duckstation

duckstation, but archived from the revision just before upstream changed it to a proprietary software project, this version is the libre one
git clone https://git.neptards.moe/u3shit/duckstation.git
Log | Files | Refs | README | LICENSE

disasm-aarch32.cc (3391487B)


      1 // Copyright 2015, VIXL authors
      2 // All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are met:
      6 //
      7 //   * Redistributions of source code must retain the above copyright notice,
      8 //     this list of conditions and the following disclaimer.
      9 //   * Redistributions in binary form must reproduce the above copyright notice,
     10 //     this list of conditions and the following disclaimer in the documentation
     11 //     and/or other materials provided with the distribution.
     12 //   * Neither the name of ARM Limited nor the names of its contributors may be
     13 //     used to endorse or promote products derived from this software without
     14 //     specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
     17 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     18 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     19 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
     20 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     21 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     22 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
     23 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26 
     27 extern "C" {
     28 #include <stdint.h>
     29 }
     30 
     31 #include <cassert>
     32 #include <cstdio>
     33 #include <cstdlib>
     34 #include <cstring>
     35 #include <iomanip>
     36 #include <iostream>
     37 
     38 #include "utils-vixl.h"
     39 #include "aarch32/constants-aarch32.h"
     40 #include "aarch32/disasm-aarch32.h"
     41 #include "aarch32/instructions-aarch32.h"
     42 #include "aarch32/operands-aarch32.h"
     43 
     44 namespace vixl {
     45 namespace aarch32 {
     46 
     47 using internal::Int64;
     48 using internal::Uint32;
     49 
     50 class T32CodeAddressIncrementer {
     51   uint32_t* code_address_;
     52   uint32_t increment_;
     53 
     54  public:
     55   T32CodeAddressIncrementer(uint32_t instr, uint32_t* code_address)
     56       : code_address_(code_address),
     57         increment_(Disassembler::Is16BitEncoding(instr) ? 2 : 4) {}
     58   ~T32CodeAddressIncrementer() { *code_address_ += increment_; }
     59 };
     60 
     61 class A32CodeAddressIncrementer {
     62   uint32_t* code_address_;
     63 
     64  public:
     65   explicit A32CodeAddressIncrementer(uint32_t* code_address)
     66       : code_address_(code_address) {}
     67   ~A32CodeAddressIncrementer() { *code_address_ += 4; }
     68 };
     69 
     70 class DecodeNeon {
     71   int lane_;
     72   SpacingType spacing_;
     73   bool valid_;
     74 
     75  public:
     76   DecodeNeon(int lane, SpacingType spacing)
     77       : lane_(lane), spacing_(spacing), valid_(true) {}
     78   DecodeNeon() : lane_(0), spacing_(kSingle), valid_(false) {}
     79   int GetLane() const { return lane_; }
     80   SpacingType GetSpacing() const { return spacing_; }
     81   bool IsValid() const { return valid_; }
     82 };
     83 
     84 class DecodeNeonAndAlign : public DecodeNeon {
     85  public:
     86   Alignment align_;
     87   DecodeNeonAndAlign(int lanes, SpacingType spacing, Alignment align)
     88       : DecodeNeon(lanes, spacing), align_(align) {}
     89   DecodeNeonAndAlign() : align_(kBadAlignment) {}
     90   Alignment GetAlign() const { return align_; }
     91 };
     92 
     93 // Start of generated code.
     94 DataTypeValue Dt_L_imm6_1_Decode(uint32_t value, uint32_t type_value) {
     95   if ((value & 0xf) == 0x1) {
     96     switch (type_value) {
     97       case 0x0:
     98         return S8;
     99       case 0x1:
    100         return U8;
    101     }
    102   } else if ((value & 0xe) == 0x2) {
    103     switch (type_value) {
    104       case 0x0:
    105         return S16;
    106       case 0x1:
    107         return U16;
    108     }
    109   } else if ((value & 0xc) == 0x4) {
    110     switch (type_value) {
    111       case 0x0:
    112         return S32;
    113       case 0x1:
    114         return U32;
    115     }
    116   } else if ((value & 0x8) == 0x8) {
    117     switch (type_value) {
    118       case 0x0:
    119         return S64;
    120       case 0x1:
    121         return U64;
    122     }
    123   }
    124   return kDataTypeValueInvalid;
    125 }
    126 
    127 DataTypeValue Dt_L_imm6_2_Decode(uint32_t value, uint32_t type_value) {
    128   if ((value & 0xf) == 0x1) {
    129     if (type_value == 0x1) return S8;
    130   } else if ((value & 0xe) == 0x2) {
    131     if (type_value == 0x1) return S16;
    132   } else if ((value & 0xc) == 0x4) {
    133     if (type_value == 0x1) return S32;
    134   } else if ((value & 0x8) == 0x8) {
    135     if (type_value == 0x1) return S64;
    136   }
    137   return kDataTypeValueInvalid;
    138 }
    139 
    140 DataTypeValue Dt_L_imm6_3_Decode(uint32_t value) {
    141   if ((value & 0xf) == 0x1) {
    142     return I8;
    143   } else if ((value & 0xe) == 0x2) {
    144     return I16;
    145   } else if ((value & 0xc) == 0x4) {
    146     return I32;
    147   } else if ((value & 0x8) == 0x8) {
    148     return I64;
    149   }
    150   return kDataTypeValueInvalid;
    151 }
    152 
    153 DataTypeValue Dt_L_imm6_4_Decode(uint32_t value) {
    154   if ((value & 0xf) == 0x1) {
    155     return Untyped8;
    156   } else if ((value & 0xe) == 0x2) {
    157     return Untyped16;
    158   } else if ((value & 0xc) == 0x4) {
    159     return Untyped32;
    160   } else if ((value & 0x8) == 0x8) {
    161     return Untyped64;
    162   }
    163   return kDataTypeValueInvalid;
    164 }
    165 
    166 DataTypeValue Dt_imm6_1_Decode(uint32_t value, uint32_t type_value) {
    167   if ((value & 0x7) == 0x1) {
    168     switch (type_value) {
    169       case 0x0:
    170         return S16;
    171       case 0x1:
    172         return U16;
    173     }
    174   } else if ((value & 0x6) == 0x2) {
    175     switch (type_value) {
    176       case 0x0:
    177         return S32;
    178       case 0x1:
    179         return U32;
    180     }
    181   } else if ((value & 0x4) == 0x4) {
    182     switch (type_value) {
    183       case 0x0:
    184         return S64;
    185       case 0x1:
    186         return U64;
    187     }
    188   }
    189   return kDataTypeValueInvalid;
    190 }
    191 
    192 DataTypeValue Dt_imm6_2_Decode(uint32_t value, uint32_t type_value) {
    193   if ((value & 0x7) == 0x1) {
    194     if (type_value == 0x1) return S16;
    195   } else if ((value & 0x6) == 0x2) {
    196     if (type_value == 0x1) return S32;
    197   } else if ((value & 0x4) == 0x4) {
    198     if (type_value == 0x1) return S64;
    199   }
    200   return kDataTypeValueInvalid;
    201 }
    202 
    203 DataTypeValue Dt_imm6_3_Decode(uint32_t value) {
    204   if ((value & 0x7) == 0x1) {
    205     return I16;
    206   } else if ((value & 0x6) == 0x2) {
    207     return I32;
    208   } else if ((value & 0x4) == 0x4) {
    209     return I64;
    210   }
    211   return kDataTypeValueInvalid;
    212 }
    213 
    214 DataTypeValue Dt_imm6_4_Decode(uint32_t value, uint32_t type_value) {
    215   if ((value & 0x7) == 0x1) {
    216     switch (type_value) {
    217       case 0x0:
    218         return S8;
    219       case 0x1:
    220         return U8;
    221     }
    222   } else if ((value & 0x6) == 0x2) {
    223     switch (type_value) {
    224       case 0x0:
    225         return S16;
    226       case 0x1:
    227         return U16;
    228     }
    229   } else if ((value & 0x4) == 0x4) {
    230     switch (type_value) {
    231       case 0x0:
    232         return S32;
    233       case 0x1:
    234         return U32;
    235     }
    236   }
    237   return kDataTypeValueInvalid;
    238 }
    239 
    240 DataTypeValue Dt_op_U_size_1_Decode(uint32_t value) {
    241   switch (value) {
    242     case 0x0:
    243       return S8;
    244     case 0x1:
    245       return S16;
    246     case 0x2:
    247       return S32;
    248     case 0x4:
    249       return U8;
    250     case 0x5:
    251       return U16;
    252     case 0x6:
    253       return U32;
    254     case 0x8:
    255       return P8;
    256     case 0xa:
    257       return P64;
    258   }
    259   return kDataTypeValueInvalid;
    260 }
    261 
    262 DataTypeValue Dt_op_size_1_Decode(uint32_t value) {
    263   switch (value) {
    264     case 0x0:
    265       return I8;
    266     case 0x1:
    267       return I16;
    268     case 0x2:
    269       return I32;
    270     case 0x4:
    271       return P8;
    272   }
    273   return kDataTypeValueInvalid;
    274 }
    275 
    276 DataTypeValue Dt_op_size_2_Decode(uint32_t value) {
    277   switch (value) {
    278     case 0x0:
    279       return S8;
    280     case 0x1:
    281       return S16;
    282     case 0x2:
    283       return S32;
    284     case 0x4:
    285       return U8;
    286     case 0x5:
    287       return U16;
    288     case 0x6:
    289       return U32;
    290   }
    291   return kDataTypeValueInvalid;
    292 }
    293 
    294 DataTypeValue Dt_op_size_3_Decode(uint32_t value) {
    295   switch (value) {
    296     case 0x0:
    297       return S16;
    298     case 0x1:
    299       return S32;
    300     case 0x2:
    301       return S64;
    302     case 0x4:
    303       return U16;
    304     case 0x5:
    305       return U32;
    306     case 0x6:
    307       return U64;
    308   }
    309   return kDataTypeValueInvalid;
    310 }
    311 
    312 DataTypeValue Dt_U_imm3H_1_Decode(uint32_t value) {
    313   switch (value) {
    314     case 0x1:
    315       return S8;
    316     case 0x2:
    317       return S16;
    318     case 0x4:
    319       return S32;
    320     case 0x9:
    321       return U8;
    322     case 0xa:
    323       return U16;
    324     case 0xc:
    325       return U32;
    326   }
    327   return kDataTypeValueInvalid;
    328 }
    329 
    330 DataTypeValue Dt_U_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) {
    331   if ((value & 0x18) == 0x8) {
    332     *lane = value & 7;
    333     return S8;
    334   }
    335   if ((value & 0x19) == 0x1) {
    336     *lane = (value >> 1) & 3;
    337     return S16;
    338   }
    339   if ((value & 0x18) == 0x18) {
    340     *lane = value & 7;
    341     return U8;
    342   }
    343   if ((value & 0x19) == 0x11) {
    344     *lane = (value >> 1) & 3;
    345     return U16;
    346   }
    347   if ((value & 0x1b) == 0x0) {
    348     *lane = (value >> 2) & 1;
    349     return Untyped32;
    350   }
    351   *lane = ~0U;
    352   return kDataTypeValueInvalid;
    353 }
    354 
    355 DataTypeValue Dt_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) {
    356   if ((value & 0x8) == 0x8) {
    357     *lane = value & 7;
    358     return Untyped8;
    359   }
    360   if ((value & 0x9) == 0x1) {
    361     *lane = (value >> 1) & 3;
    362     return Untyped16;
    363   }
    364   if ((value & 0xb) == 0x0) {
    365     *lane = (value >> 2) & 1;
    366     return Untyped32;
    367   }
    368   *lane = ~0U;
    369   return kDataTypeValueInvalid;
    370 }
    371 
    372 DataTypeValue Dt_imm4_1_Decode(uint32_t value, unsigned* lane) {
    373   if ((value & 0x1) == 0x1) {
    374     *lane = (value >> 1) & 7;
    375     return Untyped8;
    376   }
    377   if ((value & 0x3) == 0x2) {
    378     *lane = (value >> 2) & 3;
    379     return Untyped16;
    380   }
    381   if ((value & 0x7) == 0x4) {
    382     *lane = (value >> 3) & 1;
    383     return Untyped32;
    384   }
    385   *lane = ~0U;
    386   return kDataTypeValueInvalid;
    387 }
    388 
    389 DataTypeValue Dt_B_E_1_Decode(uint32_t value) {
    390   switch (value) {
    391     case 0x2:
    392       return Untyped8;
    393     case 0x1:
    394       return Untyped16;
    395     case 0x0:
    396       return Untyped32;
    397   }
    398   return kDataTypeValueInvalid;
    399 }
    400 
    401 DataTypeValue Dt_op_1_Decode1(uint32_t value) {
    402   switch (value) {
    403     case 0x0:
    404       return F32;
    405     case 0x1:
    406       return F32;
    407     case 0x2:
    408       return S32;
    409     case 0x3:
    410       return U32;
    411   }
    412   return kDataTypeValueInvalid;
    413 }
    414 
    415 DataTypeValue Dt_op_1_Decode2(uint32_t value) {
    416   switch (value) {
    417     case 0x0:
    418       return S32;
    419     case 0x1:
    420       return U32;
    421     case 0x2:
    422       return F32;
    423     case 0x3:
    424       return F32;
    425   }
    426   return kDataTypeValueInvalid;
    427 }
    428 
    429 DataTypeValue Dt_op_2_Decode(uint32_t value) {
    430   switch (value) {
    431     case 0x0:
    432       return U32;
    433     case 0x1:
    434       return S32;
    435   }
    436   return kDataTypeValueInvalid;
    437 }
    438 
    439 DataTypeValue Dt_op_3_Decode(uint32_t value) {
    440   switch (value) {
    441     case 0x0:
    442       return S32;
    443     case 0x1:
    444       return U32;
    445   }
    446   return kDataTypeValueInvalid;
    447 }
    448 
    449 DataTypeValue Dt_U_sx_1_Decode(uint32_t value) {
    450   switch (value) {
    451     case 0x0:
    452       return S16;
    453     case 0x1:
    454       return S32;
    455     case 0x2:
    456       return U16;
    457     case 0x3:
    458       return U32;
    459   }
    460   return kDataTypeValueInvalid;
    461 }
    462 
    463 DataTypeValue Dt_op_U_1_Decode1(uint32_t value) {
    464   switch (value) {
    465     case 0x0:
    466       return F32;
    467     case 0x1:
    468       return F32;
    469     case 0x2:
    470       return S32;
    471     case 0x3:
    472       return U32;
    473   }
    474   return kDataTypeValueInvalid;
    475 }
    476 
    477 DataTypeValue Dt_op_U_1_Decode2(uint32_t value) {
    478   switch (value) {
    479     case 0x0:
    480       return S32;
    481     case 0x1:
    482       return U32;
    483     case 0x2:
    484       return F32;
    485     case 0x3:
    486       return F32;
    487   }
    488   return kDataTypeValueInvalid;
    489 }
    490 
    491 DataTypeValue Dt_sz_1_Decode(uint32_t value) {
    492   switch (value) {
    493     case 0x0:
    494       return F32;
    495   }
    496   return kDataTypeValueInvalid;
    497 }
    498 
    499 DataTypeValue Dt_F_size_1_Decode(uint32_t value) {
    500   switch (value) {
    501     case 0x0:
    502       return S8;
    503     case 0x1:
    504       return S16;
    505     case 0x2:
    506       return S32;
    507     case 0x6:
    508       return F32;
    509   }
    510   return kDataTypeValueInvalid;
    511 }
    512 
    513 DataTypeValue Dt_F_size_2_Decode(uint32_t value) {
    514   switch (value) {
    515     case 0x0:
    516       return I8;
    517     case 0x1:
    518       return I16;
    519     case 0x2:
    520       return I32;
    521     case 0x6:
    522       return F32;
    523   }
    524   return kDataTypeValueInvalid;
    525 }
    526 
    527 DataTypeValue Dt_F_size_3_Decode(uint32_t value) {
    528   switch (value) {
    529     case 0x1:
    530       return I16;
    531     case 0x2:
    532       return I32;
    533     case 0x6:
    534       return F32;
    535   }
    536   return kDataTypeValueInvalid;
    537 }
    538 
    539 DataTypeValue Dt_F_size_4_Decode(uint32_t value) {
    540   switch (value) {
    541     case 0x2:
    542       return U32;
    543     case 0x6:
    544       return F32;
    545   }
    546   return kDataTypeValueInvalid;
    547 }
    548 
    549 DataTypeValue Dt_U_size_1_Decode(uint32_t value) {
    550   switch (value) {
    551     case 0x0:
    552       return S8;
    553     case 0x1:
    554       return S16;
    555     case 0x2:
    556       return S32;
    557     case 0x4:
    558       return U8;
    559     case 0x5:
    560       return U16;
    561     case 0x6:
    562       return U32;
    563   }
    564   return kDataTypeValueInvalid;
    565 }
    566 
    567 DataTypeValue Dt_U_size_2_Decode(uint32_t value) {
    568   switch (value) {
    569     case 0x1:
    570       return S16;
    571     case 0x2:
    572       return S32;
    573     case 0x5:
    574       return U16;
    575     case 0x6:
    576       return U32;
    577   }
    578   return kDataTypeValueInvalid;
    579 }
    580 
    581 DataTypeValue Dt_U_size_3_Decode(uint32_t value) {
    582   switch (value) {
    583     case 0x0:
    584       return S8;
    585     case 0x1:
    586       return S16;
    587     case 0x2:
    588       return S32;
    589     case 0x3:
    590       return S64;
    591     case 0x4:
    592       return U8;
    593     case 0x5:
    594       return U16;
    595     case 0x6:
    596       return U32;
    597     case 0x7:
    598       return U64;
    599   }
    600   return kDataTypeValueInvalid;
    601 }
    602 
    603 DataTypeValue Dt_size_1_Decode(uint32_t value) {
    604   switch (value) {
    605     case 0x0:
    606       return Untyped8;
    607   }
    608   return kDataTypeValueInvalid;
    609 }
    610 
    611 DataTypeValue Dt_size_2_Decode(uint32_t value) {
    612   switch (value) {
    613     case 0x0:
    614       return I8;
    615     case 0x1:
    616       return I16;
    617     case 0x2:
    618       return I32;
    619     case 0x3:
    620       return I64;
    621   }
    622   return kDataTypeValueInvalid;
    623 }
    624 
    625 DataTypeValue Dt_size_3_Decode(uint32_t value) {
    626   switch (value) {
    627     case 0x0:
    628       return I16;
    629     case 0x1:
    630       return I32;
    631     case 0x2:
    632       return I64;
    633   }
    634   return kDataTypeValueInvalid;
    635 }
    636 
    637 DataTypeValue Dt_size_4_Decode(uint32_t value) {
    638   switch (value) {
    639     case 0x0:
    640       return I8;
    641     case 0x1:
    642       return I16;
    643     case 0x2:
    644       return I32;
    645   }
    646   return kDataTypeValueInvalid;
    647 }
    648 
    649 DataTypeValue Dt_size_5_Decode(uint32_t value) {
    650   switch (value) {
    651     case 0x0:
    652       return S8;
    653     case 0x1:
    654       return S16;
    655     case 0x2:
    656       return S32;
    657   }
    658   return kDataTypeValueInvalid;
    659 }
    660 
    661 DataTypeValue Dt_size_6_Decode(uint32_t value) {
    662   switch (value) {
    663     case 0x0:
    664       return Untyped8;
    665     case 0x1:
    666       return Untyped16;
    667     case 0x2:
    668       return Untyped32;
    669     case 0x3:
    670       return Untyped64;
    671   }
    672   return kDataTypeValueInvalid;
    673 }
    674 
    675 DataTypeValue Dt_size_7_Decode(uint32_t value) {
    676   switch (value) {
    677     case 0x0:
    678       return Untyped8;
    679     case 0x1:
    680       return Untyped16;
    681     case 0x2:
    682       return Untyped32;
    683   }
    684   return kDataTypeValueInvalid;
    685 }
    686 
    687 DataTypeValue Dt_size_8_Decode(uint32_t value) {
    688   switch (value) {
    689     case 0x0:
    690       return Untyped8;
    691     case 0x1:
    692       return Untyped16;
    693     case 0x2:
    694       return Untyped32;
    695     case 0x3:
    696       return Untyped32;
    697   }
    698   return kDataTypeValueInvalid;
    699 }
    700 
    701 DataTypeValue Dt_size_9_Decode(uint32_t value, uint32_t type_value) {
    702   switch (value) {
    703     case 0x1:
    704       switch (type_value) {
    705         case 0x0:
    706           return I16;
    707       }
    708       break;
    709     case 0x2:
    710       switch (type_value) {
    711         case 0x0:
    712           return I32;
    713         case 0x1:
    714           return F32;
    715       }
    716       break;
    717   }
    718   return kDataTypeValueInvalid;
    719 }
    720 
    721 DataTypeValue Dt_size_10_Decode(uint32_t value) {
    722   switch (value) {
    723     case 0x0:
    724       return I8;
    725     case 0x1:
    726       return I16;
    727     case 0x2:
    728       return I32;
    729   }
    730   return kDataTypeValueInvalid;
    731 }
    732 
    733 DataTypeValue Dt_size_11_Decode(uint32_t value, uint32_t type_value) {
    734   switch (value) {
    735     case 0x1:
    736       switch (type_value) {
    737         case 0x0:
    738           return S16;
    739         case 0x1:
    740           return U16;
    741       }
    742       break;
    743     case 0x2:
    744       switch (type_value) {
    745         case 0x0:
    746           return S32;
    747         case 0x1:
    748           return U32;
    749       }
    750       break;
    751   }
    752   return kDataTypeValueInvalid;
    753 }
    754 
    755 DataTypeValue Dt_size_12_Decode(uint32_t value, uint32_t type_value) {
    756   switch (value) {
    757     case 0x0:
    758       switch (type_value) {
    759         case 0x0:
    760           return S8;
    761         case 0x1:
    762           return U8;
    763       }
    764       break;
    765     case 0x1:
    766       switch (type_value) {
    767         case 0x0:
    768           return S16;
    769         case 0x1:
    770           return U16;
    771       }
    772       break;
    773     case 0x2:
    774       switch (type_value) {
    775         case 0x0:
    776           return S32;
    777         case 0x1:
    778           return U32;
    779       }
    780       break;
    781   }
    782   return kDataTypeValueInvalid;
    783 }
    784 
    785 DataTypeValue Dt_size_13_Decode(uint32_t value) {
    786   switch (value) {
    787     case 0x1:
    788       return S16;
    789     case 0x2:
    790       return S32;
    791   }
    792   return kDataTypeValueInvalid;
    793 }
    794 
    795 DataTypeValue Dt_size_14_Decode(uint32_t value) {
    796   switch (value) {
    797     case 0x0:
    798       return S16;
    799     case 0x1:
    800       return S32;
    801     case 0x2:
    802       return S64;
    803   }
    804   return kDataTypeValueInvalid;
    805 }
    806 
    807 DataTypeValue Dt_size_15_Decode(uint32_t value) {
    808   switch (value) {
    809     case 0x0:
    810       return Untyped8;
    811     case 0x1:
    812       return Untyped16;
    813   }
    814   return kDataTypeValueInvalid;
    815 }
    816 
    817 DataTypeValue Dt_size_16_Decode(uint32_t value) {
    818   switch (value) {
    819     case 0x2:
    820       return F32;
    821   }
    822   return kDataTypeValueInvalid;
    823 }
    824 
    825 DataTypeValue Dt_size_17_Decode(uint32_t value) {
    826   switch (value) {
    827     case 0x0:
    828       return I8;
    829     case 0x1:
    830       return I16;
    831     case 0x2:
    832       return I32;
    833   }
    834   return kDataTypeValueInvalid;
    835 }
    836 
    837 DecodeNeon Index_1_Decode(uint32_t value, DataType dt) {
    838   switch (dt.GetValue()) {
    839     case Untyped8: {
    840       int lane = (value >> 1) & 0x7;
    841       if ((value & 1) != 0) break;
    842       SpacingType spacing = kSingle;
    843       return DecodeNeon(lane, spacing);
    844     }
    845     case Untyped16: {
    846       int lane = (value >> 2) & 0x3;
    847       if ((value & 1) != 0) break;
    848       SpacingType spacing = ((value & 3) == 2) ? kDouble : kSingle;
    849       return DecodeNeon(lane, spacing);
    850     }
    851     case Untyped32: {
    852       int lane = (value >> 3) & 0x1;
    853       if ((value & 3) != 0) break;
    854       SpacingType spacing = ((value & 7) == 4) ? kDouble : kSingle;
    855       return DecodeNeon(lane, spacing);
    856     }
    857     default:
    858       break;
    859   }
    860   return DecodeNeon();
    861 }
    862 
    863 DecodeNeonAndAlign Align_index_align_1_Decode(uint32_t value, DataType dt) {
    864   switch (dt.GetValue()) {
    865     case Untyped8: {
    866       AlignmentType align;
    867       if ((value & 1) == 0) {
    868         align = kNoAlignment;
    869       } else {
    870         break;
    871       }
    872       int lane = (value >> 1) & 0x7;
    873       SpacingType spacing = kSingle;
    874       return DecodeNeonAndAlign(lane, spacing, align);
    875     }
    876     case Untyped16: {
    877       AlignmentType align;
    878       if ((value & 3) == 1) {
    879         align = k16BitAlign;
    880       } else if ((value & 3) == 0) {
    881         align = kNoAlignment;
    882       } else {
    883         break;
    884       }
    885       int lane = (value >> 2) & 0x3;
    886       SpacingType spacing = kSingle;
    887       return DecodeNeonAndAlign(lane, spacing, align);
    888     }
    889     case Untyped32: {
    890       AlignmentType align;
    891       if ((value & 7) == 3) {
    892         align = k32BitAlign;
    893       } else if ((value & 7) == 0) {
    894         align = kNoAlignment;
    895       } else {
    896         break;
    897       }
    898       int lane = (value >> 3) & 0x1;
    899       SpacingType spacing = kSingle;
    900       return DecodeNeonAndAlign(lane, spacing, align);
    901     }
    902     default:
    903       break;
    904   }
    905   return DecodeNeonAndAlign();
    906 }
    907 
    908 DecodeNeonAndAlign Align_index_align_2_Decode(uint32_t value, DataType dt) {
    909   switch (dt.GetValue()) {
    910     case Untyped8: {
    911       AlignmentType align;
    912       if ((value & 1) == 1) {
    913         align = k16BitAlign;
    914       } else if ((value & 1) == 0) {
    915         align = kNoAlignment;
    916       } else {
    917         break;
    918       }
    919       int lane = (value >> 1) & 0x7;
    920       SpacingType spacing = kSingle;
    921       return DecodeNeonAndAlign(lane, spacing, align);
    922     }
    923     case Untyped16: {
    924       AlignmentType align;
    925       if ((value & 1) == 1) {
    926         align = k32BitAlign;
    927       } else if ((value & 1) == 0) {
    928         align = kNoAlignment;
    929       } else {
    930         break;
    931       }
    932       int lane = (value >> 2) & 0x3;
    933       SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle;
    934       return DecodeNeonAndAlign(lane, spacing, align);
    935     }
    936     case Untyped32: {
    937       AlignmentType align;
    938       if ((value & 3) == 1) {
    939         align = k64BitAlign;
    940       } else if ((value & 3) == 0) {
    941         align = kNoAlignment;
    942       } else {
    943         break;
    944       }
    945       int lane = (value >> 3) & 0x1;
    946       SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle;
    947       return DecodeNeonAndAlign(lane, spacing, align);
    948     }
    949     default:
    950       break;
    951   }
    952   return DecodeNeonAndAlign();
    953 }
    954 
    955 DecodeNeonAndAlign Align_index_align_3_Decode(uint32_t value, DataType dt) {
    956   switch (dt.GetValue()) {
    957     case Untyped8: {
    958       AlignmentType align;
    959       if ((value & 1) == 1) {
    960         align = k32BitAlign;
    961       } else if ((value & 1) == 0) {
    962         align = kNoAlignment;
    963       } else {
    964         break;
    965       }
    966       int lane = (value >> 1) & 0x7;
    967       SpacingType spacing = kSingle;
    968       return DecodeNeonAndAlign(lane, spacing, align);
    969     }
    970     case Untyped16: {
    971       AlignmentType align;
    972       if ((value & 1) == 1) {
    973         align = k64BitAlign;
    974       } else if ((value & 1) == 0) {
    975         align = kNoAlignment;
    976       } else {
    977         break;
    978       }
    979       int lane = (value >> 2) & 0x3;
    980       SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle;
    981       return DecodeNeonAndAlign(lane, spacing, align);
    982     }
    983     case Untyped32: {
    984       AlignmentType align;
    985       if ((value & 3) == 1) {
    986         align = k64BitAlign;
    987       } else if ((value & 3) == 2) {
    988         align = k128BitAlign;
    989       } else if ((value & 3) == 0) {
    990         align = kNoAlignment;
    991       } else {
    992         break;
    993       }
    994       int lane = (value >> 3) & 0x1;
    995       SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle;
    996       return DecodeNeonAndAlign(lane, spacing, align);
    997     }
    998     default:
    999       break;
   1000   }
   1001   return DecodeNeonAndAlign();
   1002 }
   1003 
   1004 Alignment Align_a_1_Decode(uint32_t value, DataType dt) {
   1005   switch (value) {
   1006     case 0:
   1007       return kNoAlignment;
   1008     case 1:
   1009       if (dt.Is(Untyped16)) return k16BitAlign;
   1010       if (dt.Is(Untyped32)) return k32BitAlign;
   1011       break;
   1012     default:
   1013       break;
   1014   }
   1015   return kBadAlignment;
   1016 }
   1017 
   1018 Alignment Align_a_2_Decode(uint32_t value, DataType dt) {
   1019   switch (value) {
   1020     case 0:
   1021       return kNoAlignment;
   1022     case 1:
   1023       if (dt.Is(Untyped8)) return k16BitAlign;
   1024       if (dt.Is(Untyped16)) return k32BitAlign;
   1025       if (dt.Is(Untyped32)) return k64BitAlign;
   1026       break;
   1027     default:
   1028       break;
   1029   }
   1030   return kBadAlignment;
   1031 }
   1032 
   1033 Alignment Align_a_3_Decode(uint32_t value, DataType dt, uint32_t size) {
   1034   switch (value) {
   1035     case 0:
   1036       if (size != 3) return kNoAlignment;
   1037       break;
   1038     case 1:
   1039       if (dt.Is(Untyped8)) return k32BitAlign;
   1040       if (dt.Is(Untyped16)) return k64BitAlign;
   1041       if (size == 2) return k64BitAlign;
   1042       if (size == 3) return k128BitAlign;
   1043       break;
   1044     default:
   1045       break;
   1046   }
   1047   return kBadAlignment;
   1048 }
   1049 
   1050 Alignment Align_align_1_Decode(uint32_t value) {
   1051   switch (value) {
   1052     case 0:
   1053       return kNoAlignment;
   1054     case 1:
   1055       return k64BitAlign;
   1056     case 2:
   1057       return k128BitAlign;
   1058     case 3:
   1059       return k256BitAlign;
   1060     default:
   1061       break;
   1062   }
   1063   return kBadAlignment;
   1064 }
   1065 
   1066 Alignment Align_align_2_Decode(uint32_t value) {
   1067   switch (value) {
   1068     case 0:
   1069       return kNoAlignment;
   1070     case 1:
   1071       return k64BitAlign;
   1072     case 2:
   1073       return k128BitAlign;
   1074     case 3:
   1075       return k256BitAlign;
   1076     default:
   1077       break;
   1078   }
   1079   return kBadAlignment;
   1080 }
   1081 
   1082 Alignment Align_align_3_Decode(uint32_t value) {
   1083   switch (value) {
   1084     case 0:
   1085       return kNoAlignment;
   1086     case 1:
   1087       return k64BitAlign;
   1088     default:
   1089       break;
   1090   }
   1091   return kBadAlignment;
   1092 }
   1093 
   1094 Alignment Align_align_4_Decode(uint32_t value) {
   1095   switch (value) {
   1096     case 0:
   1097       return kNoAlignment;
   1098     case 1:
   1099       return k64BitAlign;
   1100     case 2:
   1101       return k128BitAlign;
   1102     case 3:
   1103       return k256BitAlign;
   1104     default:
   1105       break;
   1106   }
   1107   return kBadAlignment;
   1108 }
   1109 
   1110 Alignment Align_align_5_Decode(uint32_t value) {
   1111   switch (value) {
   1112     case 0:
   1113       return kNoAlignment;
   1114     case 1:
   1115       return k64BitAlign;
   1116     case 2:
   1117       return k128BitAlign;
   1118     case 3:
   1119       return k256BitAlign;
   1120     default:
   1121       break;
   1122   }
   1123   return kBadAlignment;
   1124 }
   1125 
   1126 
   1127 void Disassembler::adc(Condition cond,
   1128                        EncodingSize size,
   1129                        Register rd,
   1130                        Register rn,
   1131                        const Operand& operand) {
   1132   os().SetCurrentInstruction(kAdc, kArithmetic);
   1133   os() << ToCString(kAdc) << ConditionPrinter(it_block_, cond) << size;
   1134   os() << " ";
   1135   if (!rd.Is(rn) || !use_short_hand_form_) {
   1136     os() << rd << ", ";
   1137   }
   1138   os() << rn << ", " << operand;
   1139 }
   1140 
   1141 void Disassembler::adcs(Condition cond,
   1142                         EncodingSize size,
   1143                         Register rd,
   1144                         Register rn,
   1145                         const Operand& operand) {
   1146   os().SetCurrentInstruction(kAdcs, kArithmetic);
   1147   os() << ToCString(kAdcs) << ConditionPrinter(it_block_, cond) << size;
   1148   os() << " ";
   1149   if (!rd.Is(rn) || !use_short_hand_form_) {
   1150     os() << rd << ", ";
   1151   }
   1152   os() << rn << ", " << operand;
   1153 }
   1154 
   1155 void Disassembler::add(Condition cond,
   1156                        EncodingSize size,
   1157                        Register rd,
   1158                        Register rn,
   1159                        const Operand& operand) {
   1160   os().SetCurrentInstruction(kAdd, kArithmetic);
   1161   os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << size;
   1162   os() << " ";
   1163   if (!rd.Is(rn) || !use_short_hand_form_) {
   1164     os() << rd << ", ";
   1165   }
   1166   os() << rn << ", " << operand;
   1167 }
   1168 
   1169 void Disassembler::add(Condition cond, Register rd, const Operand& operand) {
   1170   os().SetCurrentInstruction(kAdd, kArithmetic);
   1171   os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << " " << rd
   1172        << ", " << operand;
   1173 }
   1174 
   1175 void Disassembler::adds(Condition cond,
   1176                         EncodingSize size,
   1177                         Register rd,
   1178                         Register rn,
   1179                         const Operand& operand) {
   1180   os().SetCurrentInstruction(kAdds, kArithmetic);
   1181   os() << ToCString(kAdds) << ConditionPrinter(it_block_, cond) << size;
   1182   os() << " ";
   1183   if (!rd.Is(rn) || !use_short_hand_form_) {
   1184     os() << rd << ", ";
   1185   }
   1186   os() << rn << ", " << operand;
   1187 }
   1188 
   1189 void Disassembler::adds(Register rd, const Operand& operand) {
   1190   os().SetCurrentInstruction(kAdds, kArithmetic);
   1191   os() << ToCString(kAdds) << " " << rd << ", " << operand;
   1192 }
   1193 
   1194 void Disassembler::addw(Condition cond,
   1195                         Register rd,
   1196                         Register rn,
   1197                         const Operand& operand) {
   1198   os().SetCurrentInstruction(kAddw, kArithmetic);
   1199   os() << ToCString(kAddw) << ConditionPrinter(it_block_, cond);
   1200   os() << " ";
   1201   if (!rd.Is(rn) || !use_short_hand_form_) {
   1202     os() << rd << ", ";
   1203   }
   1204   os() << rn << ", " << operand;
   1205 }
   1206 
   1207 void Disassembler::adr(Condition cond,
   1208                        EncodingSize size,
   1209                        Register rd,
   1210                        Location* location) {
   1211   os().SetCurrentInstruction(kAdr, kAddress);
   1212   os() << ToCString(kAdr) << ConditionPrinter(it_block_, cond) << size << " "
   1213        << rd << ", "
   1214        << PrintLabel(kAnyLocation, location, GetCodeAddress() & ~3);
   1215 }
   1216 
   1217 void Disassembler::and_(Condition cond,
   1218                         EncodingSize size,
   1219                         Register rd,
   1220                         Register rn,
   1221                         const Operand& operand) {
   1222   os().SetCurrentInstruction(kAnd, kBitwise);
   1223   os() << ToCString(kAnd) << ConditionPrinter(it_block_, cond) << size;
   1224   os() << " ";
   1225   if (!rd.Is(rn) || !use_short_hand_form_) {
   1226     os() << rd << ", ";
   1227   }
   1228   os() << rn << ", " << operand;
   1229 }
   1230 
   1231 void Disassembler::ands(Condition cond,
   1232                         EncodingSize size,
   1233                         Register rd,
   1234                         Register rn,
   1235                         const Operand& operand) {
   1236   os().SetCurrentInstruction(kAnds, kBitwise);
   1237   os() << ToCString(kAnds) << ConditionPrinter(it_block_, cond) << size;
   1238   os() << " ";
   1239   if (!rd.Is(rn) || !use_short_hand_form_) {
   1240     os() << rd << ", ";
   1241   }
   1242   os() << rn << ", " << operand;
   1243 }
   1244 
   1245 void Disassembler::asr(Condition cond,
   1246                        EncodingSize size,
   1247                        Register rd,
   1248                        Register rm,
   1249                        const Operand& operand) {
   1250   os().SetCurrentInstruction(kAsr, kShift);
   1251   os() << ToCString(kAsr) << ConditionPrinter(it_block_, cond) << size;
   1252   os() << " ";
   1253   if (!rd.Is(rm) || !use_short_hand_form_) {
   1254     os() << rd << ", ";
   1255   }
   1256   os() << rm << ", " << operand;
   1257 }
   1258 
   1259 void Disassembler::asrs(Condition cond,
   1260                         EncodingSize size,
   1261                         Register rd,
   1262                         Register rm,
   1263                         const Operand& operand) {
   1264   os().SetCurrentInstruction(kAsrs, kShift);
   1265   os() << ToCString(kAsrs) << ConditionPrinter(it_block_, cond) << size;
   1266   os() << " ";
   1267   if (!rd.Is(rm) || !use_short_hand_form_) {
   1268     os() << rd << ", ";
   1269   }
   1270   os() << rm << ", " << operand;
   1271 }
   1272 
   1273 void Disassembler::b(Condition cond, EncodingSize size, Location* location) {
   1274   os().SetCurrentInstruction(kB, kAddress | kBranch);
   1275   os() << ToCString(kB) << ConditionPrinter(it_block_, cond) << size << " "
   1276        << PrintLabel(kCodeLocation, location, GetCodeAddress());
   1277 }
   1278 
   1279 void Disassembler::bfc(Condition cond,
   1280                        Register rd,
   1281                        uint32_t lsb,
   1282                        uint32_t width) {
   1283   os().SetCurrentInstruction(kBfc, kShift);
   1284   os() << ToCString(kBfc) << ConditionPrinter(it_block_, cond) << " " << rd
   1285        << ", " << ImmediatePrinter(lsb) << ", " << ImmediatePrinter(width);
   1286 }
   1287 
   1288 void Disassembler::bfi(
   1289     Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
   1290   os().SetCurrentInstruction(kBfi, kShift);
   1291   os() << ToCString(kBfi) << ConditionPrinter(it_block_, cond) << " " << rd
   1292        << ", " << rn << ", " << ImmediatePrinter(lsb) << ", "
   1293        << ImmediatePrinter(width);
   1294 }
   1295 
   1296 void Disassembler::bic(Condition cond,
   1297                        EncodingSize size,
   1298                        Register rd,
   1299                        Register rn,
   1300                        const Operand& operand) {
   1301   os().SetCurrentInstruction(kBic, kBitwise);
   1302   os() << ToCString(kBic) << ConditionPrinter(it_block_, cond) << size;
   1303   os() << " ";
   1304   if (!rd.Is(rn) || !use_short_hand_form_) {
   1305     os() << rd << ", ";
   1306   }
   1307   os() << rn << ", " << operand;
   1308 }
   1309 
   1310 void Disassembler::bics(Condition cond,
   1311                         EncodingSize size,
   1312                         Register rd,
   1313                         Register rn,
   1314                         const Operand& operand) {
   1315   os().SetCurrentInstruction(kBics, kBitwise);
   1316   os() << ToCString(kBics) << ConditionPrinter(it_block_, cond) << size;
   1317   os() << " ";
   1318   if (!rd.Is(rn) || !use_short_hand_form_) {
   1319     os() << rd << ", ";
   1320   }
   1321   os() << rn << ", " << operand;
   1322 }
   1323 
   1324 void Disassembler::bkpt(Condition cond, uint32_t imm) {
   1325   os().SetCurrentInstruction(kBkpt, kSystem);
   1326   os() << ToCString(kBkpt) << ConditionPrinter(it_block_, cond) << " "
   1327        << RawImmediatePrinter(imm);
   1328 }
   1329 
   1330 void Disassembler::bl(Condition cond, Location* location) {
   1331   os().SetCurrentInstruction(kBl, kAddress | kBranch);
   1332   os() << ToCString(kBl) << ConditionPrinter(it_block_, cond) << " "
   1333        << PrintLabel(kCodeLocation, location, GetCodeAddress());
   1334 }
   1335 
   1336 void Disassembler::blx(Condition cond, Location* location) {
   1337   os().SetCurrentInstruction(kBlx, kAddress | kBranch);
   1338   os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " "
   1339        << PrintLabel(kCodeLocation, location, GetCodeAddress() & ~3);
   1340 }
   1341 
   1342 void Disassembler::blx(Condition cond, Register rm) {
   1343   os().SetCurrentInstruction(kBlx, kAddress | kBranch);
   1344   os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " " << rm;
   1345 }
   1346 
   1347 void Disassembler::bx(Condition cond, Register rm) {
   1348   os().SetCurrentInstruction(kBx, kAddress | kBranch);
   1349   os() << ToCString(kBx) << ConditionPrinter(it_block_, cond) << " " << rm;
   1350 }
   1351 
   1352 void Disassembler::bxj(Condition cond, Register rm) {
   1353   os().SetCurrentInstruction(kBxj, kAddress | kBranch);
   1354   os() << ToCString(kBxj) << ConditionPrinter(it_block_, cond) << " " << rm;
   1355 }
   1356 
   1357 void Disassembler::cbnz(Register rn, Location* location) {
   1358   os().SetCurrentInstruction(kCbnz, kAddress | kBranch);
   1359   os() << ToCString(kCbnz) << " " << rn << ", "
   1360        << PrintLabel(kCodeLocation, location, GetCodeAddress());
   1361 }
   1362 
   1363 void Disassembler::cbz(Register rn, Location* location) {
   1364   os().SetCurrentInstruction(kCbz, kAddress | kBranch);
   1365   os() << ToCString(kCbz) << " " << rn << ", "
   1366        << PrintLabel(kCodeLocation, location, GetCodeAddress());
   1367 }
   1368 
   1369 void Disassembler::clrex(Condition cond) {
   1370   os().SetCurrentInstruction(kClrex, kNoAttribute);
   1371   os() << ToCString(kClrex) << ConditionPrinter(it_block_, cond);
   1372 }
   1373 
   1374 void Disassembler::clz(Condition cond, Register rd, Register rm) {
   1375   os().SetCurrentInstruction(kClz, kNoAttribute);
   1376   os() << ToCString(kClz) << ConditionPrinter(it_block_, cond) << " " << rd
   1377        << ", " << rm;
   1378 }
   1379 
   1380 void Disassembler::cmn(Condition cond,
   1381                        EncodingSize size,
   1382                        Register rn,
   1383                        const Operand& operand) {
   1384   os().SetCurrentInstruction(kCmn, kArithmetic);
   1385   os() << ToCString(kCmn) << ConditionPrinter(it_block_, cond) << size << " "
   1386        << rn << ", " << operand;
   1387 }
   1388 
   1389 void Disassembler::cmp(Condition cond,
   1390                        EncodingSize size,
   1391                        Register rn,
   1392                        const Operand& operand) {
   1393   os().SetCurrentInstruction(kCmp, kArithmetic);
   1394   os() << ToCString(kCmp) << ConditionPrinter(it_block_, cond) << size << " "
   1395        << rn << ", " << operand;
   1396 }
   1397 
   1398 void Disassembler::crc32b(Condition cond,
   1399                           Register rd,
   1400                           Register rn,
   1401                           Register rm) {
   1402   os().SetCurrentInstruction(kCrc32b, kNoAttribute);
   1403   os() << ToCString(kCrc32b) << ConditionPrinter(it_block_, cond) << " " << rd
   1404        << ", " << rn << ", " << rm;
   1405 }
   1406 
   1407 void Disassembler::crc32cb(Condition cond,
   1408                            Register rd,
   1409                            Register rn,
   1410                            Register rm) {
   1411   os().SetCurrentInstruction(kCrc32cb, kNoAttribute);
   1412   os() << ToCString(kCrc32cb) << ConditionPrinter(it_block_, cond) << " " << rd
   1413        << ", " << rn << ", " << rm;
   1414 }
   1415 
   1416 void Disassembler::crc32ch(Condition cond,
   1417                            Register rd,
   1418                            Register rn,
   1419                            Register rm) {
   1420   os().SetCurrentInstruction(kCrc32ch, kNoAttribute);
   1421   os() << ToCString(kCrc32ch) << ConditionPrinter(it_block_, cond) << " " << rd
   1422        << ", " << rn << ", " << rm;
   1423 }
   1424 
   1425 void Disassembler::crc32cw(Condition cond,
   1426                            Register rd,
   1427                            Register rn,
   1428                            Register rm) {
   1429   os().SetCurrentInstruction(kCrc32cw, kNoAttribute);
   1430   os() << ToCString(kCrc32cw) << ConditionPrinter(it_block_, cond) << " " << rd
   1431        << ", " << rn << ", " << rm;
   1432 }
   1433 
   1434 void Disassembler::crc32h(Condition cond,
   1435                           Register rd,
   1436                           Register rn,
   1437                           Register rm) {
   1438   os().SetCurrentInstruction(kCrc32h, kNoAttribute);
   1439   os() << ToCString(kCrc32h) << ConditionPrinter(it_block_, cond) << " " << rd
   1440        << ", " << rn << ", " << rm;
   1441 }
   1442 
   1443 void Disassembler::crc32w(Condition cond,
   1444                           Register rd,
   1445                           Register rn,
   1446                           Register rm) {
   1447   os().SetCurrentInstruction(kCrc32w, kNoAttribute);
   1448   os() << ToCString(kCrc32w) << ConditionPrinter(it_block_, cond) << " " << rd
   1449        << ", " << rn << ", " << rm;
   1450 }
   1451 
   1452 void Disassembler::dmb(Condition cond, MemoryBarrier option) {
   1453   os().SetCurrentInstruction(kDmb, kNoAttribute);
   1454   os() << ToCString(kDmb) << ConditionPrinter(it_block_, cond) << " " << option;
   1455 }
   1456 
   1457 void Disassembler::dsb(Condition cond, MemoryBarrier option) {
   1458   os().SetCurrentInstruction(kDsb, kNoAttribute);
   1459   os() << ToCString(kDsb) << ConditionPrinter(it_block_, cond) << " " << option;
   1460 }
   1461 
   1462 void Disassembler::eor(Condition cond,
   1463                        EncodingSize size,
   1464                        Register rd,
   1465                        Register rn,
   1466                        const Operand& operand) {
   1467   os().SetCurrentInstruction(kEor, kBitwise);
   1468   os() << ToCString(kEor) << ConditionPrinter(it_block_, cond) << size;
   1469   os() << " ";
   1470   if (!rd.Is(rn) || !use_short_hand_form_) {
   1471     os() << rd << ", ";
   1472   }
   1473   os() << rn << ", " << operand;
   1474 }
   1475 
   1476 void Disassembler::eors(Condition cond,
   1477                         EncodingSize size,
   1478                         Register rd,
   1479                         Register rn,
   1480                         const Operand& operand) {
   1481   os().SetCurrentInstruction(kEors, kBitwise);
   1482   os() << ToCString(kEors) << ConditionPrinter(it_block_, cond) << size;
   1483   os() << " ";
   1484   if (!rd.Is(rn) || !use_short_hand_form_) {
   1485     os() << rd << ", ";
   1486   }
   1487   os() << rn << ", " << operand;
   1488 }
   1489 
   1490 void Disassembler::fldmdbx(Condition cond,
   1491                            Register rn,
   1492                            WriteBack write_back,
   1493                            DRegisterList dreglist) {
   1494   os().SetCurrentInstruction(kFldmdbx,
   1495                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   1496   os() << ToCString(kFldmdbx) << ConditionPrinter(it_block_, cond) << " " << rn
   1497        << write_back << ", " << dreglist;
   1498 }
   1499 
   1500 void Disassembler::fldmiax(Condition cond,
   1501                            Register rn,
   1502                            WriteBack write_back,
   1503                            DRegisterList dreglist) {
   1504   os().SetCurrentInstruction(kFldmiax,
   1505                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   1506   os() << ToCString(kFldmiax) << ConditionPrinter(it_block_, cond) << " " << rn
   1507        << write_back << ", " << dreglist;
   1508 }
   1509 
   1510 void Disassembler::fstmdbx(Condition cond,
   1511                            Register rn,
   1512                            WriteBack write_back,
   1513                            DRegisterList dreglist) {
   1514   os().SetCurrentInstruction(kFstmdbx,
   1515                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   1516   os() << ToCString(kFstmdbx) << ConditionPrinter(it_block_, cond) << " " << rn
   1517        << write_back << ", " << dreglist;
   1518 }
   1519 
   1520 void Disassembler::fstmiax(Condition cond,
   1521                            Register rn,
   1522                            WriteBack write_back,
   1523                            DRegisterList dreglist) {
   1524   os().SetCurrentInstruction(kFstmiax,
   1525                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   1526   os() << ToCString(kFstmiax) << ConditionPrinter(it_block_, cond) << " " << rn
   1527        << write_back << ", " << dreglist;
   1528 }
   1529 
   1530 void Disassembler::hlt(Condition cond, uint32_t imm) {
   1531   os().SetCurrentInstruction(kHlt, kSystem);
   1532   os() << ToCString(kHlt) << ConditionPrinter(it_block_, cond) << " "
   1533        << RawImmediatePrinter(imm);
   1534 }
   1535 
   1536 void Disassembler::hvc(Condition cond, uint32_t imm) {
   1537   os().SetCurrentInstruction(kHvc, kSystem);
   1538   os() << ToCString(kHvc) << ConditionPrinter(it_block_, cond) << " "
   1539        << RawImmediatePrinter(imm);
   1540 }
   1541 
   1542 void Disassembler::isb(Condition cond, MemoryBarrier option) {
   1543   os().SetCurrentInstruction(kIsb, kNoAttribute);
   1544   os() << ToCString(kIsb) << ConditionPrinter(it_block_, cond) << " " << option;
   1545 }
   1546 
   1547 void Disassembler::it(Condition cond, uint16_t mask) {
   1548   os().SetCurrentInstruction(kIt, kNoAttribute);
   1549   os() << ToCString(kIt);
   1550   int count;
   1551   if ((mask & 0x1) != 0) {
   1552     count = 3;
   1553   } else if ((mask & 0x2) != 0) {
   1554     count = 2;
   1555   } else if ((mask & 0x4) != 0) {
   1556     count = 1;
   1557   } else {
   1558     count = 0;
   1559   }
   1560   uint16_t tmp = 0x8;
   1561   uint16_t ref = (cond.GetCondition() & 0x1) << 3;
   1562   while (count-- > 0) {
   1563     os() << (((mask & tmp) == ref) ? "t" : "e");
   1564     tmp >>= 1;
   1565     ref >>= 1;
   1566   }
   1567   if (cond.Is(al)) {
   1568     os() << " al";
   1569   } else {
   1570     os() << " " << cond;
   1571   }
   1572 }
   1573 
   1574 void Disassembler::lda(Condition cond, Register rt, const MemOperand& operand) {
   1575   os().SetCurrentInstruction(kLda, kAddress | kLoadStore);
   1576   os() << ToCString(kLda) << ConditionPrinter(it_block_, cond) << " " << rt
   1577        << ", " << PrintMemOperand(kLoadWordLocation, operand);
   1578 }
   1579 
   1580 void Disassembler::ldab(Condition cond,
   1581                         Register rt,
   1582                         const MemOperand& operand) {
   1583   os().SetCurrentInstruction(kLdab, kAddress | kLoadStore);
   1584   os() << ToCString(kLdab) << ConditionPrinter(it_block_, cond) << " " << rt
   1585        << ", " << PrintMemOperand(kLoadByteLocation, operand);
   1586 }
   1587 
   1588 void Disassembler::ldaex(Condition cond,
   1589                          Register rt,
   1590                          const MemOperand& operand) {
   1591   os().SetCurrentInstruction(kLdaex, kAddress | kLoadStore);
   1592   os() << ToCString(kLdaex) << ConditionPrinter(it_block_, cond) << " " << rt
   1593        << ", " << PrintMemOperand(kLoadWordLocation, operand);
   1594 }
   1595 
   1596 void Disassembler::ldaexb(Condition cond,
   1597                           Register rt,
   1598                           const MemOperand& operand) {
   1599   os().SetCurrentInstruction(kLdaexb, kAddress | kLoadStore);
   1600   os() << ToCString(kLdaexb) << ConditionPrinter(it_block_, cond) << " " << rt
   1601        << ", " << PrintMemOperand(kLoadByteLocation, operand);
   1602 }
   1603 
   1604 void Disassembler::ldaexd(Condition cond,
   1605                           Register rt,
   1606                           Register rt2,
   1607                           const MemOperand& operand) {
   1608   os().SetCurrentInstruction(kLdaexd, kAddress | kLoadStore);
   1609   os() << ToCString(kLdaexd) << ConditionPrinter(it_block_, cond) << " " << rt
   1610        << ", " << rt2 << ", "
   1611        << PrintMemOperand(kLoadDoubleWordLocation, operand);
   1612 }
   1613 
   1614 void Disassembler::ldaexh(Condition cond,
   1615                           Register rt,
   1616                           const MemOperand& operand) {
   1617   os().SetCurrentInstruction(kLdaexh, kAddress | kLoadStore);
   1618   os() << ToCString(kLdaexh) << ConditionPrinter(it_block_, cond) << " " << rt
   1619        << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
   1620 }
   1621 
   1622 void Disassembler::ldah(Condition cond,
   1623                         Register rt,
   1624                         const MemOperand& operand) {
   1625   os().SetCurrentInstruction(kLdah, kAddress | kLoadStore);
   1626   os() << ToCString(kLdah) << ConditionPrinter(it_block_, cond) << " " << rt
   1627        << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
   1628 }
   1629 
   1630 void Disassembler::ldm(Condition cond,
   1631                        EncodingSize size,
   1632                        Register rn,
   1633                        WriteBack write_back,
   1634                        RegisterList registers) {
   1635   os().SetCurrentInstruction(kLdm, kLoadStore | kLoadStoreMultiple);
   1636   os() << ToCString(kLdm) << ConditionPrinter(it_block_, cond) << size << " "
   1637        << rn << write_back << ", " << registers;
   1638 }
   1639 
   1640 void Disassembler::ldmda(Condition cond,
   1641                          Register rn,
   1642                          WriteBack write_back,
   1643                          RegisterList registers) {
   1644   os().SetCurrentInstruction(kLdmda, kLoadStore | kLoadStoreMultiple);
   1645   os() << ToCString(kLdmda) << ConditionPrinter(it_block_, cond) << " " << rn
   1646        << write_back << ", " << registers;
   1647 }
   1648 
   1649 void Disassembler::ldmdb(Condition cond,
   1650                          Register rn,
   1651                          WriteBack write_back,
   1652                          RegisterList registers) {
   1653   os().SetCurrentInstruction(kLdmdb, kLoadStore | kLoadStoreMultiple);
   1654   os() << ToCString(kLdmdb) << ConditionPrinter(it_block_, cond) << " " << rn
   1655        << write_back << ", " << registers;
   1656 }
   1657 
   1658 void Disassembler::ldmea(Condition cond,
   1659                          Register rn,
   1660                          WriteBack write_back,
   1661                          RegisterList registers) {
   1662   os().SetCurrentInstruction(kLdmea, kLoadStore | kLoadStoreMultiple);
   1663   os() << ToCString(kLdmea) << ConditionPrinter(it_block_, cond) << " " << rn
   1664        << write_back << ", " << registers;
   1665 }
   1666 
   1667 void Disassembler::ldmed(Condition cond,
   1668                          Register rn,
   1669                          WriteBack write_back,
   1670                          RegisterList registers) {
   1671   os().SetCurrentInstruction(kLdmed, kLoadStore | kLoadStoreMultiple);
   1672   os() << ToCString(kLdmed) << ConditionPrinter(it_block_, cond) << " " << rn
   1673        << write_back << ", " << registers;
   1674 }
   1675 
   1676 void Disassembler::ldmfa(Condition cond,
   1677                          Register rn,
   1678                          WriteBack write_back,
   1679                          RegisterList registers) {
   1680   os().SetCurrentInstruction(kLdmfa, kLoadStore | kLoadStoreMultiple);
   1681   os() << ToCString(kLdmfa) << ConditionPrinter(it_block_, cond) << " " << rn
   1682        << write_back << ", " << registers;
   1683 }
   1684 
   1685 void Disassembler::ldmfd(Condition cond,
   1686                          EncodingSize size,
   1687                          Register rn,
   1688                          WriteBack write_back,
   1689                          RegisterList registers) {
   1690   os().SetCurrentInstruction(kLdmfd, kLoadStore | kLoadStoreMultiple);
   1691   os() << ToCString(kLdmfd) << ConditionPrinter(it_block_, cond) << size << " "
   1692        << rn << write_back << ", " << registers;
   1693 }
   1694 
   1695 void Disassembler::ldmib(Condition cond,
   1696                          Register rn,
   1697                          WriteBack write_back,
   1698                          RegisterList registers) {
   1699   os().SetCurrentInstruction(kLdmib, kLoadStore | kLoadStoreMultiple);
   1700   os() << ToCString(kLdmib) << ConditionPrinter(it_block_, cond) << " " << rn
   1701        << write_back << ", " << registers;
   1702 }
   1703 
   1704 void Disassembler::ldr(Condition cond,
   1705                        EncodingSize size,
   1706                        Register rt,
   1707                        const MemOperand& operand) {
   1708   os().SetCurrentInstruction(kLdr, kAddress | kLoadStore);
   1709   os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " "
   1710        << rt << ", " << PrintMemOperand(kLoadWordLocation, operand);
   1711 }
   1712 
   1713 void Disassembler::ldr(Condition cond,
   1714                        EncodingSize size,
   1715                        Register rt,
   1716                        Location* location) {
   1717   os().SetCurrentInstruction(kLdr, kAddress | kLoadStore);
   1718   os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " "
   1719        << rt << ", "
   1720        << PrintLabel(kLoadWordLocation, location, GetCodeAddress() & ~3);
   1721 }
   1722 
   1723 void Disassembler::ldrb(Condition cond,
   1724                         EncodingSize size,
   1725                         Register rt,
   1726                         const MemOperand& operand) {
   1727   os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore);
   1728   os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << size << " "
   1729        << rt << ", " << PrintMemOperand(kLoadByteLocation, operand);
   1730 }
   1731 
   1732 void Disassembler::ldrb(Condition cond, Register rt, Location* location) {
   1733   os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore);
   1734   os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << " " << rt
   1735        << ", "
   1736        << PrintLabel(kLoadByteLocation, location, GetCodeAddress() & ~3);
   1737 }
   1738 
   1739 void Disassembler::ldrd(Condition cond,
   1740                         Register rt,
   1741                         Register rt2,
   1742                         const MemOperand& operand) {
   1743   os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore);
   1744   os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt
   1745        << ", " << rt2 << ", "
   1746        << PrintMemOperand(kLoadDoubleWordLocation, operand);
   1747 }
   1748 
   1749 void Disassembler::ldrd(Condition cond,
   1750                         Register rt,
   1751                         Register rt2,
   1752                         Location* location) {
   1753   os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore);
   1754   os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt
   1755        << ", " << rt2 << ", "
   1756        << PrintLabel(kLoadDoubleWordLocation, location, GetCodeAddress() & ~3);
   1757 }
   1758 
   1759 void Disassembler::ldrex(Condition cond,
   1760                          Register rt,
   1761                          const MemOperand& operand) {
   1762   os().SetCurrentInstruction(kLdrex, kAddress | kLoadStore);
   1763   os() << ToCString(kLdrex) << ConditionPrinter(it_block_, cond) << " " << rt
   1764        << ", " << PrintMemOperand(kLoadWordLocation, operand);
   1765 }
   1766 
   1767 void Disassembler::ldrexb(Condition cond,
   1768                           Register rt,
   1769                           const MemOperand& operand) {
   1770   os().SetCurrentInstruction(kLdrexb, kAddress | kLoadStore);
   1771   os() << ToCString(kLdrexb) << ConditionPrinter(it_block_, cond) << " " << rt
   1772        << ", " << PrintMemOperand(kLoadByteLocation, operand);
   1773 }
   1774 
   1775 void Disassembler::ldrexd(Condition cond,
   1776                           Register rt,
   1777                           Register rt2,
   1778                           const MemOperand& operand) {
   1779   os().SetCurrentInstruction(kLdrexd, kAddress | kLoadStore);
   1780   os() << ToCString(kLdrexd) << ConditionPrinter(it_block_, cond) << " " << rt
   1781        << ", " << rt2 << ", "
   1782        << PrintMemOperand(kLoadDoubleWordLocation, operand);
   1783 }
   1784 
   1785 void Disassembler::ldrexh(Condition cond,
   1786                           Register rt,
   1787                           const MemOperand& operand) {
   1788   os().SetCurrentInstruction(kLdrexh, kAddress | kLoadStore);
   1789   os() << ToCString(kLdrexh) << ConditionPrinter(it_block_, cond) << " " << rt
   1790        << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
   1791 }
   1792 
   1793 void Disassembler::ldrh(Condition cond,
   1794                         EncodingSize size,
   1795                         Register rt,
   1796                         const MemOperand& operand) {
   1797   os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore);
   1798   os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << size << " "
   1799        << rt << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
   1800 }
   1801 
   1802 void Disassembler::ldrh(Condition cond, Register rt, Location* location) {
   1803   os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore);
   1804   os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << " " << rt
   1805        << ", "
   1806        << PrintLabel(kLoadHalfWordLocation, location, GetCodeAddress() & ~3);
   1807 }
   1808 
   1809 void Disassembler::ldrsb(Condition cond,
   1810                          EncodingSize size,
   1811                          Register rt,
   1812                          const MemOperand& operand) {
   1813   os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore);
   1814   os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << size << " "
   1815        << rt << ", " << PrintMemOperand(kLoadSignedByteLocation, operand);
   1816 }
   1817 
   1818 void Disassembler::ldrsb(Condition cond, Register rt, Location* location) {
   1819   os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore);
   1820   os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << " " << rt
   1821        << ", "
   1822        << PrintLabel(kLoadSignedByteLocation, location, GetCodeAddress() & ~3);
   1823 }
   1824 
   1825 void Disassembler::ldrsh(Condition cond,
   1826                          EncodingSize size,
   1827                          Register rt,
   1828                          const MemOperand& operand) {
   1829   os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore);
   1830   os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << size << " "
   1831        << rt << ", " << PrintMemOperand(kLoadSignedHalfWordLocation, operand);
   1832 }
   1833 
   1834 void Disassembler::ldrsh(Condition cond, Register rt, Location* location) {
   1835   os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore);
   1836   os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << " " << rt
   1837        << ", " << PrintLabel(kLoadSignedHalfWordLocation,
   1838                              location,
   1839                              GetCodeAddress() & ~3);
   1840 }
   1841 
   1842 void Disassembler::lsl(Condition cond,
   1843                        EncodingSize size,
   1844                        Register rd,
   1845                        Register rm,
   1846                        const Operand& operand) {
   1847   os().SetCurrentInstruction(kLsl, kShift);
   1848   os() << ToCString(kLsl) << ConditionPrinter(it_block_, cond) << size;
   1849   os() << " ";
   1850   if (!rd.Is(rm) || !use_short_hand_form_) {
   1851     os() << rd << ", ";
   1852   }
   1853   os() << rm << ", " << operand;
   1854 }
   1855 
   1856 void Disassembler::lsls(Condition cond,
   1857                         EncodingSize size,
   1858                         Register rd,
   1859                         Register rm,
   1860                         const Operand& operand) {
   1861   os().SetCurrentInstruction(kLsls, kShift);
   1862   os() << ToCString(kLsls) << ConditionPrinter(it_block_, cond) << size;
   1863   os() << " ";
   1864   if (!rd.Is(rm) || !use_short_hand_form_) {
   1865     os() << rd << ", ";
   1866   }
   1867   os() << rm << ", " << operand;
   1868 }
   1869 
   1870 void Disassembler::lsr(Condition cond,
   1871                        EncodingSize size,
   1872                        Register rd,
   1873                        Register rm,
   1874                        const Operand& operand) {
   1875   os().SetCurrentInstruction(kLsr, kShift);
   1876   os() << ToCString(kLsr) << ConditionPrinter(it_block_, cond) << size;
   1877   os() << " ";
   1878   if (!rd.Is(rm) || !use_short_hand_form_) {
   1879     os() << rd << ", ";
   1880   }
   1881   os() << rm << ", " << operand;
   1882 }
   1883 
   1884 void Disassembler::lsrs(Condition cond,
   1885                         EncodingSize size,
   1886                         Register rd,
   1887                         Register rm,
   1888                         const Operand& operand) {
   1889   os().SetCurrentInstruction(kLsrs, kShift);
   1890   os() << ToCString(kLsrs) << ConditionPrinter(it_block_, cond) << size;
   1891   os() << " ";
   1892   if (!rd.Is(rm) || !use_short_hand_form_) {
   1893     os() << rd << ", ";
   1894   }
   1895   os() << rm << ", " << operand;
   1896 }
   1897 
   1898 void Disassembler::mla(
   1899     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   1900   os().SetCurrentInstruction(kMla, kArithmetic);
   1901   os() << ToCString(kMla) << ConditionPrinter(it_block_, cond) << " " << rd
   1902        << ", " << rn << ", " << rm << ", " << ra;
   1903 }
   1904 
   1905 void Disassembler::mlas(
   1906     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   1907   os().SetCurrentInstruction(kMlas, kArithmetic);
   1908   os() << ToCString(kMlas) << ConditionPrinter(it_block_, cond) << " " << rd
   1909        << ", " << rn << ", " << rm << ", " << ra;
   1910 }
   1911 
   1912 void Disassembler::mls(
   1913     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   1914   os().SetCurrentInstruction(kMls, kArithmetic);
   1915   os() << ToCString(kMls) << ConditionPrinter(it_block_, cond) << " " << rd
   1916        << ", " << rn << ", " << rm << ", " << ra;
   1917 }
   1918 
   1919 void Disassembler::mov(Condition cond,
   1920                        EncodingSize size,
   1921                        Register rd,
   1922                        const Operand& operand) {
   1923   os().SetCurrentInstruction(kMov, kNoAttribute);
   1924   os() << ToCString(kMov) << ConditionPrinter(it_block_, cond) << size << " "
   1925        << rd << ", " << operand;
   1926 }
   1927 
   1928 void Disassembler::movs(Condition cond,
   1929                         EncodingSize size,
   1930                         Register rd,
   1931                         const Operand& operand) {
   1932   os().SetCurrentInstruction(kMovs, kNoAttribute);
   1933   os() << ToCString(kMovs) << ConditionPrinter(it_block_, cond) << size << " "
   1934        << rd << ", " << operand;
   1935 }
   1936 
   1937 void Disassembler::movt(Condition cond, Register rd, const Operand& operand) {
   1938   os().SetCurrentInstruction(kMovt, kNoAttribute);
   1939   os() << ToCString(kMovt) << ConditionPrinter(it_block_, cond) << " " << rd
   1940        << ", " << operand;
   1941 }
   1942 
   1943 void Disassembler::movw(Condition cond, Register rd, const Operand& operand) {
   1944   os().SetCurrentInstruction(kMovw, kNoAttribute);
   1945   os() << ToCString(kMovw) << ConditionPrinter(it_block_, cond) << " " << rd
   1946        << ", " << operand;
   1947 }
   1948 
   1949 void Disassembler::mrs(Condition cond, Register rd, SpecialRegister spec_reg) {
   1950   os().SetCurrentInstruction(kMrs, kNoAttribute);
   1951   os() << ToCString(kMrs) << ConditionPrinter(it_block_, cond) << " " << rd
   1952        << ", " << spec_reg;
   1953 }
   1954 
   1955 void Disassembler::msr(Condition cond,
   1956                        MaskedSpecialRegister spec_reg,
   1957                        const Operand& operand) {
   1958   os().SetCurrentInstruction(kMsr, kNoAttribute);
   1959   os() << ToCString(kMsr) << ConditionPrinter(it_block_, cond) << " "
   1960        << spec_reg << ", " << operand;
   1961 }
   1962 
   1963 void Disassembler::mul(
   1964     Condition cond, EncodingSize size, Register rd, Register rn, Register rm) {
   1965   os().SetCurrentInstruction(kMul, kArithmetic);
   1966   os() << ToCString(kMul) << ConditionPrinter(it_block_, cond) << size << " "
   1967        << rd << ", " << rn << ", " << rm;
   1968 }
   1969 
   1970 void Disassembler::muls(Condition cond, Register rd, Register rn, Register rm) {
   1971   os().SetCurrentInstruction(kMuls, kArithmetic);
   1972   os() << ToCString(kMuls) << ConditionPrinter(it_block_, cond) << " " << rd
   1973        << ", " << rn << ", " << rm;
   1974 }
   1975 
   1976 void Disassembler::mvn(Condition cond,
   1977                        EncodingSize size,
   1978                        Register rd,
   1979                        const Operand& operand) {
   1980   os().SetCurrentInstruction(kMvn, kNoAttribute);
   1981   os() << ToCString(kMvn) << ConditionPrinter(it_block_, cond) << size << " "
   1982        << rd << ", " << operand;
   1983 }
   1984 
   1985 void Disassembler::mvns(Condition cond,
   1986                         EncodingSize size,
   1987                         Register rd,
   1988                         const Operand& operand) {
   1989   os().SetCurrentInstruction(kMvns, kNoAttribute);
   1990   os() << ToCString(kMvns) << ConditionPrinter(it_block_, cond) << size << " "
   1991        << rd << ", " << operand;
   1992 }
   1993 
   1994 void Disassembler::nop(Condition cond, EncodingSize size) {
   1995   os().SetCurrentInstruction(kNop, kNoAttribute);
   1996   os() << ToCString(kNop) << ConditionPrinter(it_block_, cond) << size;
   1997 }
   1998 
   1999 void Disassembler::orn(Condition cond,
   2000                        Register rd,
   2001                        Register rn,
   2002                        const Operand& operand) {
   2003   os().SetCurrentInstruction(kOrn, kBitwise);
   2004   os() << ToCString(kOrn) << ConditionPrinter(it_block_, cond);
   2005   os() << " ";
   2006   if (!rd.Is(rn) || !use_short_hand_form_) {
   2007     os() << rd << ", ";
   2008   }
   2009   os() << rn << ", " << operand;
   2010 }
   2011 
   2012 void Disassembler::orns(Condition cond,
   2013                         Register rd,
   2014                         Register rn,
   2015                         const Operand& operand) {
   2016   os().SetCurrentInstruction(kOrns, kBitwise);
   2017   os() << ToCString(kOrns) << ConditionPrinter(it_block_, cond);
   2018   os() << " ";
   2019   if (!rd.Is(rn) || !use_short_hand_form_) {
   2020     os() << rd << ", ";
   2021   }
   2022   os() << rn << ", " << operand;
   2023 }
   2024 
   2025 void Disassembler::orr(Condition cond,
   2026                        EncodingSize size,
   2027                        Register rd,
   2028                        Register rn,
   2029                        const Operand& operand) {
   2030   os().SetCurrentInstruction(kOrr, kBitwise);
   2031   os() << ToCString(kOrr) << ConditionPrinter(it_block_, cond) << size;
   2032   os() << " ";
   2033   if (!rd.Is(rn) || !use_short_hand_form_) {
   2034     os() << rd << ", ";
   2035   }
   2036   os() << rn << ", " << operand;
   2037 }
   2038 
   2039 void Disassembler::orrs(Condition cond,
   2040                         EncodingSize size,
   2041                         Register rd,
   2042                         Register rn,
   2043                         const Operand& operand) {
   2044   os().SetCurrentInstruction(kOrrs, kBitwise);
   2045   os() << ToCString(kOrrs) << ConditionPrinter(it_block_, cond) << size;
   2046   os() << " ";
   2047   if (!rd.Is(rn) || !use_short_hand_form_) {
   2048     os() << rd << ", ";
   2049   }
   2050   os() << rn << ", " << operand;
   2051 }
   2052 
   2053 void Disassembler::pkhbt(Condition cond,
   2054                          Register rd,
   2055                          Register rn,
   2056                          const Operand& operand) {
   2057   os().SetCurrentInstruction(kPkhbt, kNoAttribute);
   2058   os() << ToCString(kPkhbt) << ConditionPrinter(it_block_, cond);
   2059   os() << " ";
   2060   if (!rd.Is(rn) || !use_short_hand_form_) {
   2061     os() << rd << ", ";
   2062   }
   2063   os() << rn << ", " << operand;
   2064 }
   2065 
   2066 void Disassembler::pkhtb(Condition cond,
   2067                          Register rd,
   2068                          Register rn,
   2069                          const Operand& operand) {
   2070   os().SetCurrentInstruction(kPkhtb, kNoAttribute);
   2071   os() << ToCString(kPkhtb) << ConditionPrinter(it_block_, cond);
   2072   os() << " ";
   2073   if (!rd.Is(rn) || !use_short_hand_form_) {
   2074     os() << rd << ", ";
   2075   }
   2076   os() << rn << ", " << operand;
   2077 }
   2078 
   2079 void Disassembler::pld(Condition cond, Location* location) {
   2080   os().SetCurrentInstruction(kPld, kAddress);
   2081   os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " "
   2082        << PrintLabel(kDataLocation, location, GetCodeAddress() & ~3);
   2083 }
   2084 
   2085 void Disassembler::pld(Condition cond, const MemOperand& operand) {
   2086   os().SetCurrentInstruction(kPld, kAddress);
   2087   os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " "
   2088        << PrintMemOperand(kDataLocation, operand);
   2089 }
   2090 
   2091 void Disassembler::pldw(Condition cond, const MemOperand& operand) {
   2092   os().SetCurrentInstruction(kPldw, kAddress);
   2093   os() << ToCString(kPldw) << ConditionPrinter(it_block_, cond) << " "
   2094        << PrintMemOperand(kDataLocation, operand);
   2095 }
   2096 
   2097 void Disassembler::pli(Condition cond, const MemOperand& operand) {
   2098   os().SetCurrentInstruction(kPli, kAddress);
   2099   os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " "
   2100        << PrintMemOperand(kCodeLocation, operand);
   2101 }
   2102 
   2103 void Disassembler::pli(Condition cond, Location* location) {
   2104   os().SetCurrentInstruction(kPli, kAddress);
   2105   os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " "
   2106        << PrintLabel(kCodeLocation, location, GetCodeAddress() & ~3);
   2107 }
   2108 
   2109 void Disassembler::pop(Condition cond,
   2110                        EncodingSize size,
   2111                        RegisterList registers) {
   2112   os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple);
   2113   os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " "
   2114        << registers;
   2115 }
   2116 
   2117 void Disassembler::pop(Condition cond, EncodingSize size, Register rt) {
   2118   os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple);
   2119   os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " "
   2120        << "{" << rt << "}";
   2121 }
   2122 
   2123 void Disassembler::push(Condition cond,
   2124                         EncodingSize size,
   2125                         RegisterList registers) {
   2126   os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple);
   2127   os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " "
   2128        << registers;
   2129 }
   2130 
   2131 void Disassembler::push(Condition cond, EncodingSize size, Register rt) {
   2132   os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple);
   2133   os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " "
   2134        << "{" << rt << "}";
   2135 }
   2136 
   2137 void Disassembler::qadd(Condition cond, Register rd, Register rm, Register rn) {
   2138   os().SetCurrentInstruction(kQadd, kArithmetic);
   2139   os() << ToCString(kQadd) << ConditionPrinter(it_block_, cond);
   2140   os() << " ";
   2141   if (!rd.Is(rm) || !use_short_hand_form_) {
   2142     os() << rd << ", ";
   2143   }
   2144   os() << rm << ", " << rn;
   2145 }
   2146 
   2147 void Disassembler::qadd16(Condition cond,
   2148                           Register rd,
   2149                           Register rn,
   2150                           Register rm) {
   2151   os().SetCurrentInstruction(kQadd16, kArithmetic);
   2152   os() << ToCString(kQadd16) << ConditionPrinter(it_block_, cond);
   2153   os() << " ";
   2154   if (!rd.Is(rn) || !use_short_hand_form_) {
   2155     os() << rd << ", ";
   2156   }
   2157   os() << rn << ", " << rm;
   2158 }
   2159 
   2160 void Disassembler::qadd8(Condition cond,
   2161                          Register rd,
   2162                          Register rn,
   2163                          Register rm) {
   2164   os().SetCurrentInstruction(kQadd8, kArithmetic);
   2165   os() << ToCString(kQadd8) << ConditionPrinter(it_block_, cond);
   2166   os() << " ";
   2167   if (!rd.Is(rn) || !use_short_hand_form_) {
   2168     os() << rd << ", ";
   2169   }
   2170   os() << rn << ", " << rm;
   2171 }
   2172 
   2173 void Disassembler::qasx(Condition cond, Register rd, Register rn, Register rm) {
   2174   os().SetCurrentInstruction(kQasx, kArithmetic);
   2175   os() << ToCString(kQasx) << ConditionPrinter(it_block_, cond);
   2176   os() << " ";
   2177   if (!rd.Is(rn) || !use_short_hand_form_) {
   2178     os() << rd << ", ";
   2179   }
   2180   os() << rn << ", " << rm;
   2181 }
   2182 
   2183 void Disassembler::qdadd(Condition cond,
   2184                          Register rd,
   2185                          Register rm,
   2186                          Register rn) {
   2187   os().SetCurrentInstruction(kQdadd, kArithmetic);
   2188   os() << ToCString(kQdadd) << ConditionPrinter(it_block_, cond);
   2189   os() << " ";
   2190   if (!rd.Is(rm) || !use_short_hand_form_) {
   2191     os() << rd << ", ";
   2192   }
   2193   os() << rm << ", " << rn;
   2194 }
   2195 
   2196 void Disassembler::qdsub(Condition cond,
   2197                          Register rd,
   2198                          Register rm,
   2199                          Register rn) {
   2200   os().SetCurrentInstruction(kQdsub, kArithmetic);
   2201   os() << ToCString(kQdsub) << ConditionPrinter(it_block_, cond);
   2202   os() << " ";
   2203   if (!rd.Is(rm) || !use_short_hand_form_) {
   2204     os() << rd << ", ";
   2205   }
   2206   os() << rm << ", " << rn;
   2207 }
   2208 
   2209 void Disassembler::qsax(Condition cond, Register rd, Register rn, Register rm) {
   2210   os().SetCurrentInstruction(kQsax, kArithmetic);
   2211   os() << ToCString(kQsax) << ConditionPrinter(it_block_, cond);
   2212   os() << " ";
   2213   if (!rd.Is(rn) || !use_short_hand_form_) {
   2214     os() << rd << ", ";
   2215   }
   2216   os() << rn << ", " << rm;
   2217 }
   2218 
   2219 void Disassembler::qsub(Condition cond, Register rd, Register rm, Register rn) {
   2220   os().SetCurrentInstruction(kQsub, kArithmetic);
   2221   os() << ToCString(kQsub) << ConditionPrinter(it_block_, cond);
   2222   os() << " ";
   2223   if (!rd.Is(rm) || !use_short_hand_form_) {
   2224     os() << rd << ", ";
   2225   }
   2226   os() << rm << ", " << rn;
   2227 }
   2228 
   2229 void Disassembler::qsub16(Condition cond,
   2230                           Register rd,
   2231                           Register rn,
   2232                           Register rm) {
   2233   os().SetCurrentInstruction(kQsub16, kArithmetic);
   2234   os() << ToCString(kQsub16) << ConditionPrinter(it_block_, cond);
   2235   os() << " ";
   2236   if (!rd.Is(rn) || !use_short_hand_form_) {
   2237     os() << rd << ", ";
   2238   }
   2239   os() << rn << ", " << rm;
   2240 }
   2241 
   2242 void Disassembler::qsub8(Condition cond,
   2243                          Register rd,
   2244                          Register rn,
   2245                          Register rm) {
   2246   os().SetCurrentInstruction(kQsub8, kArithmetic);
   2247   os() << ToCString(kQsub8) << ConditionPrinter(it_block_, cond);
   2248   os() << " ";
   2249   if (!rd.Is(rn) || !use_short_hand_form_) {
   2250     os() << rd << ", ";
   2251   }
   2252   os() << rn << ", " << rm;
   2253 }
   2254 
   2255 void Disassembler::rbit(Condition cond, Register rd, Register rm) {
   2256   os().SetCurrentInstruction(kRbit, kNoAttribute);
   2257   os() << ToCString(kRbit) << ConditionPrinter(it_block_, cond) << " " << rd
   2258        << ", " << rm;
   2259 }
   2260 
   2261 void Disassembler::rev(Condition cond,
   2262                        EncodingSize size,
   2263                        Register rd,
   2264                        Register rm) {
   2265   os().SetCurrentInstruction(kRev, kNoAttribute);
   2266   os() << ToCString(kRev) << ConditionPrinter(it_block_, cond) << size << " "
   2267        << rd << ", " << rm;
   2268 }
   2269 
   2270 void Disassembler::rev16(Condition cond,
   2271                          EncodingSize size,
   2272                          Register rd,
   2273                          Register rm) {
   2274   os().SetCurrentInstruction(kRev16, kNoAttribute);
   2275   os() << ToCString(kRev16) << ConditionPrinter(it_block_, cond) << size << " "
   2276        << rd << ", " << rm;
   2277 }
   2278 
   2279 void Disassembler::revsh(Condition cond,
   2280                          EncodingSize size,
   2281                          Register rd,
   2282                          Register rm) {
   2283   os().SetCurrentInstruction(kRevsh, kNoAttribute);
   2284   os() << ToCString(kRevsh) << ConditionPrinter(it_block_, cond) << size << " "
   2285        << rd << ", " << rm;
   2286 }
   2287 
   2288 void Disassembler::ror(Condition cond,
   2289                        EncodingSize size,
   2290                        Register rd,
   2291                        Register rm,
   2292                        const Operand& operand) {
   2293   os().SetCurrentInstruction(kRor, kShift);
   2294   os() << ToCString(kRor) << ConditionPrinter(it_block_, cond) << size;
   2295   os() << " ";
   2296   if (!rd.Is(rm) || !use_short_hand_form_) {
   2297     os() << rd << ", ";
   2298   }
   2299   os() << rm << ", " << operand;
   2300 }
   2301 
   2302 void Disassembler::rors(Condition cond,
   2303                         EncodingSize size,
   2304                         Register rd,
   2305                         Register rm,
   2306                         const Operand& operand) {
   2307   os().SetCurrentInstruction(kRors, kShift);
   2308   os() << ToCString(kRors) << ConditionPrinter(it_block_, cond) << size;
   2309   os() << " ";
   2310   if (!rd.Is(rm) || !use_short_hand_form_) {
   2311     os() << rd << ", ";
   2312   }
   2313   os() << rm << ", " << operand;
   2314 }
   2315 
   2316 void Disassembler::rrx(Condition cond, Register rd, Register rm) {
   2317   os().SetCurrentInstruction(kRrx, kShift);
   2318   os() << ToCString(kRrx) << ConditionPrinter(it_block_, cond);
   2319   os() << " ";
   2320   if (!rd.Is(rm) || !use_short_hand_form_) {
   2321     os() << rd << ", ";
   2322   }
   2323   os() << rm;
   2324 }
   2325 
   2326 void Disassembler::rrxs(Condition cond, Register rd, Register rm) {
   2327   os().SetCurrentInstruction(kRrxs, kShift);
   2328   os() << ToCString(kRrxs) << ConditionPrinter(it_block_, cond);
   2329   os() << " ";
   2330   if (!rd.Is(rm) || !use_short_hand_form_) {
   2331     os() << rd << ", ";
   2332   }
   2333   os() << rm;
   2334 }
   2335 
   2336 void Disassembler::rsb(Condition cond,
   2337                        EncodingSize size,
   2338                        Register rd,
   2339                        Register rn,
   2340                        const Operand& operand) {
   2341   os().SetCurrentInstruction(kRsb, kArithmetic);
   2342   os() << ToCString(kRsb) << ConditionPrinter(it_block_, cond) << size;
   2343   os() << " ";
   2344   if (!rd.Is(rn) || !use_short_hand_form_) {
   2345     os() << rd << ", ";
   2346   }
   2347   os() << rn << ", " << operand;
   2348 }
   2349 
   2350 void Disassembler::rsbs(Condition cond,
   2351                         EncodingSize size,
   2352                         Register rd,
   2353                         Register rn,
   2354                         const Operand& operand) {
   2355   os().SetCurrentInstruction(kRsbs, kArithmetic);
   2356   os() << ToCString(kRsbs) << ConditionPrinter(it_block_, cond) << size;
   2357   os() << " ";
   2358   if (!rd.Is(rn) || !use_short_hand_form_) {
   2359     os() << rd << ", ";
   2360   }
   2361   os() << rn << ", " << operand;
   2362 }
   2363 
   2364 void Disassembler::rsc(Condition cond,
   2365                        Register rd,
   2366                        Register rn,
   2367                        const Operand& operand) {
   2368   os().SetCurrentInstruction(kRsc, kArithmetic);
   2369   os() << ToCString(kRsc) << ConditionPrinter(it_block_, cond);
   2370   os() << " ";
   2371   if (!rd.Is(rn) || !use_short_hand_form_) {
   2372     os() << rd << ", ";
   2373   }
   2374   os() << rn << ", " << operand;
   2375 }
   2376 
   2377 void Disassembler::rscs(Condition cond,
   2378                         Register rd,
   2379                         Register rn,
   2380                         const Operand& operand) {
   2381   os().SetCurrentInstruction(kRscs, kArithmetic);
   2382   os() << ToCString(kRscs) << ConditionPrinter(it_block_, cond);
   2383   os() << " ";
   2384   if (!rd.Is(rn) || !use_short_hand_form_) {
   2385     os() << rd << ", ";
   2386   }
   2387   os() << rn << ", " << operand;
   2388 }
   2389 
   2390 void Disassembler::sadd16(Condition cond,
   2391                           Register rd,
   2392                           Register rn,
   2393                           Register rm) {
   2394   os().SetCurrentInstruction(kSadd16, kArithmetic);
   2395   os() << ToCString(kSadd16) << ConditionPrinter(it_block_, cond);
   2396   os() << " ";
   2397   if (!rd.Is(rn) || !use_short_hand_form_) {
   2398     os() << rd << ", ";
   2399   }
   2400   os() << rn << ", " << rm;
   2401 }
   2402 
   2403 void Disassembler::sadd8(Condition cond,
   2404                          Register rd,
   2405                          Register rn,
   2406                          Register rm) {
   2407   os().SetCurrentInstruction(kSadd8, kArithmetic);
   2408   os() << ToCString(kSadd8) << ConditionPrinter(it_block_, cond);
   2409   os() << " ";
   2410   if (!rd.Is(rn) || !use_short_hand_form_) {
   2411     os() << rd << ", ";
   2412   }
   2413   os() << rn << ", " << rm;
   2414 }
   2415 
   2416 void Disassembler::sasx(Condition cond, Register rd, Register rn, Register rm) {
   2417   os().SetCurrentInstruction(kSasx, kArithmetic);
   2418   os() << ToCString(kSasx) << ConditionPrinter(it_block_, cond);
   2419   os() << " ";
   2420   if (!rd.Is(rn) || !use_short_hand_form_) {
   2421     os() << rd << ", ";
   2422   }
   2423   os() << rn << ", " << rm;
   2424 }
   2425 
   2426 void Disassembler::sbc(Condition cond,
   2427                        EncodingSize size,
   2428                        Register rd,
   2429                        Register rn,
   2430                        const Operand& operand) {
   2431   os().SetCurrentInstruction(kSbc, kArithmetic);
   2432   os() << ToCString(kSbc) << ConditionPrinter(it_block_, cond) << size;
   2433   os() << " ";
   2434   if (!rd.Is(rn) || !use_short_hand_form_) {
   2435     os() << rd << ", ";
   2436   }
   2437   os() << rn << ", " << operand;
   2438 }
   2439 
   2440 void Disassembler::sbcs(Condition cond,
   2441                         EncodingSize size,
   2442                         Register rd,
   2443                         Register rn,
   2444                         const Operand& operand) {
   2445   os().SetCurrentInstruction(kSbcs, kArithmetic);
   2446   os() << ToCString(kSbcs) << ConditionPrinter(it_block_, cond) << size;
   2447   os() << " ";
   2448   if (!rd.Is(rn) || !use_short_hand_form_) {
   2449     os() << rd << ", ";
   2450   }
   2451   os() << rn << ", " << operand;
   2452 }
   2453 
   2454 void Disassembler::sbfx(
   2455     Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
   2456   os().SetCurrentInstruction(kSbfx, kShift);
   2457   os() << ToCString(kSbfx) << ConditionPrinter(it_block_, cond) << " " << rd
   2458        << ", " << rn << ", " << ImmediatePrinter(lsb) << ", "
   2459        << ImmediatePrinter(width);
   2460 }
   2461 
   2462 void Disassembler::sdiv(Condition cond, Register rd, Register rn, Register rm) {
   2463   os().SetCurrentInstruction(kSdiv, kArithmetic);
   2464   os() << ToCString(kSdiv) << ConditionPrinter(it_block_, cond);
   2465   os() << " ";
   2466   if (!rd.Is(rn) || !use_short_hand_form_) {
   2467     os() << rd << ", ";
   2468   }
   2469   os() << rn << ", " << rm;
   2470 }
   2471 
   2472 void Disassembler::sel(Condition cond, Register rd, Register rn, Register rm) {
   2473   os().SetCurrentInstruction(kSel, kNoAttribute);
   2474   os() << ToCString(kSel) << ConditionPrinter(it_block_, cond);
   2475   os() << " ";
   2476   if (!rd.Is(rn) || !use_short_hand_form_) {
   2477     os() << rd << ", ";
   2478   }
   2479   os() << rn << ", " << rm;
   2480 }
   2481 
   2482 void Disassembler::shadd16(Condition cond,
   2483                            Register rd,
   2484                            Register rn,
   2485                            Register rm) {
   2486   os().SetCurrentInstruction(kShadd16, kArithmetic);
   2487   os() << ToCString(kShadd16) << ConditionPrinter(it_block_, cond);
   2488   os() << " ";
   2489   if (!rd.Is(rn) || !use_short_hand_form_) {
   2490     os() << rd << ", ";
   2491   }
   2492   os() << rn << ", " << rm;
   2493 }
   2494 
   2495 void Disassembler::shadd8(Condition cond,
   2496                           Register rd,
   2497                           Register rn,
   2498                           Register rm) {
   2499   os().SetCurrentInstruction(kShadd8, kArithmetic);
   2500   os() << ToCString(kShadd8) << ConditionPrinter(it_block_, cond);
   2501   os() << " ";
   2502   if (!rd.Is(rn) || !use_short_hand_form_) {
   2503     os() << rd << ", ";
   2504   }
   2505   os() << rn << ", " << rm;
   2506 }
   2507 
   2508 void Disassembler::shasx(Condition cond,
   2509                          Register rd,
   2510                          Register rn,
   2511                          Register rm) {
   2512   os().SetCurrentInstruction(kShasx, kArithmetic);
   2513   os() << ToCString(kShasx) << ConditionPrinter(it_block_, cond);
   2514   os() << " ";
   2515   if (!rd.Is(rn) || !use_short_hand_form_) {
   2516     os() << rd << ", ";
   2517   }
   2518   os() << rn << ", " << rm;
   2519 }
   2520 
   2521 void Disassembler::shsax(Condition cond,
   2522                          Register rd,
   2523                          Register rn,
   2524                          Register rm) {
   2525   os().SetCurrentInstruction(kShsax, kArithmetic);
   2526   os() << ToCString(kShsax) << ConditionPrinter(it_block_, cond);
   2527   os() << " ";
   2528   if (!rd.Is(rn) || !use_short_hand_form_) {
   2529     os() << rd << ", ";
   2530   }
   2531   os() << rn << ", " << rm;
   2532 }
   2533 
   2534 void Disassembler::shsub16(Condition cond,
   2535                            Register rd,
   2536                            Register rn,
   2537                            Register rm) {
   2538   os().SetCurrentInstruction(kShsub16, kArithmetic);
   2539   os() << ToCString(kShsub16) << ConditionPrinter(it_block_, cond);
   2540   os() << " ";
   2541   if (!rd.Is(rn) || !use_short_hand_form_) {
   2542     os() << rd << ", ";
   2543   }
   2544   os() << rn << ", " << rm;
   2545 }
   2546 
   2547 void Disassembler::shsub8(Condition cond,
   2548                           Register rd,
   2549                           Register rn,
   2550                           Register rm) {
   2551   os().SetCurrentInstruction(kShsub8, kArithmetic);
   2552   os() << ToCString(kShsub8) << ConditionPrinter(it_block_, cond);
   2553   os() << " ";
   2554   if (!rd.Is(rn) || !use_short_hand_form_) {
   2555     os() << rd << ", ";
   2556   }
   2557   os() << rn << ", " << rm;
   2558 }
   2559 
   2560 void Disassembler::smlabb(
   2561     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2562   os().SetCurrentInstruction(kSmlabb, kArithmetic);
   2563   os() << ToCString(kSmlabb) << ConditionPrinter(it_block_, cond) << " " << rd
   2564        << ", " << rn << ", " << rm << ", " << ra;
   2565 }
   2566 
   2567 void Disassembler::smlabt(
   2568     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2569   os().SetCurrentInstruction(kSmlabt, kArithmetic);
   2570   os() << ToCString(kSmlabt) << ConditionPrinter(it_block_, cond) << " " << rd
   2571        << ", " << rn << ", " << rm << ", " << ra;
   2572 }
   2573 
   2574 void Disassembler::smlad(
   2575     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2576   os().SetCurrentInstruction(kSmlad, kArithmetic);
   2577   os() << ToCString(kSmlad) << ConditionPrinter(it_block_, cond) << " " << rd
   2578        << ", " << rn << ", " << rm << ", " << ra;
   2579 }
   2580 
   2581 void Disassembler::smladx(
   2582     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2583   os().SetCurrentInstruction(kSmladx, kArithmetic);
   2584   os() << ToCString(kSmladx) << ConditionPrinter(it_block_, cond) << " " << rd
   2585        << ", " << rn << ", " << rm << ", " << ra;
   2586 }
   2587 
   2588 void Disassembler::smlal(
   2589     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2590   os().SetCurrentInstruction(kSmlal, kArithmetic);
   2591   os() << ToCString(kSmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2592        << ", " << rdhi << ", " << rn << ", " << rm;
   2593 }
   2594 
   2595 void Disassembler::smlalbb(
   2596     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2597   os().SetCurrentInstruction(kSmlalbb, kArithmetic);
   2598   os() << ToCString(kSmlalbb) << ConditionPrinter(it_block_, cond) << " "
   2599        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2600 }
   2601 
   2602 void Disassembler::smlalbt(
   2603     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2604   os().SetCurrentInstruction(kSmlalbt, kArithmetic);
   2605   os() << ToCString(kSmlalbt) << ConditionPrinter(it_block_, cond) << " "
   2606        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2607 }
   2608 
   2609 void Disassembler::smlald(
   2610     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2611   os().SetCurrentInstruction(kSmlald, kArithmetic);
   2612   os() << ToCString(kSmlald) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2613        << ", " << rdhi << ", " << rn << ", " << rm;
   2614 }
   2615 
   2616 void Disassembler::smlaldx(
   2617     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2618   os().SetCurrentInstruction(kSmlaldx, kArithmetic);
   2619   os() << ToCString(kSmlaldx) << ConditionPrinter(it_block_, cond) << " "
   2620        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2621 }
   2622 
   2623 void Disassembler::smlals(
   2624     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2625   os().SetCurrentInstruction(kSmlals, kArithmetic);
   2626   os() << ToCString(kSmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2627        << ", " << rdhi << ", " << rn << ", " << rm;
   2628 }
   2629 
   2630 void Disassembler::smlaltb(
   2631     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2632   os().SetCurrentInstruction(kSmlaltb, kArithmetic);
   2633   os() << ToCString(kSmlaltb) << ConditionPrinter(it_block_, cond) << " "
   2634        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2635 }
   2636 
   2637 void Disassembler::smlaltt(
   2638     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2639   os().SetCurrentInstruction(kSmlaltt, kArithmetic);
   2640   os() << ToCString(kSmlaltt) << ConditionPrinter(it_block_, cond) << " "
   2641        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2642 }
   2643 
   2644 void Disassembler::smlatb(
   2645     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2646   os().SetCurrentInstruction(kSmlatb, kArithmetic);
   2647   os() << ToCString(kSmlatb) << ConditionPrinter(it_block_, cond) << " " << rd
   2648        << ", " << rn << ", " << rm << ", " << ra;
   2649 }
   2650 
   2651 void Disassembler::smlatt(
   2652     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2653   os().SetCurrentInstruction(kSmlatt, kArithmetic);
   2654   os() << ToCString(kSmlatt) << ConditionPrinter(it_block_, cond) << " " << rd
   2655        << ", " << rn << ", " << rm << ", " << ra;
   2656 }
   2657 
   2658 void Disassembler::smlawb(
   2659     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2660   os().SetCurrentInstruction(kSmlawb, kArithmetic);
   2661   os() << ToCString(kSmlawb) << ConditionPrinter(it_block_, cond) << " " << rd
   2662        << ", " << rn << ", " << rm << ", " << ra;
   2663 }
   2664 
   2665 void Disassembler::smlawt(
   2666     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2667   os().SetCurrentInstruction(kSmlawt, kArithmetic);
   2668   os() << ToCString(kSmlawt) << ConditionPrinter(it_block_, cond) << " " << rd
   2669        << ", " << rn << ", " << rm << ", " << ra;
   2670 }
   2671 
   2672 void Disassembler::smlsd(
   2673     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2674   os().SetCurrentInstruction(kSmlsd, kArithmetic);
   2675   os() << ToCString(kSmlsd) << ConditionPrinter(it_block_, cond) << " " << rd
   2676        << ", " << rn << ", " << rm << ", " << ra;
   2677 }
   2678 
   2679 void Disassembler::smlsdx(
   2680     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2681   os().SetCurrentInstruction(kSmlsdx, kArithmetic);
   2682   os() << ToCString(kSmlsdx) << ConditionPrinter(it_block_, cond) << " " << rd
   2683        << ", " << rn << ", " << rm << ", " << ra;
   2684 }
   2685 
   2686 void Disassembler::smlsld(
   2687     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2688   os().SetCurrentInstruction(kSmlsld, kArithmetic);
   2689   os() << ToCString(kSmlsld) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2690        << ", " << rdhi << ", " << rn << ", " << rm;
   2691 }
   2692 
   2693 void Disassembler::smlsldx(
   2694     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2695   os().SetCurrentInstruction(kSmlsldx, kArithmetic);
   2696   os() << ToCString(kSmlsldx) << ConditionPrinter(it_block_, cond) << " "
   2697        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2698 }
   2699 
   2700 void Disassembler::smmla(
   2701     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2702   os().SetCurrentInstruction(kSmmla, kArithmetic);
   2703   os() << ToCString(kSmmla) << ConditionPrinter(it_block_, cond) << " " << rd
   2704        << ", " << rn << ", " << rm << ", " << ra;
   2705 }
   2706 
   2707 void Disassembler::smmlar(
   2708     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2709   os().SetCurrentInstruction(kSmmlar, kArithmetic);
   2710   os() << ToCString(kSmmlar) << ConditionPrinter(it_block_, cond) << " " << rd
   2711        << ", " << rn << ", " << rm << ", " << ra;
   2712 }
   2713 
   2714 void Disassembler::smmls(
   2715     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2716   os().SetCurrentInstruction(kSmmls, kArithmetic);
   2717   os() << ToCString(kSmmls) << ConditionPrinter(it_block_, cond) << " " << rd
   2718        << ", " << rn << ", " << rm << ", " << ra;
   2719 }
   2720 
   2721 void Disassembler::smmlsr(
   2722     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2723   os().SetCurrentInstruction(kSmmlsr, kArithmetic);
   2724   os() << ToCString(kSmmlsr) << ConditionPrinter(it_block_, cond) << " " << rd
   2725        << ", " << rn << ", " << rm << ", " << ra;
   2726 }
   2727 
   2728 void Disassembler::smmul(Condition cond,
   2729                          Register rd,
   2730                          Register rn,
   2731                          Register rm) {
   2732   os().SetCurrentInstruction(kSmmul, kArithmetic);
   2733   os() << ToCString(kSmmul) << ConditionPrinter(it_block_, cond);
   2734   os() << " ";
   2735   if (!rd.Is(rn) || !use_short_hand_form_) {
   2736     os() << rd << ", ";
   2737   }
   2738   os() << rn << ", " << rm;
   2739 }
   2740 
   2741 void Disassembler::smmulr(Condition cond,
   2742                           Register rd,
   2743                           Register rn,
   2744                           Register rm) {
   2745   os().SetCurrentInstruction(kSmmulr, kArithmetic);
   2746   os() << ToCString(kSmmulr) << ConditionPrinter(it_block_, cond);
   2747   os() << " ";
   2748   if (!rd.Is(rn) || !use_short_hand_form_) {
   2749     os() << rd << ", ";
   2750   }
   2751   os() << rn << ", " << rm;
   2752 }
   2753 
   2754 void Disassembler::smuad(Condition cond,
   2755                          Register rd,
   2756                          Register rn,
   2757                          Register rm) {
   2758   os().SetCurrentInstruction(kSmuad, kArithmetic);
   2759   os() << ToCString(kSmuad) << ConditionPrinter(it_block_, cond);
   2760   os() << " ";
   2761   if (!rd.Is(rn) || !use_short_hand_form_) {
   2762     os() << rd << ", ";
   2763   }
   2764   os() << rn << ", " << rm;
   2765 }
   2766 
   2767 void Disassembler::smuadx(Condition cond,
   2768                           Register rd,
   2769                           Register rn,
   2770                           Register rm) {
   2771   os().SetCurrentInstruction(kSmuadx, kArithmetic);
   2772   os() << ToCString(kSmuadx) << ConditionPrinter(it_block_, cond);
   2773   os() << " ";
   2774   if (!rd.Is(rn) || !use_short_hand_form_) {
   2775     os() << rd << ", ";
   2776   }
   2777   os() << rn << ", " << rm;
   2778 }
   2779 
   2780 void Disassembler::smulbb(Condition cond,
   2781                           Register rd,
   2782                           Register rn,
   2783                           Register rm) {
   2784   os().SetCurrentInstruction(kSmulbb, kArithmetic);
   2785   os() << ToCString(kSmulbb) << ConditionPrinter(it_block_, cond);
   2786   os() << " ";
   2787   if (!rd.Is(rn) || !use_short_hand_form_) {
   2788     os() << rd << ", ";
   2789   }
   2790   os() << rn << ", " << rm;
   2791 }
   2792 
   2793 void Disassembler::smulbt(Condition cond,
   2794                           Register rd,
   2795                           Register rn,
   2796                           Register rm) {
   2797   os().SetCurrentInstruction(kSmulbt, kArithmetic);
   2798   os() << ToCString(kSmulbt) << ConditionPrinter(it_block_, cond);
   2799   os() << " ";
   2800   if (!rd.Is(rn) || !use_short_hand_form_) {
   2801     os() << rd << ", ";
   2802   }
   2803   os() << rn << ", " << rm;
   2804 }
   2805 
   2806 void Disassembler::smull(
   2807     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2808   os().SetCurrentInstruction(kSmull, kArithmetic);
   2809   os() << ToCString(kSmull) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2810        << ", " << rdhi << ", " << rn << ", " << rm;
   2811 }
   2812 
   2813 void Disassembler::smulls(
   2814     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2815   os().SetCurrentInstruction(kSmulls, kArithmetic);
   2816   os() << ToCString(kSmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2817        << ", " << rdhi << ", " << rn << ", " << rm;
   2818 }
   2819 
   2820 void Disassembler::smultb(Condition cond,
   2821                           Register rd,
   2822                           Register rn,
   2823                           Register rm) {
   2824   os().SetCurrentInstruction(kSmultb, kArithmetic);
   2825   os() << ToCString(kSmultb) << ConditionPrinter(it_block_, cond);
   2826   os() << " ";
   2827   if (!rd.Is(rn) || !use_short_hand_form_) {
   2828     os() << rd << ", ";
   2829   }
   2830   os() << rn << ", " << rm;
   2831 }
   2832 
   2833 void Disassembler::smultt(Condition cond,
   2834                           Register rd,
   2835                           Register rn,
   2836                           Register rm) {
   2837   os().SetCurrentInstruction(kSmultt, kArithmetic);
   2838   os() << ToCString(kSmultt) << ConditionPrinter(it_block_, cond);
   2839   os() << " ";
   2840   if (!rd.Is(rn) || !use_short_hand_form_) {
   2841     os() << rd << ", ";
   2842   }
   2843   os() << rn << ", " << rm;
   2844 }
   2845 
   2846 void Disassembler::smulwb(Condition cond,
   2847                           Register rd,
   2848                           Register rn,
   2849                           Register rm) {
   2850   os().SetCurrentInstruction(kSmulwb, kArithmetic);
   2851   os() << ToCString(kSmulwb) << ConditionPrinter(it_block_, cond);
   2852   os() << " ";
   2853   if (!rd.Is(rn) || !use_short_hand_form_) {
   2854     os() << rd << ", ";
   2855   }
   2856   os() << rn << ", " << rm;
   2857 }
   2858 
   2859 void Disassembler::smulwt(Condition cond,
   2860                           Register rd,
   2861                           Register rn,
   2862                           Register rm) {
   2863   os().SetCurrentInstruction(kSmulwt, kArithmetic);
   2864   os() << ToCString(kSmulwt) << ConditionPrinter(it_block_, cond);
   2865   os() << " ";
   2866   if (!rd.Is(rn) || !use_short_hand_form_) {
   2867     os() << rd << ", ";
   2868   }
   2869   os() << rn << ", " << rm;
   2870 }
   2871 
   2872 void Disassembler::smusd(Condition cond,
   2873                          Register rd,
   2874                          Register rn,
   2875                          Register rm) {
   2876   os().SetCurrentInstruction(kSmusd, kArithmetic);
   2877   os() << ToCString(kSmusd) << ConditionPrinter(it_block_, cond);
   2878   os() << " ";
   2879   if (!rd.Is(rn) || !use_short_hand_form_) {
   2880     os() << rd << ", ";
   2881   }
   2882   os() << rn << ", " << rm;
   2883 }
   2884 
   2885 void Disassembler::smusdx(Condition cond,
   2886                           Register rd,
   2887                           Register rn,
   2888                           Register rm) {
   2889   os().SetCurrentInstruction(kSmusdx, kArithmetic);
   2890   os() << ToCString(kSmusdx) << ConditionPrinter(it_block_, cond);
   2891   os() << " ";
   2892   if (!rd.Is(rn) || !use_short_hand_form_) {
   2893     os() << rd << ", ";
   2894   }
   2895   os() << rn << ", " << rm;
   2896 }
   2897 
   2898 void Disassembler::ssat(Condition cond,
   2899                         Register rd,
   2900                         uint32_t imm,
   2901                         const Operand& operand) {
   2902   os().SetCurrentInstruction(kSsat, kArithmetic);
   2903   os() << ToCString(kSsat) << ConditionPrinter(it_block_, cond) << " " << rd
   2904        << ", " << ImmediatePrinter(imm) << ", " << operand;
   2905 }
   2906 
   2907 void Disassembler::ssat16(Condition cond,
   2908                           Register rd,
   2909                           uint32_t imm,
   2910                           Register rn) {
   2911   os().SetCurrentInstruction(kSsat16, kArithmetic);
   2912   os() << ToCString(kSsat16) << ConditionPrinter(it_block_, cond) << " " << rd
   2913        << ", " << ImmediatePrinter(imm) << ", " << rn;
   2914 }
   2915 
   2916 void Disassembler::ssax(Condition cond, Register rd, Register rn, Register rm) {
   2917   os().SetCurrentInstruction(kSsax, kArithmetic);
   2918   os() << ToCString(kSsax) << ConditionPrinter(it_block_, cond);
   2919   os() << " ";
   2920   if (!rd.Is(rn) || !use_short_hand_form_) {
   2921     os() << rd << ", ";
   2922   }
   2923   os() << rn << ", " << rm;
   2924 }
   2925 
   2926 void Disassembler::ssub16(Condition cond,
   2927                           Register rd,
   2928                           Register rn,
   2929                           Register rm) {
   2930   os().SetCurrentInstruction(kSsub16, kArithmetic);
   2931   os() << ToCString(kSsub16) << ConditionPrinter(it_block_, cond);
   2932   os() << " ";
   2933   if (!rd.Is(rn) || !use_short_hand_form_) {
   2934     os() << rd << ", ";
   2935   }
   2936   os() << rn << ", " << rm;
   2937 }
   2938 
   2939 void Disassembler::ssub8(Condition cond,
   2940                          Register rd,
   2941                          Register rn,
   2942                          Register rm) {
   2943   os().SetCurrentInstruction(kSsub8, kArithmetic);
   2944   os() << ToCString(kSsub8) << ConditionPrinter(it_block_, cond);
   2945   os() << " ";
   2946   if (!rd.Is(rn) || !use_short_hand_form_) {
   2947     os() << rd << ", ";
   2948   }
   2949   os() << rn << ", " << rm;
   2950 }
   2951 
   2952 void Disassembler::stl(Condition cond, Register rt, const MemOperand& operand) {
   2953   os().SetCurrentInstruction(kStl, kAddress | kLoadStore);
   2954   os() << ToCString(kStl) << ConditionPrinter(it_block_, cond) << " " << rt
   2955        << ", " << PrintMemOperand(kStoreWordLocation, operand);
   2956 }
   2957 
   2958 void Disassembler::stlb(Condition cond,
   2959                         Register rt,
   2960                         const MemOperand& operand) {
   2961   os().SetCurrentInstruction(kStlb, kAddress | kLoadStore);
   2962   os() << ToCString(kStlb) << ConditionPrinter(it_block_, cond) << " " << rt
   2963        << ", " << PrintMemOperand(kStoreByteLocation, operand);
   2964 }
   2965 
   2966 void Disassembler::stlex(Condition cond,
   2967                          Register rd,
   2968                          Register rt,
   2969                          const MemOperand& operand) {
   2970   os().SetCurrentInstruction(kStlex, kAddress | kLoadStore);
   2971   os() << ToCString(kStlex) << ConditionPrinter(it_block_, cond) << " " << rd
   2972        << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
   2973 }
   2974 
   2975 void Disassembler::stlexb(Condition cond,
   2976                           Register rd,
   2977                           Register rt,
   2978                           const MemOperand& operand) {
   2979   os().SetCurrentInstruction(kStlexb, kAddress | kLoadStore);
   2980   os() << ToCString(kStlexb) << ConditionPrinter(it_block_, cond) << " " << rd
   2981        << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
   2982 }
   2983 
   2984 void Disassembler::stlexd(Condition cond,
   2985                           Register rd,
   2986                           Register rt,
   2987                           Register rt2,
   2988                           const MemOperand& operand) {
   2989   os().SetCurrentInstruction(kStlexd, kAddress | kLoadStore);
   2990   os() << ToCString(kStlexd) << ConditionPrinter(it_block_, cond) << " " << rd
   2991        << ", " << rt << ", " << rt2 << ", "
   2992        << PrintMemOperand(kStoreDoubleWordLocation, operand);
   2993 }
   2994 
   2995 void Disassembler::stlexh(Condition cond,
   2996                           Register rd,
   2997                           Register rt,
   2998                           const MemOperand& operand) {
   2999   os().SetCurrentInstruction(kStlexh, kAddress | kLoadStore);
   3000   os() << ToCString(kStlexh) << ConditionPrinter(it_block_, cond) << " " << rd
   3001        << ", " << rt << ", "
   3002        << PrintMemOperand(kStoreHalfWordLocation, operand);
   3003 }
   3004 
   3005 void Disassembler::stlh(Condition cond,
   3006                         Register rt,
   3007                         const MemOperand& operand) {
   3008   os().SetCurrentInstruction(kStlh, kAddress | kLoadStore);
   3009   os() << ToCString(kStlh) << ConditionPrinter(it_block_, cond) << " " << rt
   3010        << ", " << PrintMemOperand(kStoreHalfWordLocation, operand);
   3011 }
   3012 
   3013 void Disassembler::stm(Condition cond,
   3014                        EncodingSize size,
   3015                        Register rn,
   3016                        WriteBack write_back,
   3017                        RegisterList registers) {
   3018   os().SetCurrentInstruction(kStm, kLoadStore | kLoadStoreMultiple);
   3019   os() << ToCString(kStm) << ConditionPrinter(it_block_, cond) << size << " "
   3020        << rn << write_back << ", " << registers;
   3021 }
   3022 
   3023 void Disassembler::stmda(Condition cond,
   3024                          Register rn,
   3025                          WriteBack write_back,
   3026                          RegisterList registers) {
   3027   os().SetCurrentInstruction(kStmda, kLoadStore | kLoadStoreMultiple);
   3028   os() << ToCString(kStmda) << ConditionPrinter(it_block_, cond) << " " << rn
   3029        << write_back << ", " << registers;
   3030 }
   3031 
   3032 void Disassembler::stmdb(Condition cond,
   3033                          EncodingSize size,
   3034                          Register rn,
   3035                          WriteBack write_back,
   3036                          RegisterList registers) {
   3037   os().SetCurrentInstruction(kStmdb, kLoadStore | kLoadStoreMultiple);
   3038   os() << ToCString(kStmdb) << ConditionPrinter(it_block_, cond) << size << " "
   3039        << rn << write_back << ", " << registers;
   3040 }
   3041 
   3042 void Disassembler::stmea(Condition cond,
   3043                          EncodingSize size,
   3044                          Register rn,
   3045                          WriteBack write_back,
   3046                          RegisterList registers) {
   3047   os().SetCurrentInstruction(kStmea, kLoadStore | kLoadStoreMultiple);
   3048   os() << ToCString(kStmea) << ConditionPrinter(it_block_, cond) << size << " "
   3049        << rn << write_back << ", " << registers;
   3050 }
   3051 
   3052 void Disassembler::stmed(Condition cond,
   3053                          Register rn,
   3054                          WriteBack write_back,
   3055                          RegisterList registers) {
   3056   os().SetCurrentInstruction(kStmed, kLoadStore | kLoadStoreMultiple);
   3057   os() << ToCString(kStmed) << ConditionPrinter(it_block_, cond) << " " << rn
   3058        << write_back << ", " << registers;
   3059 }
   3060 
   3061 void Disassembler::stmfa(Condition cond,
   3062                          Register rn,
   3063                          WriteBack write_back,
   3064                          RegisterList registers) {
   3065   os().SetCurrentInstruction(kStmfa, kLoadStore | kLoadStoreMultiple);
   3066   os() << ToCString(kStmfa) << ConditionPrinter(it_block_, cond) << " " << rn
   3067        << write_back << ", " << registers;
   3068 }
   3069 
   3070 void Disassembler::stmfd(Condition cond,
   3071                          Register rn,
   3072                          WriteBack write_back,
   3073                          RegisterList registers) {
   3074   os().SetCurrentInstruction(kStmfd, kLoadStore | kLoadStoreMultiple);
   3075   os() << ToCString(kStmfd) << ConditionPrinter(it_block_, cond) << " " << rn
   3076        << write_back << ", " << registers;
   3077 }
   3078 
   3079 void Disassembler::stmib(Condition cond,
   3080                          Register rn,
   3081                          WriteBack write_back,
   3082                          RegisterList registers) {
   3083   os().SetCurrentInstruction(kStmib, kLoadStore | kLoadStoreMultiple);
   3084   os() << ToCString(kStmib) << ConditionPrinter(it_block_, cond) << " " << rn
   3085        << write_back << ", " << registers;
   3086 }
   3087 
   3088 void Disassembler::str(Condition cond,
   3089                        EncodingSize size,
   3090                        Register rt,
   3091                        const MemOperand& operand) {
   3092   os().SetCurrentInstruction(kStr, kAddress | kLoadStore);
   3093   os() << ToCString(kStr) << ConditionPrinter(it_block_, cond) << size << " "
   3094        << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
   3095 }
   3096 
   3097 void Disassembler::strb(Condition cond,
   3098                         EncodingSize size,
   3099                         Register rt,
   3100                         const MemOperand& operand) {
   3101   os().SetCurrentInstruction(kStrb, kAddress | kLoadStore);
   3102   os() << ToCString(kStrb) << ConditionPrinter(it_block_, cond) << size << " "
   3103        << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
   3104 }
   3105 
   3106 void Disassembler::strd(Condition cond,
   3107                         Register rt,
   3108                         Register rt2,
   3109                         const MemOperand& operand) {
   3110   os().SetCurrentInstruction(kStrd, kAddress | kLoadStore);
   3111   os() << ToCString(kStrd) << ConditionPrinter(it_block_, cond) << " " << rt
   3112        << ", " << rt2 << ", "
   3113        << PrintMemOperand(kStoreDoubleWordLocation, operand);
   3114 }
   3115 
   3116 void Disassembler::strex(Condition cond,
   3117                          Register rd,
   3118                          Register rt,
   3119                          const MemOperand& operand) {
   3120   os().SetCurrentInstruction(kStrex, kAddress | kLoadStore);
   3121   os() << ToCString(kStrex) << ConditionPrinter(it_block_, cond) << " " << rd
   3122        << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
   3123 }
   3124 
   3125 void Disassembler::strexb(Condition cond,
   3126                           Register rd,
   3127                           Register rt,
   3128                           const MemOperand& operand) {
   3129   os().SetCurrentInstruction(kStrexb, kAddress | kLoadStore);
   3130   os() << ToCString(kStrexb) << ConditionPrinter(it_block_, cond) << " " << rd
   3131        << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
   3132 }
   3133 
   3134 void Disassembler::strexd(Condition cond,
   3135                           Register rd,
   3136                           Register rt,
   3137                           Register rt2,
   3138                           const MemOperand& operand) {
   3139   os().SetCurrentInstruction(kStrexd, kAddress | kLoadStore);
   3140   os() << ToCString(kStrexd) << ConditionPrinter(it_block_, cond) << " " << rd
   3141        << ", " << rt << ", " << rt2 << ", "
   3142        << PrintMemOperand(kStoreDoubleWordLocation, operand);
   3143 }
   3144 
   3145 void Disassembler::strexh(Condition cond,
   3146                           Register rd,
   3147                           Register rt,
   3148                           const MemOperand& operand) {
   3149   os().SetCurrentInstruction(kStrexh, kAddress | kLoadStore);
   3150   os() << ToCString(kStrexh) << ConditionPrinter(it_block_, cond) << " " << rd
   3151        << ", " << rt << ", "
   3152        << PrintMemOperand(kStoreHalfWordLocation, operand);
   3153 }
   3154 
   3155 void Disassembler::strh(Condition cond,
   3156                         EncodingSize size,
   3157                         Register rt,
   3158                         const MemOperand& operand) {
   3159   os().SetCurrentInstruction(kStrh, kAddress | kLoadStore);
   3160   os() << ToCString(kStrh) << ConditionPrinter(it_block_, cond) << size << " "
   3161        << rt << ", " << PrintMemOperand(kStoreHalfWordLocation, operand);
   3162 }
   3163 
   3164 void Disassembler::sub(Condition cond,
   3165                        EncodingSize size,
   3166                        Register rd,
   3167                        Register rn,
   3168                        const Operand& operand) {
   3169   os().SetCurrentInstruction(kSub, kArithmetic);
   3170   os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << size;
   3171   os() << " ";
   3172   if (!rd.Is(rn) || !use_short_hand_form_) {
   3173     os() << rd << ", ";
   3174   }
   3175   os() << rn << ", " << operand;
   3176 }
   3177 
   3178 void Disassembler::sub(Condition cond, Register rd, const Operand& operand) {
   3179   os().SetCurrentInstruction(kSub, kArithmetic);
   3180   os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << " " << rd
   3181        << ", " << operand;
   3182 }
   3183 
   3184 void Disassembler::subs(Condition cond,
   3185                         EncodingSize size,
   3186                         Register rd,
   3187                         Register rn,
   3188                         const Operand& operand) {
   3189   os().SetCurrentInstruction(kSubs, kArithmetic);
   3190   os() << ToCString(kSubs) << ConditionPrinter(it_block_, cond) << size;
   3191   os() << " ";
   3192   if (!rd.Is(rn) || !use_short_hand_form_) {
   3193     os() << rd << ", ";
   3194   }
   3195   os() << rn << ", " << operand;
   3196 }
   3197 
   3198 void Disassembler::subs(Register rd, const Operand& operand) {
   3199   os().SetCurrentInstruction(kSubs, kArithmetic);
   3200   os() << ToCString(kSubs) << " " << rd << ", " << operand;
   3201 }
   3202 
   3203 void Disassembler::subw(Condition cond,
   3204                         Register rd,
   3205                         Register rn,
   3206                         const Operand& operand) {
   3207   os().SetCurrentInstruction(kSubw, kArithmetic);
   3208   os() << ToCString(kSubw) << ConditionPrinter(it_block_, cond);
   3209   os() << " ";
   3210   if (!rd.Is(rn) || !use_short_hand_form_) {
   3211     os() << rd << ", ";
   3212   }
   3213   os() << rn << ", " << operand;
   3214 }
   3215 
   3216 void Disassembler::svc(Condition cond, uint32_t imm) {
   3217   os().SetCurrentInstruction(kSvc, kSystem);
   3218   os() << ToCString(kSvc) << ConditionPrinter(it_block_, cond) << " "
   3219        << RawImmediatePrinter(imm);
   3220 }
   3221 
   3222 void Disassembler::sxtab(Condition cond,
   3223                          Register rd,
   3224                          Register rn,
   3225                          const Operand& operand) {
   3226   os().SetCurrentInstruction(kSxtab, kArithmetic);
   3227   os() << ToCString(kSxtab) << ConditionPrinter(it_block_, cond);
   3228   os() << " ";
   3229   if (!rd.Is(rn) || !use_short_hand_form_) {
   3230     os() << rd << ", ";
   3231   }
   3232   os() << rn << ", " << operand;
   3233 }
   3234 
   3235 void Disassembler::sxtab16(Condition cond,
   3236                            Register rd,
   3237                            Register rn,
   3238                            const Operand& operand) {
   3239   os().SetCurrentInstruction(kSxtab16, kArithmetic);
   3240   os() << ToCString(kSxtab16) << ConditionPrinter(it_block_, cond);
   3241   os() << " ";
   3242   if (!rd.Is(rn) || !use_short_hand_form_) {
   3243     os() << rd << ", ";
   3244   }
   3245   os() << rn << ", " << operand;
   3246 }
   3247 
   3248 void Disassembler::sxtah(Condition cond,
   3249                          Register rd,
   3250                          Register rn,
   3251                          const Operand& operand) {
   3252   os().SetCurrentInstruction(kSxtah, kArithmetic);
   3253   os() << ToCString(kSxtah) << ConditionPrinter(it_block_, cond);
   3254   os() << " ";
   3255   if (!rd.Is(rn) || !use_short_hand_form_) {
   3256     os() << rd << ", ";
   3257   }
   3258   os() << rn << ", " << operand;
   3259 }
   3260 
   3261 void Disassembler::sxtb(Condition cond,
   3262                         EncodingSize size,
   3263                         Register rd,
   3264                         const Operand& operand) {
   3265   os().SetCurrentInstruction(kSxtb, kArithmetic);
   3266   os() << ToCString(kSxtb) << ConditionPrinter(it_block_, cond) << size;
   3267   os() << " ";
   3268   if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
   3269     os() << rd << ", ";
   3270   }
   3271   os() << operand;
   3272 }
   3273 
   3274 void Disassembler::sxtb16(Condition cond, Register rd, const Operand& operand) {
   3275   os().SetCurrentInstruction(kSxtb16, kArithmetic);
   3276   os() << ToCString(kSxtb16) << ConditionPrinter(it_block_, cond);
   3277   os() << " ";
   3278   if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
   3279     os() << rd << ", ";
   3280   }
   3281   os() << operand;
   3282 }
   3283 
   3284 void Disassembler::sxth(Condition cond,
   3285                         EncodingSize size,
   3286                         Register rd,
   3287                         const Operand& operand) {
   3288   os().SetCurrentInstruction(kSxth, kArithmetic);
   3289   os() << ToCString(kSxth) << ConditionPrinter(it_block_, cond) << size;
   3290   os() << " ";
   3291   if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
   3292     os() << rd << ", ";
   3293   }
   3294   os() << operand;
   3295 }
   3296 
   3297 void Disassembler::tbb(Condition cond, Register rn, Register rm) {
   3298   os().SetCurrentInstruction(kTbb, kBranch);
   3299   os() << ToCString(kTbb) << ConditionPrinter(it_block_, cond) << " "
   3300        << MemOperand(rn, rm);
   3301 }
   3302 
   3303 void Disassembler::tbh(Condition cond, Register rn, Register rm) {
   3304   os().SetCurrentInstruction(kTbh, kBranch);
   3305   os() << ToCString(kTbh) << ConditionPrinter(it_block_, cond) << " "
   3306        << MemOperand(rn, plus, rm, LSL, 1);
   3307 }
   3308 
   3309 void Disassembler::teq(Condition cond, Register rn, const Operand& operand) {
   3310   os().SetCurrentInstruction(kTeq, kBitwise);
   3311   os() << ToCString(kTeq) << ConditionPrinter(it_block_, cond) << " " << rn
   3312        << ", " << operand;
   3313 }
   3314 
   3315 void Disassembler::tst(Condition cond,
   3316                        EncodingSize size,
   3317                        Register rn,
   3318                        const Operand& operand) {
   3319   os().SetCurrentInstruction(kTst, kBitwise);
   3320   os() << ToCString(kTst) << ConditionPrinter(it_block_, cond) << size << " "
   3321        << rn << ", " << operand;
   3322 }
   3323 
   3324 void Disassembler::uadd16(Condition cond,
   3325                           Register rd,
   3326                           Register rn,
   3327                           Register rm) {
   3328   os().SetCurrentInstruction(kUadd16, kArithmetic);
   3329   os() << ToCString(kUadd16) << ConditionPrinter(it_block_, cond);
   3330   os() << " ";
   3331   if (!rd.Is(rn) || !use_short_hand_form_) {
   3332     os() << rd << ", ";
   3333   }
   3334   os() << rn << ", " << rm;
   3335 }
   3336 
   3337 void Disassembler::uadd8(Condition cond,
   3338                          Register rd,
   3339                          Register rn,
   3340                          Register rm) {
   3341   os().SetCurrentInstruction(kUadd8, kArithmetic);
   3342   os() << ToCString(kUadd8) << ConditionPrinter(it_block_, cond);
   3343   os() << " ";
   3344   if (!rd.Is(rn) || !use_short_hand_form_) {
   3345     os() << rd << ", ";
   3346   }
   3347   os() << rn << ", " << rm;
   3348 }
   3349 
   3350 void Disassembler::uasx(Condition cond, Register rd, Register rn, Register rm) {
   3351   os().SetCurrentInstruction(kUasx, kArithmetic);
   3352   os() << ToCString(kUasx) << ConditionPrinter(it_block_, cond);
   3353   os() << " ";
   3354   if (!rd.Is(rn) || !use_short_hand_form_) {
   3355     os() << rd << ", ";
   3356   }
   3357   os() << rn << ", " << rm;
   3358 }
   3359 
   3360 void Disassembler::ubfx(
   3361     Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
   3362   os().SetCurrentInstruction(kUbfx, kShift);
   3363   os() << ToCString(kUbfx) << ConditionPrinter(it_block_, cond) << " " << rd
   3364        << ", " << rn << ", " << ImmediatePrinter(lsb) << ", "
   3365        << ImmediatePrinter(width);
   3366 }
   3367 
   3368 void Disassembler::udf(Condition cond, EncodingSize size, uint32_t imm) {
   3369   os().SetCurrentInstruction(kUdf, kNoAttribute);
   3370   os() << ToCString(kUdf) << ConditionPrinter(it_block_, cond) << size << " "
   3371        << RawImmediatePrinter(imm);
   3372 }
   3373 
   3374 void Disassembler::udiv(Condition cond, Register rd, Register rn, Register rm) {
   3375   os().SetCurrentInstruction(kUdiv, kArithmetic);
   3376   os() << ToCString(kUdiv) << ConditionPrinter(it_block_, cond);
   3377   os() << " ";
   3378   if (!rd.Is(rn) || !use_short_hand_form_) {
   3379     os() << rd << ", ";
   3380   }
   3381   os() << rn << ", " << rm;
   3382 }
   3383 
   3384 void Disassembler::uhadd16(Condition cond,
   3385                            Register rd,
   3386                            Register rn,
   3387                            Register rm) {
   3388   os().SetCurrentInstruction(kUhadd16, kArithmetic);
   3389   os() << ToCString(kUhadd16) << ConditionPrinter(it_block_, cond);
   3390   os() << " ";
   3391   if (!rd.Is(rn) || !use_short_hand_form_) {
   3392     os() << rd << ", ";
   3393   }
   3394   os() << rn << ", " << rm;
   3395 }
   3396 
   3397 void Disassembler::uhadd8(Condition cond,
   3398                           Register rd,
   3399                           Register rn,
   3400                           Register rm) {
   3401   os().SetCurrentInstruction(kUhadd8, kArithmetic);
   3402   os() << ToCString(kUhadd8) << ConditionPrinter(it_block_, cond);
   3403   os() << " ";
   3404   if (!rd.Is(rn) || !use_short_hand_form_) {
   3405     os() << rd << ", ";
   3406   }
   3407   os() << rn << ", " << rm;
   3408 }
   3409 
   3410 void Disassembler::uhasx(Condition cond,
   3411                          Register rd,
   3412                          Register rn,
   3413                          Register rm) {
   3414   os().SetCurrentInstruction(kUhasx, kArithmetic);
   3415   os() << ToCString(kUhasx) << ConditionPrinter(it_block_, cond);
   3416   os() << " ";
   3417   if (!rd.Is(rn) || !use_short_hand_form_) {
   3418     os() << rd << ", ";
   3419   }
   3420   os() << rn << ", " << rm;
   3421 }
   3422 
   3423 void Disassembler::uhsax(Condition cond,
   3424                          Register rd,
   3425                          Register rn,
   3426                          Register rm) {
   3427   os().SetCurrentInstruction(kUhsax, kArithmetic);
   3428   os() << ToCString(kUhsax) << ConditionPrinter(it_block_, cond);
   3429   os() << " ";
   3430   if (!rd.Is(rn) || !use_short_hand_form_) {
   3431     os() << rd << ", ";
   3432   }
   3433   os() << rn << ", " << rm;
   3434 }
   3435 
   3436 void Disassembler::uhsub16(Condition cond,
   3437                            Register rd,
   3438                            Register rn,
   3439                            Register rm) {
   3440   os().SetCurrentInstruction(kUhsub16, kArithmetic);
   3441   os() << ToCString(kUhsub16) << ConditionPrinter(it_block_, cond);
   3442   os() << " ";
   3443   if (!rd.Is(rn) || !use_short_hand_form_) {
   3444     os() << rd << ", ";
   3445   }
   3446   os() << rn << ", " << rm;
   3447 }
   3448 
   3449 void Disassembler::uhsub8(Condition cond,
   3450                           Register rd,
   3451                           Register rn,
   3452                           Register rm) {
   3453   os().SetCurrentInstruction(kUhsub8, kArithmetic);
   3454   os() << ToCString(kUhsub8) << ConditionPrinter(it_block_, cond);
   3455   os() << " ";
   3456   if (!rd.Is(rn) || !use_short_hand_form_) {
   3457     os() << rd << ", ";
   3458   }
   3459   os() << rn << ", " << rm;
   3460 }
   3461 
   3462 void Disassembler::umaal(
   3463     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3464   os().SetCurrentInstruction(kUmaal, kArithmetic);
   3465   os() << ToCString(kUmaal) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3466        << ", " << rdhi << ", " << rn << ", " << rm;
   3467 }
   3468 
   3469 void Disassembler::umlal(
   3470     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3471   os().SetCurrentInstruction(kUmlal, kArithmetic);
   3472   os() << ToCString(kUmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3473        << ", " << rdhi << ", " << rn << ", " << rm;
   3474 }
   3475 
   3476 void Disassembler::umlals(
   3477     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3478   os().SetCurrentInstruction(kUmlals, kArithmetic);
   3479   os() << ToCString(kUmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3480        << ", " << rdhi << ", " << rn << ", " << rm;
   3481 }
   3482 
   3483 void Disassembler::umull(
   3484     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3485   os().SetCurrentInstruction(kUmull, kArithmetic);
   3486   os() << ToCString(kUmull) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3487        << ", " << rdhi << ", " << rn << ", " << rm;
   3488 }
   3489 
   3490 void Disassembler::umulls(
   3491     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3492   os().SetCurrentInstruction(kUmulls, kArithmetic);
   3493   os() << ToCString(kUmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3494        << ", " << rdhi << ", " << rn << ", " << rm;
   3495 }
   3496 
   3497 void Disassembler::uqadd16(Condition cond,
   3498                            Register rd,
   3499                            Register rn,
   3500                            Register rm) {
   3501   os().SetCurrentInstruction(kUqadd16, kArithmetic);
   3502   os() << ToCString(kUqadd16) << ConditionPrinter(it_block_, cond);
   3503   os() << " ";
   3504   if (!rd.Is(rn) || !use_short_hand_form_) {
   3505     os() << rd << ", ";
   3506   }
   3507   os() << rn << ", " << rm;
   3508 }
   3509 
   3510 void Disassembler::uqadd8(Condition cond,
   3511                           Register rd,
   3512                           Register rn,
   3513                           Register rm) {
   3514   os().SetCurrentInstruction(kUqadd8, kArithmetic);
   3515   os() << ToCString(kUqadd8) << ConditionPrinter(it_block_, cond);
   3516   os() << " ";
   3517   if (!rd.Is(rn) || !use_short_hand_form_) {
   3518     os() << rd << ", ";
   3519   }
   3520   os() << rn << ", " << rm;
   3521 }
   3522 
   3523 void Disassembler::uqasx(Condition cond,
   3524                          Register rd,
   3525                          Register rn,
   3526                          Register rm) {
   3527   os().SetCurrentInstruction(kUqasx, kArithmetic);
   3528   os() << ToCString(kUqasx) << ConditionPrinter(it_block_, cond);
   3529   os() << " ";
   3530   if (!rd.Is(rn) || !use_short_hand_form_) {
   3531     os() << rd << ", ";
   3532   }
   3533   os() << rn << ", " << rm;
   3534 }
   3535 
   3536 void Disassembler::uqsax(Condition cond,
   3537                          Register rd,
   3538                          Register rn,
   3539                          Register rm) {
   3540   os().SetCurrentInstruction(kUqsax, kArithmetic);
   3541   os() << ToCString(kUqsax) << ConditionPrinter(it_block_, cond);
   3542   os() << " ";
   3543   if (!rd.Is(rn) || !use_short_hand_form_) {
   3544     os() << rd << ", ";
   3545   }
   3546   os() << rn << ", " << rm;
   3547 }
   3548 
   3549 void Disassembler::uqsub16(Condition cond,
   3550                            Register rd,
   3551                            Register rn,
   3552                            Register rm) {
   3553   os().SetCurrentInstruction(kUqsub16, kArithmetic);
   3554   os() << ToCString(kUqsub16) << ConditionPrinter(it_block_, cond);
   3555   os() << " ";
   3556   if (!rd.Is(rn) || !use_short_hand_form_) {
   3557     os() << rd << ", ";
   3558   }
   3559   os() << rn << ", " << rm;
   3560 }
   3561 
   3562 void Disassembler::uqsub8(Condition cond,
   3563                           Register rd,
   3564                           Register rn,
   3565                           Register rm) {
   3566   os().SetCurrentInstruction(kUqsub8, kArithmetic);
   3567   os() << ToCString(kUqsub8) << ConditionPrinter(it_block_, cond);
   3568   os() << " ";
   3569   if (!rd.Is(rn) || !use_short_hand_form_) {
   3570     os() << rd << ", ";
   3571   }
   3572   os() << rn << ", " << rm;
   3573 }
   3574 
   3575 void Disassembler::usad8(Condition cond,
   3576                          Register rd,
   3577                          Register rn,
   3578                          Register rm) {
   3579   os().SetCurrentInstruction(kUsad8, kArithmetic);
   3580   os() << ToCString(kUsad8) << ConditionPrinter(it_block_, cond);
   3581   os() << " ";
   3582   if (!rd.Is(rn) || !use_short_hand_form_) {
   3583     os() << rd << ", ";
   3584   }
   3585   os() << rn << ", " << rm;
   3586 }
   3587 
   3588 void Disassembler::usada8(
   3589     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   3590   os().SetCurrentInstruction(kUsada8, kArithmetic);
   3591   os() << ToCString(kUsada8) << ConditionPrinter(it_block_, cond) << " " << rd
   3592        << ", " << rn << ", " << rm << ", " << ra;
   3593 }
   3594 
   3595 void Disassembler::usat(Condition cond,
   3596                         Register rd,
   3597                         uint32_t imm,
   3598                         const Operand& operand) {
   3599   os().SetCurrentInstruction(kUsat, kArithmetic);
   3600   os() << ToCString(kUsat) << ConditionPrinter(it_block_, cond) << " " << rd
   3601        << ", " << ImmediatePrinter(imm) << ", " << operand;
   3602 }
   3603 
   3604 void Disassembler::usat16(Condition cond,
   3605                           Register rd,
   3606                           uint32_t imm,
   3607                           Register rn) {
   3608   os().SetCurrentInstruction(kUsat16, kArithmetic);
   3609   os() << ToCString(kUsat16) << ConditionPrinter(it_block_, cond) << " " << rd
   3610        << ", " << ImmediatePrinter(imm) << ", " << rn;
   3611 }
   3612 
   3613 void Disassembler::usax(Condition cond, Register rd, Register rn, Register rm) {
   3614   os().SetCurrentInstruction(kUsax, kArithmetic);
   3615   os() << ToCString(kUsax) << ConditionPrinter(it_block_, cond);
   3616   os() << " ";
   3617   if (!rd.Is(rn) || !use_short_hand_form_) {
   3618     os() << rd << ", ";
   3619   }
   3620   os() << rn << ", " << rm;
   3621 }
   3622 
   3623 void Disassembler::usub16(Condition cond,
   3624                           Register rd,
   3625                           Register rn,
   3626                           Register rm) {
   3627   os().SetCurrentInstruction(kUsub16, kArithmetic);
   3628   os() << ToCString(kUsub16) << ConditionPrinter(it_block_, cond);
   3629   os() << " ";
   3630   if (!rd.Is(rn) || !use_short_hand_form_) {
   3631     os() << rd << ", ";
   3632   }
   3633   os() << rn << ", " << rm;
   3634 }
   3635 
   3636 void Disassembler::usub8(Condition cond,
   3637                          Register rd,
   3638                          Register rn,
   3639                          Register rm) {
   3640   os().SetCurrentInstruction(kUsub8, kArithmetic);
   3641   os() << ToCString(kUsub8) << ConditionPrinter(it_block_, cond);
   3642   os() << " ";
   3643   if (!rd.Is(rn) || !use_short_hand_form_) {
   3644     os() << rd << ", ";
   3645   }
   3646   os() << rn << ", " << rm;
   3647 }
   3648 
   3649 void Disassembler::uxtab(Condition cond,
   3650                          Register rd,
   3651                          Register rn,
   3652                          const Operand& operand) {
   3653   os().SetCurrentInstruction(kUxtab, kArithmetic);
   3654   os() << ToCString(kUxtab) << ConditionPrinter(it_block_, cond);
   3655   os() << " ";
   3656   if (!rd.Is(rn) || !use_short_hand_form_) {
   3657     os() << rd << ", ";
   3658   }
   3659   os() << rn << ", " << operand;
   3660 }
   3661 
   3662 void Disassembler::uxtab16(Condition cond,
   3663                            Register rd,
   3664                            Register rn,
   3665                            const Operand& operand) {
   3666   os().SetCurrentInstruction(kUxtab16, kArithmetic);
   3667   os() << ToCString(kUxtab16) << ConditionPrinter(it_block_, cond);
   3668   os() << " ";
   3669   if (!rd.Is(rn) || !use_short_hand_form_) {
   3670     os() << rd << ", ";
   3671   }
   3672   os() << rn << ", " << operand;
   3673 }
   3674 
   3675 void Disassembler::uxtah(Condition cond,
   3676                          Register rd,
   3677                          Register rn,
   3678                          const Operand& operand) {
   3679   os().SetCurrentInstruction(kUxtah, kArithmetic);
   3680   os() << ToCString(kUxtah) << ConditionPrinter(it_block_, cond);
   3681   os() << " ";
   3682   if (!rd.Is(rn) || !use_short_hand_form_) {
   3683     os() << rd << ", ";
   3684   }
   3685   os() << rn << ", " << operand;
   3686 }
   3687 
   3688 void Disassembler::uxtb(Condition cond,
   3689                         EncodingSize size,
   3690                         Register rd,
   3691                         const Operand& operand) {
   3692   os().SetCurrentInstruction(kUxtb, kArithmetic);
   3693   os() << ToCString(kUxtb) << ConditionPrinter(it_block_, cond) << size;
   3694   os() << " ";
   3695   if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
   3696     os() << rd << ", ";
   3697   }
   3698   os() << operand;
   3699 }
   3700 
   3701 void Disassembler::uxtb16(Condition cond, Register rd, const Operand& operand) {
   3702   os().SetCurrentInstruction(kUxtb16, kArithmetic);
   3703   os() << ToCString(kUxtb16) << ConditionPrinter(it_block_, cond);
   3704   os() << " ";
   3705   if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
   3706     os() << rd << ", ";
   3707   }
   3708   os() << operand;
   3709 }
   3710 
   3711 void Disassembler::uxth(Condition cond,
   3712                         EncodingSize size,
   3713                         Register rd,
   3714                         const Operand& operand) {
   3715   os().SetCurrentInstruction(kUxth, kArithmetic);
   3716   os() << ToCString(kUxth) << ConditionPrinter(it_block_, cond) << size;
   3717   os() << " ";
   3718   if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) {
   3719     os() << rd << ", ";
   3720   }
   3721   os() << operand;
   3722 }
   3723 
   3724 void Disassembler::vaba(
   3725     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3726   os().SetCurrentInstruction(kVaba, kFpNeon);
   3727   os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " "
   3728        << rd << ", " << rn << ", " << rm;
   3729 }
   3730 
   3731 void Disassembler::vaba(
   3732     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3733   os().SetCurrentInstruction(kVaba, kFpNeon);
   3734   os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " "
   3735        << rd << ", " << rn << ", " << rm;
   3736 }
   3737 
   3738 void Disassembler::vabal(
   3739     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   3740   os().SetCurrentInstruction(kVabal, kFpNeon);
   3741   os() << ToCString(kVabal) << ConditionPrinter(it_block_, cond) << dt << " "
   3742        << rd << ", " << rn << ", " << rm;
   3743 }
   3744 
   3745 void Disassembler::vabd(
   3746     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3747   os().SetCurrentInstruction(kVabd, kFpNeon);
   3748   os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt;
   3749   os() << " ";
   3750   if (!rd.Is(rn) || !use_short_hand_form_) {
   3751     os() << rd << ", ";
   3752   }
   3753   os() << rn << ", " << rm;
   3754 }
   3755 
   3756 void Disassembler::vabd(
   3757     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3758   os().SetCurrentInstruction(kVabd, kFpNeon);
   3759   os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt;
   3760   os() << " ";
   3761   if (!rd.Is(rn) || !use_short_hand_form_) {
   3762     os() << rd << ", ";
   3763   }
   3764   os() << rn << ", " << rm;
   3765 }
   3766 
   3767 void Disassembler::vabdl(
   3768     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   3769   os().SetCurrentInstruction(kVabdl, kFpNeon);
   3770   os() << ToCString(kVabdl) << ConditionPrinter(it_block_, cond) << dt << " "
   3771        << rd << ", " << rn << ", " << rm;
   3772 }
   3773 
   3774 void Disassembler::vabs(Condition cond,
   3775                         DataType dt,
   3776                         DRegister rd,
   3777                         DRegister rm) {
   3778   os().SetCurrentInstruction(kVabs, kFpNeon);
   3779   os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
   3780        << rd << ", " << rm;
   3781 }
   3782 
   3783 void Disassembler::vabs(Condition cond,
   3784                         DataType dt,
   3785                         QRegister rd,
   3786                         QRegister rm) {
   3787   os().SetCurrentInstruction(kVabs, kFpNeon);
   3788   os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
   3789        << rd << ", " << rm;
   3790 }
   3791 
   3792 void Disassembler::vabs(Condition cond,
   3793                         DataType dt,
   3794                         SRegister rd,
   3795                         SRegister rm) {
   3796   os().SetCurrentInstruction(kVabs, kFpNeon);
   3797   os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
   3798        << rd << ", " << rm;
   3799 }
   3800 
   3801 void Disassembler::vacge(
   3802     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3803   os().SetCurrentInstruction(kVacge, kFpNeon);
   3804   os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt;
   3805   os() << " ";
   3806   if (!rd.Is(rn) || !use_short_hand_form_) {
   3807     os() << rd << ", ";
   3808   }
   3809   os() << rn << ", " << rm;
   3810 }
   3811 
   3812 void Disassembler::vacge(
   3813     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3814   os().SetCurrentInstruction(kVacge, kFpNeon);
   3815   os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt;
   3816   os() << " ";
   3817   if (!rd.Is(rn) || !use_short_hand_form_) {
   3818     os() << rd << ", ";
   3819   }
   3820   os() << rn << ", " << rm;
   3821 }
   3822 
   3823 void Disassembler::vacgt(
   3824     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3825   os().SetCurrentInstruction(kVacgt, kFpNeon);
   3826   os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt;
   3827   os() << " ";
   3828   if (!rd.Is(rn) || !use_short_hand_form_) {
   3829     os() << rd << ", ";
   3830   }
   3831   os() << rn << ", " << rm;
   3832 }
   3833 
   3834 void Disassembler::vacgt(
   3835     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3836   os().SetCurrentInstruction(kVacgt, kFpNeon);
   3837   os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt;
   3838   os() << " ";
   3839   if (!rd.Is(rn) || !use_short_hand_form_) {
   3840     os() << rd << ", ";
   3841   }
   3842   os() << rn << ", " << rm;
   3843 }
   3844 
   3845 void Disassembler::vacle(
   3846     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3847   os().SetCurrentInstruction(kVacle, kFpNeon);
   3848   os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt;
   3849   os() << " ";
   3850   if (!rd.Is(rn) || !use_short_hand_form_) {
   3851     os() << rd << ", ";
   3852   }
   3853   os() << rn << ", " << rm;
   3854 }
   3855 
   3856 void Disassembler::vacle(
   3857     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3858   os().SetCurrentInstruction(kVacle, kFpNeon);
   3859   os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt;
   3860   os() << " ";
   3861   if (!rd.Is(rn) || !use_short_hand_form_) {
   3862     os() << rd << ", ";
   3863   }
   3864   os() << rn << ", " << rm;
   3865 }
   3866 
   3867 void Disassembler::vaclt(
   3868     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3869   os().SetCurrentInstruction(kVaclt, kFpNeon);
   3870   os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt;
   3871   os() << " ";
   3872   if (!rd.Is(rn) || !use_short_hand_form_) {
   3873     os() << rd << ", ";
   3874   }
   3875   os() << rn << ", " << rm;
   3876 }
   3877 
   3878 void Disassembler::vaclt(
   3879     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3880   os().SetCurrentInstruction(kVaclt, kFpNeon);
   3881   os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt;
   3882   os() << " ";
   3883   if (!rd.Is(rn) || !use_short_hand_form_) {
   3884     os() << rd << ", ";
   3885   }
   3886   os() << rn << ", " << rm;
   3887 }
   3888 
   3889 void Disassembler::vadd(
   3890     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3891   os().SetCurrentInstruction(kVadd, kFpNeon);
   3892   os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
   3893   os() << " ";
   3894   if (!rd.Is(rn) || !use_short_hand_form_) {
   3895     os() << rd << ", ";
   3896   }
   3897   os() << rn << ", " << rm;
   3898 }
   3899 
   3900 void Disassembler::vadd(
   3901     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3902   os().SetCurrentInstruction(kVadd, kFpNeon);
   3903   os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
   3904   os() << " ";
   3905   if (!rd.Is(rn) || !use_short_hand_form_) {
   3906     os() << rd << ", ";
   3907   }
   3908   os() << rn << ", " << rm;
   3909 }
   3910 
   3911 void Disassembler::vadd(
   3912     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   3913   os().SetCurrentInstruction(kVadd, kFpNeon);
   3914   os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
   3915   os() << " ";
   3916   if (!rd.Is(rn) || !use_short_hand_form_) {
   3917     os() << rd << ", ";
   3918   }
   3919   os() << rn << ", " << rm;
   3920 }
   3921 
   3922 void Disassembler::vaddhn(
   3923     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
   3924   os().SetCurrentInstruction(kVaddhn, kFpNeon);
   3925   os() << ToCString(kVaddhn) << ConditionPrinter(it_block_, cond) << dt << " "
   3926        << rd << ", " << rn << ", " << rm;
   3927 }
   3928 
   3929 void Disassembler::vaddl(
   3930     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   3931   os().SetCurrentInstruction(kVaddl, kFpNeon);
   3932   os() << ToCString(kVaddl) << ConditionPrinter(it_block_, cond) << dt << " "
   3933        << rd << ", " << rn << ", " << rm;
   3934 }
   3935 
   3936 void Disassembler::vaddw(
   3937     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
   3938   os().SetCurrentInstruction(kVaddw, kFpNeon);
   3939   os() << ToCString(kVaddw) << ConditionPrinter(it_block_, cond) << dt;
   3940   os() << " ";
   3941   if (!rd.Is(rn) || !use_short_hand_form_) {
   3942     os() << rd << ", ";
   3943   }
   3944   os() << rn << ", " << rm;
   3945 }
   3946 
   3947 void Disassembler::vand(Condition cond,
   3948                         DataType dt,
   3949                         DRegister rd,
   3950                         DRegister rn,
   3951                         const DOperand& operand) {
   3952   os().SetCurrentInstruction(kVand, kFpNeon);
   3953   os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt;
   3954   os() << " ";
   3955   if (!rd.Is(rn) || !use_short_hand_form_) {
   3956     os() << rd << ", ";
   3957   }
   3958   os() << rn << ", " << operand;
   3959 }
   3960 
   3961 void Disassembler::vand(Condition cond,
   3962                         DataType dt,
   3963                         QRegister rd,
   3964                         QRegister rn,
   3965                         const QOperand& operand) {
   3966   os().SetCurrentInstruction(kVand, kFpNeon);
   3967   os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt;
   3968   os() << " ";
   3969   if (!rd.Is(rn) || !use_short_hand_form_) {
   3970     os() << rd << ", ";
   3971   }
   3972   os() << rn << ", " << operand;
   3973 }
   3974 
   3975 void Disassembler::vbic(Condition cond,
   3976                         DataType dt,
   3977                         DRegister rd,
   3978                         DRegister rn,
   3979                         const DOperand& operand) {
   3980   os().SetCurrentInstruction(kVbic, kFpNeon);
   3981   os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt;
   3982   os() << " ";
   3983   if (!rd.Is(rn) || !use_short_hand_form_) {
   3984     os() << rd << ", ";
   3985   }
   3986   os() << rn << ", " << operand;
   3987 }
   3988 
   3989 void Disassembler::vbic(Condition cond,
   3990                         DataType dt,
   3991                         QRegister rd,
   3992                         QRegister rn,
   3993                         const QOperand& operand) {
   3994   os().SetCurrentInstruction(kVbic, kFpNeon);
   3995   os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt;
   3996   os() << " ";
   3997   if (!rd.Is(rn) || !use_short_hand_form_) {
   3998     os() << rd << ", ";
   3999   }
   4000   os() << rn << ", " << operand;
   4001 }
   4002 
   4003 void Disassembler::vbif(
   4004     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4005   os().SetCurrentInstruction(kVbif, kFpNeon);
   4006   os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt;
   4007   os() << " ";
   4008   if (!rd.Is(rn) || !use_short_hand_form_) {
   4009     os() << rd << ", ";
   4010   }
   4011   os() << rn << ", " << rm;
   4012 }
   4013 
   4014 void Disassembler::vbif(
   4015     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4016   os().SetCurrentInstruction(kVbif, kFpNeon);
   4017   os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt;
   4018   os() << " ";
   4019   if (!rd.Is(rn) || !use_short_hand_form_) {
   4020     os() << rd << ", ";
   4021   }
   4022   os() << rn << ", " << rm;
   4023 }
   4024 
   4025 void Disassembler::vbit(
   4026     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4027   os().SetCurrentInstruction(kVbit, kFpNeon);
   4028   os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt;
   4029   os() << " ";
   4030   if (!rd.Is(rn) || !use_short_hand_form_) {
   4031     os() << rd << ", ";
   4032   }
   4033   os() << rn << ", " << rm;
   4034 }
   4035 
   4036 void Disassembler::vbit(
   4037     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4038   os().SetCurrentInstruction(kVbit, kFpNeon);
   4039   os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt;
   4040   os() << " ";
   4041   if (!rd.Is(rn) || !use_short_hand_form_) {
   4042     os() << rd << ", ";
   4043   }
   4044   os() << rn << ", " << rm;
   4045 }
   4046 
   4047 void Disassembler::vbsl(
   4048     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4049   os().SetCurrentInstruction(kVbsl, kFpNeon);
   4050   os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt;
   4051   os() << " ";
   4052   if (!rd.Is(rn) || !use_short_hand_form_) {
   4053     os() << rd << ", ";
   4054   }
   4055   os() << rn << ", " << rm;
   4056 }
   4057 
   4058 void Disassembler::vbsl(
   4059     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4060   os().SetCurrentInstruction(kVbsl, kFpNeon);
   4061   os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt;
   4062   os() << " ";
   4063   if (!rd.Is(rn) || !use_short_hand_form_) {
   4064     os() << rd << ", ";
   4065   }
   4066   os() << rn << ", " << rm;
   4067 }
   4068 
   4069 void Disassembler::vceq(Condition cond,
   4070                         DataType dt,
   4071                         DRegister rd,
   4072                         DRegister rm,
   4073                         const DOperand& operand) {
   4074   os().SetCurrentInstruction(kVceq, kFpNeon);
   4075   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
   4076   os() << " ";
   4077   if (!rd.Is(rm) || !use_short_hand_form_) {
   4078     os() << rd << ", ";
   4079   }
   4080   os() << rm << ", " << operand;
   4081 }
   4082 
   4083 void Disassembler::vceq(Condition cond,
   4084                         DataType dt,
   4085                         QRegister rd,
   4086                         QRegister rm,
   4087                         const QOperand& operand) {
   4088   os().SetCurrentInstruction(kVceq, kFpNeon);
   4089   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
   4090   os() << " ";
   4091   if (!rd.Is(rm) || !use_short_hand_form_) {
   4092     os() << rd << ", ";
   4093   }
   4094   os() << rm << ", " << operand;
   4095 }
   4096 
   4097 void Disassembler::vceq(
   4098     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4099   os().SetCurrentInstruction(kVceq, kFpNeon);
   4100   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
   4101   os() << " ";
   4102   if (!rd.Is(rn) || !use_short_hand_form_) {
   4103     os() << rd << ", ";
   4104   }
   4105   os() << rn << ", " << rm;
   4106 }
   4107 
   4108 void Disassembler::vceq(
   4109     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4110   os().SetCurrentInstruction(kVceq, kFpNeon);
   4111   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
   4112   os() << " ";
   4113   if (!rd.Is(rn) || !use_short_hand_form_) {
   4114     os() << rd << ", ";
   4115   }
   4116   os() << rn << ", " << rm;
   4117 }
   4118 
   4119 void Disassembler::vcge(Condition cond,
   4120                         DataType dt,
   4121                         DRegister rd,
   4122                         DRegister rm,
   4123                         const DOperand& operand) {
   4124   os().SetCurrentInstruction(kVcge, kFpNeon);
   4125   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
   4126   os() << " ";
   4127   if (!rd.Is(rm) || !use_short_hand_form_) {
   4128     os() << rd << ", ";
   4129   }
   4130   os() << rm << ", " << operand;
   4131 }
   4132 
   4133 void Disassembler::vcge(Condition cond,
   4134                         DataType dt,
   4135                         QRegister rd,
   4136                         QRegister rm,
   4137                         const QOperand& operand) {
   4138   os().SetCurrentInstruction(kVcge, kFpNeon);
   4139   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
   4140   os() << " ";
   4141   if (!rd.Is(rm) || !use_short_hand_form_) {
   4142     os() << rd << ", ";
   4143   }
   4144   os() << rm << ", " << operand;
   4145 }
   4146 
   4147 void Disassembler::vcge(
   4148     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4149   os().SetCurrentInstruction(kVcge, kFpNeon);
   4150   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
   4151   os() << " ";
   4152   if (!rd.Is(rn) || !use_short_hand_form_) {
   4153     os() << rd << ", ";
   4154   }
   4155   os() << rn << ", " << rm;
   4156 }
   4157 
   4158 void Disassembler::vcge(
   4159     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4160   os().SetCurrentInstruction(kVcge, kFpNeon);
   4161   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
   4162   os() << " ";
   4163   if (!rd.Is(rn) || !use_short_hand_form_) {
   4164     os() << rd << ", ";
   4165   }
   4166   os() << rn << ", " << rm;
   4167 }
   4168 
   4169 void Disassembler::vcgt(Condition cond,
   4170                         DataType dt,
   4171                         DRegister rd,
   4172                         DRegister rm,
   4173                         const DOperand& operand) {
   4174   os().SetCurrentInstruction(kVcgt, kFpNeon);
   4175   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
   4176   os() << " ";
   4177   if (!rd.Is(rm) || !use_short_hand_form_) {
   4178     os() << rd << ", ";
   4179   }
   4180   os() << rm << ", " << operand;
   4181 }
   4182 
   4183 void Disassembler::vcgt(Condition cond,
   4184                         DataType dt,
   4185                         QRegister rd,
   4186                         QRegister rm,
   4187                         const QOperand& operand) {
   4188   os().SetCurrentInstruction(kVcgt, kFpNeon);
   4189   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
   4190   os() << " ";
   4191   if (!rd.Is(rm) || !use_short_hand_form_) {
   4192     os() << rd << ", ";
   4193   }
   4194   os() << rm << ", " << operand;
   4195 }
   4196 
   4197 void Disassembler::vcgt(
   4198     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4199   os().SetCurrentInstruction(kVcgt, kFpNeon);
   4200   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
   4201   os() << " ";
   4202   if (!rd.Is(rn) || !use_short_hand_form_) {
   4203     os() << rd << ", ";
   4204   }
   4205   os() << rn << ", " << rm;
   4206 }
   4207 
   4208 void Disassembler::vcgt(
   4209     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4210   os().SetCurrentInstruction(kVcgt, kFpNeon);
   4211   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
   4212   os() << " ";
   4213   if (!rd.Is(rn) || !use_short_hand_form_) {
   4214     os() << rd << ", ";
   4215   }
   4216   os() << rn << ", " << rm;
   4217 }
   4218 
   4219 void Disassembler::vcle(Condition cond,
   4220                         DataType dt,
   4221                         DRegister rd,
   4222                         DRegister rm,
   4223                         const DOperand& operand) {
   4224   os().SetCurrentInstruction(kVcle, kFpNeon);
   4225   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
   4226   os() << " ";
   4227   if (!rd.Is(rm) || !use_short_hand_form_) {
   4228     os() << rd << ", ";
   4229   }
   4230   os() << rm << ", " << operand;
   4231 }
   4232 
   4233 void Disassembler::vcle(Condition cond,
   4234                         DataType dt,
   4235                         QRegister rd,
   4236                         QRegister rm,
   4237                         const QOperand& operand) {
   4238   os().SetCurrentInstruction(kVcle, kFpNeon);
   4239   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
   4240   os() << " ";
   4241   if (!rd.Is(rm) || !use_short_hand_form_) {
   4242     os() << rd << ", ";
   4243   }
   4244   os() << rm << ", " << operand;
   4245 }
   4246 
   4247 void Disassembler::vcle(
   4248     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4249   os().SetCurrentInstruction(kVcle, kFpNeon);
   4250   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
   4251   os() << " ";
   4252   if (!rd.Is(rn) || !use_short_hand_form_) {
   4253     os() << rd << ", ";
   4254   }
   4255   os() << rn << ", " << rm;
   4256 }
   4257 
   4258 void Disassembler::vcle(
   4259     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4260   os().SetCurrentInstruction(kVcle, kFpNeon);
   4261   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
   4262   os() << " ";
   4263   if (!rd.Is(rn) || !use_short_hand_form_) {
   4264     os() << rd << ", ";
   4265   }
   4266   os() << rn << ", " << rm;
   4267 }
   4268 
   4269 void Disassembler::vcls(Condition cond,
   4270                         DataType dt,
   4271                         DRegister rd,
   4272                         DRegister rm) {
   4273   os().SetCurrentInstruction(kVcls, kFpNeon);
   4274   os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " "
   4275        << rd << ", " << rm;
   4276 }
   4277 
   4278 void Disassembler::vcls(Condition cond,
   4279                         DataType dt,
   4280                         QRegister rd,
   4281                         QRegister rm) {
   4282   os().SetCurrentInstruction(kVcls, kFpNeon);
   4283   os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " "
   4284        << rd << ", " << rm;
   4285 }
   4286 
   4287 void Disassembler::vclt(Condition cond,
   4288                         DataType dt,
   4289                         DRegister rd,
   4290                         DRegister rm,
   4291                         const DOperand& operand) {
   4292   os().SetCurrentInstruction(kVclt, kFpNeon);
   4293   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
   4294   os() << " ";
   4295   if (!rd.Is(rm) || !use_short_hand_form_) {
   4296     os() << rd << ", ";
   4297   }
   4298   os() << rm << ", " << operand;
   4299 }
   4300 
   4301 void Disassembler::vclt(Condition cond,
   4302                         DataType dt,
   4303                         QRegister rd,
   4304                         QRegister rm,
   4305                         const QOperand& operand) {
   4306   os().SetCurrentInstruction(kVclt, kFpNeon);
   4307   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
   4308   os() << " ";
   4309   if (!rd.Is(rm) || !use_short_hand_form_) {
   4310     os() << rd << ", ";
   4311   }
   4312   os() << rm << ", " << operand;
   4313 }
   4314 
   4315 void Disassembler::vclt(
   4316     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4317   os().SetCurrentInstruction(kVclt, kFpNeon);
   4318   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
   4319   os() << " ";
   4320   if (!rd.Is(rn) || !use_short_hand_form_) {
   4321     os() << rd << ", ";
   4322   }
   4323   os() << rn << ", " << rm;
   4324 }
   4325 
   4326 void Disassembler::vclt(
   4327     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4328   os().SetCurrentInstruction(kVclt, kFpNeon);
   4329   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
   4330   os() << " ";
   4331   if (!rd.Is(rn) || !use_short_hand_form_) {
   4332     os() << rd << ", ";
   4333   }
   4334   os() << rn << ", " << rm;
   4335 }
   4336 
   4337 void Disassembler::vclz(Condition cond,
   4338                         DataType dt,
   4339                         DRegister rd,
   4340                         DRegister rm) {
   4341   os().SetCurrentInstruction(kVclz, kFpNeon);
   4342   os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " "
   4343        << rd << ", " << rm;
   4344 }
   4345 
   4346 void Disassembler::vclz(Condition cond,
   4347                         DataType dt,
   4348                         QRegister rd,
   4349                         QRegister rm) {
   4350   os().SetCurrentInstruction(kVclz, kFpNeon);
   4351   os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " "
   4352        << rd << ", " << rm;
   4353 }
   4354 
   4355 void Disassembler::vcmp(Condition cond,
   4356                         DataType dt,
   4357                         SRegister rd,
   4358                         const SOperand& operand) {
   4359   os().SetCurrentInstruction(kVcmp, kFpNeon);
   4360   os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
   4361        << rd << ", " << operand;
   4362 }
   4363 
   4364 void Disassembler::vcmp(Condition cond,
   4365                         DataType dt,
   4366                         DRegister rd,
   4367                         const DOperand& operand) {
   4368   os().SetCurrentInstruction(kVcmp, kFpNeon);
   4369   os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
   4370        << rd << ", " << operand;
   4371 }
   4372 
   4373 void Disassembler::vcmpe(Condition cond,
   4374                          DataType dt,
   4375                          SRegister rd,
   4376                          const SOperand& operand) {
   4377   os().SetCurrentInstruction(kVcmpe, kFpNeon);
   4378   os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
   4379        << rd << ", " << operand;
   4380 }
   4381 
   4382 void Disassembler::vcmpe(Condition cond,
   4383                          DataType dt,
   4384                          DRegister rd,
   4385                          const DOperand& operand) {
   4386   os().SetCurrentInstruction(kVcmpe, kFpNeon);
   4387   os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
   4388        << rd << ", " << operand;
   4389 }
   4390 
   4391 void Disassembler::vcnt(Condition cond,
   4392                         DataType dt,
   4393                         DRegister rd,
   4394                         DRegister rm) {
   4395   os().SetCurrentInstruction(kVcnt, kFpNeon);
   4396   os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " "
   4397        << rd << ", " << rm;
   4398 }
   4399 
   4400 void Disassembler::vcnt(Condition cond,
   4401                         DataType dt,
   4402                         QRegister rd,
   4403                         QRegister rm) {
   4404   os().SetCurrentInstruction(kVcnt, kFpNeon);
   4405   os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " "
   4406        << rd << ", " << rm;
   4407 }
   4408 
   4409 void Disassembler::vcvt(
   4410     Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
   4411   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4412   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4413        << " " << rd << ", " << rm;
   4414 }
   4415 
   4416 void Disassembler::vcvt(
   4417     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
   4418   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4419   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4420        << " " << rd << ", " << rm;
   4421 }
   4422 
   4423 void Disassembler::vcvt(Condition cond,
   4424                         DataType dt1,
   4425                         DataType dt2,
   4426                         DRegister rd,
   4427                         DRegister rm,
   4428                         int32_t fbits) {
   4429   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4430   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4431        << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits);
   4432 }
   4433 
   4434 void Disassembler::vcvt(Condition cond,
   4435                         DataType dt1,
   4436                         DataType dt2,
   4437                         QRegister rd,
   4438                         QRegister rm,
   4439                         int32_t fbits) {
   4440   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4441   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4442        << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits);
   4443 }
   4444 
   4445 void Disassembler::vcvt(Condition cond,
   4446                         DataType dt1,
   4447                         DataType dt2,
   4448                         SRegister rd,
   4449                         SRegister rm,
   4450                         int32_t fbits) {
   4451   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4452   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4453        << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits);
   4454 }
   4455 
   4456 void Disassembler::vcvt(
   4457     Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
   4458   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4459   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4460        << " " << rd << ", " << rm;
   4461 }
   4462 
   4463 void Disassembler::vcvt(
   4464     Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
   4465   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4466   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4467        << " " << rd << ", " << rm;
   4468 }
   4469 
   4470 void Disassembler::vcvt(
   4471     Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
   4472   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4473   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4474        << " " << rd << ", " << rm;
   4475 }
   4476 
   4477 void Disassembler::vcvt(
   4478     Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
   4479   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4480   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4481        << " " << rd << ", " << rm;
   4482 }
   4483 
   4484 void Disassembler::vcvt(
   4485     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   4486   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4487   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4488        << " " << rd << ", " << rm;
   4489 }
   4490 
   4491 void Disassembler::vcvta(DataType dt1,
   4492                          DataType dt2,
   4493                          DRegister rd,
   4494                          DRegister rm) {
   4495   os().SetCurrentInstruction(kVcvta, kFpNeon);
   4496   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
   4497 }
   4498 
   4499 void Disassembler::vcvta(DataType dt1,
   4500                          DataType dt2,
   4501                          QRegister rd,
   4502                          QRegister rm) {
   4503   os().SetCurrentInstruction(kVcvta, kFpNeon);
   4504   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
   4505 }
   4506 
   4507 void Disassembler::vcvta(DataType dt1,
   4508                          DataType dt2,
   4509                          SRegister rd,
   4510                          SRegister rm) {
   4511   os().SetCurrentInstruction(kVcvta, kFpNeon);
   4512   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
   4513 }
   4514 
   4515 void Disassembler::vcvta(DataType dt1,
   4516                          DataType dt2,
   4517                          SRegister rd,
   4518                          DRegister rm) {
   4519   os().SetCurrentInstruction(kVcvta, kFpNeon);
   4520   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
   4521 }
   4522 
   4523 void Disassembler::vcvtb(
   4524     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   4525   os().SetCurrentInstruction(kVcvtb, kFpNeon);
   4526   os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4527        << " " << rd << ", " << rm;
   4528 }
   4529 
   4530 void Disassembler::vcvtb(
   4531     Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
   4532   os().SetCurrentInstruction(kVcvtb, kFpNeon);
   4533   os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4534        << " " << rd << ", " << rm;
   4535 }
   4536 
   4537 void Disassembler::vcvtb(
   4538     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
   4539   os().SetCurrentInstruction(kVcvtb, kFpNeon);
   4540   os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4541        << " " << rd << ", " << rm;
   4542 }
   4543 
   4544 void Disassembler::vcvtm(DataType dt1,
   4545                          DataType dt2,
   4546                          DRegister rd,
   4547                          DRegister rm) {
   4548   os().SetCurrentInstruction(kVcvtm, kFpNeon);
   4549   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
   4550 }
   4551 
   4552 void Disassembler::vcvtm(DataType dt1,
   4553                          DataType dt2,
   4554                          QRegister rd,
   4555                          QRegister rm) {
   4556   os().SetCurrentInstruction(kVcvtm, kFpNeon);
   4557   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
   4558 }
   4559 
   4560 void Disassembler::vcvtm(DataType dt1,
   4561                          DataType dt2,
   4562                          SRegister rd,
   4563                          SRegister rm) {
   4564   os().SetCurrentInstruction(kVcvtm, kFpNeon);
   4565   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
   4566 }
   4567 
   4568 void Disassembler::vcvtm(DataType dt1,
   4569                          DataType dt2,
   4570                          SRegister rd,
   4571                          DRegister rm) {
   4572   os().SetCurrentInstruction(kVcvtm, kFpNeon);
   4573   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
   4574 }
   4575 
   4576 void Disassembler::vcvtn(DataType dt1,
   4577                          DataType dt2,
   4578                          DRegister rd,
   4579                          DRegister rm) {
   4580   os().SetCurrentInstruction(kVcvtn, kFpNeon);
   4581   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
   4582 }
   4583 
   4584 void Disassembler::vcvtn(DataType dt1,
   4585                          DataType dt2,
   4586                          QRegister rd,
   4587                          QRegister rm) {
   4588   os().SetCurrentInstruction(kVcvtn, kFpNeon);
   4589   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
   4590 }
   4591 
   4592 void Disassembler::vcvtn(DataType dt1,
   4593                          DataType dt2,
   4594                          SRegister rd,
   4595                          SRegister rm) {
   4596   os().SetCurrentInstruction(kVcvtn, kFpNeon);
   4597   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
   4598 }
   4599 
   4600 void Disassembler::vcvtn(DataType dt1,
   4601                          DataType dt2,
   4602                          SRegister rd,
   4603                          DRegister rm) {
   4604   os().SetCurrentInstruction(kVcvtn, kFpNeon);
   4605   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
   4606 }
   4607 
   4608 void Disassembler::vcvtp(DataType dt1,
   4609                          DataType dt2,
   4610                          DRegister rd,
   4611                          DRegister rm) {
   4612   os().SetCurrentInstruction(kVcvtp, kFpNeon);
   4613   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
   4614 }
   4615 
   4616 void Disassembler::vcvtp(DataType dt1,
   4617                          DataType dt2,
   4618                          QRegister rd,
   4619                          QRegister rm) {
   4620   os().SetCurrentInstruction(kVcvtp, kFpNeon);
   4621   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
   4622 }
   4623 
   4624 void Disassembler::vcvtp(DataType dt1,
   4625                          DataType dt2,
   4626                          SRegister rd,
   4627                          SRegister rm) {
   4628   os().SetCurrentInstruction(kVcvtp, kFpNeon);
   4629   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
   4630 }
   4631 
   4632 void Disassembler::vcvtp(DataType dt1,
   4633                          DataType dt2,
   4634                          SRegister rd,
   4635                          DRegister rm) {
   4636   os().SetCurrentInstruction(kVcvtp, kFpNeon);
   4637   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
   4638 }
   4639 
   4640 void Disassembler::vcvtr(
   4641     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   4642   os().SetCurrentInstruction(kVcvtr, kFpNeon);
   4643   os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4644        << " " << rd << ", " << rm;
   4645 }
   4646 
   4647 void Disassembler::vcvtr(
   4648     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
   4649   os().SetCurrentInstruction(kVcvtr, kFpNeon);
   4650   os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4651        << " " << rd << ", " << rm;
   4652 }
   4653 
   4654 void Disassembler::vcvtt(
   4655     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   4656   os().SetCurrentInstruction(kVcvtt, kFpNeon);
   4657   os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4658        << " " << rd << ", " << rm;
   4659 }
   4660 
   4661 void Disassembler::vcvtt(
   4662     Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
   4663   os().SetCurrentInstruction(kVcvtt, kFpNeon);
   4664   os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4665        << " " << rd << ", " << rm;
   4666 }
   4667 
   4668 void Disassembler::vcvtt(
   4669     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
   4670   os().SetCurrentInstruction(kVcvtt, kFpNeon);
   4671   os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4672        << " " << rd << ", " << rm;
   4673 }
   4674 
   4675 void Disassembler::vdiv(
   4676     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4677   os().SetCurrentInstruction(kVdiv, kFpNeon);
   4678   os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt;
   4679   os() << " ";
   4680   if (!rd.Is(rn) || !use_short_hand_form_) {
   4681     os() << rd << ", ";
   4682   }
   4683   os() << rn << ", " << rm;
   4684 }
   4685 
   4686 void Disassembler::vdiv(
   4687     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4688   os().SetCurrentInstruction(kVdiv, kFpNeon);
   4689   os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt;
   4690   os() << " ";
   4691   if (!rd.Is(rn) || !use_short_hand_form_) {
   4692     os() << rd << ", ";
   4693   }
   4694   os() << rn << ", " << rm;
   4695 }
   4696 
   4697 void Disassembler::vdup(Condition cond,
   4698                         DataType dt,
   4699                         QRegister rd,
   4700                         Register rt) {
   4701   os().SetCurrentInstruction(kVdup, kFpNeon);
   4702   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
   4703        << rd << ", " << rt;
   4704 }
   4705 
   4706 void Disassembler::vdup(Condition cond,
   4707                         DataType dt,
   4708                         DRegister rd,
   4709                         Register rt) {
   4710   os().SetCurrentInstruction(kVdup, kFpNeon);
   4711   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
   4712        << rd << ", " << rt;
   4713 }
   4714 
   4715 void Disassembler::vdup(Condition cond,
   4716                         DataType dt,
   4717                         DRegister rd,
   4718                         DRegisterLane rm) {
   4719   os().SetCurrentInstruction(kVdup, kFpNeon);
   4720   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
   4721        << rd << ", " << rm;
   4722 }
   4723 
   4724 void Disassembler::vdup(Condition cond,
   4725                         DataType dt,
   4726                         QRegister rd,
   4727                         DRegisterLane rm) {
   4728   os().SetCurrentInstruction(kVdup, kFpNeon);
   4729   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
   4730        << rd << ", " << rm;
   4731 }
   4732 
   4733 void Disassembler::veor(
   4734     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4735   os().SetCurrentInstruction(kVeor, kFpNeon);
   4736   os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt;
   4737   os() << " ";
   4738   if (!rd.Is(rn) || !use_short_hand_form_) {
   4739     os() << rd << ", ";
   4740   }
   4741   os() << rn << ", " << rm;
   4742 }
   4743 
   4744 void Disassembler::veor(
   4745     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4746   os().SetCurrentInstruction(kVeor, kFpNeon);
   4747   os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt;
   4748   os() << " ";
   4749   if (!rd.Is(rn) || !use_short_hand_form_) {
   4750     os() << rd << ", ";
   4751   }
   4752   os() << rn << ", " << rm;
   4753 }
   4754 
   4755 void Disassembler::vext(Condition cond,
   4756                         DataType dt,
   4757                         DRegister rd,
   4758                         DRegister rn,
   4759                         DRegister rm,
   4760                         const DOperand& operand) {
   4761   os().SetCurrentInstruction(kVext, kFpNeon);
   4762   os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt;
   4763   os() << " ";
   4764   if (!rd.Is(rn) || !use_short_hand_form_) {
   4765     os() << rd << ", ";
   4766   }
   4767   os() << rn << ", " << rm << ", " << operand;
   4768 }
   4769 
   4770 void Disassembler::vext(Condition cond,
   4771                         DataType dt,
   4772                         QRegister rd,
   4773                         QRegister rn,
   4774                         QRegister rm,
   4775                         const QOperand& operand) {
   4776   os().SetCurrentInstruction(kVext, kFpNeon);
   4777   os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt;
   4778   os() << " ";
   4779   if (!rd.Is(rn) || !use_short_hand_form_) {
   4780     os() << rd << ", ";
   4781   }
   4782   os() << rn << ", " << rm << ", " << operand;
   4783 }
   4784 
   4785 void Disassembler::vfma(
   4786     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4787   os().SetCurrentInstruction(kVfma, kFpNeon);
   4788   os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
   4789        << rd << ", " << rn << ", " << rm;
   4790 }
   4791 
   4792 void Disassembler::vfma(
   4793     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4794   os().SetCurrentInstruction(kVfma, kFpNeon);
   4795   os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
   4796        << rd << ", " << rn << ", " << rm;
   4797 }
   4798 
   4799 void Disassembler::vfma(
   4800     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4801   os().SetCurrentInstruction(kVfma, kFpNeon);
   4802   os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
   4803        << rd << ", " << rn << ", " << rm;
   4804 }
   4805 
   4806 void Disassembler::vfms(
   4807     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4808   os().SetCurrentInstruction(kVfms, kFpNeon);
   4809   os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
   4810        << rd << ", " << rn << ", " << rm;
   4811 }
   4812 
   4813 void Disassembler::vfms(
   4814     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4815   os().SetCurrentInstruction(kVfms, kFpNeon);
   4816   os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
   4817        << rd << ", " << rn << ", " << rm;
   4818 }
   4819 
   4820 void Disassembler::vfms(
   4821     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4822   os().SetCurrentInstruction(kVfms, kFpNeon);
   4823   os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
   4824        << rd << ", " << rn << ", " << rm;
   4825 }
   4826 
   4827 void Disassembler::vfnma(
   4828     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4829   os().SetCurrentInstruction(kVfnma, kFpNeon);
   4830   os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " "
   4831        << rd << ", " << rn << ", " << rm;
   4832 }
   4833 
   4834 void Disassembler::vfnma(
   4835     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4836   os().SetCurrentInstruction(kVfnma, kFpNeon);
   4837   os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " "
   4838        << rd << ", " << rn << ", " << rm;
   4839 }
   4840 
   4841 void Disassembler::vfnms(
   4842     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4843   os().SetCurrentInstruction(kVfnms, kFpNeon);
   4844   os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " "
   4845        << rd << ", " << rn << ", " << rm;
   4846 }
   4847 
   4848 void Disassembler::vfnms(
   4849     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4850   os().SetCurrentInstruction(kVfnms, kFpNeon);
   4851   os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " "
   4852        << rd << ", " << rn << ", " << rm;
   4853 }
   4854 
   4855 void Disassembler::vhadd(
   4856     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4857   os().SetCurrentInstruction(kVhadd, kFpNeon);
   4858   os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt;
   4859   os() << " ";
   4860   if (!rd.Is(rn) || !use_short_hand_form_) {
   4861     os() << rd << ", ";
   4862   }
   4863   os() << rn << ", " << rm;
   4864 }
   4865 
   4866 void Disassembler::vhadd(
   4867     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4868   os().SetCurrentInstruction(kVhadd, kFpNeon);
   4869   os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt;
   4870   os() << " ";
   4871   if (!rd.Is(rn) || !use_short_hand_form_) {
   4872     os() << rd << ", ";
   4873   }
   4874   os() << rn << ", " << rm;
   4875 }
   4876 
   4877 void Disassembler::vhsub(
   4878     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4879   os().SetCurrentInstruction(kVhsub, kFpNeon);
   4880   os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt;
   4881   os() << " ";
   4882   if (!rd.Is(rn) || !use_short_hand_form_) {
   4883     os() << rd << ", ";
   4884   }
   4885   os() << rn << ", " << rm;
   4886 }
   4887 
   4888 void Disassembler::vhsub(
   4889     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4890   os().SetCurrentInstruction(kVhsub, kFpNeon);
   4891   os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt;
   4892   os() << " ";
   4893   if (!rd.Is(rn) || !use_short_hand_form_) {
   4894     os() << rd << ", ";
   4895   }
   4896   os() << rn << ", " << rm;
   4897 }
   4898 
   4899 void Disassembler::vld1(Condition cond,
   4900                         DataType dt,
   4901                         const NeonRegisterList& nreglist,
   4902                         const AlignedMemOperand& operand) {
   4903   os().SetCurrentInstruction(kVld1, kFpNeon);
   4904   os() << ToCString(kVld1) << ConditionPrinter(it_block_, cond) << dt << " "
   4905        << nreglist << ", " << PrintAlignedMemOperand(kVld1Location, operand);
   4906 }
   4907 
   4908 void Disassembler::vld2(Condition cond,
   4909                         DataType dt,
   4910                         const NeonRegisterList& nreglist,
   4911                         const AlignedMemOperand& operand) {
   4912   os().SetCurrentInstruction(kVld2, kFpNeon);
   4913   os() << ToCString(kVld2) << ConditionPrinter(it_block_, cond) << dt << " "
   4914        << nreglist << ", " << PrintAlignedMemOperand(kVld2Location, operand);
   4915 }
   4916 
   4917 void Disassembler::vld3(Condition cond,
   4918                         DataType dt,
   4919                         const NeonRegisterList& nreglist,
   4920                         const AlignedMemOperand& operand) {
   4921   os().SetCurrentInstruction(kVld3, kFpNeon);
   4922   os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " "
   4923        << nreglist << ", " << PrintAlignedMemOperand(kVld3Location, operand);
   4924 }
   4925 
   4926 void Disassembler::vld3(Condition cond,
   4927                         DataType dt,
   4928                         const NeonRegisterList& nreglist,
   4929                         const MemOperand& operand) {
   4930   os().SetCurrentInstruction(kVld3, kFpNeon);
   4931   os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " "
   4932        << nreglist << ", " << PrintMemOperand(kVld3Location, operand);
   4933 }
   4934 
   4935 void Disassembler::vld4(Condition cond,
   4936                         DataType dt,
   4937                         const NeonRegisterList& nreglist,
   4938                         const AlignedMemOperand& operand) {
   4939   os().SetCurrentInstruction(kVld4, kFpNeon);
   4940   os() << ToCString(kVld4) << ConditionPrinter(it_block_, cond) << dt << " "
   4941        << nreglist << ", " << PrintAlignedMemOperand(kVld4Location, operand);
   4942 }
   4943 
   4944 void Disassembler::vldm(Condition cond,
   4945                         DataType dt,
   4946                         Register rn,
   4947                         WriteBack write_back,
   4948                         DRegisterList dreglist) {
   4949   os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon);
   4950   os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " "
   4951        << rn << write_back << ", " << dreglist;
   4952 }
   4953 
   4954 void Disassembler::vldm(Condition cond,
   4955                         DataType dt,
   4956                         Register rn,
   4957                         WriteBack write_back,
   4958                         SRegisterList sreglist) {
   4959   os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon);
   4960   os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " "
   4961        << rn << write_back << ", " << sreglist;
   4962 }
   4963 
   4964 void Disassembler::vldmdb(Condition cond,
   4965                           DataType dt,
   4966                           Register rn,
   4967                           WriteBack write_back,
   4968                           DRegisterList dreglist) {
   4969   os().SetCurrentInstruction(kVldmdb,
   4970                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   4971   os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " "
   4972        << rn << write_back << ", " << dreglist;
   4973 }
   4974 
   4975 void Disassembler::vldmdb(Condition cond,
   4976                           DataType dt,
   4977                           Register rn,
   4978                           WriteBack write_back,
   4979                           SRegisterList sreglist) {
   4980   os().SetCurrentInstruction(kVldmdb,
   4981                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   4982   os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " "
   4983        << rn << write_back << ", " << sreglist;
   4984 }
   4985 
   4986 void Disassembler::vldmia(Condition cond,
   4987                           DataType dt,
   4988                           Register rn,
   4989                           WriteBack write_back,
   4990                           DRegisterList dreglist) {
   4991   os().SetCurrentInstruction(kVldmia,
   4992                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   4993   os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " "
   4994        << rn << write_back << ", " << dreglist;
   4995 }
   4996 
   4997 void Disassembler::vldmia(Condition cond,
   4998                           DataType dt,
   4999                           Register rn,
   5000                           WriteBack write_back,
   5001                           SRegisterList sreglist) {
   5002   os().SetCurrentInstruction(kVldmia,
   5003                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   5004   os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " "
   5005        << rn << write_back << ", " << sreglist;
   5006 }
   5007 
   5008 void Disassembler::vldr(Condition cond,
   5009                         DataType dt,
   5010                         DRegister rd,
   5011                         Location* location) {
   5012   os().SetCurrentInstruction(kVldr, kFpNeon);
   5013   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
   5014        << DtPrinter(dt, Untyped64) << " " << rd << ", "
   5015        << PrintLabel(kLoadDoublePrecisionLocation,
   5016                      location,
   5017                      GetCodeAddress() & ~3);
   5018 }
   5019 
   5020 void Disassembler::vldr(Condition cond,
   5021                         DataType dt,
   5022                         DRegister rd,
   5023                         const MemOperand& operand) {
   5024   os().SetCurrentInstruction(kVldr, kFpNeon);
   5025   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
   5026        << DtPrinter(dt, Untyped64) << " " << rd << ", "
   5027        << PrintMemOperand(kLoadDoublePrecisionLocation, operand);
   5028 }
   5029 
   5030 void Disassembler::vldr(Condition cond,
   5031                         DataType dt,
   5032                         SRegister rd,
   5033                         Location* location) {
   5034   os().SetCurrentInstruction(kVldr, kFpNeon);
   5035   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
   5036        << DtPrinter(dt, Untyped32) << " " << rd << ", "
   5037        << PrintLabel(kLoadSinglePrecisionLocation,
   5038                      location,
   5039                      GetCodeAddress() & ~3);
   5040 }
   5041 
   5042 void Disassembler::vldr(Condition cond,
   5043                         DataType dt,
   5044                         SRegister rd,
   5045                         const MemOperand& operand) {
   5046   os().SetCurrentInstruction(kVldr, kFpNeon);
   5047   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond)
   5048        << DtPrinter(dt, Untyped32) << " " << rd << ", "
   5049        << PrintMemOperand(kLoadSinglePrecisionLocation, operand);
   5050 }
   5051 
   5052 void Disassembler::vmax(
   5053     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5054   os().SetCurrentInstruction(kVmax, kFpNeon);
   5055   os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt;
   5056   os() << " ";
   5057   if (!rd.Is(rn) || !use_short_hand_form_) {
   5058     os() << rd << ", ";
   5059   }
   5060   os() << rn << ", " << rm;
   5061 }
   5062 
   5063 void Disassembler::vmax(
   5064     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5065   os().SetCurrentInstruction(kVmax, kFpNeon);
   5066   os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt;
   5067   os() << " ";
   5068   if (!rd.Is(rn) || !use_short_hand_form_) {
   5069     os() << rd << ", ";
   5070   }
   5071   os() << rn << ", " << rm;
   5072 }
   5073 
   5074 void Disassembler::vmaxnm(DataType dt,
   5075                           DRegister rd,
   5076                           DRegister rn,
   5077                           DRegister rm) {
   5078   os().SetCurrentInstruction(kVmaxnm, kFpNeon);
   5079   os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5080 }
   5081 
   5082 void Disassembler::vmaxnm(DataType dt,
   5083                           QRegister rd,
   5084                           QRegister rn,
   5085                           QRegister rm) {
   5086   os().SetCurrentInstruction(kVmaxnm, kFpNeon);
   5087   os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5088 }
   5089 
   5090 void Disassembler::vmaxnm(DataType dt,
   5091                           SRegister rd,
   5092                           SRegister rn,
   5093                           SRegister rm) {
   5094   os().SetCurrentInstruction(kVmaxnm, kFpNeon);
   5095   os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5096 }
   5097 
   5098 void Disassembler::vmin(
   5099     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5100   os().SetCurrentInstruction(kVmin, kFpNeon);
   5101   os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt;
   5102   os() << " ";
   5103   if (!rd.Is(rn) || !use_short_hand_form_) {
   5104     os() << rd << ", ";
   5105   }
   5106   os() << rn << ", " << rm;
   5107 }
   5108 
   5109 void Disassembler::vmin(
   5110     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5111   os().SetCurrentInstruction(kVmin, kFpNeon);
   5112   os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt;
   5113   os() << " ";
   5114   if (!rd.Is(rn) || !use_short_hand_form_) {
   5115     os() << rd << ", ";
   5116   }
   5117   os() << rn << ", " << rm;
   5118 }
   5119 
   5120 void Disassembler::vminnm(DataType dt,
   5121                           DRegister rd,
   5122                           DRegister rn,
   5123                           DRegister rm) {
   5124   os().SetCurrentInstruction(kVminnm, kFpNeon);
   5125   os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5126 }
   5127 
   5128 void Disassembler::vminnm(DataType dt,
   5129                           QRegister rd,
   5130                           QRegister rn,
   5131                           QRegister rm) {
   5132   os().SetCurrentInstruction(kVminnm, kFpNeon);
   5133   os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5134 }
   5135 
   5136 void Disassembler::vminnm(DataType dt,
   5137                           SRegister rd,
   5138                           SRegister rn,
   5139                           SRegister rm) {
   5140   os().SetCurrentInstruction(kVminnm, kFpNeon);
   5141   os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5142 }
   5143 
   5144 void Disassembler::vmla(
   5145     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
   5146   os().SetCurrentInstruction(kVmla, kFpNeon);
   5147   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5148        << rd << ", " << rn << ", " << rm;
   5149 }
   5150 
   5151 void Disassembler::vmla(
   5152     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
   5153   os().SetCurrentInstruction(kVmla, kFpNeon);
   5154   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5155        << rd << ", " << rn << ", " << rm;
   5156 }
   5157 
   5158 void Disassembler::vmla(
   5159     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5160   os().SetCurrentInstruction(kVmla, kFpNeon);
   5161   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5162        << rd << ", " << rn << ", " << rm;
   5163 }
   5164 
   5165 void Disassembler::vmla(
   5166     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5167   os().SetCurrentInstruction(kVmla, kFpNeon);
   5168   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5169        << rd << ", " << rn << ", " << rm;
   5170 }
   5171 
   5172 void Disassembler::vmla(
   5173     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5174   os().SetCurrentInstruction(kVmla, kFpNeon);
   5175   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5176        << rd << ", " << rn << ", " << rm;
   5177 }
   5178 
   5179 void Disassembler::vmlal(
   5180     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
   5181   os().SetCurrentInstruction(kVmlal, kFpNeon);
   5182   os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " "
   5183        << rd << ", " << rn << ", " << rm;
   5184 }
   5185 
   5186 void Disassembler::vmlal(
   5187     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5188   os().SetCurrentInstruction(kVmlal, kFpNeon);
   5189   os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " "
   5190        << rd << ", " << rn << ", " << rm;
   5191 }
   5192 
   5193 void Disassembler::vmls(
   5194     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
   5195   os().SetCurrentInstruction(kVmls, kFpNeon);
   5196   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5197        << rd << ", " << rn << ", " << rm;
   5198 }
   5199 
   5200 void Disassembler::vmls(
   5201     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
   5202   os().SetCurrentInstruction(kVmls, kFpNeon);
   5203   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5204        << rd << ", " << rn << ", " << rm;
   5205 }
   5206 
   5207 void Disassembler::vmls(
   5208     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5209   os().SetCurrentInstruction(kVmls, kFpNeon);
   5210   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5211        << rd << ", " << rn << ", " << rm;
   5212 }
   5213 
   5214 void Disassembler::vmls(
   5215     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5216   os().SetCurrentInstruction(kVmls, kFpNeon);
   5217   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5218        << rd << ", " << rn << ", " << rm;
   5219 }
   5220 
   5221 void Disassembler::vmls(
   5222     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5223   os().SetCurrentInstruction(kVmls, kFpNeon);
   5224   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5225        << rd << ", " << rn << ", " << rm;
   5226 }
   5227 
   5228 void Disassembler::vmlsl(
   5229     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
   5230   os().SetCurrentInstruction(kVmlsl, kFpNeon);
   5231   os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
   5232        << rd << ", " << rn << ", " << rm;
   5233 }
   5234 
   5235 void Disassembler::vmlsl(
   5236     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5237   os().SetCurrentInstruction(kVmlsl, kFpNeon);
   5238   os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
   5239        << rd << ", " << rn << ", " << rm;
   5240 }
   5241 
   5242 void Disassembler::vmov(Condition cond, Register rt, SRegister rn) {
   5243   os().SetCurrentInstruction(kVmov, kFpNeon);
   5244   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
   5245        << ", " << rn;
   5246 }
   5247 
   5248 void Disassembler::vmov(Condition cond, SRegister rn, Register rt) {
   5249   os().SetCurrentInstruction(kVmov, kFpNeon);
   5250   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rn
   5251        << ", " << rt;
   5252 }
   5253 
   5254 void Disassembler::vmov(Condition cond,
   5255                         Register rt,
   5256                         Register rt2,
   5257                         DRegister rm) {
   5258   os().SetCurrentInstruction(kVmov, kFpNeon);
   5259   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
   5260        << ", " << rt2 << ", " << rm;
   5261 }
   5262 
   5263 void Disassembler::vmov(Condition cond,
   5264                         DRegister rm,
   5265                         Register rt,
   5266                         Register rt2) {
   5267   os().SetCurrentInstruction(kVmov, kFpNeon);
   5268   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm
   5269        << ", " << rt << ", " << rt2;
   5270 }
   5271 
   5272 void Disassembler::vmov(
   5273     Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) {
   5274   os().SetCurrentInstruction(kVmov, kFpNeon);
   5275   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
   5276        << ", " << rt2 << ", " << rm << ", " << rm1;
   5277 }
   5278 
   5279 void Disassembler::vmov(
   5280     Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) {
   5281   os().SetCurrentInstruction(kVmov, kFpNeon);
   5282   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm
   5283        << ", " << rm1 << ", " << rt << ", " << rt2;
   5284 }
   5285 
   5286 void Disassembler::vmov(Condition cond,
   5287                         DataType dt,
   5288                         DRegisterLane rd,
   5289                         Register rt) {
   5290   os().SetCurrentInstruction(kVmov, kFpNeon);
   5291   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5292        << rd << ", " << rt;
   5293 }
   5294 
   5295 void Disassembler::vmov(Condition cond,
   5296                         DataType dt,
   5297                         DRegister rd,
   5298                         const DOperand& operand) {
   5299   os().SetCurrentInstruction(kVmov, kFpNeon);
   5300   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5301        << rd << ", " << operand;
   5302 }
   5303 
   5304 void Disassembler::vmov(Condition cond,
   5305                         DataType dt,
   5306                         QRegister rd,
   5307                         const QOperand& operand) {
   5308   os().SetCurrentInstruction(kVmov, kFpNeon);
   5309   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5310        << rd << ", " << operand;
   5311 }
   5312 
   5313 void Disassembler::vmov(Condition cond,
   5314                         DataType dt,
   5315                         SRegister rd,
   5316                         const SOperand& operand) {
   5317   os().SetCurrentInstruction(kVmov, kFpNeon);
   5318   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5319        << rd << ", " << operand;
   5320 }
   5321 
   5322 void Disassembler::vmov(Condition cond,
   5323                         DataType dt,
   5324                         Register rt,
   5325                         DRegisterLane rn) {
   5326   os().SetCurrentInstruction(kVmov, kFpNeon);
   5327   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5328        << rt << ", " << rn;
   5329 }
   5330 
   5331 void Disassembler::vmovl(Condition cond,
   5332                          DataType dt,
   5333                          QRegister rd,
   5334                          DRegister rm) {
   5335   os().SetCurrentInstruction(kVmovl, kFpNeon);
   5336   os() << ToCString(kVmovl) << ConditionPrinter(it_block_, cond) << dt << " "
   5337        << rd << ", " << rm;
   5338 }
   5339 
   5340 void Disassembler::vmovn(Condition cond,
   5341                          DataType dt,
   5342                          DRegister rd,
   5343                          QRegister rm) {
   5344   os().SetCurrentInstruction(kVmovn, kFpNeon);
   5345   os() << ToCString(kVmovn) << ConditionPrinter(it_block_, cond) << dt << " "
   5346        << rd << ", " << rm;
   5347 }
   5348 
   5349 void Disassembler::vmrs(Condition cond,
   5350                         RegisterOrAPSR_nzcv rt,
   5351                         SpecialFPRegister spec_reg) {
   5352   os().SetCurrentInstruction(kVmrs, kFpNeon);
   5353   os() << ToCString(kVmrs) << ConditionPrinter(it_block_, cond) << " " << rt
   5354        << ", " << spec_reg;
   5355 }
   5356 
   5357 void Disassembler::vmsr(Condition cond,
   5358                         SpecialFPRegister spec_reg,
   5359                         Register rt) {
   5360   os().SetCurrentInstruction(kVmsr, kFpNeon);
   5361   os() << ToCString(kVmsr) << ConditionPrinter(it_block_, cond) << " "
   5362        << spec_reg << ", " << rt;
   5363 }
   5364 
   5365 void Disassembler::vmul(Condition cond,
   5366                         DataType dt,
   5367                         DRegister rd,
   5368                         DRegister rn,
   5369                         DRegister dm,
   5370                         unsigned index) {
   5371   os().SetCurrentInstruction(kVmul, kFpNeon);
   5372   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5373   os() << " ";
   5374   if (!rd.Is(rn) || !use_short_hand_form_) {
   5375     os() << rd << ", ";
   5376   }
   5377   os() << rn << ", " << IndexedRegisterPrinter(dm, index);
   5378 }
   5379 
   5380 void Disassembler::vmul(Condition cond,
   5381                         DataType dt,
   5382                         QRegister rd,
   5383                         QRegister rn,
   5384                         DRegister dm,
   5385                         unsigned index) {
   5386   os().SetCurrentInstruction(kVmul, kFpNeon);
   5387   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5388   os() << " ";
   5389   if (!rd.Is(rn) || !use_short_hand_form_) {
   5390     os() << rd << ", ";
   5391   }
   5392   os() << rn << ", " << IndexedRegisterPrinter(dm, index);
   5393 }
   5394 
   5395 void Disassembler::vmul(
   5396     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5397   os().SetCurrentInstruction(kVmul, kFpNeon);
   5398   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5399   os() << " ";
   5400   if (!rd.Is(rn) || !use_short_hand_form_) {
   5401     os() << rd << ", ";
   5402   }
   5403   os() << rn << ", " << rm;
   5404 }
   5405 
   5406 void Disassembler::vmul(
   5407     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5408   os().SetCurrentInstruction(kVmul, kFpNeon);
   5409   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5410   os() << " ";
   5411   if (!rd.Is(rn) || !use_short_hand_form_) {
   5412     os() << rd << ", ";
   5413   }
   5414   os() << rn << ", " << rm;
   5415 }
   5416 
   5417 void Disassembler::vmul(
   5418     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5419   os().SetCurrentInstruction(kVmul, kFpNeon);
   5420   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5421   os() << " ";
   5422   if (!rd.Is(rn) || !use_short_hand_form_) {
   5423     os() << rd << ", ";
   5424   }
   5425   os() << rn << ", " << rm;
   5426 }
   5427 
   5428 void Disassembler::vmull(Condition cond,
   5429                          DataType dt,
   5430                          QRegister rd,
   5431                          DRegister rn,
   5432                          DRegister dm,
   5433                          unsigned index) {
   5434   os().SetCurrentInstruction(kVmull, kFpNeon);
   5435   os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " "
   5436        << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index);
   5437 }
   5438 
   5439 void Disassembler::vmull(
   5440     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5441   os().SetCurrentInstruction(kVmull, kFpNeon);
   5442   os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " "
   5443        << rd << ", " << rn << ", " << rm;
   5444 }
   5445 
   5446 void Disassembler::vmvn(Condition cond,
   5447                         DataType dt,
   5448                         DRegister rd,
   5449                         const DOperand& operand) {
   5450   os().SetCurrentInstruction(kVmvn, kFpNeon);
   5451   os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " "
   5452        << rd << ", " << operand;
   5453 }
   5454 
   5455 void Disassembler::vmvn(Condition cond,
   5456                         DataType dt,
   5457                         QRegister rd,
   5458                         const QOperand& operand) {
   5459   os().SetCurrentInstruction(kVmvn, kFpNeon);
   5460   os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " "
   5461        << rd << ", " << operand;
   5462 }
   5463 
   5464 void Disassembler::vneg(Condition cond,
   5465                         DataType dt,
   5466                         DRegister rd,
   5467                         DRegister rm) {
   5468   os().SetCurrentInstruction(kVneg, kFpNeon);
   5469   os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5470        << rd << ", " << rm;
   5471 }
   5472 
   5473 void Disassembler::vneg(Condition cond,
   5474                         DataType dt,
   5475                         QRegister rd,
   5476                         QRegister rm) {
   5477   os().SetCurrentInstruction(kVneg, kFpNeon);
   5478   os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5479        << rd << ", " << rm;
   5480 }
   5481 
   5482 void Disassembler::vneg(Condition cond,
   5483                         DataType dt,
   5484                         SRegister rd,
   5485                         SRegister rm) {
   5486   os().SetCurrentInstruction(kVneg, kFpNeon);
   5487   os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5488        << rd << ", " << rm;
   5489 }
   5490 
   5491 void Disassembler::vnmla(
   5492     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5493   os().SetCurrentInstruction(kVnmla, kFpNeon);
   5494   os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5495        << rd << ", " << rn << ", " << rm;
   5496 }
   5497 
   5498 void Disassembler::vnmla(
   5499     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5500   os().SetCurrentInstruction(kVnmla, kFpNeon);
   5501   os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5502        << rd << ", " << rn << ", " << rm;
   5503 }
   5504 
   5505 void Disassembler::vnmls(
   5506     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5507   os().SetCurrentInstruction(kVnmls, kFpNeon);
   5508   os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5509        << rd << ", " << rn << ", " << rm;
   5510 }
   5511 
   5512 void Disassembler::vnmls(
   5513     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5514   os().SetCurrentInstruction(kVnmls, kFpNeon);
   5515   os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5516        << rd << ", " << rn << ", " << rm;
   5517 }
   5518 
   5519 void Disassembler::vnmul(
   5520     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5521   os().SetCurrentInstruction(kVnmul, kFpNeon);
   5522   os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt;
   5523   os() << " ";
   5524   if (!rd.Is(rn) || !use_short_hand_form_) {
   5525     os() << rd << ", ";
   5526   }
   5527   os() << rn << ", " << rm;
   5528 }
   5529 
   5530 void Disassembler::vnmul(
   5531     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5532   os().SetCurrentInstruction(kVnmul, kFpNeon);
   5533   os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt;
   5534   os() << " ";
   5535   if (!rd.Is(rn) || !use_short_hand_form_) {
   5536     os() << rd << ", ";
   5537   }
   5538   os() << rn << ", " << rm;
   5539 }
   5540 
   5541 void Disassembler::vorn(Condition cond,
   5542                         DataType dt,
   5543                         DRegister rd,
   5544                         DRegister rn,
   5545                         const DOperand& operand) {
   5546   os().SetCurrentInstruction(kVorn, kFpNeon);
   5547   os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt;
   5548   os() << " ";
   5549   if (!rd.Is(rn) || !use_short_hand_form_) {
   5550     os() << rd << ", ";
   5551   }
   5552   os() << rn << ", " << operand;
   5553 }
   5554 
   5555 void Disassembler::vorn(Condition cond,
   5556                         DataType dt,
   5557                         QRegister rd,
   5558                         QRegister rn,
   5559                         const QOperand& operand) {
   5560   os().SetCurrentInstruction(kVorn, kFpNeon);
   5561   os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt;
   5562   os() << " ";
   5563   if (!rd.Is(rn) || !use_short_hand_form_) {
   5564     os() << rd << ", ";
   5565   }
   5566   os() << rn << ", " << operand;
   5567 }
   5568 
   5569 void Disassembler::vorr(Condition cond,
   5570                         DataType dt,
   5571                         DRegister rd,
   5572                         DRegister rn,
   5573                         const DOperand& operand) {
   5574   os().SetCurrentInstruction(kVorr, kFpNeon);
   5575   os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt;
   5576   os() << " ";
   5577   if (!rd.Is(rn) || !use_short_hand_form_) {
   5578     os() << rd << ", ";
   5579   }
   5580   os() << rn << ", " << operand;
   5581 }
   5582 
   5583 void Disassembler::vorr(Condition cond,
   5584                         DataType dt,
   5585                         QRegister rd,
   5586                         QRegister rn,
   5587                         const QOperand& operand) {
   5588   os().SetCurrentInstruction(kVorr, kFpNeon);
   5589   os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt;
   5590   os() << " ";
   5591   if (!rd.Is(rn) || !use_short_hand_form_) {
   5592     os() << rd << ", ";
   5593   }
   5594   os() << rn << ", " << operand;
   5595 }
   5596 
   5597 void Disassembler::vpadal(Condition cond,
   5598                           DataType dt,
   5599                           DRegister rd,
   5600                           DRegister rm) {
   5601   os().SetCurrentInstruction(kVpadal, kFpNeon);
   5602   os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " "
   5603        << rd << ", " << rm;
   5604 }
   5605 
   5606 void Disassembler::vpadal(Condition cond,
   5607                           DataType dt,
   5608                           QRegister rd,
   5609                           QRegister rm) {
   5610   os().SetCurrentInstruction(kVpadal, kFpNeon);
   5611   os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " "
   5612        << rd << ", " << rm;
   5613 }
   5614 
   5615 void Disassembler::vpadd(
   5616     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5617   os().SetCurrentInstruction(kVpadd, kFpNeon);
   5618   os() << ToCString(kVpadd) << ConditionPrinter(it_block_, cond) << dt;
   5619   os() << " ";
   5620   if (!rd.Is(rn) || !use_short_hand_form_) {
   5621     os() << rd << ", ";
   5622   }
   5623   os() << rn << ", " << rm;
   5624 }
   5625 
   5626 void Disassembler::vpaddl(Condition cond,
   5627                           DataType dt,
   5628                           DRegister rd,
   5629                           DRegister rm) {
   5630   os().SetCurrentInstruction(kVpaddl, kFpNeon);
   5631   os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " "
   5632        << rd << ", " << rm;
   5633 }
   5634 
   5635 void Disassembler::vpaddl(Condition cond,
   5636                           DataType dt,
   5637                           QRegister rd,
   5638                           QRegister rm) {
   5639   os().SetCurrentInstruction(kVpaddl, kFpNeon);
   5640   os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " "
   5641        << rd << ", " << rm;
   5642 }
   5643 
   5644 void Disassembler::vpmax(
   5645     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5646   os().SetCurrentInstruction(kVpmax, kFpNeon);
   5647   os() << ToCString(kVpmax) << ConditionPrinter(it_block_, cond) << dt;
   5648   os() << " ";
   5649   if (!rd.Is(rn) || !use_short_hand_form_) {
   5650     os() << rd << ", ";
   5651   }
   5652   os() << rn << ", " << rm;
   5653 }
   5654 
   5655 void Disassembler::vpmin(
   5656     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5657   os().SetCurrentInstruction(kVpmin, kFpNeon);
   5658   os() << ToCString(kVpmin) << ConditionPrinter(it_block_, cond) << dt;
   5659   os() << " ";
   5660   if (!rd.Is(rn) || !use_short_hand_form_) {
   5661     os() << rd << ", ";
   5662   }
   5663   os() << rn << ", " << rm;
   5664 }
   5665 
   5666 void Disassembler::vpop(Condition cond, DataType dt, DRegisterList dreglist) {
   5667   os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon);
   5668   os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " "
   5669        << dreglist;
   5670 }
   5671 
   5672 void Disassembler::vpop(Condition cond, DataType dt, SRegisterList sreglist) {
   5673   os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon);
   5674   os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " "
   5675        << sreglist;
   5676 }
   5677 
   5678 void Disassembler::vpush(Condition cond, DataType dt, DRegisterList dreglist) {
   5679   os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon);
   5680   os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " "
   5681        << dreglist;
   5682 }
   5683 
   5684 void Disassembler::vpush(Condition cond, DataType dt, SRegisterList sreglist) {
   5685   os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon);
   5686   os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " "
   5687        << sreglist;
   5688 }
   5689 
   5690 void Disassembler::vqabs(Condition cond,
   5691                          DataType dt,
   5692                          DRegister rd,
   5693                          DRegister rm) {
   5694   os().SetCurrentInstruction(kVqabs, kFpNeon);
   5695   os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " "
   5696        << rd << ", " << rm;
   5697 }
   5698 
   5699 void Disassembler::vqabs(Condition cond,
   5700                          DataType dt,
   5701                          QRegister rd,
   5702                          QRegister rm) {
   5703   os().SetCurrentInstruction(kVqabs, kFpNeon);
   5704   os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " "
   5705        << rd << ", " << rm;
   5706 }
   5707 
   5708 void Disassembler::vqadd(
   5709     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5710   os().SetCurrentInstruction(kVqadd, kFpNeon);
   5711   os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt;
   5712   os() << " ";
   5713   if (!rd.Is(rn) || !use_short_hand_form_) {
   5714     os() << rd << ", ";
   5715   }
   5716   os() << rn << ", " << rm;
   5717 }
   5718 
   5719 void Disassembler::vqadd(
   5720     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5721   os().SetCurrentInstruction(kVqadd, kFpNeon);
   5722   os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt;
   5723   os() << " ";
   5724   if (!rd.Is(rn) || !use_short_hand_form_) {
   5725     os() << rd << ", ";
   5726   }
   5727   os() << rn << ", " << rm;
   5728 }
   5729 
   5730 void Disassembler::vqdmlal(
   5731     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5732   os().SetCurrentInstruction(kVqdmlal, kFpNeon);
   5733   os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " "
   5734        << rd << ", " << rn << ", " << rm;
   5735 }
   5736 
   5737 void Disassembler::vqdmlal(Condition cond,
   5738                            DataType dt,
   5739                            QRegister rd,
   5740                            DRegister rn,
   5741                            DRegister dm,
   5742                            unsigned index) {
   5743   os().SetCurrentInstruction(kVqdmlal, kFpNeon);
   5744   os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " "
   5745        << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index);
   5746 }
   5747 
   5748 void Disassembler::vqdmlsl(
   5749     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5750   os().SetCurrentInstruction(kVqdmlsl, kFpNeon);
   5751   os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
   5752        << rd << ", " << rn << ", " << rm;
   5753 }
   5754 
   5755 void Disassembler::vqdmlsl(Condition cond,
   5756                            DataType dt,
   5757                            QRegister rd,
   5758                            DRegister rn,
   5759                            DRegister dm,
   5760                            unsigned index) {
   5761   os().SetCurrentInstruction(kVqdmlsl, kFpNeon);
   5762   os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
   5763        << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index);
   5764 }
   5765 
   5766 void Disassembler::vqdmulh(
   5767     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5768   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
   5769   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5770   os() << " ";
   5771   if (!rd.Is(rn) || !use_short_hand_form_) {
   5772     os() << rd << ", ";
   5773   }
   5774   os() << rn << ", " << rm;
   5775 }
   5776 
   5777 void Disassembler::vqdmulh(
   5778     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5779   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
   5780   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5781   os() << " ";
   5782   if (!rd.Is(rn) || !use_short_hand_form_) {
   5783     os() << rd << ", ";
   5784   }
   5785   os() << rn << ", " << rm;
   5786 }
   5787 
   5788 void Disassembler::vqdmulh(
   5789     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
   5790   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
   5791   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5792   os() << " ";
   5793   if (!rd.Is(rn) || !use_short_hand_form_) {
   5794     os() << rd << ", ";
   5795   }
   5796   os() << rn << ", " << rm;
   5797 }
   5798 
   5799 void Disassembler::vqdmulh(
   5800     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
   5801   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
   5802   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5803   os() << " ";
   5804   if (!rd.Is(rn) || !use_short_hand_form_) {
   5805     os() << rd << ", ";
   5806   }
   5807   os() << rn << ", " << rm;
   5808 }
   5809 
   5810 void Disassembler::vqdmull(
   5811     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5812   os().SetCurrentInstruction(kVqdmull, kFpNeon);
   5813   os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " "
   5814        << rd << ", " << rn << ", " << rm;
   5815 }
   5816 
   5817 void Disassembler::vqdmull(
   5818     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
   5819   os().SetCurrentInstruction(kVqdmull, kFpNeon);
   5820   os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " "
   5821        << rd << ", " << rn << ", " << rm;
   5822 }
   5823 
   5824 void Disassembler::vqmovn(Condition cond,
   5825                           DataType dt,
   5826                           DRegister rd,
   5827                           QRegister rm) {
   5828   os().SetCurrentInstruction(kVqmovn, kFpNeon);
   5829   os() << ToCString(kVqmovn) << ConditionPrinter(it_block_, cond) << dt << " "
   5830        << rd << ", " << rm;
   5831 }
   5832 
   5833 void Disassembler::vqmovun(Condition cond,
   5834                            DataType dt,
   5835                            DRegister rd,
   5836                            QRegister rm) {
   5837   os().SetCurrentInstruction(kVqmovun, kFpNeon);
   5838   os() << ToCString(kVqmovun) << ConditionPrinter(it_block_, cond) << dt << " "
   5839        << rd << ", " << rm;
   5840 }
   5841 
   5842 void Disassembler::vqneg(Condition cond,
   5843                          DataType dt,
   5844                          DRegister rd,
   5845                          DRegister rm) {
   5846   os().SetCurrentInstruction(kVqneg, kFpNeon);
   5847   os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5848        << rd << ", " << rm;
   5849 }
   5850 
   5851 void Disassembler::vqneg(Condition cond,
   5852                          DataType dt,
   5853                          QRegister rd,
   5854                          QRegister rm) {
   5855   os().SetCurrentInstruction(kVqneg, kFpNeon);
   5856   os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5857        << rd << ", " << rm;
   5858 }
   5859 
   5860 void Disassembler::vqrdmulh(
   5861     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5862   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
   5863   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5864   os() << " ";
   5865   if (!rd.Is(rn) || !use_short_hand_form_) {
   5866     os() << rd << ", ";
   5867   }
   5868   os() << rn << ", " << rm;
   5869 }
   5870 
   5871 void Disassembler::vqrdmulh(
   5872     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5873   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
   5874   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5875   os() << " ";
   5876   if (!rd.Is(rn) || !use_short_hand_form_) {
   5877     os() << rd << ", ";
   5878   }
   5879   os() << rn << ", " << rm;
   5880 }
   5881 
   5882 void Disassembler::vqrdmulh(
   5883     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
   5884   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
   5885   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5886   os() << " ";
   5887   if (!rd.Is(rn) || !use_short_hand_form_) {
   5888     os() << rd << ", ";
   5889   }
   5890   os() << rn << ", " << rm;
   5891 }
   5892 
   5893 void Disassembler::vqrdmulh(
   5894     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
   5895   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
   5896   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5897   os() << " ";
   5898   if (!rd.Is(rn) || !use_short_hand_form_) {
   5899     os() << rd << ", ";
   5900   }
   5901   os() << rn << ", " << rm;
   5902 }
   5903 
   5904 void Disassembler::vqrshl(
   5905     Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
   5906   os().SetCurrentInstruction(kVqrshl, kFpNeon);
   5907   os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt;
   5908   os() << " ";
   5909   if (!rd.Is(rm) || !use_short_hand_form_) {
   5910     os() << rd << ", ";
   5911   }
   5912   os() << rm << ", " << rn;
   5913 }
   5914 
   5915 void Disassembler::vqrshl(
   5916     Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
   5917   os().SetCurrentInstruction(kVqrshl, kFpNeon);
   5918   os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt;
   5919   os() << " ";
   5920   if (!rd.Is(rm) || !use_short_hand_form_) {
   5921     os() << rd << ", ";
   5922   }
   5923   os() << rm << ", " << rn;
   5924 }
   5925 
   5926 void Disassembler::vqrshrn(Condition cond,
   5927                            DataType dt,
   5928                            DRegister rd,
   5929                            QRegister rm,
   5930                            const QOperand& operand) {
   5931   os().SetCurrentInstruction(kVqrshrn, kFpNeon);
   5932   os() << ToCString(kVqrshrn) << ConditionPrinter(it_block_, cond) << dt << " "
   5933        << rd << ", " << rm << ", " << operand;
   5934 }
   5935 
   5936 void Disassembler::vqrshrun(Condition cond,
   5937                             DataType dt,
   5938                             DRegister rd,
   5939                             QRegister rm,
   5940                             const QOperand& operand) {
   5941   os().SetCurrentInstruction(kVqrshrun, kFpNeon);
   5942   os() << ToCString(kVqrshrun) << ConditionPrinter(it_block_, cond) << dt << " "
   5943        << rd << ", " << rm << ", " << operand;
   5944 }
   5945 
   5946 void Disassembler::vqshl(Condition cond,
   5947                          DataType dt,
   5948                          DRegister rd,
   5949                          DRegister rm,
   5950                          const DOperand& operand) {
   5951   os().SetCurrentInstruction(kVqshl, kFpNeon);
   5952   os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt;
   5953   os() << " ";
   5954   if (!rd.Is(rm) || !use_short_hand_form_) {
   5955     os() << rd << ", ";
   5956   }
   5957   os() << rm << ", " << operand;
   5958 }
   5959 
   5960 void Disassembler::vqshl(Condition cond,
   5961                          DataType dt,
   5962                          QRegister rd,
   5963                          QRegister rm,
   5964                          const QOperand& operand) {
   5965   os().SetCurrentInstruction(kVqshl, kFpNeon);
   5966   os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt;
   5967   os() << " ";
   5968   if (!rd.Is(rm) || !use_short_hand_form_) {
   5969     os() << rd << ", ";
   5970   }
   5971   os() << rm << ", " << operand;
   5972 }
   5973 
   5974 void Disassembler::vqshlu(Condition cond,
   5975                           DataType dt,
   5976                           DRegister rd,
   5977                           DRegister rm,
   5978                           const DOperand& operand) {
   5979   os().SetCurrentInstruction(kVqshlu, kFpNeon);
   5980   os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt;
   5981   os() << " ";
   5982   if (!rd.Is(rm) || !use_short_hand_form_) {
   5983     os() << rd << ", ";
   5984   }
   5985   os() << rm << ", " << operand;
   5986 }
   5987 
   5988 void Disassembler::vqshlu(Condition cond,
   5989                           DataType dt,
   5990                           QRegister rd,
   5991                           QRegister rm,
   5992                           const QOperand& operand) {
   5993   os().SetCurrentInstruction(kVqshlu, kFpNeon);
   5994   os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt;
   5995   os() << " ";
   5996   if (!rd.Is(rm) || !use_short_hand_form_) {
   5997     os() << rd << ", ";
   5998   }
   5999   os() << rm << ", " << operand;
   6000 }
   6001 
   6002 void Disassembler::vqshrn(Condition cond,
   6003                           DataType dt,
   6004                           DRegister rd,
   6005                           QRegister rm,
   6006                           const QOperand& operand) {
   6007   os().SetCurrentInstruction(kVqshrn, kFpNeon);
   6008   os() << ToCString(kVqshrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6009        << rd << ", " << rm << ", " << operand;
   6010 }
   6011 
   6012 void Disassembler::vqshrun(Condition cond,
   6013                            DataType dt,
   6014                            DRegister rd,
   6015                            QRegister rm,
   6016                            const QOperand& operand) {
   6017   os().SetCurrentInstruction(kVqshrun, kFpNeon);
   6018   os() << ToCString(kVqshrun) << ConditionPrinter(it_block_, cond) << dt << " "
   6019        << rd << ", " << rm << ", " << operand;
   6020 }
   6021 
   6022 void Disassembler::vqsub(
   6023     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6024   os().SetCurrentInstruction(kVqsub, kFpNeon);
   6025   os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt;
   6026   os() << " ";
   6027   if (!rd.Is(rn) || !use_short_hand_form_) {
   6028     os() << rd << ", ";
   6029   }
   6030   os() << rn << ", " << rm;
   6031 }
   6032 
   6033 void Disassembler::vqsub(
   6034     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6035   os().SetCurrentInstruction(kVqsub, kFpNeon);
   6036   os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt;
   6037   os() << " ";
   6038   if (!rd.Is(rn) || !use_short_hand_form_) {
   6039     os() << rd << ", ";
   6040   }
   6041   os() << rn << ", " << rm;
   6042 }
   6043 
   6044 void Disassembler::vraddhn(
   6045     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
   6046   os().SetCurrentInstruction(kVraddhn, kFpNeon);
   6047   os() << ToCString(kVraddhn) << ConditionPrinter(it_block_, cond) << dt << " "
   6048        << rd << ", " << rn << ", " << rm;
   6049 }
   6050 
   6051 void Disassembler::vrecpe(Condition cond,
   6052                           DataType dt,
   6053                           DRegister rd,
   6054                           DRegister rm) {
   6055   os().SetCurrentInstruction(kVrecpe, kFpNeon);
   6056   os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " "
   6057        << rd << ", " << rm;
   6058 }
   6059 
   6060 void Disassembler::vrecpe(Condition cond,
   6061                           DataType dt,
   6062                           QRegister rd,
   6063                           QRegister rm) {
   6064   os().SetCurrentInstruction(kVrecpe, kFpNeon);
   6065   os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " "
   6066        << rd << ", " << rm;
   6067 }
   6068 
   6069 void Disassembler::vrecps(
   6070     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6071   os().SetCurrentInstruction(kVrecps, kFpNeon);
   6072   os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt;
   6073   os() << " ";
   6074   if (!rd.Is(rn) || !use_short_hand_form_) {
   6075     os() << rd << ", ";
   6076   }
   6077   os() << rn << ", " << rm;
   6078 }
   6079 
   6080 void Disassembler::vrecps(
   6081     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6082   os().SetCurrentInstruction(kVrecps, kFpNeon);
   6083   os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt;
   6084   os() << " ";
   6085   if (!rd.Is(rn) || !use_short_hand_form_) {
   6086     os() << rd << ", ";
   6087   }
   6088   os() << rn << ", " << rm;
   6089 }
   6090 
   6091 void Disassembler::vrev16(Condition cond,
   6092                           DataType dt,
   6093                           DRegister rd,
   6094                           DRegister rm) {
   6095   os().SetCurrentInstruction(kVrev16, kFpNeon);
   6096   os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " "
   6097        << rd << ", " << rm;
   6098 }
   6099 
   6100 void Disassembler::vrev16(Condition cond,
   6101                           DataType dt,
   6102                           QRegister rd,
   6103                           QRegister rm) {
   6104   os().SetCurrentInstruction(kVrev16, kFpNeon);
   6105   os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " "
   6106        << rd << ", " << rm;
   6107 }
   6108 
   6109 void Disassembler::vrev32(Condition cond,
   6110                           DataType dt,
   6111                           DRegister rd,
   6112                           DRegister rm) {
   6113   os().SetCurrentInstruction(kVrev32, kFpNeon);
   6114   os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " "
   6115        << rd << ", " << rm;
   6116 }
   6117 
   6118 void Disassembler::vrev32(Condition cond,
   6119                           DataType dt,
   6120                           QRegister rd,
   6121                           QRegister rm) {
   6122   os().SetCurrentInstruction(kVrev32, kFpNeon);
   6123   os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " "
   6124        << rd << ", " << rm;
   6125 }
   6126 
   6127 void Disassembler::vrev64(Condition cond,
   6128                           DataType dt,
   6129                           DRegister rd,
   6130                           DRegister rm) {
   6131   os().SetCurrentInstruction(kVrev64, kFpNeon);
   6132   os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " "
   6133        << rd << ", " << rm;
   6134 }
   6135 
   6136 void Disassembler::vrev64(Condition cond,
   6137                           DataType dt,
   6138                           QRegister rd,
   6139                           QRegister rm) {
   6140   os().SetCurrentInstruction(kVrev64, kFpNeon);
   6141   os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " "
   6142        << rd << ", " << rm;
   6143 }
   6144 
   6145 void Disassembler::vrhadd(
   6146     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6147   os().SetCurrentInstruction(kVrhadd, kFpNeon);
   6148   os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt;
   6149   os() << " ";
   6150   if (!rd.Is(rn) || !use_short_hand_form_) {
   6151     os() << rd << ", ";
   6152   }
   6153   os() << rn << ", " << rm;
   6154 }
   6155 
   6156 void Disassembler::vrhadd(
   6157     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6158   os().SetCurrentInstruction(kVrhadd, kFpNeon);
   6159   os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt;
   6160   os() << " ";
   6161   if (!rd.Is(rn) || !use_short_hand_form_) {
   6162     os() << rd << ", ";
   6163   }
   6164   os() << rn << ", " << rm;
   6165 }
   6166 
   6167 void Disassembler::vrinta(DataType dt, DRegister rd, DRegister rm) {
   6168   os().SetCurrentInstruction(kVrinta, kFpNeon);
   6169   os() << ToCString(kVrinta) << dt << " " << rd << ", " << rm;
   6170 }
   6171 
   6172 void Disassembler::vrinta(DataType dt, QRegister rd, QRegister rm) {
   6173   os().SetCurrentInstruction(kVrinta, kFpNeon);
   6174   os() << ToCString(kVrinta) << dt << " " << rd << ", " << rm;
   6175 }
   6176 
   6177 void Disassembler::vrinta(DataType dt, SRegister rd, SRegister rm) {
   6178   os().SetCurrentInstruction(kVrinta, kFpNeon);
   6179   os() << ToCString(kVrinta) << dt << " " << rd << ", " << rm;
   6180 }
   6181 
   6182 void Disassembler::vrintm(DataType dt, DRegister rd, DRegister rm) {
   6183   os().SetCurrentInstruction(kVrintm, kFpNeon);
   6184   os() << ToCString(kVrintm) << dt << " " << rd << ", " << rm;
   6185 }
   6186 
   6187 void Disassembler::vrintm(DataType dt, QRegister rd, QRegister rm) {
   6188   os().SetCurrentInstruction(kVrintm, kFpNeon);
   6189   os() << ToCString(kVrintm) << dt << " " << rd << ", " << rm;
   6190 }
   6191 
   6192 void Disassembler::vrintm(DataType dt, SRegister rd, SRegister rm) {
   6193   os().SetCurrentInstruction(kVrintm, kFpNeon);
   6194   os() << ToCString(kVrintm) << dt << " " << rd << ", " << rm;
   6195 }
   6196 
   6197 void Disassembler::vrintn(DataType dt, DRegister rd, DRegister rm) {
   6198   os().SetCurrentInstruction(kVrintn, kFpNeon);
   6199   os() << ToCString(kVrintn) << dt << " " << rd << ", " << rm;
   6200 }
   6201 
   6202 void Disassembler::vrintn(DataType dt, QRegister rd, QRegister rm) {
   6203   os().SetCurrentInstruction(kVrintn, kFpNeon);
   6204   os() << ToCString(kVrintn) << dt << " " << rd << ", " << rm;
   6205 }
   6206 
   6207 void Disassembler::vrintn(DataType dt, SRegister rd, SRegister rm) {
   6208   os().SetCurrentInstruction(kVrintn, kFpNeon);
   6209   os() << ToCString(kVrintn) << dt << " " << rd << ", " << rm;
   6210 }
   6211 
   6212 void Disassembler::vrintp(DataType dt, DRegister rd, DRegister rm) {
   6213   os().SetCurrentInstruction(kVrintp, kFpNeon);
   6214   os() << ToCString(kVrintp) << dt << " " << rd << ", " << rm;
   6215 }
   6216 
   6217 void Disassembler::vrintp(DataType dt, QRegister rd, QRegister rm) {
   6218   os().SetCurrentInstruction(kVrintp, kFpNeon);
   6219   os() << ToCString(kVrintp) << dt << " " << rd << ", " << rm;
   6220 }
   6221 
   6222 void Disassembler::vrintp(DataType dt, SRegister rd, SRegister rm) {
   6223   os().SetCurrentInstruction(kVrintp, kFpNeon);
   6224   os() << ToCString(kVrintp) << dt << " " << rd << ", " << rm;
   6225 }
   6226 
   6227 void Disassembler::vrintr(Condition cond,
   6228                           DataType dt,
   6229                           SRegister rd,
   6230                           SRegister rm) {
   6231   os().SetCurrentInstruction(kVrintr, kFpNeon);
   6232   os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt << " "
   6233        << rd << ", " << rm;
   6234 }
   6235 
   6236 void Disassembler::vrintr(Condition cond,
   6237                           DataType dt,
   6238                           DRegister rd,
   6239                           DRegister rm) {
   6240   os().SetCurrentInstruction(kVrintr, kFpNeon);
   6241   os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt << " "
   6242        << rd << ", " << rm;
   6243 }
   6244 
   6245 void Disassembler::vrintx(Condition cond,
   6246                           DataType dt,
   6247                           DRegister rd,
   6248                           DRegister rm) {
   6249   os().SetCurrentInstruction(kVrintx, kFpNeon);
   6250   os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt << " "
   6251        << rd << ", " << rm;
   6252 }
   6253 
   6254 void Disassembler::vrintx(DataType dt, QRegister rd, QRegister rm) {
   6255   os().SetCurrentInstruction(kVrintx, kFpNeon);
   6256   os() << ToCString(kVrintx) << dt << " " << rd << ", " << rm;
   6257 }
   6258 
   6259 void Disassembler::vrintx(Condition cond,
   6260                           DataType dt,
   6261                           SRegister rd,
   6262                           SRegister rm) {
   6263   os().SetCurrentInstruction(kVrintx, kFpNeon);
   6264   os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt << " "
   6265        << rd << ", " << rm;
   6266 }
   6267 
   6268 void Disassembler::vrintz(Condition cond,
   6269                           DataType dt,
   6270                           DRegister rd,
   6271                           DRegister rm) {
   6272   os().SetCurrentInstruction(kVrintz, kFpNeon);
   6273   os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt << " "
   6274        << rd << ", " << rm;
   6275 }
   6276 
   6277 void Disassembler::vrintz(DataType dt, QRegister rd, QRegister rm) {
   6278   os().SetCurrentInstruction(kVrintz, kFpNeon);
   6279   os() << ToCString(kVrintz) << dt << " " << rd << ", " << rm;
   6280 }
   6281 
   6282 void Disassembler::vrintz(Condition cond,
   6283                           DataType dt,
   6284                           SRegister rd,
   6285                           SRegister rm) {
   6286   os().SetCurrentInstruction(kVrintz, kFpNeon);
   6287   os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt << " "
   6288        << rd << ", " << rm;
   6289 }
   6290 
   6291 void Disassembler::vrshl(
   6292     Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
   6293   os().SetCurrentInstruction(kVrshl, kFpNeon);
   6294   os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt;
   6295   os() << " ";
   6296   if (!rd.Is(rm) || !use_short_hand_form_) {
   6297     os() << rd << ", ";
   6298   }
   6299   os() << rm << ", " << rn;
   6300 }
   6301 
   6302 void Disassembler::vrshl(
   6303     Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
   6304   os().SetCurrentInstruction(kVrshl, kFpNeon);
   6305   os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt;
   6306   os() << " ";
   6307   if (!rd.Is(rm) || !use_short_hand_form_) {
   6308     os() << rd << ", ";
   6309   }
   6310   os() << rm << ", " << rn;
   6311 }
   6312 
   6313 void Disassembler::vrshr(Condition cond,
   6314                          DataType dt,
   6315                          DRegister rd,
   6316                          DRegister rm,
   6317                          const DOperand& operand) {
   6318   os().SetCurrentInstruction(kVrshr, kFpNeon);
   6319   os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt;
   6320   os() << " ";
   6321   if (!rd.Is(rm) || !use_short_hand_form_) {
   6322     os() << rd << ", ";
   6323   }
   6324   os() << rm << ", " << operand;
   6325 }
   6326 
   6327 void Disassembler::vrshr(Condition cond,
   6328                          DataType dt,
   6329                          QRegister rd,
   6330                          QRegister rm,
   6331                          const QOperand& operand) {
   6332   os().SetCurrentInstruction(kVrshr, kFpNeon);
   6333   os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt;
   6334   os() << " ";
   6335   if (!rd.Is(rm) || !use_short_hand_form_) {
   6336     os() << rd << ", ";
   6337   }
   6338   os() << rm << ", " << operand;
   6339 }
   6340 
   6341 void Disassembler::vrshrn(Condition cond,
   6342                           DataType dt,
   6343                           DRegister rd,
   6344                           QRegister rm,
   6345                           const QOperand& operand) {
   6346   os().SetCurrentInstruction(kVrshrn, kFpNeon);
   6347   os() << ToCString(kVrshrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6348        << rd << ", " << rm << ", " << operand;
   6349 }
   6350 
   6351 void Disassembler::vrsqrte(Condition cond,
   6352                            DataType dt,
   6353                            DRegister rd,
   6354                            DRegister rm) {
   6355   os().SetCurrentInstruction(kVrsqrte, kFpNeon);
   6356   os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " "
   6357        << rd << ", " << rm;
   6358 }
   6359 
   6360 void Disassembler::vrsqrte(Condition cond,
   6361                            DataType dt,
   6362                            QRegister rd,
   6363                            QRegister rm) {
   6364   os().SetCurrentInstruction(kVrsqrte, kFpNeon);
   6365   os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " "
   6366        << rd << ", " << rm;
   6367 }
   6368 
   6369 void Disassembler::vrsqrts(
   6370     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6371   os().SetCurrentInstruction(kVrsqrts, kFpNeon);
   6372   os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt;
   6373   os() << " ";
   6374   if (!rd.Is(rn) || !use_short_hand_form_) {
   6375     os() << rd << ", ";
   6376   }
   6377   os() << rn << ", " << rm;
   6378 }
   6379 
   6380 void Disassembler::vrsqrts(
   6381     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6382   os().SetCurrentInstruction(kVrsqrts, kFpNeon);
   6383   os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt;
   6384   os() << " ";
   6385   if (!rd.Is(rn) || !use_short_hand_form_) {
   6386     os() << rd << ", ";
   6387   }
   6388   os() << rn << ", " << rm;
   6389 }
   6390 
   6391 void Disassembler::vrsra(Condition cond,
   6392                          DataType dt,
   6393                          DRegister rd,
   6394                          DRegister rm,
   6395                          const DOperand& operand) {
   6396   os().SetCurrentInstruction(kVrsra, kFpNeon);
   6397   os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt;
   6398   os() << " ";
   6399   if (!rd.Is(rm) || !use_short_hand_form_) {
   6400     os() << rd << ", ";
   6401   }
   6402   os() << rm << ", " << operand;
   6403 }
   6404 
   6405 void Disassembler::vrsra(Condition cond,
   6406                          DataType dt,
   6407                          QRegister rd,
   6408                          QRegister rm,
   6409                          const QOperand& operand) {
   6410   os().SetCurrentInstruction(kVrsra, kFpNeon);
   6411   os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt;
   6412   os() << " ";
   6413   if (!rd.Is(rm) || !use_short_hand_form_) {
   6414     os() << rd << ", ";
   6415   }
   6416   os() << rm << ", " << operand;
   6417 }
   6418 
   6419 void Disassembler::vrsubhn(
   6420     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
   6421   os().SetCurrentInstruction(kVrsubhn, kFpNeon);
   6422   os() << ToCString(kVrsubhn) << ConditionPrinter(it_block_, cond) << dt << " "
   6423        << rd << ", " << rn << ", " << rm;
   6424 }
   6425 
   6426 void Disassembler::vseleq(DataType dt,
   6427                           DRegister rd,
   6428                           DRegister rn,
   6429                           DRegister rm) {
   6430   os().SetCurrentInstruction(kVseleq, kFpNeon);
   6431   os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm;
   6432 }
   6433 
   6434 void Disassembler::vseleq(DataType dt,
   6435                           SRegister rd,
   6436                           SRegister rn,
   6437                           SRegister rm) {
   6438   os().SetCurrentInstruction(kVseleq, kFpNeon);
   6439   os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm;
   6440 }
   6441 
   6442 void Disassembler::vselge(DataType dt,
   6443                           DRegister rd,
   6444                           DRegister rn,
   6445                           DRegister rm) {
   6446   os().SetCurrentInstruction(kVselge, kFpNeon);
   6447   os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm;
   6448 }
   6449 
   6450 void Disassembler::vselge(DataType dt,
   6451                           SRegister rd,
   6452                           SRegister rn,
   6453                           SRegister rm) {
   6454   os().SetCurrentInstruction(kVselge, kFpNeon);
   6455   os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm;
   6456 }
   6457 
   6458 void Disassembler::vselgt(DataType dt,
   6459                           DRegister rd,
   6460                           DRegister rn,
   6461                           DRegister rm) {
   6462   os().SetCurrentInstruction(kVselgt, kFpNeon);
   6463   os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm;
   6464 }
   6465 
   6466 void Disassembler::vselgt(DataType dt,
   6467                           SRegister rd,
   6468                           SRegister rn,
   6469                           SRegister rm) {
   6470   os().SetCurrentInstruction(kVselgt, kFpNeon);
   6471   os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm;
   6472 }
   6473 
   6474 void Disassembler::vselvs(DataType dt,
   6475                           DRegister rd,
   6476                           DRegister rn,
   6477                           DRegister rm) {
   6478   os().SetCurrentInstruction(kVselvs, kFpNeon);
   6479   os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm;
   6480 }
   6481 
   6482 void Disassembler::vselvs(DataType dt,
   6483                           SRegister rd,
   6484                           SRegister rn,
   6485                           SRegister rm) {
   6486   os().SetCurrentInstruction(kVselvs, kFpNeon);
   6487   os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm;
   6488 }
   6489 
   6490 void Disassembler::vshl(Condition cond,
   6491                         DataType dt,
   6492                         DRegister rd,
   6493                         DRegister rm,
   6494                         const DOperand& operand) {
   6495   os().SetCurrentInstruction(kVshl, kFpNeon);
   6496   os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt;
   6497   os() << " ";
   6498   if (!rd.Is(rm) || !use_short_hand_form_) {
   6499     os() << rd << ", ";
   6500   }
   6501   os() << rm << ", " << operand;
   6502 }
   6503 
   6504 void Disassembler::vshl(Condition cond,
   6505                         DataType dt,
   6506                         QRegister rd,
   6507                         QRegister rm,
   6508                         const QOperand& operand) {
   6509   os().SetCurrentInstruction(kVshl, kFpNeon);
   6510   os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt;
   6511   os() << " ";
   6512   if (!rd.Is(rm) || !use_short_hand_form_) {
   6513     os() << rd << ", ";
   6514   }
   6515   os() << rm << ", " << operand;
   6516 }
   6517 
   6518 void Disassembler::vshll(Condition cond,
   6519                          DataType dt,
   6520                          QRegister rd,
   6521                          DRegister rm,
   6522                          const DOperand& operand) {
   6523   os().SetCurrentInstruction(kVshll, kFpNeon);
   6524   os() << ToCString(kVshll) << ConditionPrinter(it_block_, cond) << dt << " "
   6525        << rd << ", " << rm << ", " << operand;
   6526 }
   6527 
   6528 void Disassembler::vshr(Condition cond,
   6529                         DataType dt,
   6530                         DRegister rd,
   6531                         DRegister rm,
   6532                         const DOperand& operand) {
   6533   os().SetCurrentInstruction(kVshr, kFpNeon);
   6534   os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt;
   6535   os() << " ";
   6536   if (!rd.Is(rm) || !use_short_hand_form_) {
   6537     os() << rd << ", ";
   6538   }
   6539   os() << rm << ", " << operand;
   6540 }
   6541 
   6542 void Disassembler::vshr(Condition cond,
   6543                         DataType dt,
   6544                         QRegister rd,
   6545                         QRegister rm,
   6546                         const QOperand& operand) {
   6547   os().SetCurrentInstruction(kVshr, kFpNeon);
   6548   os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt;
   6549   os() << " ";
   6550   if (!rd.Is(rm) || !use_short_hand_form_) {
   6551     os() << rd << ", ";
   6552   }
   6553   os() << rm << ", " << operand;
   6554 }
   6555 
   6556 void Disassembler::vshrn(Condition cond,
   6557                          DataType dt,
   6558                          DRegister rd,
   6559                          QRegister rm,
   6560                          const QOperand& operand) {
   6561   os().SetCurrentInstruction(kVshrn, kFpNeon);
   6562   os() << ToCString(kVshrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6563        << rd << ", " << rm << ", " << operand;
   6564 }
   6565 
   6566 void Disassembler::vsli(Condition cond,
   6567                         DataType dt,
   6568                         DRegister rd,
   6569                         DRegister rm,
   6570                         const DOperand& operand) {
   6571   os().SetCurrentInstruction(kVsli, kFpNeon);
   6572   os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt;
   6573   os() << " ";
   6574   if (!rd.Is(rm) || !use_short_hand_form_) {
   6575     os() << rd << ", ";
   6576   }
   6577   os() << rm << ", " << operand;
   6578 }
   6579 
   6580 void Disassembler::vsli(Condition cond,
   6581                         DataType dt,
   6582                         QRegister rd,
   6583                         QRegister rm,
   6584                         const QOperand& operand) {
   6585   os().SetCurrentInstruction(kVsli, kFpNeon);
   6586   os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt;
   6587   os() << " ";
   6588   if (!rd.Is(rm) || !use_short_hand_form_) {
   6589     os() << rd << ", ";
   6590   }
   6591   os() << rm << ", " << operand;
   6592 }
   6593 
   6594 void Disassembler::vsqrt(Condition cond,
   6595                          DataType dt,
   6596                          SRegister rd,
   6597                          SRegister rm) {
   6598   os().SetCurrentInstruction(kVsqrt, kFpNeon);
   6599   os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " "
   6600        << rd << ", " << rm;
   6601 }
   6602 
   6603 void Disassembler::vsqrt(Condition cond,
   6604                          DataType dt,
   6605                          DRegister rd,
   6606                          DRegister rm) {
   6607   os().SetCurrentInstruction(kVsqrt, kFpNeon);
   6608   os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " "
   6609        << rd << ", " << rm;
   6610 }
   6611 
   6612 void Disassembler::vsra(Condition cond,
   6613                         DataType dt,
   6614                         DRegister rd,
   6615                         DRegister rm,
   6616                         const DOperand& operand) {
   6617   os().SetCurrentInstruction(kVsra, kFpNeon);
   6618   os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt;
   6619   os() << " ";
   6620   if (!rd.Is(rm) || !use_short_hand_form_) {
   6621     os() << rd << ", ";
   6622   }
   6623   os() << rm << ", " << operand;
   6624 }
   6625 
   6626 void Disassembler::vsra(Condition cond,
   6627                         DataType dt,
   6628                         QRegister rd,
   6629                         QRegister rm,
   6630                         const QOperand& operand) {
   6631   os().SetCurrentInstruction(kVsra, kFpNeon);
   6632   os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt;
   6633   os() << " ";
   6634   if (!rd.Is(rm) || !use_short_hand_form_) {
   6635     os() << rd << ", ";
   6636   }
   6637   os() << rm << ", " << operand;
   6638 }
   6639 
   6640 void Disassembler::vsri(Condition cond,
   6641                         DataType dt,
   6642                         DRegister rd,
   6643                         DRegister rm,
   6644                         const DOperand& operand) {
   6645   os().SetCurrentInstruction(kVsri, kFpNeon);
   6646   os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt;
   6647   os() << " ";
   6648   if (!rd.Is(rm) || !use_short_hand_form_) {
   6649     os() << rd << ", ";
   6650   }
   6651   os() << rm << ", " << operand;
   6652 }
   6653 
   6654 void Disassembler::vsri(Condition cond,
   6655                         DataType dt,
   6656                         QRegister rd,
   6657                         QRegister rm,
   6658                         const QOperand& operand) {
   6659   os().SetCurrentInstruction(kVsri, kFpNeon);
   6660   os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt;
   6661   os() << " ";
   6662   if (!rd.Is(rm) || !use_short_hand_form_) {
   6663     os() << rd << ", ";
   6664   }
   6665   os() << rm << ", " << operand;
   6666 }
   6667 
   6668 void Disassembler::vst1(Condition cond,
   6669                         DataType dt,
   6670                         const NeonRegisterList& nreglist,
   6671                         const AlignedMemOperand& operand) {
   6672   os().SetCurrentInstruction(kVst1, kFpNeon);
   6673   os() << ToCString(kVst1) << ConditionPrinter(it_block_, cond) << dt << " "
   6674        << nreglist << ", " << PrintAlignedMemOperand(kVst1Location, operand);
   6675 }
   6676 
   6677 void Disassembler::vst2(Condition cond,
   6678                         DataType dt,
   6679                         const NeonRegisterList& nreglist,
   6680                         const AlignedMemOperand& operand) {
   6681   os().SetCurrentInstruction(kVst2, kFpNeon);
   6682   os() << ToCString(kVst2) << ConditionPrinter(it_block_, cond) << dt << " "
   6683        << nreglist << ", " << PrintAlignedMemOperand(kVst2Location, operand);
   6684 }
   6685 
   6686 void Disassembler::vst3(Condition cond,
   6687                         DataType dt,
   6688                         const NeonRegisterList& nreglist,
   6689                         const AlignedMemOperand& operand) {
   6690   os().SetCurrentInstruction(kVst3, kFpNeon);
   6691   os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " "
   6692        << nreglist << ", " << PrintAlignedMemOperand(kVst3Location, operand);
   6693 }
   6694 
   6695 void Disassembler::vst3(Condition cond,
   6696                         DataType dt,
   6697                         const NeonRegisterList& nreglist,
   6698                         const MemOperand& operand) {
   6699   os().SetCurrentInstruction(kVst3, kFpNeon);
   6700   os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " "
   6701        << nreglist << ", " << PrintMemOperand(kVst3Location, operand);
   6702 }
   6703 
   6704 void Disassembler::vst4(Condition cond,
   6705                         DataType dt,
   6706                         const NeonRegisterList& nreglist,
   6707                         const AlignedMemOperand& operand) {
   6708   os().SetCurrentInstruction(kVst4, kFpNeon);
   6709   os() << ToCString(kVst4) << ConditionPrinter(it_block_, cond) << dt << " "
   6710        << nreglist << ", " << PrintAlignedMemOperand(kVst4Location, operand);
   6711 }
   6712 
   6713 void Disassembler::vstm(Condition cond,
   6714                         DataType dt,
   6715                         Register rn,
   6716                         WriteBack write_back,
   6717                         DRegisterList dreglist) {
   6718   os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon);
   6719   os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " "
   6720        << rn << write_back << ", " << dreglist;
   6721 }
   6722 
   6723 void Disassembler::vstm(Condition cond,
   6724                         DataType dt,
   6725                         Register rn,
   6726                         WriteBack write_back,
   6727                         SRegisterList sreglist) {
   6728   os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon);
   6729   os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " "
   6730        << rn << write_back << ", " << sreglist;
   6731 }
   6732 
   6733 void Disassembler::vstmdb(Condition cond,
   6734                           DataType dt,
   6735                           Register rn,
   6736                           WriteBack write_back,
   6737                           DRegisterList dreglist) {
   6738   os().SetCurrentInstruction(kVstmdb,
   6739                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   6740   os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " "
   6741        << rn << write_back << ", " << dreglist;
   6742 }
   6743 
   6744 void Disassembler::vstmdb(Condition cond,
   6745                           DataType dt,
   6746                           Register rn,
   6747                           WriteBack write_back,
   6748                           SRegisterList sreglist) {
   6749   os().SetCurrentInstruction(kVstmdb,
   6750                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   6751   os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " "
   6752        << rn << write_back << ", " << sreglist;
   6753 }
   6754 
   6755 void Disassembler::vstmia(Condition cond,
   6756                           DataType dt,
   6757                           Register rn,
   6758                           WriteBack write_back,
   6759                           DRegisterList dreglist) {
   6760   os().SetCurrentInstruction(kVstmia,
   6761                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   6762   os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " "
   6763        << rn << write_back << ", " << dreglist;
   6764 }
   6765 
   6766 void Disassembler::vstmia(Condition cond,
   6767                           DataType dt,
   6768                           Register rn,
   6769                           WriteBack write_back,
   6770                           SRegisterList sreglist) {
   6771   os().SetCurrentInstruction(kVstmia,
   6772                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   6773   os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " "
   6774        << rn << write_back << ", " << sreglist;
   6775 }
   6776 
   6777 void Disassembler::vstr(Condition cond,
   6778                         DataType dt,
   6779                         DRegister rd,
   6780                         const MemOperand& operand) {
   6781   os().SetCurrentInstruction(kVstr, kFpNeon);
   6782   os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond)
   6783        << DtPrinter(dt, Untyped64) << " " << rd << ", "
   6784        << PrintMemOperand(kStoreDoublePrecisionLocation, operand);
   6785 }
   6786 
   6787 void Disassembler::vstr(Condition cond,
   6788                         DataType dt,
   6789                         SRegister rd,
   6790                         const MemOperand& operand) {
   6791   os().SetCurrentInstruction(kVstr, kFpNeon);
   6792   os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond)
   6793        << DtPrinter(dt, Untyped32) << " " << rd << ", "
   6794        << PrintMemOperand(kStoreSinglePrecisionLocation, operand);
   6795 }
   6796 
   6797 void Disassembler::vsub(
   6798     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6799   os().SetCurrentInstruction(kVsub, kFpNeon);
   6800   os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
   6801   os() << " ";
   6802   if (!rd.Is(rn) || !use_short_hand_form_) {
   6803     os() << rd << ", ";
   6804   }
   6805   os() << rn << ", " << rm;
   6806 }
   6807 
   6808 void Disassembler::vsub(
   6809     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6810   os().SetCurrentInstruction(kVsub, kFpNeon);
   6811   os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
   6812   os() << " ";
   6813   if (!rd.Is(rn) || !use_short_hand_form_) {
   6814     os() << rd << ", ";
   6815   }
   6816   os() << rn << ", " << rm;
   6817 }
   6818 
   6819 void Disassembler::vsub(
   6820     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   6821   os().SetCurrentInstruction(kVsub, kFpNeon);
   6822   os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
   6823   os() << " ";
   6824   if (!rd.Is(rn) || !use_short_hand_form_) {
   6825     os() << rd << ", ";
   6826   }
   6827   os() << rn << ", " << rm;
   6828 }
   6829 
   6830 void Disassembler::vsubhn(
   6831     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
   6832   os().SetCurrentInstruction(kVsubhn, kFpNeon);
   6833   os() << ToCString(kVsubhn) << ConditionPrinter(it_block_, cond) << dt << " "
   6834        << rd << ", " << rn << ", " << rm;
   6835 }
   6836 
   6837 void Disassembler::vsubl(
   6838     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   6839   os().SetCurrentInstruction(kVsubl, kFpNeon);
   6840   os() << ToCString(kVsubl) << ConditionPrinter(it_block_, cond) << dt << " "
   6841        << rd << ", " << rn << ", " << rm;
   6842 }
   6843 
   6844 void Disassembler::vsubw(
   6845     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
   6846   os().SetCurrentInstruction(kVsubw, kFpNeon);
   6847   os() << ToCString(kVsubw) << ConditionPrinter(it_block_, cond) << dt;
   6848   os() << " ";
   6849   if (!rd.Is(rn) || !use_short_hand_form_) {
   6850     os() << rd << ", ";
   6851   }
   6852   os() << rn << ", " << rm;
   6853 }
   6854 
   6855 void Disassembler::vswp(Condition cond,
   6856                         DataType dt,
   6857                         DRegister rd,
   6858                         DRegister rm) {
   6859   os().SetCurrentInstruction(kVswp, kFpNeon);
   6860   os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " "
   6861        << rd << ", " << rm;
   6862 }
   6863 
   6864 void Disassembler::vswp(Condition cond,
   6865                         DataType dt,
   6866                         QRegister rd,
   6867                         QRegister rm) {
   6868   os().SetCurrentInstruction(kVswp, kFpNeon);
   6869   os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " "
   6870        << rd << ", " << rm;
   6871 }
   6872 
   6873 void Disassembler::vtbl(Condition cond,
   6874                         DataType dt,
   6875                         DRegister rd,
   6876                         const NeonRegisterList& nreglist,
   6877                         DRegister rm) {
   6878   os().SetCurrentInstruction(kVtbl, kFpNeon);
   6879   os() << ToCString(kVtbl) << ConditionPrinter(it_block_, cond) << dt << " "
   6880        << rd << ", " << nreglist << ", " << rm;
   6881 }
   6882 
   6883 void Disassembler::vtbx(Condition cond,
   6884                         DataType dt,
   6885                         DRegister rd,
   6886                         const NeonRegisterList& nreglist,
   6887                         DRegister rm) {
   6888   os().SetCurrentInstruction(kVtbx, kFpNeon);
   6889   os() << ToCString(kVtbx) << ConditionPrinter(it_block_, cond) << dt << " "
   6890        << rd << ", " << nreglist << ", " << rm;
   6891 }
   6892 
   6893 void Disassembler::vtrn(Condition cond,
   6894                         DataType dt,
   6895                         DRegister rd,
   6896                         DRegister rm) {
   6897   os().SetCurrentInstruction(kVtrn, kFpNeon);
   6898   os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6899        << rd << ", " << rm;
   6900 }
   6901 
   6902 void Disassembler::vtrn(Condition cond,
   6903                         DataType dt,
   6904                         QRegister rd,
   6905                         QRegister rm) {
   6906   os().SetCurrentInstruction(kVtrn, kFpNeon);
   6907   os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6908        << rd << ", " << rm;
   6909 }
   6910 
   6911 void Disassembler::vtst(
   6912     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6913   os().SetCurrentInstruction(kVtst, kFpNeon);
   6914   os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt;
   6915   os() << " ";
   6916   if (!rd.Is(rn) || !use_short_hand_form_) {
   6917     os() << rd << ", ";
   6918   }
   6919   os() << rn << ", " << rm;
   6920 }
   6921 
   6922 void Disassembler::vtst(
   6923     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6924   os().SetCurrentInstruction(kVtst, kFpNeon);
   6925   os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt;
   6926   os() << " ";
   6927   if (!rd.Is(rn) || !use_short_hand_form_) {
   6928     os() << rd << ", ";
   6929   }
   6930   os() << rn << ", " << rm;
   6931 }
   6932 
   6933 void Disassembler::vuzp(Condition cond,
   6934                         DataType dt,
   6935                         DRegister rd,
   6936                         DRegister rm) {
   6937   os().SetCurrentInstruction(kVuzp, kFpNeon);
   6938   os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " "
   6939        << rd << ", " << rm;
   6940 }
   6941 
   6942 void Disassembler::vuzp(Condition cond,
   6943                         DataType dt,
   6944                         QRegister rd,
   6945                         QRegister rm) {
   6946   os().SetCurrentInstruction(kVuzp, kFpNeon);
   6947   os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " "
   6948        << rd << ", " << rm;
   6949 }
   6950 
   6951 void Disassembler::vzip(Condition cond,
   6952                         DataType dt,
   6953                         DRegister rd,
   6954                         DRegister rm) {
   6955   os().SetCurrentInstruction(kVzip, kFpNeon);
   6956   os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " "
   6957        << rd << ", " << rm;
   6958 }
   6959 
   6960 void Disassembler::vzip(Condition cond,
   6961                         DataType dt,
   6962                         QRegister rd,
   6963                         QRegister rm) {
   6964   os().SetCurrentInstruction(kVzip, kFpNeon);
   6965   os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " "
   6966        << rd << ", " << rm;
   6967 }
   6968 
   6969 void Disassembler::yield(Condition cond, EncodingSize size) {
   6970   os().SetCurrentInstruction(kYield, kNoAttribute);
   6971   os() << ToCString(kYield) << ConditionPrinter(it_block_, cond) << size;
   6972 }
   6973 
   6974 int Disassembler::T32Size(uint32_t instr) {
   6975   if ((instr & 0xe0000000) == 0xe0000000) {
   6976     switch (instr & 0x08000000) {
   6977       case 0x00000000:
   6978         if ((instr & 0x10000000) == 0x10000000) return 4;
   6979         return 2;
   6980       case 0x08000000:
   6981         return 4;
   6982       default:
   6983         return 2;
   6984     }
   6985   }
   6986   return 2;
   6987 }
   6988 
   6989 void Disassembler::DecodeT32(uint32_t instr) {
   6990   T32CodeAddressIncrementer incrementer(instr, &code_address_);
   6991   ITBlockScope it_scope(&it_block_);
   6992 
   6993   switch (instr & 0xe0000000) {
   6994     case 0x00000000: {
   6995       // 0x00000000
   6996       switch (instr & 0x18000000) {
   6997         case 0x18000000: {
   6998           // 0x18000000
   6999           switch (instr & 0x06000000) {
   7000             case 0x00000000: {
   7001               // 0x18000000
   7002               unsigned rd = (instr >> 16) & 0x7;
   7003               unsigned rn = (instr >> 19) & 0x7;
   7004               unsigned rm = (instr >> 22) & 0x7;
   7005               if (InITBlock()) {
   7006                 // ADD<c>{<q>} <Rd>, <Rn>, <Rm> ; T1
   7007                 add(CurrentCond(),
   7008                     Narrow,
   7009                     Register(rd),
   7010                     Register(rn),
   7011                     Register(rm));
   7012               } else {
   7013                 VIXL_ASSERT(OutsideITBlock());
   7014                 // ADDS{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   7015                 adds(Condition::None(),
   7016                      Narrow,
   7017                      Register(rd),
   7018                      Register(rn),
   7019                      Register(rm));
   7020               }
   7021               break;
   7022             }
   7023             case 0x02000000: {
   7024               // 0x1a000000
   7025               unsigned rd = (instr >> 16) & 0x7;
   7026               unsigned rn = (instr >> 19) & 0x7;
   7027               unsigned rm = (instr >> 22) & 0x7;
   7028               if (InITBlock()) {
   7029                 // SUB<c>{<q>} <Rd>, <Rn>, <Rm> ; T1
   7030                 sub(CurrentCond(),
   7031                     Narrow,
   7032                     Register(rd),
   7033                     Register(rn),
   7034                     Register(rm));
   7035               } else {
   7036                 VIXL_ASSERT(OutsideITBlock());
   7037                 // SUBS{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   7038                 subs(Condition::None(),
   7039                      Narrow,
   7040                      Register(rd),
   7041                      Register(rn),
   7042                      Register(rm));
   7043               }
   7044               break;
   7045             }
   7046             case 0x04000000: {
   7047               // 0x1c000000
   7048               unsigned rd = (instr >> 16) & 0x7;
   7049               unsigned rn = (instr >> 19) & 0x7;
   7050               uint32_t imm = (instr >> 22) & 0x7;
   7051               if (InITBlock()) {
   7052                 // ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
   7053                 add(CurrentCond(), Narrow, Register(rd), Register(rn), imm);
   7054               } else {
   7055                 VIXL_ASSERT(OutsideITBlock());
   7056                 // ADDS{<q>} <Rd>, <Rn>, #<imm3> ; T1
   7057                 adds(Condition::None(),
   7058                      Narrow,
   7059                      Register(rd),
   7060                      Register(rn),
   7061                      imm);
   7062               }
   7063               break;
   7064             }
   7065             case 0x06000000: {
   7066               // 0x1e000000
   7067               unsigned rd = (instr >> 16) & 0x7;
   7068               unsigned rn = (instr >> 19) & 0x7;
   7069               uint32_t imm = (instr >> 22) & 0x7;
   7070               if (InITBlock()) {
   7071                 // SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
   7072                 sub(CurrentCond(), Narrow, Register(rd), Register(rn), imm);
   7073               } else {
   7074                 VIXL_ASSERT(OutsideITBlock());
   7075                 // SUBS{<q>} <Rd>, <Rn>, #<imm3> ; T1
   7076                 subs(Condition::None(),
   7077                      Narrow,
   7078                      Register(rd),
   7079                      Register(rn),
   7080                      imm);
   7081               }
   7082               break;
   7083             }
   7084           }
   7085           break;
   7086         }
   7087         default: {
   7088           if (((instr & 0x18000000) == 0x18000000)) {
   7089             UnallocatedT32(instr);
   7090             return;
   7091           }
   7092           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) &&
   7093               InITBlock()) {
   7094             unsigned rd = (instr >> 16) & 0x7;
   7095             unsigned rm = (instr >> 19) & 0x7;
   7096             uint32_t amount = (instr >> 22) & 0x1f;
   7097             if (amount == 0) amount = 32;
   7098             // ASR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7099             asr(CurrentCond(), Narrow, Register(rd), Register(rm), amount);
   7100             return;
   7101           }
   7102           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) &&
   7103               !InITBlock()) {
   7104             unsigned rd = (instr >> 16) & 0x7;
   7105             unsigned rm = (instr >> 19) & 0x7;
   7106             uint32_t amount = (instr >> 22) & 0x1f;
   7107             if (amount == 0) amount = 32;
   7108             // ASRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7109             asrs(Condition::None(), Narrow, Register(rd), Register(rm), amount);
   7110             return;
   7111           }
   7112           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) &&
   7113               ((instr & 0x07c00000) != 0x00000000) && InITBlock()) {
   7114             unsigned rd = (instr >> 16) & 0x7;
   7115             unsigned rm = (instr >> 19) & 0x7;
   7116             uint32_t amount = (instr >> 22) & 0x1f;
   7117             // LSL<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7118             lsl(CurrentCond(), Narrow, Register(rd), Register(rm), amount);
   7119             return;
   7120           }
   7121           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) &&
   7122               ((instr & 0x07c00000) != 0x00000000) && !InITBlock()) {
   7123             unsigned rd = (instr >> 16) & 0x7;
   7124             unsigned rm = (instr >> 19) & 0x7;
   7125             uint32_t amount = (instr >> 22) & 0x1f;
   7126             // LSLS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7127             lsls(Condition::None(), Narrow, Register(rd), Register(rm), amount);
   7128             return;
   7129           }
   7130           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) &&
   7131               InITBlock()) {
   7132             unsigned rd = (instr >> 16) & 0x7;
   7133             unsigned rm = (instr >> 19) & 0x7;
   7134             uint32_t amount = (instr >> 22) & 0x1f;
   7135             if (amount == 0) amount = 32;
   7136             // LSR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7137             lsr(CurrentCond(), Narrow, Register(rd), Register(rm), amount);
   7138             return;
   7139           }
   7140           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) &&
   7141               !InITBlock()) {
   7142             unsigned rd = (instr >> 16) & 0x7;
   7143             unsigned rm = (instr >> 19) & 0x7;
   7144             uint32_t amount = (instr >> 22) & 0x1f;
   7145             if (amount == 0) amount = 32;
   7146             // LSRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7147             lsrs(Condition::None(), Narrow, Register(rd), Register(rm), amount);
   7148             return;
   7149           }
   7150           unsigned rd = (instr >> 16) & 0x7;
   7151           unsigned rm = (instr >> 19) & 0x7;
   7152           ImmediateShiftOperand shift_operand((instr >> 27) & 0x3,
   7153                                               (instr >> 22) & 0x1f);
   7154           if (InITBlock()) {
   7155             // MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2
   7156             mov(CurrentCond(),
   7157                 Narrow,
   7158                 Register(rd),
   7159                 Operand(Register(rm),
   7160                         shift_operand.GetType(),
   7161                         shift_operand.GetAmount()));
   7162           } else {
   7163             VIXL_ASSERT(OutsideITBlock());
   7164             // MOVS{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2
   7165             movs(Condition::None(),
   7166                  Narrow,
   7167                  Register(rd),
   7168                  Operand(Register(rm),
   7169                          shift_operand.GetType(),
   7170                          shift_operand.GetAmount()));
   7171           }
   7172           break;
   7173         }
   7174       }
   7175       break;
   7176     }
   7177     case 0x20000000: {
   7178       // 0x20000000
   7179       switch (instr & 0x18000000) {
   7180         case 0x00000000: {
   7181           // 0x20000000
   7182           unsigned rd = (instr >> 24) & 0x7;
   7183           uint32_t imm = (instr >> 16) & 0xff;
   7184           if (InITBlock()) {
   7185             // MOV<c>{<q>} <Rd>, #<imm8> ; T1
   7186             mov(CurrentCond(), Narrow, Register(rd), imm);
   7187           } else {
   7188             VIXL_ASSERT(OutsideITBlock());
   7189             // MOVS{<q>} <Rd>, #<imm8> ; T1
   7190             movs(Condition::None(), Narrow, Register(rd), imm);
   7191           }
   7192           break;
   7193         }
   7194         case 0x08000000: {
   7195           // 0x28000000
   7196           unsigned rn = (instr >> 24) & 0x7;
   7197           uint32_t imm = (instr >> 16) & 0xff;
   7198           // CMP{<c>}{<q>} <Rn>, #<imm8> ; T1
   7199           cmp(CurrentCond(), Narrow, Register(rn), imm);
   7200           break;
   7201         }
   7202         case 0x10000000: {
   7203           // 0x30000000
   7204           unsigned rd = (instr >> 24) & 0x7;
   7205           uint32_t imm = (instr >> 16) & 0xff;
   7206           if (InITBlock() && ((imm <= 7))) {
   7207             // ADD<c>{<q>} <Rdn>, #<imm8> ; T2
   7208             add(CurrentCond(), Register(rd), imm);
   7209           } else if (InITBlock() && ((imm > 7))) {
   7210             // ADD<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
   7211             add(CurrentCond(), Narrow, Register(rd), Register(rd), imm);
   7212           } else if (OutsideITBlock() && ((imm <= 7))) {
   7213             // ADDS{<q>} <Rdn>, #<imm8> ; T2
   7214             adds(Register(rd), imm);
   7215           } else if (OutsideITBlock() && ((imm > 7))) {
   7216             // ADDS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
   7217             adds(Condition::None(), Narrow, Register(rd), Register(rd), imm);
   7218           } else {
   7219             UnallocatedT32(instr);
   7220           }
   7221           break;
   7222         }
   7223         case 0x18000000: {
   7224           // 0x38000000
   7225           unsigned rd = (instr >> 24) & 0x7;
   7226           uint32_t imm = (instr >> 16) & 0xff;
   7227           if (InITBlock() && ((imm <= 7))) {
   7228             // SUB<c>{<q>} <Rdn>, #<imm8> ; T2
   7229             sub(CurrentCond(), Register(rd), imm);
   7230           } else if (InITBlock() && ((imm > 7))) {
   7231             // SUB<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
   7232             sub(CurrentCond(), Narrow, Register(rd), Register(rd), imm);
   7233           } else if (OutsideITBlock() && ((imm <= 7))) {
   7234             // SUBS{<q>} <Rdn>, #<imm8> ; T2
   7235             subs(Register(rd), imm);
   7236           } else if (OutsideITBlock() && ((imm > 7))) {
   7237             // SUBS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
   7238             subs(Condition::None(), Narrow, Register(rd), Register(rd), imm);
   7239           } else {
   7240             UnallocatedT32(instr);
   7241           }
   7242           break;
   7243         }
   7244       }
   7245       break;
   7246     }
   7247     case 0x40000000: {
   7248       // 0x40000000
   7249       switch (instr & 0x18000000) {
   7250         case 0x00000000: {
   7251           // 0x40000000
   7252           switch (instr & 0x07000000) {
   7253             case 0x00000000: {
   7254               // 0x40000000
   7255               switch (instr & 0x00c00000) {
   7256                 case 0x00000000: {
   7257                   // 0x40000000
   7258                   unsigned rd = (instr >> 16) & 0x7;
   7259                   unsigned rm = (instr >> 19) & 0x7;
   7260                   if (InITBlock()) {
   7261                     // AND<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7262                     and_(CurrentCond(),
   7263                          Narrow,
   7264                          Register(rd),
   7265                          Register(rd),
   7266                          Register(rm));
   7267                   } else {
   7268                     VIXL_ASSERT(OutsideITBlock());
   7269                     // ANDS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7270                     ands(Condition::None(),
   7271                          Narrow,
   7272                          Register(rd),
   7273                          Register(rd),
   7274                          Register(rm));
   7275                   }
   7276                   break;
   7277                 }
   7278                 case 0x00400000: {
   7279                   // 0x40400000
   7280                   unsigned rd = (instr >> 16) & 0x7;
   7281                   unsigned rm = (instr >> 19) & 0x7;
   7282                   if (InITBlock()) {
   7283                     // EOR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7284                     eor(CurrentCond(),
   7285                         Narrow,
   7286                         Register(rd),
   7287                         Register(rd),
   7288                         Register(rm));
   7289                   } else {
   7290                     VIXL_ASSERT(OutsideITBlock());
   7291                     // EORS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7292                     eors(Condition::None(),
   7293                          Narrow,
   7294                          Register(rd),
   7295                          Register(rd),
   7296                          Register(rm));
   7297                   }
   7298                   break;
   7299                 }
   7300                 case 0x00800000: {
   7301                   // 0x40800000
   7302                   if (InITBlock()) {
   7303                     unsigned rd = (instr >> 16) & 0x7;
   7304                     unsigned rs = (instr >> 19) & 0x7;
   7305                     // LSL<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7306                     lsl(CurrentCond(),
   7307                         Narrow,
   7308                         Register(rd),
   7309                         Register(rd),
   7310                         Register(rs));
   7311                     return;
   7312                   }
   7313                   if (!InITBlock()) {
   7314                     unsigned rd = (instr >> 16) & 0x7;
   7315                     unsigned rs = (instr >> 19) & 0x7;
   7316                     // LSLS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7317                     lsls(Condition::None(),
   7318                          Narrow,
   7319                          Register(rd),
   7320                          Register(rd),
   7321                          Register(rs));
   7322                     return;
   7323                   }
   7324                   unsigned rd = (instr >> 16) & 0x7;
   7325                   unsigned rm = (instr >> 16) & 0x7;
   7326                   unsigned rs = (instr >> 19) & 0x7;
   7327                   if (InITBlock()) {
   7328                     // MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
   7329                     mov(CurrentCond(),
   7330                         Narrow,
   7331                         Register(rd),
   7332                         Operand(Register(rm), LSL, Register(rs)));
   7333                   } else {
   7334                     VIXL_ASSERT(OutsideITBlock());
   7335                     // MOVS{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
   7336                     movs(Condition::None(),
   7337                          Narrow,
   7338                          Register(rd),
   7339                          Operand(Register(rm), LSL, Register(rs)));
   7340                   }
   7341                   break;
   7342                 }
   7343                 case 0x00c00000: {
   7344                   // 0x40c00000
   7345                   if (InITBlock()) {
   7346                     unsigned rd = (instr >> 16) & 0x7;
   7347                     unsigned rs = (instr >> 19) & 0x7;
   7348                     // LSR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7349                     lsr(CurrentCond(),
   7350                         Narrow,
   7351                         Register(rd),
   7352                         Register(rd),
   7353                         Register(rs));
   7354                     return;
   7355                   }
   7356                   if (!InITBlock()) {
   7357                     unsigned rd = (instr >> 16) & 0x7;
   7358                     unsigned rs = (instr >> 19) & 0x7;
   7359                     // LSRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7360                     lsrs(Condition::None(),
   7361                          Narrow,
   7362                          Register(rd),
   7363                          Register(rd),
   7364                          Register(rs));
   7365                     return;
   7366                   }
   7367                   unsigned rd = (instr >> 16) & 0x7;
   7368                   unsigned rm = (instr >> 16) & 0x7;
   7369                   unsigned rs = (instr >> 19) & 0x7;
   7370                   if (InITBlock()) {
   7371                     // MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
   7372                     mov(CurrentCond(),
   7373                         Narrow,
   7374                         Register(rd),
   7375                         Operand(Register(rm), LSR, Register(rs)));
   7376                   } else {
   7377                     VIXL_ASSERT(OutsideITBlock());
   7378                     // MOVS{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
   7379                     movs(Condition::None(),
   7380                          Narrow,
   7381                          Register(rd),
   7382                          Operand(Register(rm), LSR, Register(rs)));
   7383                   }
   7384                   break;
   7385                 }
   7386               }
   7387               break;
   7388             }
   7389             case 0x01000000: {
   7390               // 0x41000000
   7391               switch (instr & 0x00c00000) {
   7392                 case 0x00000000: {
   7393                   // 0x41000000
   7394                   if (InITBlock()) {
   7395                     unsigned rd = (instr >> 16) & 0x7;
   7396                     unsigned rs = (instr >> 19) & 0x7;
   7397                     // ASR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7398                     asr(CurrentCond(),
   7399                         Narrow,
   7400                         Register(rd),
   7401                         Register(rd),
   7402                         Register(rs));
   7403                     return;
   7404                   }
   7405                   if (!InITBlock()) {
   7406                     unsigned rd = (instr >> 16) & 0x7;
   7407                     unsigned rs = (instr >> 19) & 0x7;
   7408                     // ASRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7409                     asrs(Condition::None(),
   7410                          Narrow,
   7411                          Register(rd),
   7412                          Register(rd),
   7413                          Register(rs));
   7414                     return;
   7415                   }
   7416                   unsigned rd = (instr >> 16) & 0x7;
   7417                   unsigned rm = (instr >> 16) & 0x7;
   7418                   unsigned rs = (instr >> 19) & 0x7;
   7419                   if (InITBlock()) {
   7420                     // MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
   7421                     mov(CurrentCond(),
   7422                         Narrow,
   7423                         Register(rd),
   7424                         Operand(Register(rm), ASR, Register(rs)));
   7425                   } else {
   7426                     VIXL_ASSERT(OutsideITBlock());
   7427                     // MOVS{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
   7428                     movs(Condition::None(),
   7429                          Narrow,
   7430                          Register(rd),
   7431                          Operand(Register(rm), ASR, Register(rs)));
   7432                   }
   7433                   break;
   7434                 }
   7435                 case 0x00400000: {
   7436                   // 0x41400000
   7437                   unsigned rd = (instr >> 16) & 0x7;
   7438                   unsigned rm = (instr >> 19) & 0x7;
   7439                   if (InITBlock()) {
   7440                     // ADC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7441                     adc(CurrentCond(),
   7442                         Narrow,
   7443                         Register(rd),
   7444                         Register(rd),
   7445                         Register(rm));
   7446                   } else {
   7447                     VIXL_ASSERT(OutsideITBlock());
   7448                     // ADCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7449                     adcs(Condition::None(),
   7450                          Narrow,
   7451                          Register(rd),
   7452                          Register(rd),
   7453                          Register(rm));
   7454                   }
   7455                   break;
   7456                 }
   7457                 case 0x00800000: {
   7458                   // 0x41800000
   7459                   unsigned rd = (instr >> 16) & 0x7;
   7460                   unsigned rm = (instr >> 19) & 0x7;
   7461                   if (InITBlock()) {
   7462                     // SBC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7463                     sbc(CurrentCond(),
   7464                         Narrow,
   7465                         Register(rd),
   7466                         Register(rd),
   7467                         Register(rm));
   7468                   } else {
   7469                     VIXL_ASSERT(OutsideITBlock());
   7470                     // SBCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7471                     sbcs(Condition::None(),
   7472                          Narrow,
   7473                          Register(rd),
   7474                          Register(rd),
   7475                          Register(rm));
   7476                   }
   7477                   break;
   7478                 }
   7479                 case 0x00c00000: {
   7480                   // 0x41c00000
   7481                   if (InITBlock()) {
   7482                     unsigned rd = (instr >> 16) & 0x7;
   7483                     unsigned rs = (instr >> 19) & 0x7;
   7484                     // ROR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7485                     ror(CurrentCond(),
   7486                         Narrow,
   7487                         Register(rd),
   7488                         Register(rd),
   7489                         Register(rs));
   7490                     return;
   7491                   }
   7492                   if (!InITBlock()) {
   7493                     unsigned rd = (instr >> 16) & 0x7;
   7494                     unsigned rs = (instr >> 19) & 0x7;
   7495                     // RORS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7496                     rors(Condition::None(),
   7497                          Narrow,
   7498                          Register(rd),
   7499                          Register(rd),
   7500                          Register(rs));
   7501                     return;
   7502                   }
   7503                   unsigned rd = (instr >> 16) & 0x7;
   7504                   unsigned rm = (instr >> 16) & 0x7;
   7505                   unsigned rs = (instr >> 19) & 0x7;
   7506                   if (InITBlock()) {
   7507                     // MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
   7508                     mov(CurrentCond(),
   7509                         Narrow,
   7510                         Register(rd),
   7511                         Operand(Register(rm), ROR, Register(rs)));
   7512                   } else {
   7513                     VIXL_ASSERT(OutsideITBlock());
   7514                     // MOVS{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
   7515                     movs(Condition::None(),
   7516                          Narrow,
   7517                          Register(rd),
   7518                          Operand(Register(rm), ROR, Register(rs)));
   7519                   }
   7520                   break;
   7521                 }
   7522               }
   7523               break;
   7524             }
   7525             case 0x02000000: {
   7526               // 0x42000000
   7527               switch (instr & 0x00c00000) {
   7528                 case 0x00000000: {
   7529                   // 0x42000000
   7530                   unsigned rn = (instr >> 16) & 0x7;
   7531                   unsigned rm = (instr >> 19) & 0x7;
   7532                   // TST{<c>}{<q>} <Rn>, <Rm> ; T1
   7533                   tst(CurrentCond(), Narrow, Register(rn), Register(rm));
   7534                   break;
   7535                 }
   7536                 case 0x00400000: {
   7537                   // 0x42400000
   7538                   unsigned rd = (instr >> 16) & 0x7;
   7539                   unsigned rn = (instr >> 19) & 0x7;
   7540                   if (InITBlock()) {
   7541                     // RSB<c>{<q>} {<Rd>}, <Rn>, #0 ; T1
   7542                     rsb(CurrentCond(),
   7543                         Narrow,
   7544                         Register(rd),
   7545                         Register(rn),
   7546                         UINT32_C(0));
   7547                   } else {
   7548                     VIXL_ASSERT(OutsideITBlock());
   7549                     // RSBS{<q>} {<Rd>}, <Rn>, #0 ; T1
   7550                     rsbs(Condition::None(),
   7551                          Narrow,
   7552                          Register(rd),
   7553                          Register(rn),
   7554                          UINT32_C(0));
   7555                   }
   7556                   break;
   7557                 }
   7558                 case 0x00800000: {
   7559                   // 0x42800000
   7560                   unsigned rn = (instr >> 16) & 0x7;
   7561                   unsigned rm = (instr >> 19) & 0x7;
   7562                   // CMP{<c>}{<q>} <Rn>, <Rm> ; T1
   7563                   cmp(CurrentCond(), Narrow, Register(rn), Register(rm));
   7564                   break;
   7565                 }
   7566                 case 0x00c00000: {
   7567                   // 0x42c00000
   7568                   unsigned rn = (instr >> 16) & 0x7;
   7569                   unsigned rm = (instr >> 19) & 0x7;
   7570                   // CMN{<c>}{<q>} <Rn>, <Rm> ; T1
   7571                   cmn(CurrentCond(), Narrow, Register(rn), Register(rm));
   7572                   break;
   7573                 }
   7574               }
   7575               break;
   7576             }
   7577             case 0x03000000: {
   7578               // 0x43000000
   7579               switch (instr & 0x00c00000) {
   7580                 case 0x00000000: {
   7581                   // 0x43000000
   7582                   unsigned rd = (instr >> 16) & 0x7;
   7583                   unsigned rm = (instr >> 19) & 0x7;
   7584                   if (InITBlock()) {
   7585                     // ORR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7586                     orr(CurrentCond(),
   7587                         Narrow,
   7588                         Register(rd),
   7589                         Register(rd),
   7590                         Register(rm));
   7591                   } else {
   7592                     VIXL_ASSERT(OutsideITBlock());
   7593                     // ORRS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7594                     orrs(Condition::None(),
   7595                          Narrow,
   7596                          Register(rd),
   7597                          Register(rd),
   7598                          Register(rm));
   7599                   }
   7600                   break;
   7601                 }
   7602                 case 0x00400000: {
   7603                   // 0x43400000
   7604                   unsigned rd = (instr >> 16) & 0x7;
   7605                   unsigned rn = (instr >> 19) & 0x7;
   7606                   if (InITBlock()) {
   7607                     // MUL<c>{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1
   7608                     mul(CurrentCond(),
   7609                         Narrow,
   7610                         Register(rd),
   7611                         Register(rn),
   7612                         Register(rd));
   7613                   } else {
   7614                     VIXL_ASSERT(OutsideITBlock());
   7615                     // MULS{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1
   7616                     muls(Condition::None(),
   7617                          Register(rd),
   7618                          Register(rn),
   7619                          Register(rd));
   7620                   }
   7621                   break;
   7622                 }
   7623                 case 0x00800000: {
   7624                   // 0x43800000
   7625                   unsigned rd = (instr >> 16) & 0x7;
   7626                   unsigned rm = (instr >> 19) & 0x7;
   7627                   if (InITBlock()) {
   7628                     // BIC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7629                     bic(CurrentCond(),
   7630                         Narrow,
   7631                         Register(rd),
   7632                         Register(rd),
   7633                         Register(rm));
   7634                   } else {
   7635                     VIXL_ASSERT(OutsideITBlock());
   7636                     // BICS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7637                     bics(Condition::None(),
   7638                          Narrow,
   7639                          Register(rd),
   7640                          Register(rd),
   7641                          Register(rm));
   7642                   }
   7643                   break;
   7644                 }
   7645                 case 0x00c00000: {
   7646                   // 0x43c00000
   7647                   unsigned rd = (instr >> 16) & 0x7;
   7648                   unsigned rm = (instr >> 19) & 0x7;
   7649                   if (InITBlock()) {
   7650                     // MVN<c>{<q>} <Rd>, <Rm> ; T1
   7651                     mvn(CurrentCond(), Narrow, Register(rd), Register(rm));
   7652                   } else {
   7653                     VIXL_ASSERT(OutsideITBlock());
   7654                     // MVNS{<q>} <Rd>, <Rm> ; T1
   7655                     mvns(Condition::None(), Narrow, Register(rd), Register(rm));
   7656                   }
   7657                   break;
   7658                 }
   7659               }
   7660               break;
   7661             }
   7662             case 0x04000000: {
   7663               // 0x44000000
   7664               switch (instr & 0x00780000) {
   7665                 case 0x00680000: {
   7666                   // 0x44680000
   7667                   unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
   7668                   // ADD{<c>}{<q>} {<Rdm>}, SP, <Rdm> ; T1
   7669                   add(CurrentCond(), Narrow, Register(rd), sp, Register(rd));
   7670                   break;
   7671                 }
   7672                 default: {
   7673                   switch (instr & 0x00870000) {
   7674                     case 0x00850000: {
   7675                       // 0x44850000
   7676                       if (((instr & 0x780000) == 0x680000)) {
   7677                         UnallocatedT32(instr);
   7678                         return;
   7679                       }
   7680                       unsigned rm = (instr >> 19) & 0xf;
   7681                       // ADD{<c>}{<q>} {SP}, SP, <Rm> ; T2
   7682                       add(CurrentCond(), Narrow, sp, sp, Register(rm));
   7683                       break;
   7684                     }
   7685                     default: {
   7686                       if (((instr & 0x780000) == 0x680000) ||
   7687                           ((instr & 0x870000) == 0x850000)) {
   7688                         UnallocatedT32(instr);
   7689                         return;
   7690                       }
   7691                       unsigned rd =
   7692                           ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
   7693                       unsigned rm = (instr >> 19) & 0xf;
   7694                       if (InITBlock()) {
   7695                         // ADD<c>{<q>} <Rdn>, <Rm> ; T2
   7696                         add(CurrentCond(), Register(rd), Register(rm));
   7697                       } else {
   7698                         // ADD{<c>}{<q>} {<Rdn>}, <Rdn>, <Rm> ; T2
   7699                         add(CurrentCond(),
   7700                             Narrow,
   7701                             Register(rd),
   7702                             Register(rd),
   7703                             Register(rm));
   7704                       }
   7705                       break;
   7706                     }
   7707                   }
   7708                   break;
   7709                 }
   7710               }
   7711               break;
   7712             }
   7713             case 0x05000000: {
   7714               // 0x45000000
   7715               unsigned rn = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
   7716               unsigned rm = (instr >> 19) & 0xf;
   7717               // CMP{<c>}{<q>} <Rn>, <Rm> ; T2
   7718               cmp(CurrentCond(), Narrow, Register(rn), Register(rm));
   7719               break;
   7720             }
   7721             case 0x06000000: {
   7722               // 0x46000000
   7723               unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
   7724               unsigned rm = (instr >> 19) & 0xf;
   7725               // MOV{<c>}{<q>} <Rd>, <Rm> ; T1
   7726               mov(CurrentCond(), Narrow, Register(rd), Register(rm));
   7727               break;
   7728             }
   7729             case 0x07000000: {
   7730               // 0x47000000
   7731               switch (instr & 0x00800000) {
   7732                 case 0x00000000: {
   7733                   // 0x47000000
   7734                   unsigned rm = (instr >> 19) & 0xf;
   7735                   // BX{<c>}{<q>} <Rm> ; T1
   7736                   bx(CurrentCond(), Register(rm));
   7737                   if (((instr & 0xff870000) != 0x47000000)) {
   7738                     UnpredictableT32(instr);
   7739                   }
   7740                   break;
   7741                 }
   7742                 case 0x00800000: {
   7743                   // 0x47800000
   7744                   unsigned rm = (instr >> 19) & 0xf;
   7745                   // BLX{<c>}{<q>} <Rm> ; T1
   7746                   blx(CurrentCond(), Register(rm));
   7747                   if (((instr & 0xff870000) != 0x47800000)) {
   7748                     UnpredictableT32(instr);
   7749                   }
   7750                   break;
   7751                 }
   7752               }
   7753               break;
   7754             }
   7755           }
   7756           break;
   7757         }
   7758         case 0x08000000: {
   7759           // 0x48000000
   7760           unsigned rt = (instr >> 24) & 0x7;
   7761           int32_t imm = ((instr >> 16) & 0xff) << 2;
   7762           Location location(imm, kT32PcDelta);
   7763           // LDR{<c>}{<q>} <Rt>, <label> ; T1
   7764           ldr(CurrentCond(), Narrow, Register(rt), &location);
   7765           break;
   7766         }
   7767         case 0x10000000: {
   7768           // 0x50000000
   7769           switch (instr & 0x06000000) {
   7770             case 0x00000000: {
   7771               // 0x50000000
   7772               unsigned rt = (instr >> 16) & 0x7;
   7773               unsigned rn = (instr >> 19) & 0x7;
   7774               Sign sign(plus);
   7775               unsigned rm = (instr >> 22) & 0x7;
   7776               AddrMode addrmode = Offset;
   7777               // STR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7778               str(CurrentCond(),
   7779                   Narrow,
   7780                   Register(rt),
   7781                   MemOperand(Register(rn), sign, Register(rm), addrmode));
   7782               break;
   7783             }
   7784             case 0x02000000: {
   7785               // 0x52000000
   7786               unsigned rt = (instr >> 16) & 0x7;
   7787               unsigned rn = (instr >> 19) & 0x7;
   7788               Sign sign(plus);
   7789               unsigned rm = (instr >> 22) & 0x7;
   7790               AddrMode addrmode = Offset;
   7791               // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7792               strh(CurrentCond(),
   7793                    Narrow,
   7794                    Register(rt),
   7795                    MemOperand(Register(rn), sign, Register(rm), addrmode));
   7796               break;
   7797             }
   7798             case 0x04000000: {
   7799               // 0x54000000
   7800               unsigned rt = (instr >> 16) & 0x7;
   7801               unsigned rn = (instr >> 19) & 0x7;
   7802               Sign sign(plus);
   7803               unsigned rm = (instr >> 22) & 0x7;
   7804               AddrMode addrmode = Offset;
   7805               // STRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7806               strb(CurrentCond(),
   7807                    Narrow,
   7808                    Register(rt),
   7809                    MemOperand(Register(rn), sign, Register(rm), addrmode));
   7810               break;
   7811             }
   7812             case 0x06000000: {
   7813               // 0x56000000
   7814               unsigned rt = (instr >> 16) & 0x7;
   7815               unsigned rn = (instr >> 19) & 0x7;
   7816               Sign sign(plus);
   7817               unsigned rm = (instr >> 22) & 0x7;
   7818               AddrMode addrmode = Offset;
   7819               // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7820               ldrsb(CurrentCond(),
   7821                     Narrow,
   7822                     Register(rt),
   7823                     MemOperand(Register(rn), sign, Register(rm), addrmode));
   7824               break;
   7825             }
   7826           }
   7827           break;
   7828         }
   7829         case 0x18000000: {
   7830           // 0x58000000
   7831           switch (instr & 0x06000000) {
   7832             case 0x00000000: {
   7833               // 0x58000000
   7834               unsigned rt = (instr >> 16) & 0x7;
   7835               unsigned rn = (instr >> 19) & 0x7;
   7836               Sign sign(plus);
   7837               unsigned rm = (instr >> 22) & 0x7;
   7838               AddrMode addrmode = Offset;
   7839               // LDR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7840               ldr(CurrentCond(),
   7841                   Narrow,
   7842                   Register(rt),
   7843                   MemOperand(Register(rn), sign, Register(rm), addrmode));
   7844               break;
   7845             }
   7846             case 0x02000000: {
   7847               // 0x5a000000
   7848               unsigned rt = (instr >> 16) & 0x7;
   7849               unsigned rn = (instr >> 19) & 0x7;
   7850               Sign sign(plus);
   7851               unsigned rm = (instr >> 22) & 0x7;
   7852               AddrMode addrmode = Offset;
   7853               // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7854               ldrh(CurrentCond(),
   7855                    Narrow,
   7856                    Register(rt),
   7857                    MemOperand(Register(rn), sign, Register(rm), addrmode));
   7858               break;
   7859             }
   7860             case 0x04000000: {
   7861               // 0x5c000000
   7862               unsigned rt = (instr >> 16) & 0x7;
   7863               unsigned rn = (instr >> 19) & 0x7;
   7864               Sign sign(plus);
   7865               unsigned rm = (instr >> 22) & 0x7;
   7866               AddrMode addrmode = Offset;
   7867               // LDRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7868               ldrb(CurrentCond(),
   7869                    Narrow,
   7870                    Register(rt),
   7871                    MemOperand(Register(rn), sign, Register(rm), addrmode));
   7872               break;
   7873             }
   7874             case 0x06000000: {
   7875               // 0x5e000000
   7876               unsigned rt = (instr >> 16) & 0x7;
   7877               unsigned rn = (instr >> 19) & 0x7;
   7878               Sign sign(plus);
   7879               unsigned rm = (instr >> 22) & 0x7;
   7880               AddrMode addrmode = Offset;
   7881               // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7882               ldrsh(CurrentCond(),
   7883                     Narrow,
   7884                     Register(rt),
   7885                     MemOperand(Register(rn), sign, Register(rm), addrmode));
   7886               break;
   7887             }
   7888           }
   7889           break;
   7890         }
   7891       }
   7892       break;
   7893     }
   7894     case 0x60000000: {
   7895       // 0x60000000
   7896       switch (instr & 0x18000000) {
   7897         case 0x00000000: {
   7898           // 0x60000000
   7899           unsigned rt = (instr >> 16) & 0x7;
   7900           unsigned rn = (instr >> 19) & 0x7;
   7901           int32_t offset = ((instr >> 22) & 0x1f) << 2;
   7902           // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7903           str(CurrentCond(),
   7904               Narrow,
   7905               Register(rt),
   7906               MemOperand(Register(rn), plus, offset, Offset));
   7907           break;
   7908         }
   7909         case 0x08000000: {
   7910           // 0x68000000
   7911           unsigned rt = (instr >> 16) & 0x7;
   7912           unsigned rn = (instr >> 19) & 0x7;
   7913           int32_t offset = ((instr >> 22) & 0x1f) << 2;
   7914           // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7915           ldr(CurrentCond(),
   7916               Narrow,
   7917               Register(rt),
   7918               MemOperand(Register(rn), plus, offset, Offset));
   7919           break;
   7920         }
   7921         case 0x10000000: {
   7922           // 0x70000000
   7923           unsigned rt = (instr >> 16) & 0x7;
   7924           unsigned rn = (instr >> 19) & 0x7;
   7925           int32_t offset = (instr >> 22) & 0x1f;
   7926           // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7927           strb(CurrentCond(),
   7928                Narrow,
   7929                Register(rt),
   7930                MemOperand(Register(rn), plus, offset, Offset));
   7931           break;
   7932         }
   7933         case 0x18000000: {
   7934           // 0x78000000
   7935           unsigned rt = (instr >> 16) & 0x7;
   7936           unsigned rn = (instr >> 19) & 0x7;
   7937           int32_t offset = (instr >> 22) & 0x1f;
   7938           // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7939           ldrb(CurrentCond(),
   7940                Narrow,
   7941                Register(rt),
   7942                MemOperand(Register(rn), plus, offset, Offset));
   7943           break;
   7944         }
   7945       }
   7946       break;
   7947     }
   7948     case 0x80000000: {
   7949       // 0x80000000
   7950       switch (instr & 0x18000000) {
   7951         case 0x00000000: {
   7952           // 0x80000000
   7953           unsigned rt = (instr >> 16) & 0x7;
   7954           unsigned rn = (instr >> 19) & 0x7;
   7955           int32_t offset = ((instr >> 22) & 0x1f) << 1;
   7956           // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7957           strh(CurrentCond(),
   7958                Narrow,
   7959                Register(rt),
   7960                MemOperand(Register(rn), plus, offset, Offset));
   7961           break;
   7962         }
   7963         case 0x08000000: {
   7964           // 0x88000000
   7965           unsigned rt = (instr >> 16) & 0x7;
   7966           unsigned rn = (instr >> 19) & 0x7;
   7967           int32_t offset = ((instr >> 22) & 0x1f) << 1;
   7968           // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7969           ldrh(CurrentCond(),
   7970                Narrow,
   7971                Register(rt),
   7972                MemOperand(Register(rn), plus, offset, Offset));
   7973           break;
   7974         }
   7975         case 0x10000000: {
   7976           // 0x90000000
   7977           unsigned rt = (instr >> 24) & 0x7;
   7978           int32_t offset = ((instr >> 16) & 0xff) << 2;
   7979           // STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
   7980           str(CurrentCond(),
   7981               Narrow,
   7982               Register(rt),
   7983               MemOperand(sp, plus, offset, Offset));
   7984           break;
   7985         }
   7986         case 0x18000000: {
   7987           // 0x98000000
   7988           unsigned rt = (instr >> 24) & 0x7;
   7989           int32_t offset = ((instr >> 16) & 0xff) << 2;
   7990           // LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
   7991           ldr(CurrentCond(),
   7992               Narrow,
   7993               Register(rt),
   7994               MemOperand(sp, plus, offset, Offset));
   7995           break;
   7996         }
   7997       }
   7998       break;
   7999     }
   8000     case 0xa0000000: {
   8001       // 0xa0000000
   8002       switch (instr & 0x18000000) {
   8003         case 0x00000000: {
   8004           // 0xa0000000
   8005           unsigned rd = (instr >> 24) & 0x7;
   8006           int32_t imm = ((instr >> 16) & 0xff) << 2;
   8007           Location location(imm, kT32PcDelta);
   8008           // ADR{<c>}{<q>} <Rd>, <label> ; T1
   8009           adr(CurrentCond(), Narrow, Register(rd), &location);
   8010           break;
   8011         }
   8012         case 0x08000000: {
   8013           // 0xa8000000
   8014           unsigned rd = (instr >> 24) & 0x7;
   8015           uint32_t imm = ((instr >> 16) & 0xff) << 2;
   8016           // ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1
   8017           add(CurrentCond(), Narrow, Register(rd), sp, imm);
   8018           break;
   8019         }
   8020         case 0x10000000: {
   8021           // 0xb0000000
   8022           switch (instr & 0x04000000) {
   8023             case 0x00000000: {
   8024               // 0xb0000000
   8025               switch (instr & 0x01000000) {
   8026                 case 0x00000000: {
   8027                   // 0xb0000000
   8028                   switch (instr & 0x02800000) {
   8029                     case 0x00000000: {
   8030                       // 0xb0000000
   8031                       uint32_t imm = ((instr >> 16) & 0x7f) << 2;
   8032                       // ADD{<c>}{<q>} {SP}, SP, #<imm7> ; T2
   8033                       add(CurrentCond(), Narrow, sp, sp, imm);
   8034                       break;
   8035                     }
   8036                     case 0x00800000: {
   8037                       // 0xb0800000
   8038                       uint32_t imm = ((instr >> 16) & 0x7f) << 2;
   8039                       // SUB{<c>}{<q>} {SP}, SP, #<imm7> ; T1
   8040                       sub(CurrentCond(), Narrow, sp, sp, imm);
   8041                       break;
   8042                     }
   8043                     case 0x02000000: {
   8044                       // 0xb2000000
   8045                       switch (instr & 0x00400000) {
   8046                         case 0x00000000: {
   8047                           // 0xb2000000
   8048                           unsigned rd = (instr >> 16) & 0x7;
   8049                           unsigned rm = (instr >> 19) & 0x7;
   8050                           // SXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1
   8051                           sxth(CurrentCond(),
   8052                                Narrow,
   8053                                Register(rd),
   8054                                Register(rm));
   8055                           break;
   8056                         }
   8057                         case 0x00400000: {
   8058                           // 0xb2400000
   8059                           unsigned rd = (instr >> 16) & 0x7;
   8060                           unsigned rm = (instr >> 19) & 0x7;
   8061                           // SXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1
   8062                           sxtb(CurrentCond(),
   8063                                Narrow,
   8064                                Register(rd),
   8065                                Register(rm));
   8066                           break;
   8067                         }
   8068                       }
   8069                       break;
   8070                     }
   8071                     case 0x02800000: {
   8072                       // 0xb2800000
   8073                       switch (instr & 0x00400000) {
   8074                         case 0x00000000: {
   8075                           // 0xb2800000
   8076                           unsigned rd = (instr >> 16) & 0x7;
   8077                           unsigned rm = (instr >> 19) & 0x7;
   8078                           // UXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1
   8079                           uxth(CurrentCond(),
   8080                                Narrow,
   8081                                Register(rd),
   8082                                Register(rm));
   8083                           break;
   8084                         }
   8085                         case 0x00400000: {
   8086                           // 0xb2c00000
   8087                           unsigned rd = (instr >> 16) & 0x7;
   8088                           unsigned rm = (instr >> 19) & 0x7;
   8089                           // UXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1
   8090                           uxtb(CurrentCond(),
   8091                                Narrow,
   8092                                Register(rd),
   8093                                Register(rm));
   8094                           break;
   8095                         }
   8096                       }
   8097                       break;
   8098                     }
   8099                   }
   8100                   break;
   8101                 }
   8102                 case 0x01000000: {
   8103                   // 0xb1000000
   8104                   unsigned rn = (instr >> 16) & 0x7;
   8105                   int32_t imm =
   8106                       (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1;
   8107                   Location location(imm, kT32PcDelta);
   8108                   // CBZ{<q>} <Rn>, <label> ; T1
   8109                   cbz(Register(rn), &location);
   8110                   break;
   8111                 }
   8112               }
   8113               break;
   8114             }
   8115             case 0x04000000: {
   8116               // 0xb4000000
   8117               switch (instr & 0x02000000) {
   8118                 case 0x00000000: {
   8119                   // 0xb4000000
   8120                   RegisterList registers((((instr >> 24) & 0x1) << kLRRegNum) |
   8121                                          ((instr >> 16) & 0xff));
   8122                   // PUSH{<c>}{<q>} <registers> ; T1
   8123                   push(CurrentCond(), Narrow, registers);
   8124                   break;
   8125                 }
   8126                 case 0x02000000: {
   8127                   // 0xb6000000
   8128                   switch (instr & 0x01e00000) {
   8129                     case 0x00400000: {
   8130                       // 0xb6400000
   8131                       UnimplementedT32_16("SETEND", instr);
   8132                       break;
   8133                     }
   8134                     case 0x00600000: {
   8135                       // 0xb6600000
   8136                       switch (instr & 0x00100000) {
   8137                         case 0x00000000: {
   8138                           // 0xb6600000
   8139                           UnimplementedT32_16("CPSIE", instr);
   8140                           break;
   8141                         }
   8142                         case 0x00100000: {
   8143                           // 0xb6700000
   8144                           UnimplementedT32_16("CPSID", instr);
   8145                           break;
   8146                         }
   8147                       }
   8148                       break;
   8149                     }
   8150                     default:
   8151                       UnallocatedT32(instr);
   8152                       break;
   8153                   }
   8154                   break;
   8155                 }
   8156               }
   8157               break;
   8158             }
   8159           }
   8160           break;
   8161         }
   8162         case 0x18000000: {
   8163           // 0xb8000000
   8164           switch (instr & 0x04000000) {
   8165             case 0x00000000: {
   8166               // 0xb8000000
   8167               switch (instr & 0x01000000) {
   8168                 case 0x00000000: {
   8169                   // 0xb8000000
   8170                   switch (instr & 0x02c00000) {
   8171                     case 0x02000000: {
   8172                       // 0xba000000
   8173                       unsigned rd = (instr >> 16) & 0x7;
   8174                       unsigned rm = (instr >> 19) & 0x7;
   8175                       // REV{<c>}{<q>} <Rd>, <Rm> ; T1
   8176                       rev(CurrentCond(), Narrow, Register(rd), Register(rm));
   8177                       break;
   8178                     }
   8179                     case 0x02400000: {
   8180                       // 0xba400000
   8181                       unsigned rd = (instr >> 16) & 0x7;
   8182                       unsigned rm = (instr >> 19) & 0x7;
   8183                       // REV16{<c>}{<q>} <Rd>, <Rm> ; T1
   8184                       rev16(CurrentCond(), Narrow, Register(rd), Register(rm));
   8185                       break;
   8186                     }
   8187                     case 0x02800000: {
   8188                       // 0xba800000
   8189                       uint32_t imm = (instr >> 16) & 0x3f;
   8190                       // HLT{<q>} {#}<imm> ; T1
   8191                       hlt(Condition::None(), imm);
   8192                       break;
   8193                     }
   8194                     case 0x02c00000: {
   8195                       // 0xbac00000
   8196                       unsigned rd = (instr >> 16) & 0x7;
   8197                       unsigned rm = (instr >> 19) & 0x7;
   8198                       // REVSH{<c>}{<q>} <Rd>, <Rm> ; T1
   8199                       revsh(CurrentCond(), Narrow, Register(rd), Register(rm));
   8200                       break;
   8201                     }
   8202                     default:
   8203                       UnallocatedT32(instr);
   8204                       break;
   8205                   }
   8206                   break;
   8207                 }
   8208                 case 0x01000000: {
   8209                   // 0xb9000000
   8210                   unsigned rn = (instr >> 16) & 0x7;
   8211                   int32_t imm =
   8212                       (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1;
   8213                   Location location(imm, kT32PcDelta);
   8214                   // CBNZ{<q>} <Rn>, <label> ; T1
   8215                   cbnz(Register(rn), &location);
   8216                   break;
   8217                 }
   8218               }
   8219               break;
   8220             }
   8221             case 0x04000000: {
   8222               // 0xbc000000
   8223               switch (instr & 0x02000000) {
   8224                 case 0x00000000: {
   8225                   // 0xbc000000
   8226                   RegisterList registers((((instr >> 24) & 0x1) << kPCRegNum) |
   8227                                          ((instr >> 16) & 0xff));
   8228                   // POP{<c>}{<q>} <registers> ; T1
   8229                   pop(CurrentCond(), Narrow, registers);
   8230                   break;
   8231                 }
   8232                 case 0x02000000: {
   8233                   // 0xbe000000
   8234                   switch (instr & 0x01000000) {
   8235                     case 0x00000000: {
   8236                       // 0xbe000000
   8237                       uint32_t imm = (instr >> 16) & 0xff;
   8238                       // BKPT{<q>} {#}<imm> ; T1
   8239                       bkpt(Condition::None(), imm);
   8240                       break;
   8241                     }
   8242                     case 0x01000000: {
   8243                       // 0xbf000000
   8244                       switch (instr & 0x000f0000) {
   8245                         case 0x00000000: {
   8246                           // 0xbf000000
   8247                           switch (instr & 0x00f00000) {
   8248                             case 0x00000000: {
   8249                               // 0xbf000000
   8250                               // NOP{<c>}{<q>} ; T1
   8251                               nop(CurrentCond(), Narrow);
   8252                               break;
   8253                             }
   8254                             case 0x00100000: {
   8255                               // 0xbf100000
   8256                               // YIELD{<c>}{<q>} ; T1
   8257                               yield(CurrentCond(), Narrow);
   8258                               break;
   8259                             }
   8260                             case 0x00200000: {
   8261                               // 0xbf200000
   8262                               UnimplementedT32_16("WFE", instr);
   8263                               break;
   8264                             }
   8265                             case 0x00300000: {
   8266                               // 0xbf300000
   8267                               UnimplementedT32_16("WFI", instr);
   8268                               break;
   8269                             }
   8270                             case 0x00400000: {
   8271                               // 0xbf400000
   8272                               UnimplementedT32_16("SEV", instr);
   8273                               break;
   8274                             }
   8275                             case 0x00500000: {
   8276                               // 0xbf500000
   8277                               UnimplementedT32_16("SEVL", instr);
   8278                               break;
   8279                             }
   8280                             default:
   8281                               UnallocatedT32(instr);
   8282                               break;
   8283                           }
   8284                           break;
   8285                         }
   8286                         default: {
   8287                           if (((instr & 0xf0000) == 0x0)) {
   8288                             UnallocatedT32(instr);
   8289                             return;
   8290                           }
   8291                           unsigned first_cond = (instr >> 20) & 0xf;
   8292                           unsigned mask = (instr >> 16) & 0xf;
   8293                           bool was_in_it_block = InITBlock();
   8294                           SetIT(Condition(first_cond), mask);
   8295                           it(Condition(first_cond), mask);
   8296                           if (was_in_it_block || (first_cond == 15) ||
   8297                               ((first_cond == al) &&
   8298                                (BitCount(Uint32(mask)) != 1))) {
   8299                             UnpredictableT32(instr);
   8300                           }
   8301                           break;
   8302                         }
   8303                       }
   8304                       break;
   8305                     }
   8306                   }
   8307                   break;
   8308                 }
   8309               }
   8310               break;
   8311             }
   8312           }
   8313           break;
   8314         }
   8315       }
   8316       break;
   8317     }
   8318     case 0xc0000000: {
   8319       // 0xc0000000
   8320       switch (instr & 0x10000000) {
   8321         case 0x00000000: {
   8322           // 0xc0000000
   8323           switch (instr & 0x08000000) {
   8324             case 0x00000000: {
   8325               // 0xc0000000
   8326               unsigned rn = (instr >> 24) & 0x7;
   8327               RegisterList registers(((instr >> 16) & 0xff));
   8328               // STM{<c>}{<q>} <Rn>!, <registers> ; T1
   8329               stm(CurrentCond(),
   8330                   Narrow,
   8331                   Register(rn),
   8332                   WriteBack(WRITE_BACK),
   8333                   registers);
   8334               break;
   8335             }
   8336             case 0x08000000: {
   8337               // 0xc8000000
   8338               unsigned rn = (instr >> 24) & 0x7;
   8339               RegisterList registers(((instr >> 16) & 0xff));
   8340               // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T1
   8341               ldm(CurrentCond(),
   8342                   Narrow,
   8343                   Register(rn),
   8344                   WriteBack(!registers.Includes(Register(rn))),
   8345                   registers);
   8346               break;
   8347             }
   8348           }
   8349           break;
   8350         }
   8351         case 0x10000000: {
   8352           // 0xd0000000
   8353           switch (instr & 0x0e000000) {
   8354             case 0x0e000000: {
   8355               // 0xde000000
   8356               switch (instr & 0x01000000) {
   8357                 case 0x00000000: {
   8358                   // 0xde000000
   8359                   uint32_t imm = (instr >> 16) & 0xff;
   8360                   // UDF{<c>}{<q>} {#}<imm> ; T1
   8361                   udf(CurrentCond(), Narrow, imm);
   8362                   break;
   8363                 }
   8364                 case 0x01000000: {
   8365                   // 0xdf000000
   8366                   uint32_t imm = (instr >> 16) & 0xff;
   8367                   // SVC{<c>}{<q>} {#}<imm> ; T1
   8368                   svc(CurrentCond(), imm);
   8369                   break;
   8370                 }
   8371               }
   8372               break;
   8373             }
   8374             default: {
   8375               if (((instr & 0xe000000) == 0xe000000)) {
   8376                 UnallocatedT32(instr);
   8377                 return;
   8378               }
   8379               Condition condition((instr >> 24) & 0xf);
   8380               int32_t imm = SignExtend<int32_t>(((instr >> 16) & 0xff) << 1, 9);
   8381               Location location(imm, kT32PcDelta);
   8382               // B<c>{<q>} <label> ; T1
   8383               b(condition, Narrow, &location);
   8384               if (InITBlock()) {
   8385                 UnpredictableT32(instr);
   8386               }
   8387               break;
   8388             }
   8389           }
   8390           break;
   8391         }
   8392       }
   8393       break;
   8394     }
   8395     case 0xe0000000: {
   8396       // 0xe0000000
   8397       switch (instr & 0x08000000) {
   8398         case 0x00000000: {
   8399           // 0xe0000000
   8400           switch (instr & 0x10000000) {
   8401             case 0x00000000: {
   8402               // 0xe0000000
   8403               int32_t imm =
   8404                   SignExtend<int32_t>(((instr >> 16) & 0x7ff) << 1, 12);
   8405               Location location(imm, kT32PcDelta);
   8406               // B{<c>}{<q>} <label> ; T2
   8407               b(CurrentCond(), Narrow, &location);
   8408               if (!OutsideITBlockOrLast()) {
   8409                 UnpredictableT32(instr);
   8410               }
   8411               break;
   8412             }
   8413             case 0x10000000: {
   8414               // 0xf0000000
   8415               switch (instr & 0x00008000) {
   8416                 case 0x00000000: {
   8417                   // 0xf0000000
   8418                   switch (instr & 0x03f00000) {
   8419                     case 0x00000000: {
   8420                       // 0xf0000000
   8421                       unsigned rd = (instr >> 8) & 0xf;
   8422                       unsigned rn = (instr >> 16) & 0xf;
   8423                       uint32_t imm = ImmediateT32::Decode(
   8424                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8425                           ((instr >> 15) & 0x800));
   8426                       // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8427                       and_(CurrentCond(),
   8428                            Best,
   8429                            Register(rd),
   8430                            Register(rn),
   8431                            imm);
   8432                       break;
   8433                     }
   8434                     case 0x00100000: {
   8435                       // 0xf0100000
   8436                       switch (instr & 0x00000f00) {
   8437                         case 0x00000f00: {
   8438                           // 0xf0100f00
   8439                           unsigned rn = (instr >> 16) & 0xf;
   8440                           uint32_t imm = ImmediateT32::Decode(
   8441                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8442                               ((instr >> 15) & 0x800));
   8443                           // TST{<c>}{<q>} <Rn>, #<const> ; T1
   8444                           tst(CurrentCond(), Best, Register(rn), imm);
   8445                           break;
   8446                         }
   8447                         default: {
   8448                           if (((instr & 0xf00) == 0xf00)) {
   8449                             UnallocatedT32(instr);
   8450                             return;
   8451                           }
   8452                           unsigned rd = (instr >> 8) & 0xf;
   8453                           unsigned rn = (instr >> 16) & 0xf;
   8454                           uint32_t imm = ImmediateT32::Decode(
   8455                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8456                               ((instr >> 15) & 0x800));
   8457                           // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8458                           ands(CurrentCond(),
   8459                                Best,
   8460                                Register(rd),
   8461                                Register(rn),
   8462                                imm);
   8463                           break;
   8464                         }
   8465                       }
   8466                       break;
   8467                     }
   8468                     case 0x00200000: {
   8469                       // 0xf0200000
   8470                       unsigned rd = (instr >> 8) & 0xf;
   8471                       unsigned rn = (instr >> 16) & 0xf;
   8472                       uint32_t imm = ImmediateT32::Decode(
   8473                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8474                           ((instr >> 15) & 0x800));
   8475                       // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8476                       bic(CurrentCond(), Best, Register(rd), Register(rn), imm);
   8477                       break;
   8478                     }
   8479                     case 0x00300000: {
   8480                       // 0xf0300000
   8481                       unsigned rd = (instr >> 8) & 0xf;
   8482                       unsigned rn = (instr >> 16) & 0xf;
   8483                       uint32_t imm = ImmediateT32::Decode(
   8484                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8485                           ((instr >> 15) & 0x800));
   8486                       // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8487                       bics(CurrentCond(),
   8488                            Best,
   8489                            Register(rd),
   8490                            Register(rn),
   8491                            imm);
   8492                       break;
   8493                     }
   8494                     case 0x00400000: {
   8495                       // 0xf0400000
   8496                       switch (instr & 0x000f0000) {
   8497                         case 0x000f0000: {
   8498                           // 0xf04f0000
   8499                           unsigned rd = (instr >> 8) & 0xf;
   8500                           uint32_t imm = ImmediateT32::Decode(
   8501                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8502                               ((instr >> 15) & 0x800));
   8503                           if (InITBlock() &&
   8504                               (instr & 0x00100000) == 0x00000000 &&
   8505                               ((rd < kNumberOfT32LowRegisters) &&
   8506                                (imm <= 255))) {
   8507                             // MOV<c>.W <Rd>, #<const> ; T2
   8508                             mov(CurrentCond(), Wide, Register(rd), imm);
   8509                           } else if ((instr & 0x00100000) == 0x00000000) {
   8510                             // MOV{<c>}{<q>} <Rd>, #<const> ; T2
   8511                             mov(CurrentCond(), Best, Register(rd), imm);
   8512                           } else {
   8513                             UnallocatedT32(instr);
   8514                           }
   8515                           break;
   8516                         }
   8517                         default: {
   8518                           if (((instr & 0xf0000) == 0xf0000)) {
   8519                             UnallocatedT32(instr);
   8520                             return;
   8521                           }
   8522                           unsigned rd = (instr >> 8) & 0xf;
   8523                           unsigned rn = (instr >> 16) & 0xf;
   8524                           uint32_t imm = ImmediateT32::Decode(
   8525                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8526                               ((instr >> 15) & 0x800));
   8527                           // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8528                           orr(CurrentCond(),
   8529                               Best,
   8530                               Register(rd),
   8531                               Register(rn),
   8532                               imm);
   8533                           break;
   8534                         }
   8535                       }
   8536                       break;
   8537                     }
   8538                     case 0x00500000: {
   8539                       // 0xf0500000
   8540                       switch (instr & 0x000f0000) {
   8541                         case 0x000f0000: {
   8542                           // 0xf05f0000
   8543                           unsigned rd = (instr >> 8) & 0xf;
   8544                           uint32_t imm = ImmediateT32::Decode(
   8545                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8546                               ((instr >> 15) & 0x800));
   8547                           if (OutsideITBlock() &&
   8548                               (instr & 0x00100000) == 0x00100000 &&
   8549                               ((rd < kNumberOfT32LowRegisters) &&
   8550                                (imm <= 255))) {
   8551                             // MOVS.W <Rd>, #<const> ; T2
   8552                             movs(Condition::None(), Wide, Register(rd), imm);
   8553                           } else if ((instr & 0x00100000) == 0x00100000) {
   8554                             // MOVS{<c>}{<q>} <Rd>, #<const> ; T2
   8555                             movs(CurrentCond(), Best, Register(rd), imm);
   8556                           } else {
   8557                             UnallocatedT32(instr);
   8558                           }
   8559                           break;
   8560                         }
   8561                         default: {
   8562                           if (((instr & 0xf0000) == 0xf0000)) {
   8563                             UnallocatedT32(instr);
   8564                             return;
   8565                           }
   8566                           unsigned rd = (instr >> 8) & 0xf;
   8567                           unsigned rn = (instr >> 16) & 0xf;
   8568                           uint32_t imm = ImmediateT32::Decode(
   8569                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8570                               ((instr >> 15) & 0x800));
   8571                           // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8572                           orrs(CurrentCond(),
   8573                                Best,
   8574                                Register(rd),
   8575                                Register(rn),
   8576                                imm);
   8577                           break;
   8578                         }
   8579                       }
   8580                       break;
   8581                     }
   8582                     case 0x00600000: {
   8583                       // 0xf0600000
   8584                       switch (instr & 0x000f0000) {
   8585                         case 0x000f0000: {
   8586                           // 0xf06f0000
   8587                           unsigned rd = (instr >> 8) & 0xf;
   8588                           uint32_t imm = ImmediateT32::Decode(
   8589                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8590                               ((instr >> 15) & 0x800));
   8591                           // MVN{<c>}{<q>} <Rd>, #<const> ; T1
   8592                           mvn(CurrentCond(), Best, Register(rd), imm);
   8593                           break;
   8594                         }
   8595                         default: {
   8596                           if (((instr & 0xf0000) == 0xf0000)) {
   8597                             UnallocatedT32(instr);
   8598                             return;
   8599                           }
   8600                           unsigned rd = (instr >> 8) & 0xf;
   8601                           unsigned rn = (instr >> 16) & 0xf;
   8602                           uint32_t imm = ImmediateT32::Decode(
   8603                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8604                               ((instr >> 15) & 0x800));
   8605                           // ORN{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8606                           orn(CurrentCond(), Register(rd), Register(rn), imm);
   8607                           break;
   8608                         }
   8609                       }
   8610                       break;
   8611                     }
   8612                     case 0x00700000: {
   8613                       // 0xf0700000
   8614                       switch (instr & 0x000f0000) {
   8615                         case 0x000f0000: {
   8616                           // 0xf07f0000
   8617                           unsigned rd = (instr >> 8) & 0xf;
   8618                           uint32_t imm = ImmediateT32::Decode(
   8619                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8620                               ((instr >> 15) & 0x800));
   8621                           // MVNS{<c>}{<q>} <Rd>, #<const> ; T1
   8622                           mvns(CurrentCond(), Best, Register(rd), imm);
   8623                           break;
   8624                         }
   8625                         default: {
   8626                           if (((instr & 0xf0000) == 0xf0000)) {
   8627                             UnallocatedT32(instr);
   8628                             return;
   8629                           }
   8630                           unsigned rd = (instr >> 8) & 0xf;
   8631                           unsigned rn = (instr >> 16) & 0xf;
   8632                           uint32_t imm = ImmediateT32::Decode(
   8633                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8634                               ((instr >> 15) & 0x800));
   8635                           // ORNS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8636                           orns(CurrentCond(), Register(rd), Register(rn), imm);
   8637                           break;
   8638                         }
   8639                       }
   8640                       break;
   8641                     }
   8642                     case 0x00800000: {
   8643                       // 0xf0800000
   8644                       unsigned rd = (instr >> 8) & 0xf;
   8645                       unsigned rn = (instr >> 16) & 0xf;
   8646                       uint32_t imm = ImmediateT32::Decode(
   8647                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8648                           ((instr >> 15) & 0x800));
   8649                       // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8650                       eor(CurrentCond(), Best, Register(rd), Register(rn), imm);
   8651                       break;
   8652                     }
   8653                     case 0x00900000: {
   8654                       // 0xf0900000
   8655                       switch (instr & 0x00000f00) {
   8656                         case 0x00000f00: {
   8657                           // 0xf0900f00
   8658                           unsigned rn = (instr >> 16) & 0xf;
   8659                           uint32_t imm = ImmediateT32::Decode(
   8660                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8661                               ((instr >> 15) & 0x800));
   8662                           // TEQ{<c>}{<q>} <Rn>, #<const> ; T1
   8663                           teq(CurrentCond(), Register(rn), imm);
   8664                           break;
   8665                         }
   8666                         default: {
   8667                           if (((instr & 0xf00) == 0xf00)) {
   8668                             UnallocatedT32(instr);
   8669                             return;
   8670                           }
   8671                           unsigned rd = (instr >> 8) & 0xf;
   8672                           unsigned rn = (instr >> 16) & 0xf;
   8673                           uint32_t imm = ImmediateT32::Decode(
   8674                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8675                               ((instr >> 15) & 0x800));
   8676                           // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8677                           eors(CurrentCond(),
   8678                                Best,
   8679                                Register(rd),
   8680                                Register(rn),
   8681                                imm);
   8682                           break;
   8683                         }
   8684                       }
   8685                       break;
   8686                     }
   8687                     case 0x01000000: {
   8688                       // 0xf1000000
   8689                       switch (instr & 0x000f0000) {
   8690                         case 0x000d0000: {
   8691                           // 0xf10d0000
   8692                           unsigned rd = (instr >> 8) & 0xf;
   8693                           uint32_t imm = ImmediateT32::Decode(
   8694                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8695                               ((instr >> 15) & 0x800));
   8696                           if ((instr & 0x00100000) == 0x00000000 &&
   8697                               (((rd < kNumberOfT32LowRegisters) &&
   8698                                 ((imm <= 1020) && ((imm & 3) == 0))) ||
   8699                                ((rd == sp.GetCode()) &&
   8700                                 ((imm <= 508) && ((imm & 3) == 0))))) {
   8701                             // ADD{<c>}.W {<Rd>}, SP, #<const> ; T3
   8702                             add(CurrentCond(), Wide, Register(rd), sp, imm);
   8703                           } else if ((instr & 0x00100000) == 0x00000000) {
   8704                             // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; T3
   8705                             add(CurrentCond(), Best, Register(rd), sp, imm);
   8706                           } else {
   8707                             UnallocatedT32(instr);
   8708                           }
   8709                           break;
   8710                         }
   8711                         default: {
   8712                           if (((instr & 0xf0000) == 0xd0000)) {
   8713                             UnallocatedT32(instr);
   8714                             return;
   8715                           }
   8716                           unsigned rd = (instr >> 8) & 0xf;
   8717                           unsigned rn = (instr >> 16) & 0xf;
   8718                           uint32_t imm = ImmediateT32::Decode(
   8719                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8720                               ((instr >> 15) & 0x800));
   8721                           if (InITBlock() &&
   8722                               (instr & 0x00100000) == 0x00000000 &&
   8723                               (((rd < kNumberOfT32LowRegisters) &&
   8724                                 (rn < kNumberOfT32LowRegisters) &&
   8725                                 (imm <= 7)) ||
   8726                                ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   8727                                 (imm <= 255)))) {
   8728                             // ADD<c>.W {<Rd>}, <Rn>, #<const> ; T3
   8729                             add(CurrentCond(),
   8730                                 Wide,
   8731                                 Register(rd),
   8732                                 Register(rn),
   8733                                 imm);
   8734                           } else if ((instr & 0x00100000) == 0x00000000) {
   8735                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
   8736                             add(CurrentCond(),
   8737                                 Best,
   8738                                 Register(rd),
   8739                                 Register(rn),
   8740                                 imm);
   8741                           } else {
   8742                             UnallocatedT32(instr);
   8743                           }
   8744                           break;
   8745                         }
   8746                       }
   8747                       break;
   8748                     }
   8749                     case 0x01100000: {
   8750                       // 0xf1100000
   8751                       switch (instr & 0x00000f00) {
   8752                         case 0x00000f00: {
   8753                           // 0xf1100f00
   8754                           unsigned rn = (instr >> 16) & 0xf;
   8755                           uint32_t imm = ImmediateT32::Decode(
   8756                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8757                               ((instr >> 15) & 0x800));
   8758                           // CMN{<c>}{<q>} <Rn>, #<const> ; T1
   8759                           cmn(CurrentCond(), Best, Register(rn), imm);
   8760                           break;
   8761                         }
   8762                         default: {
   8763                           switch (instr & 0x000f0000) {
   8764                             case 0x000d0000: {
   8765                               // 0xf11d0000
   8766                               if (((instr & 0xf00) == 0xf00)) {
   8767                                 UnallocatedT32(instr);
   8768                                 return;
   8769                               }
   8770                               unsigned rd = (instr >> 8) & 0xf;
   8771                               uint32_t imm = ImmediateT32::Decode(
   8772                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
   8773                                   ((instr >> 15) & 0x800));
   8774                               // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; T3
   8775                               adds(CurrentCond(), Best, Register(rd), sp, imm);
   8776                               break;
   8777                             }
   8778                             default: {
   8779                               if (((instr & 0xf0000) == 0xd0000) ||
   8780                                   ((instr & 0xf00) == 0xf00)) {
   8781                                 UnallocatedT32(instr);
   8782                                 return;
   8783                               }
   8784                               unsigned rd = (instr >> 8) & 0xf;
   8785                               unsigned rn = (instr >> 16) & 0xf;
   8786                               uint32_t imm = ImmediateT32::Decode(
   8787                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
   8788                                   ((instr >> 15) & 0x800));
   8789                               if (OutsideITBlock() &&
   8790                                   (instr & 0x00100000) == 0x00100000 &&
   8791                                   (((rd < kNumberOfT32LowRegisters) &&
   8792                                     (rn < kNumberOfT32LowRegisters) &&
   8793                                     (imm <= 7)) ||
   8794                                    ((rd == rn) &&
   8795                                     (rd < kNumberOfT32LowRegisters) &&
   8796                                     (imm <= 255)))) {
   8797                                 // ADDS.W {<Rd>}, <Rn>, #<const> ; T3
   8798                                 adds(Condition::None(),
   8799                                      Wide,
   8800                                      Register(rd),
   8801                                      Register(rn),
   8802                                      imm);
   8803                               } else if ((instr & 0x00100000) == 0x00100000) {
   8804                                 // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
   8805                                 adds(CurrentCond(),
   8806                                      Best,
   8807                                      Register(rd),
   8808                                      Register(rn),
   8809                                      imm);
   8810                               } else {
   8811                                 UnallocatedT32(instr);
   8812                               }
   8813                               break;
   8814                             }
   8815                           }
   8816                           break;
   8817                         }
   8818                       }
   8819                       break;
   8820                     }
   8821                     case 0x01400000: {
   8822                       // 0xf1400000
   8823                       unsigned rd = (instr >> 8) & 0xf;
   8824                       unsigned rn = (instr >> 16) & 0xf;
   8825                       uint32_t imm = ImmediateT32::Decode(
   8826                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8827                           ((instr >> 15) & 0x800));
   8828                       // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8829                       adc(CurrentCond(), Best, Register(rd), Register(rn), imm);
   8830                       break;
   8831                     }
   8832                     case 0x01500000: {
   8833                       // 0xf1500000
   8834                       unsigned rd = (instr >> 8) & 0xf;
   8835                       unsigned rn = (instr >> 16) & 0xf;
   8836                       uint32_t imm = ImmediateT32::Decode(
   8837                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8838                           ((instr >> 15) & 0x800));
   8839                       // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8840                       adcs(CurrentCond(),
   8841                            Best,
   8842                            Register(rd),
   8843                            Register(rn),
   8844                            imm);
   8845                       break;
   8846                     }
   8847                     case 0x01600000: {
   8848                       // 0xf1600000
   8849                       unsigned rd = (instr >> 8) & 0xf;
   8850                       unsigned rn = (instr >> 16) & 0xf;
   8851                       uint32_t imm = ImmediateT32::Decode(
   8852                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8853                           ((instr >> 15) & 0x800));
   8854                       // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8855                       sbc(CurrentCond(), Best, Register(rd), Register(rn), imm);
   8856                       break;
   8857                     }
   8858                     case 0x01700000: {
   8859                       // 0xf1700000
   8860                       unsigned rd = (instr >> 8) & 0xf;
   8861                       unsigned rn = (instr >> 16) & 0xf;
   8862                       uint32_t imm = ImmediateT32::Decode(
   8863                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8864                           ((instr >> 15) & 0x800));
   8865                       // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8866                       sbcs(CurrentCond(),
   8867                            Best,
   8868                            Register(rd),
   8869                            Register(rn),
   8870                            imm);
   8871                       break;
   8872                     }
   8873                     case 0x01a00000: {
   8874                       // 0xf1a00000
   8875                       switch (instr & 0x000f0000) {
   8876                         case 0x000d0000: {
   8877                           // 0xf1ad0000
   8878                           unsigned rd = (instr >> 8) & 0xf;
   8879                           uint32_t imm = ImmediateT32::Decode(
   8880                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8881                               ((instr >> 15) & 0x800));
   8882                           if ((instr & 0x00100000) == 0x00000000 &&
   8883                               ((rd == sp.GetCode()) &&
   8884                                ((imm <= 508) && ((imm & 3) == 0)))) {
   8885                             // SUB{<c>}.W {<Rd>}, SP, #<const> ; T2
   8886                             sub(CurrentCond(), Wide, Register(rd), sp, imm);
   8887                           } else if ((instr & 0x00100000) == 0x00000000) {
   8888                             // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; T2
   8889                             sub(CurrentCond(), Best, Register(rd), sp, imm);
   8890                           } else {
   8891                             UnallocatedT32(instr);
   8892                           }
   8893                           break;
   8894                         }
   8895                         default: {
   8896                           if (((instr & 0xf0000) == 0xd0000)) {
   8897                             UnallocatedT32(instr);
   8898                             return;
   8899                           }
   8900                           unsigned rd = (instr >> 8) & 0xf;
   8901                           unsigned rn = (instr >> 16) & 0xf;
   8902                           uint32_t imm = ImmediateT32::Decode(
   8903                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8904                               ((instr >> 15) & 0x800));
   8905                           if (InITBlock() &&
   8906                               (instr & 0x00100000) == 0x00000000 &&
   8907                               (((rd < kNumberOfT32LowRegisters) &&
   8908                                 (rn < kNumberOfT32LowRegisters) &&
   8909                                 (imm <= 7)) ||
   8910                                ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   8911                                 (imm <= 255)))) {
   8912                             // SUB<c>.W {<Rd>}, <Rn>, #<const> ; T3
   8913                             sub(CurrentCond(),
   8914                                 Wide,
   8915                                 Register(rd),
   8916                                 Register(rn),
   8917                                 imm);
   8918                           } else if ((instr & 0x00100000) == 0x00000000) {
   8919                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
   8920                             sub(CurrentCond(),
   8921                                 Best,
   8922                                 Register(rd),
   8923                                 Register(rn),
   8924                                 imm);
   8925                           } else {
   8926                             UnallocatedT32(instr);
   8927                           }
   8928                           break;
   8929                         }
   8930                       }
   8931                       break;
   8932                     }
   8933                     case 0x01b00000: {
   8934                       // 0xf1b00000
   8935                       switch (instr & 0x00000f00) {
   8936                         case 0x00000f00: {
   8937                           // 0xf1b00f00
   8938                           unsigned rn = (instr >> 16) & 0xf;
   8939                           uint32_t imm = ImmediateT32::Decode(
   8940                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8941                               ((instr >> 15) & 0x800));
   8942                           if ((rn < kNumberOfT32LowRegisters) && (imm <= 255)) {
   8943                             // CMP{<c>}.W <Rn>, #<const> ; T2
   8944                             cmp(CurrentCond(), Wide, Register(rn), imm);
   8945                           } else {
   8946                             // CMP{<c>}{<q>} <Rn>, #<const> ; T2
   8947                             cmp(CurrentCond(), Best, Register(rn), imm);
   8948                           }
   8949                           break;
   8950                         }
   8951                         default: {
   8952                           switch (instr & 0x000f0000) {
   8953                             case 0x000d0000: {
   8954                               // 0xf1bd0000
   8955                               if (((instr & 0xf00) == 0xf00)) {
   8956                                 UnallocatedT32(instr);
   8957                                 return;
   8958                               }
   8959                               unsigned rd = (instr >> 8) & 0xf;
   8960                               uint32_t imm = ImmediateT32::Decode(
   8961                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
   8962                                   ((instr >> 15) & 0x800));
   8963                               // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; T2
   8964                               subs(CurrentCond(), Best, Register(rd), sp, imm);
   8965                               break;
   8966                             }
   8967                             default: {
   8968                               if (((instr & 0xf0000) == 0xd0000) ||
   8969                                   ((instr & 0xf00) == 0xf00)) {
   8970                                 UnallocatedT32(instr);
   8971                                 return;
   8972                               }
   8973                               unsigned rd = (instr >> 8) & 0xf;
   8974                               unsigned rn = (instr >> 16) & 0xf;
   8975                               uint32_t imm = ImmediateT32::Decode(
   8976                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
   8977                                   ((instr >> 15) & 0x800));
   8978                               if (OutsideITBlock() &&
   8979                                   (instr & 0x00100000) == 0x00100000 &&
   8980                                   (((rd < kNumberOfT32LowRegisters) &&
   8981                                     (rn < kNumberOfT32LowRegisters) &&
   8982                                     (imm <= 7)) ||
   8983                                    ((rd == rn) &&
   8984                                     (rd < kNumberOfT32LowRegisters) &&
   8985                                     (imm <= 255)))) {
   8986                                 // SUBS.W {<Rd>}, <Rn>, #<const> ; T3
   8987                                 subs(Condition::None(),
   8988                                      Wide,
   8989                                      Register(rd),
   8990                                      Register(rn),
   8991                                      imm);
   8992                               } else if ((instr & 0x00100000) == 0x00100000) {
   8993                                 // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
   8994                                 subs(CurrentCond(),
   8995                                      Best,
   8996                                      Register(rd),
   8997                                      Register(rn),
   8998                                      imm);
   8999                               } else {
   9000                                 UnallocatedT32(instr);
   9001                               }
   9002                               break;
   9003                             }
   9004                           }
   9005                           break;
   9006                         }
   9007                       }
   9008                       break;
   9009                     }
   9010                     case 0x01c00000: {
   9011                       // 0xf1c00000
   9012                       unsigned rd = (instr >> 8) & 0xf;
   9013                       unsigned rn = (instr >> 16) & 0xf;
   9014                       uint32_t imm = ImmediateT32::Decode(
   9015                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   9016                           ((instr >> 15) & 0x800));
   9017                       if (InITBlock() && (instr & 0x00100000) == 0x00000000 &&
   9018                           (imm == 0) &&
   9019                           ((rd < kNumberOfT32LowRegisters) &&
   9020                            (rn < kNumberOfT32LowRegisters) && (imm == 0))) {
   9021                         // RSB<c>.W {<Rd>}, <Rn>, #0 ; T2
   9022                         rsb(CurrentCond(),
   9023                             Wide,
   9024                             Register(rd),
   9025                             Register(rn),
   9026                             UINT32_C(0));
   9027                       } else if ((instr & 0x00100000) == 0x00000000) {
   9028                         // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2
   9029                         rsb(CurrentCond(),
   9030                             Best,
   9031                             Register(rd),
   9032                             Register(rn),
   9033                             imm);
   9034                       } else {
   9035                         UnallocatedT32(instr);
   9036                       }
   9037                       break;
   9038                     }
   9039                     case 0x01d00000: {
   9040                       // 0xf1d00000
   9041                       unsigned rd = (instr >> 8) & 0xf;
   9042                       unsigned rn = (instr >> 16) & 0xf;
   9043                       uint32_t imm = ImmediateT32::Decode(
   9044                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   9045                           ((instr >> 15) & 0x800));
   9046                       if (OutsideITBlock() &&
   9047                           (instr & 0x00100000) == 0x00100000 && (imm == 0) &&
   9048                           ((rd < kNumberOfT32LowRegisters) &&
   9049                            (rn < kNumberOfT32LowRegisters) && (imm == 0))) {
   9050                         // RSBS.W {<Rd>}, <Rn>, #0 ; T2
   9051                         rsbs(Condition::None(),
   9052                              Wide,
   9053                              Register(rd),
   9054                              Register(rn),
   9055                              UINT32_C(0));
   9056                       } else if ((instr & 0x00100000) == 0x00100000) {
   9057                         // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2
   9058                         rsbs(CurrentCond(),
   9059                              Best,
   9060                              Register(rd),
   9061                              Register(rn),
   9062                              imm);
   9063                       } else {
   9064                         UnallocatedT32(instr);
   9065                       }
   9066                       break;
   9067                     }
   9068                     case 0x02000000: {
   9069                       // 0xf2000000
   9070                       switch (instr & 0x000d0000) {
   9071                         case 0x000d0000: {
   9072                           // 0xf20d0000
   9073                           switch (instr & 0x00020000) {
   9074                             case 0x00000000: {
   9075                               // 0xf20d0000
   9076                               unsigned rd = (instr >> 8) & 0xf;
   9077                               uint32_t imm = (instr & 0xff) |
   9078                                              ((instr >> 4) & 0x700) |
   9079                                              ((instr >> 15) & 0x800);
   9080                               if (((rd >= kNumberOfT32LowRegisters) ||
   9081                                    ((imm > 1020) || ((imm & 3) != 0))) &&
   9082                                   ((rd != sp.GetCode()) ||
   9083                                    ((imm > 508) || ((imm & 3) != 0))) &&
   9084                                   (!ImmediateT32::IsImmediateT32(imm))) {
   9085                                 // ADD{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4
   9086                                 add(CurrentCond(), Best, Register(rd), sp, imm);
   9087                               } else {
   9088                                 // ADDW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4
   9089                                 addw(CurrentCond(), Register(rd), sp, imm);
   9090                               }
   9091                               break;
   9092                             }
   9093                             case 0x00020000: {
   9094                               // 0xf20f0000
   9095                               unsigned rd = (instr >> 8) & 0xf;
   9096                               int32_t imm = (instr & 0xff) |
   9097                                             ((instr >> 4) & 0x700) |
   9098                                             ((instr >> 15) & 0x800);
   9099                               Location location(imm, kT32PcDelta);
   9100                               if ((imm >= 0) && (imm <= 4095) &&
   9101                                   ((rd < kNumberOfT32LowRegisters) &&
   9102                                    (imm >= 0) && (imm <= 1020) &&
   9103                                    ((imm & 3) == 0))) {
   9104                                 // ADR{<c>}.W <Rd>, <label> ; T3
   9105                                 adr(CurrentCond(),
   9106                                     Wide,
   9107                                     Register(rd),
   9108                                     &location);
   9109                               } else if ((imm >= 0) && (imm <= 4095)) {
   9110                                 // ADR{<c>}{<q>} <Rd>, <label> ; T3
   9111                                 adr(CurrentCond(),
   9112                                     Best,
   9113                                     Register(rd),
   9114                                     &location);
   9115                               } else {
   9116                                 UnallocatedT32(instr);
   9117                               }
   9118                               break;
   9119                             }
   9120                           }
   9121                           break;
   9122                         }
   9123                         default: {
   9124                           if (((instr & 0xd0000) == 0xd0000)) {
   9125                             UnallocatedT32(instr);
   9126                             return;
   9127                           }
   9128                           unsigned rd = (instr >> 8) & 0xf;
   9129                           unsigned rn = (instr >> 16) & 0xf;
   9130                           uint32_t imm = (instr & 0xff) |
   9131                                          ((instr >> 4) & 0x700) |
   9132                                          ((instr >> 15) & 0x800);
   9133                           if ((InITBlock() ||
   9134                                (rd >= kNumberOfT32LowRegisters) ||
   9135                                (rn >= kNumberOfT32LowRegisters) || (imm > 7)) &&
   9136                               (InITBlock() || (rd != rn) ||
   9137                                (rd >= kNumberOfT32LowRegisters) ||
   9138                                (imm > 255)) &&
   9139                               (!ImmediateT32::IsImmediateT32(imm))) {
   9140                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
   9141                             add(CurrentCond(),
   9142                                 Best,
   9143                                 Register(rd),
   9144                                 Register(rn),
   9145                                 imm);
   9146                           } else {
   9147                             // ADDW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
   9148                             addw(CurrentCond(),
   9149                                  Register(rd),
   9150                                  Register(rn),
   9151                                  imm);
   9152                           }
   9153                           break;
   9154                         }
   9155                       }
   9156                       break;
   9157                     }
   9158                     case 0x02400000: {
   9159                       // 0xf2400000
   9160                       unsigned rd = (instr >> 8) & 0xf;
   9161                       uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) |
   9162                                      ((instr >> 15) & 0x800) |
   9163                                      ((instr >> 4) & 0xf000);
   9164                       if ((InITBlock() || (rd >= kNumberOfT32LowRegisters) ||
   9165                            (imm > 255)) &&
   9166                           (!ImmediateT32::IsImmediateT32(imm))) {
   9167                         // MOV{<c>}{<q>} <Rd>, #<imm16> ; T3
   9168                         mov(CurrentCond(), Best, Register(rd), imm);
   9169                       } else {
   9170                         // MOVW{<c>}{<q>} <Rd>, #<imm16> ; T3
   9171                         movw(CurrentCond(), Register(rd), imm);
   9172                       }
   9173                       break;
   9174                     }
   9175                     case 0x02a00000: {
   9176                       // 0xf2a00000
   9177                       switch (instr & 0x000d0000) {
   9178                         case 0x000d0000: {
   9179                           // 0xf2ad0000
   9180                           switch (instr & 0x00020000) {
   9181                             case 0x00000000: {
   9182                               // 0xf2ad0000
   9183                               unsigned rd = (instr >> 8) & 0xf;
   9184                               uint32_t imm = (instr & 0xff) |
   9185                                              ((instr >> 4) & 0x700) |
   9186                                              ((instr >> 15) & 0x800);
   9187                               if (((rd != sp.GetCode()) ||
   9188                                    ((imm > 508) || ((imm & 3) != 0))) &&
   9189                                   (!ImmediateT32::IsImmediateT32(imm))) {
   9190                                 // SUB{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3
   9191                                 sub(CurrentCond(), Best, Register(rd), sp, imm);
   9192                               } else {
   9193                                 // SUBW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3
   9194                                 subw(CurrentCond(), Register(rd), sp, imm);
   9195                               }
   9196                               break;
   9197                             }
   9198                             case 0x00020000: {
   9199                               // 0xf2af0000
   9200                               if (((((Uint32((instr >> 26)) & Uint32(0x1))
   9201                                      << 11) |
   9202                                     ((Uint32((instr >> 12)) & Uint32(0x7))
   9203                                      << 8) |
   9204                                     (Uint32(instr) & Uint32(0xff))) ==
   9205                                    Uint32(0x0))) {
   9206                                 unsigned rd = (instr >> 8) & 0xf;
   9207                                 uint32_t imm = (instr & 0xff) |
   9208                                                ((instr >> 4) & 0x700) |
   9209                                                ((instr >> 15) & 0x800);
   9210                                 // SUB{<c>}{<q>} <Rd>, PC, #<imm12> ; T2
   9211                                 sub(CurrentCond(), Best, Register(rd), pc, imm);
   9212                                 return;
   9213                               }
   9214                               unsigned rd = (instr >> 8) & 0xf;
   9215                               int32_t imm = (instr & 0xff) |
   9216                                             ((instr >> 4) & 0x700) |
   9217                                             ((instr >> 15) & 0x800);
   9218                               Location location(-imm, kT32PcDelta);
   9219                               // ADR{<c>}{<q>} <Rd>, <label> ; T2
   9220                               adr(CurrentCond(), Best, Register(rd), &location);
   9221                               break;
   9222                             }
   9223                           }
   9224                           break;
   9225                         }
   9226                         default: {
   9227                           if (((instr & 0xd0000) == 0xd0000)) {
   9228                             UnallocatedT32(instr);
   9229                             return;
   9230                           }
   9231                           unsigned rd = (instr >> 8) & 0xf;
   9232                           unsigned rn = (instr >> 16) & 0xf;
   9233                           uint32_t imm = (instr & 0xff) |
   9234                                          ((instr >> 4) & 0x700) |
   9235                                          ((instr >> 15) & 0x800);
   9236                           if ((InITBlock() ||
   9237                                (rd >= kNumberOfT32LowRegisters) ||
   9238                                (rn >= kNumberOfT32LowRegisters) || (imm > 7)) &&
   9239                               (InITBlock() || (rd != rn) ||
   9240                                (rd >= kNumberOfT32LowRegisters) ||
   9241                                (imm > 255)) &&
   9242                               (!ImmediateT32::IsImmediateT32(imm))) {
   9243                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
   9244                             sub(CurrentCond(),
   9245                                 Best,
   9246                                 Register(rd),
   9247                                 Register(rn),
   9248                                 imm);
   9249                           } else {
   9250                             // SUBW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
   9251                             subw(CurrentCond(),
   9252                                  Register(rd),
   9253                                  Register(rn),
   9254                                  imm);
   9255                           }
   9256                           break;
   9257                         }
   9258                       }
   9259                       break;
   9260                     }
   9261                     case 0x02c00000: {
   9262                       // 0xf2c00000
   9263                       unsigned rd = (instr >> 8) & 0xf;
   9264                       uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) |
   9265                                      ((instr >> 15) & 0x800) |
   9266                                      ((instr >> 4) & 0xf000);
   9267                       // MOVT{<c>}{<q>} <Rd>, #<imm16> ; T1
   9268                       movt(CurrentCond(), Register(rd), imm);
   9269                       break;
   9270                     }
   9271                     case 0x03000000: {
   9272                       // 0xf3000000
   9273                       unsigned rd = (instr >> 8) & 0xf;
   9274                       uint32_t imm = (instr & 0x1f) + 1;
   9275                       unsigned rn = (instr >> 16) & 0xf;
   9276                       uint32_t amount =
   9277                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9278                       // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length)
   9279                       ssat(CurrentCond(),
   9280                            Register(rd),
   9281                            imm,
   9282                            Operand(Register(rn), LSL, amount));
   9283                       if (((instr & 0xfff08020) != 0xf3000000)) {
   9284                         UnpredictableT32(instr);
   9285                       }
   9286                       break;
   9287                     }
   9288                     case 0x03200000: {
   9289                       // 0xf3200000
   9290                       switch (instr & 0x000070c0) {
   9291                         case 0x00000000: {
   9292                           // 0xf3200000
   9293                           unsigned rd = (instr >> 8) & 0xf;
   9294                           uint32_t imm = (instr & 0xf) + 1;
   9295                           unsigned rn = (instr >> 16) & 0xf;
   9296                           // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1
   9297                           ssat16(CurrentCond(),
   9298                                  Register(rd),
   9299                                  imm,
   9300                                  Register(rn));
   9301                           if (((instr & 0xfff0f0f0) != 0xf3200000)) {
   9302                             UnpredictableT32(instr);
   9303                           }
   9304                           break;
   9305                         }
   9306                         default: {
   9307                           if (((instr & 0x70c0) == 0x0)) {
   9308                             UnallocatedT32(instr);
   9309                             return;
   9310                           }
   9311                           unsigned rd = (instr >> 8) & 0xf;
   9312                           uint32_t imm = (instr & 0x1f) + 1;
   9313                           unsigned rn = (instr >> 16) & 0xf;
   9314                           uint32_t amount =
   9315                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9316                           // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length)
   9317                           ssat(CurrentCond(),
   9318                                Register(rd),
   9319                                imm,
   9320                                Operand(Register(rn), ASR, amount));
   9321                           if (((instr & 0xfff08020) != 0xf3200000)) {
   9322                             UnpredictableT32(instr);
   9323                           }
   9324                           break;
   9325                         }
   9326                       }
   9327                       break;
   9328                     }
   9329                     case 0x03400000: {
   9330                       // 0xf3400000
   9331                       unsigned rd = (instr >> 8) & 0xf;
   9332                       unsigned rn = (instr >> 16) & 0xf;
   9333                       uint32_t lsb =
   9334                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9335                       uint32_t widthm1 = instr & 0x1f;
   9336                       uint32_t width = widthm1 + 1;
   9337                       // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
   9338                       sbfx(CurrentCond(),
   9339                            Register(rd),
   9340                            Register(rn),
   9341                            lsb,
   9342                            width);
   9343                       if (((instr & 0xfff08020) != 0xf3400000)) {
   9344                         UnpredictableT32(instr);
   9345                       }
   9346                       break;
   9347                     }
   9348                     case 0x03600000: {
   9349                       // 0xf3600000
   9350                       switch (instr & 0x000f0000) {
   9351                         case 0x000f0000: {
   9352                           // 0xf36f0000
   9353                           unsigned rd = (instr >> 8) & 0xf;
   9354                           uint32_t lsb =
   9355                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9356                           uint32_t msb = instr & 0x1f;
   9357                           uint32_t width = msb - lsb + 1;
   9358                           // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; T1
   9359                           bfc(CurrentCond(), Register(rd), lsb, width);
   9360                           if (((instr & 0xffff8020) != 0xf36f0000)) {
   9361                             UnpredictableT32(instr);
   9362                           }
   9363                           break;
   9364                         }
   9365                         default: {
   9366                           if (((instr & 0xf0000) == 0xf0000)) {
   9367                             UnallocatedT32(instr);
   9368                             return;
   9369                           }
   9370                           unsigned rd = (instr >> 8) & 0xf;
   9371                           unsigned rn = (instr >> 16) & 0xf;
   9372                           uint32_t lsb =
   9373                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9374                           uint32_t msb = instr & 0x1f;
   9375                           uint32_t width = msb - lsb + 1;
   9376                           // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
   9377                           bfi(CurrentCond(),
   9378                               Register(rd),
   9379                               Register(rn),
   9380                               lsb,
   9381                               width);
   9382                           if (((instr & 0xfff08020) != 0xf3600000)) {
   9383                             UnpredictableT32(instr);
   9384                           }
   9385                           break;
   9386                         }
   9387                       }
   9388                       break;
   9389                     }
   9390                     case 0x03800000: {
   9391                       // 0xf3800000
   9392                       unsigned rd = (instr >> 8) & 0xf;
   9393                       uint32_t imm = instr & 0x1f;
   9394                       unsigned rn = (instr >> 16) & 0xf;
   9395                       uint32_t amount =
   9396                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9397                       // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length)
   9398                       usat(CurrentCond(),
   9399                            Register(rd),
   9400                            imm,
   9401                            Operand(Register(rn), LSL, amount));
   9402                       if (((instr & 0xfff08020) != 0xf3800000)) {
   9403                         UnpredictableT32(instr);
   9404                       }
   9405                       break;
   9406                     }
   9407                     case 0x03a00000: {
   9408                       // 0xf3a00000
   9409                       switch (instr & 0x000070c0) {
   9410                         case 0x00000000: {
   9411                           // 0xf3a00000
   9412                           unsigned rd = (instr >> 8) & 0xf;
   9413                           uint32_t imm = instr & 0xf;
   9414                           unsigned rn = (instr >> 16) & 0xf;
   9415                           // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1
   9416                           usat16(CurrentCond(),
   9417                                  Register(rd),
   9418                                  imm,
   9419                                  Register(rn));
   9420                           if (((instr & 0xfff0f0f0) != 0xf3a00000)) {
   9421                             UnpredictableT32(instr);
   9422                           }
   9423                           break;
   9424                         }
   9425                         default: {
   9426                           if (((instr & 0x70c0) == 0x0)) {
   9427                             UnallocatedT32(instr);
   9428                             return;
   9429                           }
   9430                           unsigned rd = (instr >> 8) & 0xf;
   9431                           uint32_t imm = instr & 0x1f;
   9432                           unsigned rn = (instr >> 16) & 0xf;
   9433                           uint32_t amount =
   9434                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9435                           // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length)
   9436                           usat(CurrentCond(),
   9437                                Register(rd),
   9438                                imm,
   9439                                Operand(Register(rn), ASR, amount));
   9440                           if (((instr & 0xfff08020) != 0xf3a00000)) {
   9441                             UnpredictableT32(instr);
   9442                           }
   9443                           break;
   9444                         }
   9445                       }
   9446                       break;
   9447                     }
   9448                     case 0x03c00000: {
   9449                       // 0xf3c00000
   9450                       unsigned rd = (instr >> 8) & 0xf;
   9451                       unsigned rn = (instr >> 16) & 0xf;
   9452                       uint32_t lsb =
   9453                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9454                       uint32_t widthm1 = instr & 0x1f;
   9455                       uint32_t width = widthm1 + 1;
   9456                       // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
   9457                       ubfx(CurrentCond(),
   9458                            Register(rd),
   9459                            Register(rn),
   9460                            lsb,
   9461                            width);
   9462                       if (((instr & 0xfff08020) != 0xf3c00000)) {
   9463                         UnpredictableT32(instr);
   9464                       }
   9465                       break;
   9466                     }
   9467                     default:
   9468                       UnallocatedT32(instr);
   9469                       break;
   9470                   }
   9471                   break;
   9472                 }
   9473                 case 0x00008000: {
   9474                   // 0xf0008000
   9475                   switch (instr & 0x00005000) {
   9476                     case 0x00000000: {
   9477                       // 0xf0008000
   9478                       switch (instr & 0x03800000) {
   9479                         case 0x03800000: {
   9480                           // 0xf3808000
   9481                           switch (instr & 0x04600000) {
   9482                             case 0x00000000: {
   9483                               // 0xf3808000
   9484                               switch (instr & 0x00000020) {
   9485                                 case 0x00000000: {
   9486                                   // 0xf3808000
   9487                                   unsigned spec_reg = ((instr >> 8) & 0xf) |
   9488                                                       ((instr >> 16) & 0x10);
   9489                                   unsigned rn = (instr >> 16) & 0xf;
   9490                                   // MSR{<c>}{<q>} <spec_reg>, <Rn> ; T1
   9491                                   msr(CurrentCond(),
   9492                                       MaskedSpecialRegister(spec_reg),
   9493                                       Register(rn));
   9494                                   if (((instr & 0xffe0f0ff) != 0xf3808000)) {
   9495                                     UnpredictableT32(instr);
   9496                                   }
   9497                                   break;
   9498                                 }
   9499                                 case 0x00000020: {
   9500                                   // 0xf3808020
   9501                                   UnimplementedT32_32("MSR", instr);
   9502                                   break;
   9503                                 }
   9504                               }
   9505                               break;
   9506                             }
   9507                             case 0x00200000: {
   9508                               // 0xf3a08000
   9509                               switch (instr & 0x00100000) {
   9510                                 case 0x00000000: {
   9511                                   // 0xf3a08000
   9512                                   switch (instr & 0x00000700) {
   9513                                     case 0x00000000: {
   9514                                       // 0xf3a08000
   9515                                       switch (instr & 0x000000f0) {
   9516                                         case 0x00000000: {
   9517                                           // 0xf3a08000
   9518                                           switch (instr & 0x0000000f) {
   9519                                             case 0x00000000: {
   9520                                               // 0xf3a08000
   9521                                               // NOP{<c>}.W ; T2
   9522                                               nop(CurrentCond(), Wide);
   9523                                               if (((instr & 0xffffffff) !=
   9524                                                    0xf3af8000)) {
   9525                                                 UnpredictableT32(instr);
   9526                                               }
   9527                                               break;
   9528                                             }
   9529                                             case 0x00000001: {
   9530                                               // 0xf3a08001
   9531                                               // YIELD{<c>}.W ; T2
   9532                                               yield(CurrentCond(), Wide);
   9533                                               if (((instr & 0xffffffff) !=
   9534                                                    0xf3af8001)) {
   9535                                                 UnpredictableT32(instr);
   9536                                               }
   9537                                               break;
   9538                                             }
   9539                                             case 0x00000002: {
   9540                                               // 0xf3a08002
   9541                                               UnimplementedT32_32("WFE", instr);
   9542                                               break;
   9543                                             }
   9544                                             case 0x00000003: {
   9545                                               // 0xf3a08003
   9546                                               UnimplementedT32_32("WFI", instr);
   9547                                               break;
   9548                                             }
   9549                                             case 0x00000004: {
   9550                                               // 0xf3a08004
   9551                                               UnimplementedT32_32("SEV", instr);
   9552                                               break;
   9553                                             }
   9554                                             case 0x00000005: {
   9555                                               // 0xf3a08005
   9556                                               UnimplementedT32_32("SEVL",
   9557                                                                   instr);
   9558                                               break;
   9559                                             }
   9560                                             default:
   9561                                               UnallocatedT32(instr);
   9562                                               break;
   9563                                           }
   9564                                           break;
   9565                                         }
   9566                                         case 0x000000f0: {
   9567                                           // 0xf3a080f0
   9568                                           UnimplementedT32_32("DBG", instr);
   9569                                           break;
   9570                                         }
   9571                                         default:
   9572                                           UnallocatedT32(instr);
   9573                                           break;
   9574                                       }
   9575                                       break;
   9576                                     }
   9577                                     case 0x00000100: {
   9578                                       // 0xf3a08100
   9579                                       if ((instr & 0x000000e0) == 0x00000000) {
   9580                                         UnimplementedT32_32("CPS", instr);
   9581                                       } else {
   9582                                         UnallocatedT32(instr);
   9583                                       }
   9584                                       break;
   9585                                     }
   9586                                     case 0x00000400: {
   9587                                       // 0xf3a08400
   9588                                       if ((instr & 0x0000001f) == 0x00000000) {
   9589                                         UnimplementedT32_32("CPSIE", instr);
   9590                                       } else {
   9591                                         UnallocatedT32(instr);
   9592                                       }
   9593                                       break;
   9594                                     }
   9595                                     case 0x00000500: {
   9596                                       // 0xf3a08500
   9597                                       UnimplementedT32_32("CPSIE", instr);
   9598                                       break;
   9599                                     }
   9600                                     case 0x00000600: {
   9601                                       // 0xf3a08600
   9602                                       if ((instr & 0x0000001f) == 0x00000000) {
   9603                                         UnimplementedT32_32("CPSID", instr);
   9604                                       } else {
   9605                                         UnallocatedT32(instr);
   9606                                       }
   9607                                       break;
   9608                                     }
   9609                                     case 0x00000700: {
   9610                                       // 0xf3a08700
   9611                                       UnimplementedT32_32("CPSID", instr);
   9612                                       break;
   9613                                     }
   9614                                     default:
   9615                                       UnallocatedT32(instr);
   9616                                       break;
   9617                                   }
   9618                                   break;
   9619                                 }
   9620                                 case 0x00100000: {
   9621                                   // 0xf3b08000
   9622                                   switch (instr & 0x000000f0) {
   9623                                     case 0x00000020: {
   9624                                       // 0xf3b08020
   9625                                       // CLREX{<c>}{<q>} ; T1
   9626                                       clrex(CurrentCond());
   9627                                       if (((instr & 0xffffffff) !=
   9628                                            0xf3bf8f2f)) {
   9629                                         UnpredictableT32(instr);
   9630                                       }
   9631                                       break;
   9632                                     }
   9633                                     case 0x00000040: {
   9634                                       // 0xf3b08040
   9635                                       MemoryBarrier option(instr & 0xf);
   9636                                       // DSB{<c>}{<q>} {<option>} ; T1
   9637                                       dsb(CurrentCond(), option);
   9638                                       if (((instr & 0xfffffff0) !=
   9639                                            0xf3bf8f40)) {
   9640                                         UnpredictableT32(instr);
   9641                                       }
   9642                                       break;
   9643                                     }
   9644                                     case 0x00000050: {
   9645                                       // 0xf3b08050
   9646                                       MemoryBarrier option(instr & 0xf);
   9647                                       // DMB{<c>}{<q>} {<option>} ; T1
   9648                                       dmb(CurrentCond(), option);
   9649                                       if (((instr & 0xfffffff0) !=
   9650                                            0xf3bf8f50)) {
   9651                                         UnpredictableT32(instr);
   9652                                       }
   9653                                       break;
   9654                                     }
   9655                                     case 0x00000060: {
   9656                                       // 0xf3b08060
   9657                                       MemoryBarrier option(instr & 0xf);
   9658                                       // ISB{<c>}{<q>} {<option>} ; T1
   9659                                       isb(CurrentCond(), option);
   9660                                       if (((instr & 0xfffffff0) !=
   9661                                            0xf3bf8f60)) {
   9662                                         UnpredictableT32(instr);
   9663                                       }
   9664                                       break;
   9665                                     }
   9666                                     default:
   9667                                       UnallocatedT32(instr);
   9668                                       break;
   9669                                   }
   9670                                   break;
   9671                                 }
   9672                               }
   9673                               break;
   9674                             }
   9675                             case 0x00400000: {
   9676                               // 0xf3c08000
   9677                               switch (instr & 0x00100000) {
   9678                                 case 0x00000000: {
   9679                                   // 0xf3c08000
   9680                                   unsigned rm = (instr >> 16) & 0xf;
   9681                                   // BXJ{<c>}{<q>} <Rm> ; T1
   9682                                   bxj(CurrentCond(), Register(rm));
   9683                                   if (((instr & 0xfff0ffff) != 0xf3c08f00)) {
   9684                                     UnpredictableT32(instr);
   9685                                   }
   9686                                   break;
   9687                                 }
   9688                                 case 0x00100000: {
   9689                                   // 0xf3d08000
   9690                                   switch (instr & 0x000000ff) {
   9691                                     case 0x00000000: {
   9692                                       // 0xf3d08000
   9693                                       if ((instr & 0x000f0000) == 0x000e0000) {
   9694                                         UnimplementedT32_32("ERET", instr);
   9695                                       } else {
   9696                                         UnallocatedT32(instr);
   9697                                       }
   9698                                       break;
   9699                                     }
   9700                                     default: {
   9701                                       if (((instr & 0xff) == 0x0)) {
   9702                                         UnallocatedT32(instr);
   9703                                         return;
   9704                                       }
   9705                                       uint32_t imm = instr & 0xff;
   9706                                       // SUBS{<c>}{<q>} PC, LR, #<imm8> ; T5
   9707                                       subs(CurrentCond(), Best, pc, lr, imm);
   9708                                       if (((instr & 0xffffff00) !=
   9709                                            0xf3de8f00)) {
   9710                                         UnpredictableT32(instr);
   9711                                       }
   9712                                       break;
   9713                                     }
   9714                                   }
   9715                                   break;
   9716                                 }
   9717                               }
   9718                               break;
   9719                             }
   9720                             case 0x00600000: {
   9721                               // 0xf3e08000
   9722                               switch (instr & 0x00000020) {
   9723                                 case 0x00000000: {
   9724                                   // 0xf3e08000
   9725                                   unsigned rd = (instr >> 8) & 0xf;
   9726                                   unsigned spec_reg = (instr >> 20) & 0x1;
   9727                                   // MRS{<c>}{<q>} <Rd>, <spec_reg> ; T1
   9728                                   mrs(CurrentCond(),
   9729                                       Register(rd),
   9730                                       SpecialRegister(spec_reg));
   9731                                   if (((instr & 0xffeff0ff) != 0xf3ef8000)) {
   9732                                     UnpredictableT32(instr);
   9733                                   }
   9734                                   break;
   9735                                 }
   9736                                 case 0x00000020: {
   9737                                   // 0xf3e08020
   9738                                   UnimplementedT32_32("MRS", instr);
   9739                                   break;
   9740                                 }
   9741                               }
   9742                               break;
   9743                             }
   9744                             case 0x04000000: {
   9745                               // 0xf7808000
   9746                               switch (instr & 0x001f2fff) {
   9747                                 case 0x000f0001: {
   9748                                   // 0xf78f8001
   9749                                   UnimplementedT32_32("DCPS1", instr);
   9750                                   break;
   9751                                 }
   9752                                 case 0x000f0002: {
   9753                                   // 0xf78f8002
   9754                                   UnimplementedT32_32("DCPS2", instr);
   9755                                   break;
   9756                                 }
   9757                                 case 0x000f0003: {
   9758                                   // 0xf78f8003
   9759                                   UnimplementedT32_32("DCPS3", instr);
   9760                                   break;
   9761                                 }
   9762                                 default:
   9763                                   UnallocatedT32(instr);
   9764                                   break;
   9765                               }
   9766                               break;
   9767                             }
   9768                             case 0x04600000: {
   9769                               // 0xf7e08000
   9770                               switch (instr & 0x00102000) {
   9771                                 case 0x00000000: {
   9772                                   // 0xf7e08000
   9773                                   uint32_t imm =
   9774                                       (instr & 0xfff) | ((instr >> 4) & 0xf000);
   9775                                   // HVC{<q>} {#}<imm16> ; T1
   9776                                   hvc(Condition::None(), imm);
   9777                                   break;
   9778                                 }
   9779                                 case 0x00100000: {
   9780                                   // 0xf7f08000
   9781                                   UnimplementedT32_32("SMC", instr);
   9782                                   break;
   9783                                 }
   9784                                 case 0x00102000: {
   9785                                   // 0xf7f0a000
   9786                                   uint32_t imm =
   9787                                       (instr & 0xfff) | ((instr >> 4) & 0xf000);
   9788                                   if ((imm <= 255)) {
   9789                                     // UDF{<c>}.W {#}<imm> ; T2
   9790                                     udf(CurrentCond(), Wide, imm);
   9791                                   } else {
   9792                                     // UDF{<c>}{<q>} {#}<imm> ; T2
   9793                                     udf(CurrentCond(), Best, imm);
   9794                                   }
   9795                                   break;
   9796                                 }
   9797                                 default:
   9798                                   UnallocatedT32(instr);
   9799                                   break;
   9800                               }
   9801                               break;
   9802                             }
   9803                             default:
   9804                               UnallocatedT32(instr);
   9805                               break;
   9806                           }
   9807                           break;
   9808                         }
   9809                         default: {
   9810                           if (((instr & 0x3800000) == 0x3800000)) {
   9811                             UnallocatedT32(instr);
   9812                             return;
   9813                           }
   9814                           Condition condition((instr >> 22) & 0xf);
   9815                           int32_t imm =
   9816                               SignExtend<int32_t>(((instr & 0x7ff) |
   9817                                                    ((instr >> 5) & 0x1f800) |
   9818                                                    ((instr << 4) & 0x20000) |
   9819                                                    ((instr << 7) & 0x40000) |
   9820                                                    ((instr >> 7) & 0x80000))
   9821                                                       << 1,
   9822                                                   21);
   9823                           Location location(imm, kT32PcDelta);
   9824                           if ((imm >= -1048576) && (imm <= 1048574) &&
   9825                               ((imm & 1) == 0) &&
   9826                               ((imm >= -256) && (imm <= 254) &&
   9827                                ((imm & 1) == 0))) {
   9828                             // B<c>.W <label> ; T3
   9829                             b(condition, Wide, &location);
   9830                             if (InITBlock()) {
   9831                               UnpredictableT32(instr);
   9832                             }
   9833                           } else if ((imm >= -1048576) && (imm <= 1048574) &&
   9834                                      ((imm & 1) == 0)) {
   9835                             // B<c>{<q>} <label> ; T3
   9836                             b(condition, Best, &location);
   9837                             if (InITBlock()) {
   9838                               UnpredictableT32(instr);
   9839                             }
   9840                           } else {
   9841                             UnallocatedT32(instr);
   9842                           }
   9843                           break;
   9844                         }
   9845                       }
   9846                       break;
   9847                     }
   9848                     case 0x00001000: {
   9849                       // 0xf0009000
   9850                       uint32_t encoded_imm =
   9851                           (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) |
   9852                           ((instr << 10) & 0x200000) |
   9853                           ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000);
   9854                       uint32_t S = encoded_imm & (1 << 23);
   9855                       encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21);
   9856                       int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25);
   9857                       Location location(imm, kT32PcDelta);
   9858                       if ((imm >= -16777216) && (imm <= 16777214) &&
   9859                           ((imm & 1) == 0) &&
   9860                           ((imm >= -2048) && (imm <= 2046) &&
   9861                            ((imm & 1) == 0))) {
   9862                         // B{<c>}.W <label> ; T4
   9863                         b(CurrentCond(), Wide, &location);
   9864                       } else if ((imm >= -16777216) && (imm <= 16777214) &&
   9865                                  ((imm & 1) == 0)) {
   9866                         // B{<c>}{<q>} <label> ; T4
   9867                         b(CurrentCond(), Best, &location);
   9868                         if (!OutsideITBlockOrLast()) {
   9869                           UnpredictableT32(instr);
   9870                         }
   9871                       } else {
   9872                         UnallocatedT32(instr);
   9873                       }
   9874                       break;
   9875                     }
   9876                     case 0x00004000: {
   9877                       // 0xf000c000
   9878                       if ((instr & 0x00000001) == 0x00000000) {
   9879                         uint32_t encoded_imm = ((instr >> 1) & 0x3ff) |
   9880                                                ((instr >> 6) & 0xffc00) |
   9881                                                ((instr << 9) & 0x100000) |
   9882                                                ((instr << 8) & 0x200000) |
   9883                                                ((instr >> 4) & 0x400000);
   9884                         uint32_t S = encoded_imm & (1 << 22);
   9885                         encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 20);
   9886                         int32_t imm = SignExtend<int32_t>(encoded_imm << 2, 25);
   9887                         Location location(imm, kT32PcDelta);
   9888                         // BLX{<c>}{<q>} <label> ; T2
   9889                         blx(CurrentCond(), &location);
   9890                       } else {
   9891                         UnallocatedT32(instr);
   9892                       }
   9893                       break;
   9894                     }
   9895                     case 0x00005000: {
   9896                       // 0xf000d000
   9897                       uint32_t encoded_imm =
   9898                           (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) |
   9899                           ((instr << 10) & 0x200000) |
   9900                           ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000);
   9901                       uint32_t S = encoded_imm & (1 << 23);
   9902                       encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21);
   9903                       int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25);
   9904                       Location location(imm, kT32PcDelta);
   9905                       // BL{<c>}{<q>} <label> ; T1
   9906                       bl(CurrentCond(), &location);
   9907                       break;
   9908                     }
   9909                   }
   9910                   break;
   9911                 }
   9912               }
   9913               break;
   9914             }
   9915           }
   9916           break;
   9917         }
   9918         case 0x08000000: {
   9919           // 0xe8000000
   9920           switch (instr & 0x06000000) {
   9921             case 0x00000000: {
   9922               // 0xe8000000
   9923               switch (instr & 0x10100000) {
   9924                 case 0x00000000: {
   9925                   // 0xe8000000
   9926                   switch (instr & 0x01400000) {
   9927                     case 0x00000000: {
   9928                       // 0xe8000000
   9929                       switch (instr & 0x00800000) {
   9930                         case 0x00000000: {
   9931                           // 0xe8000000
   9932                           UnimplementedT32_32("SRSDB", instr);
   9933                           break;
   9934                         }
   9935                         case 0x00800000: {
   9936                           // 0xe8800000
   9937                           unsigned rn = (instr >> 16) & 0xf;
   9938                           WriteBack write_back((instr >> 21) & 0x1);
   9939                           RegisterList registers(
   9940                               (((instr >> 14) & 0x1) << kLRRegNum) |
   9941                               (instr & 0x1fff));
   9942                           if ((rn < kNumberOfT32LowRegisters) &&
   9943                               write_back.DoesWriteBack() &&
   9944                               ((registers.GetList() & ~0xff) == 0)) {
   9945                             // STM{<c>}.W <Rn>{!}, <registers> ; T2
   9946                             stm(CurrentCond(),
   9947                                 Wide,
   9948                                 Register(rn),
   9949                                 write_back,
   9950                                 registers);
   9951                             if (((instr & 0xffd0a000) != 0xe8800000)) {
   9952                               UnpredictableT32(instr);
   9953                             }
   9954                           } else {
   9955                             // STM{<c>}{<q>} <Rn>{!}, <registers> ; T2
   9956                             stm(CurrentCond(),
   9957                                 Best,
   9958                                 Register(rn),
   9959                                 write_back,
   9960                                 registers);
   9961                             if (((instr & 0xffd0a000) != 0xe8800000)) {
   9962                               UnpredictableT32(instr);
   9963                             }
   9964                           }
   9965                           break;
   9966                         }
   9967                       }
   9968                       break;
   9969                     }
   9970                     case 0x00400000: {
   9971                       // 0xe8400000
   9972                       switch (instr & 0x00200000) {
   9973                         case 0x00000000: {
   9974                           // 0xe8400000
   9975                           switch (instr & 0x00800000) {
   9976                             case 0x00000000: {
   9977                               // 0xe8400000
   9978                               unsigned rd = (instr >> 8) & 0xf;
   9979                               unsigned rt = (instr >> 12) & 0xf;
   9980                               unsigned rn = (instr >> 16) & 0xf;
   9981                               int32_t offset = (instr & 0xff) << 2;
   9982                               // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm>}] ; T1 NOLINT(whitespace/line_length)
   9983                               strex(CurrentCond(),
   9984                                     Register(rd),
   9985                                     Register(rt),
   9986                                     MemOperand(Register(rn),
   9987                                                plus,
   9988                                                offset,
   9989                                                Offset));
   9990                               break;
   9991                             }
   9992                             case 0x00800000: {
   9993                               // 0xe8c00000
   9994                               switch (instr & 0x000000f0) {
   9995                                 case 0x00000040: {
   9996                                   // 0xe8c00040
   9997                                   unsigned rd = instr & 0xf;
   9998                                   unsigned rt = (instr >> 12) & 0xf;
   9999                                   unsigned rn = (instr >> 16) & 0xf;
  10000                                   // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
  10001                                   strexb(CurrentCond(),
  10002                                          Register(rd),
  10003                                          Register(rt),
  10004                                          MemOperand(Register(rn), Offset));
  10005                                   if (((instr & 0xfff00ff0) != 0xe8c00f40)) {
  10006                                     UnpredictableT32(instr);
  10007                                   }
  10008                                   break;
  10009                                 }
  10010                                 case 0x00000050: {
  10011                                   // 0xe8c00050
  10012                                   unsigned rd = instr & 0xf;
  10013                                   unsigned rt = (instr >> 12) & 0xf;
  10014                                   unsigned rn = (instr >> 16) & 0xf;
  10015                                   // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
  10016                                   strexh(CurrentCond(),
  10017                                          Register(rd),
  10018                                          Register(rt),
  10019                                          MemOperand(Register(rn), Offset));
  10020                                   if (((instr & 0xfff00ff0) != 0xe8c00f50)) {
  10021                                     UnpredictableT32(instr);
  10022                                   }
  10023                                   break;
  10024                                 }
  10025                                 case 0x00000070: {
  10026                                   // 0xe8c00070
  10027                                   unsigned rd = instr & 0xf;
  10028                                   unsigned rt = (instr >> 12) & 0xf;
  10029                                   unsigned rt2 = (instr >> 8) & 0xf;
  10030                                   unsigned rn = (instr >> 16) & 0xf;
  10031                                   // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
  10032                                   strexd(CurrentCond(),
  10033                                          Register(rd),
  10034                                          Register(rt),
  10035                                          Register(rt2),
  10036                                          MemOperand(Register(rn), Offset));
  10037                                   break;
  10038                                 }
  10039                                 case 0x00000080: {
  10040                                   // 0xe8c00080
  10041                                   unsigned rt = (instr >> 12) & 0xf;
  10042                                   unsigned rn = (instr >> 16) & 0xf;
  10043                                   // STLB{<c>}{<q>} <Rt>, [<Rn>] ; T1
  10044                                   stlb(CurrentCond(),
  10045                                        Register(rt),
  10046                                        MemOperand(Register(rn), Offset));
  10047                                   if (((instr & 0xfff00fff) != 0xe8c00f8f)) {
  10048                                     UnpredictableT32(instr);
  10049                                   }
  10050                                   break;
  10051                                 }
  10052                                 case 0x00000090: {
  10053                                   // 0xe8c00090
  10054                                   unsigned rt = (instr >> 12) & 0xf;
  10055                                   unsigned rn = (instr >> 16) & 0xf;
  10056                                   // STLH{<c>}{<q>} <Rt>, [<Rn>] ; T1
  10057                                   stlh(CurrentCond(),
  10058                                        Register(rt),
  10059                                        MemOperand(Register(rn), Offset));
  10060                                   if (((instr & 0xfff00fff) != 0xe8c00f9f)) {
  10061                                     UnpredictableT32(instr);
  10062                                   }
  10063                                   break;
  10064                                 }
  10065                                 case 0x000000a0: {
  10066                                   // 0xe8c000a0
  10067                                   unsigned rt = (instr >> 12) & 0xf;
  10068                                   unsigned rn = (instr >> 16) & 0xf;
  10069                                   // STL{<c>}{<q>} <Rt>, [<Rn>] ; T1
  10070                                   stl(CurrentCond(),
  10071                                       Register(rt),
  10072                                       MemOperand(Register(rn), Offset));
  10073                                   if (((instr & 0xfff00fff) != 0xe8c00faf)) {
  10074                                     UnpredictableT32(instr);
  10075                                   }
  10076                                   break;
  10077                                 }
  10078                                 case 0x000000c0: {
  10079                                   // 0xe8c000c0
  10080                                   unsigned rd = instr & 0xf;
  10081                                   unsigned rt = (instr >> 12) & 0xf;
  10082                                   unsigned rn = (instr >> 16) & 0xf;
  10083                                   // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
  10084                                   stlexb(CurrentCond(),
  10085                                          Register(rd),
  10086                                          Register(rt),
  10087                                          MemOperand(Register(rn), Offset));
  10088                                   if (((instr & 0xfff00ff0) != 0xe8c00fc0)) {
  10089                                     UnpredictableT32(instr);
  10090                                   }
  10091                                   break;
  10092                                 }
  10093                                 case 0x000000d0: {
  10094                                   // 0xe8c000d0
  10095                                   unsigned rd = instr & 0xf;
  10096                                   unsigned rt = (instr >> 12) & 0xf;
  10097                                   unsigned rn = (instr >> 16) & 0xf;
  10098                                   // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
  10099                                   stlexh(CurrentCond(),
  10100                                          Register(rd),
  10101                                          Register(rt),
  10102                                          MemOperand(Register(rn), Offset));
  10103                                   if (((instr & 0xfff00ff0) != 0xe8c00fd0)) {
  10104                                     UnpredictableT32(instr);
  10105                                   }
  10106                                   break;
  10107                                 }
  10108                                 case 0x000000e0: {
  10109                                   // 0xe8c000e0
  10110                                   unsigned rd = instr & 0xf;
  10111                                   unsigned rt = (instr >> 12) & 0xf;
  10112                                   unsigned rn = (instr >> 16) & 0xf;
  10113                                   // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
  10114                                   stlex(CurrentCond(),
  10115                                         Register(rd),
  10116                                         Register(rt),
  10117                                         MemOperand(Register(rn), Offset));
  10118                                   if (((instr & 0xfff00ff0) != 0xe8c00fe0)) {
  10119                                     UnpredictableT32(instr);
  10120                                   }
  10121                                   break;
  10122                                 }
  10123                                 case 0x000000f0: {
  10124                                   // 0xe8c000f0
  10125                                   unsigned rd = instr & 0xf;
  10126                                   unsigned rt = (instr >> 12) & 0xf;
  10127                                   unsigned rt2 = (instr >> 8) & 0xf;
  10128                                   unsigned rn = (instr >> 16) & 0xf;
  10129                                   // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
  10130                                   stlexd(CurrentCond(),
  10131                                          Register(rd),
  10132                                          Register(rt),
  10133                                          Register(rt2),
  10134                                          MemOperand(Register(rn), Offset));
  10135                                   break;
  10136                                 }
  10137                                 default:
  10138                                   UnallocatedT32(instr);
  10139                                   break;
  10140                               }
  10141                               break;
  10142                             }
  10143                           }
  10144                           break;
  10145                         }
  10146                         case 0x00200000: {
  10147                           // 0xe8600000
  10148                           if (((instr & 0xf0000) == 0xf0000)) {
  10149                             UnallocatedT32(instr);
  10150                             return;
  10151                           }
  10152                           unsigned rt = (instr >> 12) & 0xf;
  10153                           unsigned rt2 = (instr >> 8) & 0xf;
  10154                           unsigned rn = (instr >> 16) & 0xf;
  10155                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  10156                                                                  : plus);
  10157                           int32_t offset = (instr & 0xff) << 2;
  10158                           // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length)
  10159                           strd(CurrentCond(),
  10160                                Register(rt),
  10161                                Register(rt2),
  10162                                MemOperand(Register(rn),
  10163                                           sign,
  10164                                           offset,
  10165                                           PostIndex));
  10166                           break;
  10167                         }
  10168                       }
  10169                       break;
  10170                     }
  10171                     case 0x01000000: {
  10172                       // 0xe9000000
  10173                       switch (instr & 0x00800000) {
  10174                         case 0x00000000: {
  10175                           // 0xe9000000
  10176                           if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
  10177                                Uint32(0x1)) &&
  10178                               ((Uint32((instr >> 16)) & Uint32(0xf)) ==
  10179                                Uint32(0xd)) &&
  10180                               (BitCount(((Uint32((instr >> 14)) & Uint32(0x1))
  10181                                          << 13) |
  10182                                         (Uint32(instr) & Uint32(0x1fff))) >
  10183                                Int64(1))) {
  10184                             RegisterList registers(
  10185                                 (((instr >> 14) & 0x1) << kLRRegNum) |
  10186                                 (instr & 0x1fff));
  10187                             if (registers.IsR0toR7orLR()) {
  10188                               // PUSH{<c>}.W <registers> ; T1
  10189                               push(CurrentCond(), Wide, registers);
  10190                               if (((instr & 0xffffa000) != 0xe92d0000)) {
  10191                                 UnpredictableT32(instr);
  10192                               }
  10193                             } else {
  10194                               // PUSH{<c>}{<q>} <registers> ; T1
  10195                               push(CurrentCond(), Best, registers);
  10196                               if (((instr & 0xffffa000) != 0xe92d0000)) {
  10197                                 UnpredictableT32(instr);
  10198                               }
  10199                             }
  10200                             return;
  10201                           }
  10202                           unsigned rn = (instr >> 16) & 0xf;
  10203                           WriteBack write_back((instr >> 21) & 0x1);
  10204                           RegisterList registers(
  10205                               (((instr >> 14) & 0x1) << kLRRegNum) |
  10206                               (instr & 0x1fff));
  10207                           // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1
  10208                           stmdb(CurrentCond(),
  10209                                 Best,
  10210                                 Register(rn),
  10211                                 write_back,
  10212                                 registers);
  10213                           if (((instr & 0xffd0a000) != 0xe9000000)) {
  10214                             UnpredictableT32(instr);
  10215                           }
  10216                           break;
  10217                         }
  10218                         case 0x00800000: {
  10219                           // 0xe9800000
  10220                           UnimplementedT32_32("SRS{IA}", instr);
  10221                           break;
  10222                         }
  10223                       }
  10224                       break;
  10225                     }
  10226                     case 0x01400000: {
  10227                       // 0xe9400000
  10228                       switch (instr & 0x00200000) {
  10229                         case 0x00000000: {
  10230                           // 0xe9400000
  10231                           if (((instr & 0xf0000) == 0xf0000)) {
  10232                             UnallocatedT32(instr);
  10233                             return;
  10234                           }
  10235                           unsigned rt = (instr >> 12) & 0xf;
  10236                           unsigned rt2 = (instr >> 8) & 0xf;
  10237                           unsigned rn = (instr >> 16) & 0xf;
  10238                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  10239                                                                  : plus);
  10240                           int32_t offset = (instr & 0xff) << 2;
  10241                           // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
  10242                           strd(CurrentCond(),
  10243                                Register(rt),
  10244                                Register(rt2),
  10245                                MemOperand(Register(rn), sign, offset, Offset));
  10246                           break;
  10247                         }
  10248                         case 0x00200000: {
  10249                           // 0xe9600000
  10250                           if (((instr & 0xf0000) == 0xf0000)) {
  10251                             UnallocatedT32(instr);
  10252                             return;
  10253                           }
  10254                           unsigned rt = (instr >> 12) & 0xf;
  10255                           unsigned rt2 = (instr >> 8) & 0xf;
  10256                           unsigned rn = (instr >> 16) & 0xf;
  10257                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  10258                                                                  : plus);
  10259                           int32_t offset = (instr & 0xff) << 2;
  10260                           // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length)
  10261                           strd(CurrentCond(),
  10262                                Register(rt),
  10263                                Register(rt2),
  10264                                MemOperand(Register(rn),
  10265                                           sign,
  10266                                           offset,
  10267                                           PreIndex));
  10268                           break;
  10269                         }
  10270                       }
  10271                       break;
  10272                     }
  10273                   }
  10274                   break;
  10275                 }
  10276                 case 0x00100000: {
  10277                   // 0xe8100000
  10278                   switch (instr & 0x00400000) {
  10279                     case 0x00000000: {
  10280                       // 0xe8100000
  10281                       switch (instr & 0x01800000) {
  10282                         case 0x00000000: {
  10283                           // 0xe8100000
  10284                           UnimplementedT32_32("RFEDB", instr);
  10285                           break;
  10286                         }
  10287                         case 0x00800000: {
  10288                           // 0xe8900000
  10289                           if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
  10290                                Uint32(0x1)) &&
  10291                               ((Uint32((instr >> 16)) & Uint32(0xf)) ==
  10292                                Uint32(0xd)) &&
  10293                               (BitCount(((Uint32((instr >> 15)) & Uint32(0x1))
  10294                                          << 14) |
  10295                                         ((Uint32((instr >> 14)) & Uint32(0x1))
  10296                                          << 13) |
  10297                                         (Uint32(instr) & Uint32(0x1fff))) >
  10298                                Int64(1))) {
  10299                             RegisterList registers(
  10300                                 (((instr >> 15) & 0x1) << kPCRegNum) |
  10301                                 (((instr >> 14) & 0x1) << kLRRegNum) |
  10302                                 (instr & 0x1fff));
  10303                             if (registers.IsR0toR7orPC()) {
  10304                               // POP{<c>}.W <registers> ; T2
  10305                               pop(CurrentCond(), Wide, registers);
  10306                               if (((instr & 0xffff2000) != 0xe8bd0000)) {
  10307                                 UnpredictableT32(instr);
  10308                               }
  10309                             } else {
  10310                               // POP{<c>}{<q>} <registers> ; T2
  10311                               pop(CurrentCond(), Best, registers);
  10312                               if (((instr & 0xffff2000) != 0xe8bd0000)) {
  10313                                 UnpredictableT32(instr);
  10314                               }
  10315                             }
  10316                             return;
  10317                           }
  10318                           unsigned rn = (instr >> 16) & 0xf;
  10319                           WriteBack write_back((instr >> 21) & 0x1);
  10320                           RegisterList registers(
  10321                               (((instr >> 15) & 0x1) << kPCRegNum) |
  10322                               (((instr >> 14) & 0x1) << kLRRegNum) |
  10323                               (instr & 0x1fff));
  10324                           if ((rn < kNumberOfT32LowRegisters) &&
  10325                               (((registers.GetList() & (1 << rn)) == 0) ==
  10326                                write_back.DoesWriteBack()) &&
  10327                               ((registers.GetList() & ~0xff) == 0)) {
  10328                             // LDM{<c>}.W <Rn>{!}, <registers> ; T2
  10329                             ldm(CurrentCond(),
  10330                                 Wide,
  10331                                 Register(rn),
  10332                                 write_back,
  10333                                 registers);
  10334                             if (((instr & 0xffd02000) != 0xe8900000)) {
  10335                               UnpredictableT32(instr);
  10336                             }
  10337                           } else {
  10338                             // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T2
  10339                             ldm(CurrentCond(),
  10340                                 Best,
  10341                                 Register(rn),
  10342                                 write_back,
  10343                                 registers);
  10344                             if (((instr & 0xffd02000) != 0xe8900000)) {
  10345                               UnpredictableT32(instr);
  10346                             }
  10347                           }
  10348                           break;
  10349                         }
  10350                         case 0x01000000: {
  10351                           // 0xe9100000
  10352                           unsigned rn = (instr >> 16) & 0xf;
  10353                           WriteBack write_back((instr >> 21) & 0x1);
  10354                           RegisterList registers(
  10355                               (((instr >> 15) & 0x1) << kPCRegNum) |
  10356                               (((instr >> 14) & 0x1) << kLRRegNum) |
  10357                               (instr & 0x1fff));
  10358                           // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1
  10359                           ldmdb(CurrentCond(),
  10360                                 Register(rn),
  10361                                 write_back,
  10362                                 registers);
  10363                           if (((instr & 0xffd02000) != 0xe9100000)) {
  10364                             UnpredictableT32(instr);
  10365                           }
  10366                           break;
  10367                         }
  10368                         case 0x01800000: {
  10369                           // 0xe9900000
  10370                           UnimplementedT32_32("RFE{IA}", instr);
  10371                           break;
  10372                         }
  10373                       }
  10374                       break;
  10375                     }
  10376                     case 0x00400000: {
  10377                       // 0xe8500000
  10378                       switch (instr & 0x01200000) {
  10379                         case 0x00000000: {
  10380                           // 0xe8500000
  10381                           switch (instr & 0x00800000) {
  10382                             case 0x00000000: {
  10383                               // 0xe8500000
  10384                               unsigned rt = (instr >> 12) & 0xf;
  10385                               unsigned rn = (instr >> 16) & 0xf;
  10386                               int32_t offset = (instr & 0xff) << 2;
  10387                               // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm>}] ; T1
  10388                               ldrex(CurrentCond(),
  10389                                     Register(rt),
  10390                                     MemOperand(Register(rn),
  10391                                                plus,
  10392                                                offset,
  10393                                                Offset));
  10394                               if (((instr & 0xfff00f00) != 0xe8500f00)) {
  10395                                 UnpredictableT32(instr);
  10396                               }
  10397                               break;
  10398                             }
  10399                             case 0x00800000: {
  10400                               // 0xe8d00000
  10401                               switch (instr & 0x000000f0) {
  10402                                 case 0x00000000: {
  10403                                   // 0xe8d00000
  10404                                   unsigned rn = (instr >> 16) & 0xf;
  10405                                   unsigned rm = instr & 0xf;
  10406                                   // TBB{<c>}{<q>} [<Rn>, <Rm>] ; T1
  10407                                   tbb(CurrentCond(),
  10408                                       Register(rn),
  10409                                       Register(rm));
  10410                                   if (((instr & 0xfff0fff0) != 0xe8d0f000) ||
  10411                                       !OutsideITBlockOrLast()) {
  10412                                     UnpredictableT32(instr);
  10413                                   }
  10414                                   break;
  10415                                 }
  10416                                 case 0x00000010: {
  10417                                   // 0xe8d00010
  10418                                   unsigned rn = (instr >> 16) & 0xf;
  10419                                   unsigned rm = instr & 0xf;
  10420                                   // TBH{<c>}{<q>} [<Rn>, <Rm>, LSL #1] ; T1
  10421                                   tbh(CurrentCond(),
  10422                                       Register(rn),
  10423                                       Register(rm));
  10424                                   if (((instr & 0xfff0fff0) != 0xe8d0f010) ||
  10425                                       !OutsideITBlockOrLast()) {
  10426                                     UnpredictableT32(instr);
  10427                                   }
  10428                                   break;
  10429                                 }
  10430                                 case 0x00000040: {
  10431                                   // 0xe8d00040
  10432                                   unsigned rt = (instr >> 12) & 0xf;
  10433                                   unsigned rn = (instr >> 16) & 0xf;
  10434                                   // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; T1
  10435                                   ldrexb(CurrentCond(),
  10436                                          Register(rt),
  10437                                          MemOperand(Register(rn), Offset));
  10438                                   if (((instr & 0xfff00fff) != 0xe8d00f4f)) {
  10439                                     UnpredictableT32(instr);
  10440                                   }
  10441                                   break;
  10442                                 }
  10443                                 case 0x00000050: {
  10444                                   // 0xe8d00050
  10445                                   unsigned rt = (instr >> 12) & 0xf;
  10446                                   unsigned rn = (instr >> 16) & 0xf;
  10447                                   // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; T1
  10448                                   ldrexh(CurrentCond(),
  10449                                          Register(rt),
  10450                                          MemOperand(Register(rn), Offset));
  10451                                   if (((instr & 0xfff00fff) != 0xe8d00f5f)) {
  10452                                     UnpredictableT32(instr);
  10453                                   }
  10454                                   break;
  10455                                 }
  10456                                 case 0x00000070: {
  10457                                   // 0xe8d00070
  10458                                   unsigned rt = (instr >> 12) & 0xf;
  10459                                   unsigned rt2 = (instr >> 8) & 0xf;
  10460                                   unsigned rn = (instr >> 16) & 0xf;
  10461                                   // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1
  10462                                   ldrexd(CurrentCond(),
  10463                                          Register(rt),
  10464                                          Register(rt2),
  10465                                          MemOperand(Register(rn), Offset));
  10466                                   if (((instr & 0xfff000ff) != 0xe8d0007f)) {
  10467                                     UnpredictableT32(instr);
  10468                                   }
  10469                                   break;
  10470                                 }
  10471                                 case 0x00000080: {
  10472                                   // 0xe8d00080
  10473                                   unsigned rt = (instr >> 12) & 0xf;
  10474                                   unsigned rn = (instr >> 16) & 0xf;
  10475                                   // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; T1
  10476                                   ldab(CurrentCond(),
  10477                                        Register(rt),
  10478                                        MemOperand(Register(rn), Offset));
  10479                                   if (((instr & 0xfff00fff) != 0xe8d00f8f)) {
  10480                                     UnpredictableT32(instr);
  10481                                   }
  10482                                   break;
  10483                                 }
  10484                                 case 0x00000090: {
  10485                                   // 0xe8d00090
  10486                                   unsigned rt = (instr >> 12) & 0xf;
  10487                                   unsigned rn = (instr >> 16) & 0xf;
  10488                                   // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; T1
  10489                                   ldah(CurrentCond(),
  10490                                        Register(rt),
  10491                                        MemOperand(Register(rn), Offset));
  10492                                   if (((instr & 0xfff00fff) != 0xe8d00f9f)) {
  10493                                     UnpredictableT32(instr);
  10494                                   }
  10495                                   break;
  10496                                 }
  10497                                 case 0x000000a0: {
  10498                                   // 0xe8d000a0
  10499                                   unsigned rt = (instr >> 12) & 0xf;
  10500                                   unsigned rn = (instr >> 16) & 0xf;
  10501                                   // LDA{<c>}{<q>} <Rt>, [<Rn>] ; T1
  10502                                   lda(CurrentCond(),
  10503                                       Register(rt),
  10504                                       MemOperand(Register(rn), Offset));
  10505                                   if (((instr & 0xfff00fff) != 0xe8d00faf)) {
  10506                                     UnpredictableT32(instr);
  10507                                   }
  10508                                   break;
  10509                                 }
  10510                                 case 0x000000c0: {
  10511                                   // 0xe8d000c0
  10512                                   unsigned rt = (instr >> 12) & 0xf;
  10513                                   unsigned rn = (instr >> 16) & 0xf;
  10514                                   // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; T1
  10515                                   ldaexb(CurrentCond(),
  10516                                          Register(rt),
  10517                                          MemOperand(Register(rn), Offset));
  10518                                   if (((instr & 0xfff00fff) != 0xe8d00fcf)) {
  10519                                     UnpredictableT32(instr);
  10520                                   }
  10521                                   break;
  10522                                 }
  10523                                 case 0x000000d0: {
  10524                                   // 0xe8d000d0
  10525                                   unsigned rt = (instr >> 12) & 0xf;
  10526                                   unsigned rn = (instr >> 16) & 0xf;
  10527                                   // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; T1
  10528                                   ldaexh(CurrentCond(),
  10529                                          Register(rt),
  10530                                          MemOperand(Register(rn), Offset));
  10531                                   if (((instr & 0xfff00fff) != 0xe8d00fdf)) {
  10532                                     UnpredictableT32(instr);
  10533                                   }
  10534                                   break;
  10535                                 }
  10536                                 case 0x000000e0: {
  10537                                   // 0xe8d000e0
  10538                                   unsigned rt = (instr >> 12) & 0xf;
  10539                                   unsigned rn = (instr >> 16) & 0xf;
  10540                                   // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; T1
  10541                                   ldaex(CurrentCond(),
  10542                                         Register(rt),
  10543                                         MemOperand(Register(rn), Offset));
  10544                                   if (((instr & 0xfff00fff) != 0xe8d00fef)) {
  10545                                     UnpredictableT32(instr);
  10546                                   }
  10547                                   break;
  10548                                 }
  10549                                 case 0x000000f0: {
  10550                                   // 0xe8d000f0
  10551                                   unsigned rt = (instr >> 12) & 0xf;
  10552                                   unsigned rt2 = (instr >> 8) & 0xf;
  10553                                   unsigned rn = (instr >> 16) & 0xf;
  10554                                   // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1
  10555                                   ldaexd(CurrentCond(),
  10556                                          Register(rt),
  10557                                          Register(rt2),
  10558                                          MemOperand(Register(rn), Offset));
  10559                                   if (((instr & 0xfff000ff) != 0xe8d000ff)) {
  10560                                     UnpredictableT32(instr);
  10561                                   }
  10562                                   break;
  10563                                 }
  10564                                 default:
  10565                                   UnallocatedT32(instr);
  10566                                   break;
  10567                               }
  10568                               break;
  10569                             }
  10570                           }
  10571                           break;
  10572                         }
  10573                         case 0x00200000: {
  10574                           // 0xe8700000
  10575                           switch (instr & 0x000f0000) {
  10576                             case 0x000f0000: {
  10577                               // 0xe87f0000
  10578                               if (((instr & 0x1200000) == 0x0)) {
  10579                                 UnallocatedT32(instr);
  10580                                 return;
  10581                               }
  10582                               unsigned rt = (instr >> 12) & 0xf;
  10583                               unsigned rt2 = (instr >> 8) & 0xf;
  10584                               uint32_t U = (instr >> 23) & 0x1;
  10585                               int32_t imm = instr & 0xff;
  10586                               imm <<= 2;
  10587                               if (U == 0) imm = -imm;
  10588                               bool minus_zero = (imm == 0) && (U == 0);
  10589                               Location location(imm, kT32PcDelta);
  10590                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
  10591                               if (minus_zero) {
  10592                                 ldrd(CurrentCond(),
  10593                                      Register(rt),
  10594                                      Register(rt2),
  10595                                      MemOperand(pc, minus, 0));
  10596                               } else {
  10597                                 ldrd(CurrentCond(),
  10598                                      Register(rt),
  10599                                      Register(rt2),
  10600                                      &location);
  10601                               }
  10602                               if (((instr & 0xff7f0000) != 0xe95f0000)) {
  10603                                 UnpredictableT32(instr);
  10604                               }
  10605                               break;
  10606                             }
  10607                             default: {
  10608                               if (((instr & 0xf0000) == 0xf0000)) {
  10609                                 UnallocatedT32(instr);
  10610                                 return;
  10611                               }
  10612                               unsigned rt = (instr >> 12) & 0xf;
  10613                               unsigned rt2 = (instr >> 8) & 0xf;
  10614                               unsigned rn = (instr >> 16) & 0xf;
  10615                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  10616                                                                      : plus);
  10617                               int32_t offset = (instr & 0xff) << 2;
  10618                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length)
  10619                               ldrd(CurrentCond(),
  10620                                    Register(rt),
  10621                                    Register(rt2),
  10622                                    MemOperand(Register(rn),
  10623                                               sign,
  10624                                               offset,
  10625                                               PostIndex));
  10626                               break;
  10627                             }
  10628                           }
  10629                           break;
  10630                         }
  10631                         case 0x01000000: {
  10632                           // 0xe9500000
  10633                           switch (instr & 0x000f0000) {
  10634                             case 0x000f0000: {
  10635                               // 0xe95f0000
  10636                               if (((instr & 0x1200000) == 0x0)) {
  10637                                 UnallocatedT32(instr);
  10638                                 return;
  10639                               }
  10640                               unsigned rt = (instr >> 12) & 0xf;
  10641                               unsigned rt2 = (instr >> 8) & 0xf;
  10642                               uint32_t U = (instr >> 23) & 0x1;
  10643                               int32_t imm = instr & 0xff;
  10644                               imm <<= 2;
  10645                               if (U == 0) imm = -imm;
  10646                               bool minus_zero = (imm == 0) && (U == 0);
  10647                               Location location(imm, kT32PcDelta);
  10648                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
  10649                               if (minus_zero) {
  10650                                 ldrd(CurrentCond(),
  10651                                      Register(rt),
  10652                                      Register(rt2),
  10653                                      MemOperand(pc, minus, 0));
  10654                               } else {
  10655                                 ldrd(CurrentCond(),
  10656                                      Register(rt),
  10657                                      Register(rt2),
  10658                                      &location);
  10659                               }
  10660                               if (((instr & 0xff7f0000) != 0xe95f0000)) {
  10661                                 UnpredictableT32(instr);
  10662                               }
  10663                               break;
  10664                             }
  10665                             default: {
  10666                               if (((instr & 0xf0000) == 0xf0000)) {
  10667                                 UnallocatedT32(instr);
  10668                                 return;
  10669                               }
  10670                               unsigned rt = (instr >> 12) & 0xf;
  10671                               unsigned rt2 = (instr >> 8) & 0xf;
  10672                               unsigned rn = (instr >> 16) & 0xf;
  10673                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  10674                                                                      : plus);
  10675                               int32_t offset = (instr & 0xff) << 2;
  10676                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
  10677                               ldrd(CurrentCond(),
  10678                                    Register(rt),
  10679                                    Register(rt2),
  10680                                    MemOperand(Register(rn),
  10681                                               sign,
  10682                                               offset,
  10683                                               Offset));
  10684                               break;
  10685                             }
  10686                           }
  10687                           break;
  10688                         }
  10689                         case 0x01200000: {
  10690                           // 0xe9700000
  10691                           switch (instr & 0x000f0000) {
  10692                             case 0x000f0000: {
  10693                               // 0xe97f0000
  10694                               if (((instr & 0x1200000) == 0x0)) {
  10695                                 UnallocatedT32(instr);
  10696                                 return;
  10697                               }
  10698                               unsigned rt = (instr >> 12) & 0xf;
  10699                               unsigned rt2 = (instr >> 8) & 0xf;
  10700                               uint32_t U = (instr >> 23) & 0x1;
  10701                               int32_t imm = instr & 0xff;
  10702                               imm <<= 2;
  10703                               if (U == 0) imm = -imm;
  10704                               bool minus_zero = (imm == 0) && (U == 0);
  10705                               Location location(imm, kT32PcDelta);
  10706                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
  10707                               if (minus_zero) {
  10708                                 ldrd(CurrentCond(),
  10709                                      Register(rt),
  10710                                      Register(rt2),
  10711                                      MemOperand(pc, minus, 0));
  10712                               } else {
  10713                                 ldrd(CurrentCond(),
  10714                                      Register(rt),
  10715                                      Register(rt2),
  10716                                      &location);
  10717                               }
  10718                               if (((instr & 0xff7f0000) != 0xe95f0000)) {
  10719                                 UnpredictableT32(instr);
  10720                               }
  10721                               break;
  10722                             }
  10723                             default: {
  10724                               if (((instr & 0xf0000) == 0xf0000)) {
  10725                                 UnallocatedT32(instr);
  10726                                 return;
  10727                               }
  10728                               unsigned rt = (instr >> 12) & 0xf;
  10729                               unsigned rt2 = (instr >> 8) & 0xf;
  10730                               unsigned rn = (instr >> 16) & 0xf;
  10731                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  10732                                                                      : plus);
  10733                               int32_t offset = (instr & 0xff) << 2;
  10734                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length)
  10735                               ldrd(CurrentCond(),
  10736                                    Register(rt),
  10737                                    Register(rt2),
  10738                                    MemOperand(Register(rn),
  10739                                               sign,
  10740                                               offset,
  10741                                               PreIndex));
  10742                               break;
  10743                             }
  10744                           }
  10745                           break;
  10746                         }
  10747                       }
  10748                       break;
  10749                     }
  10750                   }
  10751                   break;
  10752                 }
  10753                 case 0x10000000: {
  10754                   // 0xf8000000
  10755                   switch (instr & 0x01a00000) {
  10756                     case 0x00000000: {
  10757                       // 0xf8000000
  10758                       switch (instr & 0x00400d00) {
  10759                         case 0x00000000: {
  10760                           // 0xf8000000
  10761                           if ((instr & 0x000002c0) == 0x00000000) {
  10762                             if (((instr & 0xf0000) == 0xf0000)) {
  10763                               UnallocatedT32(instr);
  10764                               return;
  10765                             }
  10766                             unsigned rt = (instr >> 12) & 0xf;
  10767                             unsigned rn = (instr >> 16) & 0xf;
  10768                             Sign sign(plus);
  10769                             unsigned rm = instr & 0xf;
  10770                             Shift shift = LSL;
  10771                             uint32_t amount = (instr >> 4) & 0x3;
  10772                             AddrMode addrmode = Offset;
  10773                             if ((rt < kNumberOfT32LowRegisters) &&
  10774                                 (rn < kNumberOfT32LowRegisters) &&
  10775                                 (rm < kNumberOfT32LowRegisters) &&
  10776                                 shift.IsLSL() && (amount == 0) &&
  10777                                 sign.IsPlus()) {
  10778                               // STRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
  10779                               strb(CurrentCond(),
  10780                                    Wide,
  10781                                    Register(rt),
  10782                                    MemOperand(Register(rn),
  10783                                               sign,
  10784                                               Register(rm),
  10785                                               addrmode));
  10786                             } else {
  10787                               // STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
  10788                               strb(CurrentCond(),
  10789                                    Best,
  10790                                    Register(rt),
  10791                                    MemOperand(Register(rn),
  10792                                               sign,
  10793                                               Register(rm),
  10794                                               shift,
  10795                                               amount,
  10796                                               addrmode));
  10797                             }
  10798                           } else {
  10799                             UnallocatedT32(instr);
  10800                           }
  10801                           break;
  10802                         }
  10803                         case 0x00000900: {
  10804                           // 0xf8000900
  10805                           if (((instr & 0xf0000) == 0xf0000)) {
  10806                             UnallocatedT32(instr);
  10807                             return;
  10808                           }
  10809                           unsigned rt = (instr >> 12) & 0xf;
  10810                           unsigned rn = (instr >> 16) & 0xf;
  10811                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
  10812                           int32_t offset = instr & 0xff;
  10813                           // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3
  10814                           strb(CurrentCond(),
  10815                                Best,
  10816                                Register(rt),
  10817                                MemOperand(Register(rn),
  10818                                           sign,
  10819                                           offset,
  10820                                           PostIndex));
  10821                           break;
  10822                         }
  10823                         case 0x00000c00: {
  10824                           // 0xf8000c00
  10825                           switch (instr & 0x00000200) {
  10826                             case 0x00000000: {
  10827                               // 0xf8000c00
  10828                               if (((instr & 0xf0000) == 0xf0000)) {
  10829                                 UnallocatedT32(instr);
  10830                                 return;
  10831                               }
  10832                               unsigned rt = (instr >> 12) & 0xf;
  10833                               unsigned rn = (instr >> 16) & 0xf;
  10834                               int32_t offset = instr & 0xff;
  10835                               // STRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3
  10836                               strb(CurrentCond(),
  10837                                    Best,
  10838                                    Register(rt),
  10839                                    MemOperand(Register(rn),
  10840                                               minus,
  10841                                               offset,
  10842                                               Offset));
  10843                               break;
  10844                             }
  10845                             case 0x00000200: {
  10846                               // 0xf8000e00
  10847                               if (((instr & 0xf0000) == 0xf0000)) {
  10848                                 UnallocatedT32(instr);
  10849                                 return;
  10850                               }
  10851                               UnimplementedT32_32("STRBT", instr);
  10852                               break;
  10853                             }
  10854                           }
  10855                           break;
  10856                         }
  10857                         case 0x00000d00: {
  10858                           // 0xf8000d00
  10859                           if (((instr & 0xf0000) == 0xf0000)) {
  10860                             UnallocatedT32(instr);
  10861                             return;
  10862                           }
  10863                           unsigned rt = (instr >> 12) & 0xf;
  10864                           unsigned rn = (instr >> 16) & 0xf;
  10865                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
  10866                           int32_t offset = instr & 0xff;
  10867                           // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3
  10868                           strb(CurrentCond(),
  10869                                Best,
  10870                                Register(rt),
  10871                                MemOperand(Register(rn),
  10872                                           sign,
  10873                                           offset,
  10874                                           PreIndex));
  10875                           break;
  10876                         }
  10877                         case 0x00400000: {
  10878                           // 0xf8400000
  10879                           if ((instr & 0x000002c0) == 0x00000000) {
  10880                             if (((instr & 0xf0000) == 0xf0000)) {
  10881                               UnallocatedT32(instr);
  10882                               return;
  10883                             }
  10884                             unsigned rt = (instr >> 12) & 0xf;
  10885                             unsigned rn = (instr >> 16) & 0xf;
  10886                             Sign sign(plus);
  10887                             unsigned rm = instr & 0xf;
  10888                             Shift shift = LSL;
  10889                             uint32_t amount = (instr >> 4) & 0x3;
  10890                             AddrMode addrmode = Offset;
  10891                             if ((rt < kNumberOfT32LowRegisters) &&
  10892                                 (rn < kNumberOfT32LowRegisters) &&
  10893                                 (rm < kNumberOfT32LowRegisters) &&
  10894                                 shift.IsLSL() && (amount == 0) &&
  10895                                 sign.IsPlus()) {
  10896                               // STR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
  10897                               str(CurrentCond(),
  10898                                   Wide,
  10899                                   Register(rt),
  10900                                   MemOperand(Register(rn),
  10901                                              sign,
  10902                                              Register(rm),
  10903                                              addrmode));
  10904                             } else {
  10905                               // STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
  10906                               str(CurrentCond(),
  10907                                   Best,
  10908                                   Register(rt),
  10909                                   MemOperand(Register(rn),
  10910                                              sign,
  10911                                              Register(rm),
  10912                                              shift,
  10913                                              amount,
  10914                                              addrmode));
  10915                             }
  10916                           } else {
  10917                             UnallocatedT32(instr);
  10918                           }
  10919                           break;
  10920                         }
  10921                         case 0x00400900: {
  10922                           // 0xf8400900
  10923                           if (((instr & 0xf0000) == 0xf0000)) {
  10924                             UnallocatedT32(instr);
  10925                             return;
  10926                           }
  10927                           unsigned rt = (instr >> 12) & 0xf;
  10928                           unsigned rn = (instr >> 16) & 0xf;
  10929                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
  10930                           int32_t offset = instr & 0xff;
  10931                           // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4
  10932                           str(CurrentCond(),
  10933                               Best,
  10934                               Register(rt),
  10935                               MemOperand(Register(rn),
  10936                                          sign,
  10937                                          offset,
  10938                                          PostIndex));
  10939                           break;
  10940                         }
  10941                         case 0x00400c00: {
  10942                           // 0xf8400c00
  10943                           switch (instr & 0x00000200) {
  10944                             case 0x00000000: {
  10945                               // 0xf8400c00
  10946                               if (((instr & 0xf0000) == 0xf0000)) {
  10947                                 UnallocatedT32(instr);
  10948                                 return;
  10949                               }
  10950                               unsigned rt = (instr >> 12) & 0xf;
  10951                               unsigned rn = (instr >> 16) & 0xf;
  10952                               int32_t offset = instr & 0xff;
  10953                               // STR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4
  10954                               str(CurrentCond(),
  10955                                   Best,
  10956                                   Register(rt),
  10957                                   MemOperand(Register(rn),
  10958                                              minus,
  10959                                              offset,
  10960                                              Offset));
  10961                               break;
  10962                             }
  10963                             case 0x00000200: {
  10964                               // 0xf8400e00
  10965                               if (((instr & 0xf0000) == 0xf0000)) {
  10966                                 UnallocatedT32(instr);
  10967                                 return;
  10968                               }
  10969                               UnimplementedT32_32("STRT", instr);
  10970                               break;
  10971                             }
  10972                           }
  10973                           break;
  10974                         }
  10975                         case 0x00400d00: {
  10976                           // 0xf8400d00
  10977                           if (((instr & 0xf0000) == 0xf0000)) {
  10978                             UnallocatedT32(instr);
  10979                             return;
  10980                           }
  10981                           if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
  10982                                Uint32(0xd)) &&
  10983                               ((Uint32((instr >> 9)) & Uint32(0x1)) ==
  10984                                Uint32(0x0)) &&
  10985                               ((Uint32(instr) & Uint32(0xff)) == Uint32(0x4))) {
  10986                             unsigned rt = (instr >> 12) & 0xf;
  10987                             if ((rt <= 7) || (rt == kLRRegNum)) {
  10988                               // PUSH{<c>}.W <single_register_list> ; T4
  10989                               push(CurrentCond(), Wide, Register(rt));
  10990                             } else {
  10991                               // PUSH{<c>}{<q>} <single_register_list> ; T4
  10992                               push(CurrentCond(), Best, Register(rt));
  10993                             }
  10994                             return;
  10995                           }
  10996                           unsigned rt = (instr >> 12) & 0xf;
  10997                           unsigned rn = (instr >> 16) & 0xf;
  10998                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
  10999                           int32_t offset = instr & 0xff;
  11000                           // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4
  11001                           str(CurrentCond(),
  11002                               Best,
  11003                               Register(rt),
  11004                               MemOperand(Register(rn), sign, offset, PreIndex));
  11005                           break;
  11006                         }
  11007                         default:
  11008                           UnallocatedT32(instr);
  11009                           break;
  11010                       }
  11011                       break;
  11012                     }
  11013                     case 0x00200000: {
  11014                       // 0xf8200000
  11015                       switch (instr & 0x00400d00) {
  11016                         case 0x00000000: {
  11017                           // 0xf8200000
  11018                           if ((instr & 0x000002c0) == 0x00000000) {
  11019                             if (((instr & 0xf0000) == 0xf0000)) {
  11020                               UnallocatedT32(instr);
  11021                               return;
  11022                             }
  11023                             unsigned rt = (instr >> 12) & 0xf;
  11024                             unsigned rn = (instr >> 16) & 0xf;
  11025                             Sign sign(plus);
  11026                             unsigned rm = instr & 0xf;
  11027                             Shift shift = LSL;
  11028                             uint32_t amount = (instr >> 4) & 0x3;
  11029                             AddrMode addrmode = Offset;
  11030                             if ((rt < kNumberOfT32LowRegisters) &&
  11031                                 (rn < kNumberOfT32LowRegisters) &&
  11032                                 (rm < kNumberOfT32LowRegisters) &&
  11033                                 shift.IsLSL() && (amount == 0) &&
  11034                                 sign.IsPlus()) {
  11035                               // STRH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
  11036                               strh(CurrentCond(),
  11037                                    Wide,
  11038                                    Register(rt),
  11039                                    MemOperand(Register(rn),
  11040                                               sign,
  11041                                               Register(rm),
  11042                                               addrmode));
  11043                             } else {
  11044                               // STRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
  11045                               strh(CurrentCond(),
  11046                                    Best,
  11047                                    Register(rt),
  11048                                    MemOperand(Register(rn),
  11049                                               sign,
  11050                                               Register(rm),
  11051                                               shift,
  11052                                               amount,
  11053                                               addrmode));
  11054                             }
  11055                           } else {
  11056                             UnallocatedT32(instr);
  11057                           }
  11058                           break;
  11059                         }
  11060                         case 0x00000900: {
  11061                           // 0xf8200900
  11062                           if (((instr & 0xf0000) == 0xf0000)) {
  11063                             UnallocatedT32(instr);
  11064                             return;
  11065                           }
  11066                           unsigned rt = (instr >> 12) & 0xf;
  11067                           unsigned rn = (instr >> 16) & 0xf;
  11068                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
  11069                           int32_t offset = instr & 0xff;
  11070                           // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3
  11071                           strh(CurrentCond(),
  11072                                Best,
  11073                                Register(rt),
  11074                                MemOperand(Register(rn),
  11075                                           sign,
  11076                                           offset,
  11077                                           PostIndex));
  11078                           break;
  11079                         }
  11080                         case 0x00000c00: {
  11081                           // 0xf8200c00
  11082                           switch (instr & 0x00000200) {
  11083                             case 0x00000000: {
  11084                               // 0xf8200c00
  11085                               if (((instr & 0xf0000) == 0xf0000)) {
  11086                                 UnallocatedT32(instr);
  11087                                 return;
  11088                               }
  11089                               unsigned rt = (instr >> 12) & 0xf;
  11090                               unsigned rn = (instr >> 16) & 0xf;
  11091                               int32_t offset = instr & 0xff;
  11092                               // STRH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3
  11093                               strh(CurrentCond(),
  11094                                    Best,
  11095                                    Register(rt),
  11096                                    MemOperand(Register(rn),
  11097                                               minus,
  11098                                               offset,
  11099                                               Offset));
  11100                               break;
  11101                             }
  11102                             case 0x00000200: {
  11103                               // 0xf8200e00
  11104                               if (((instr & 0xf0000) == 0xf0000)) {
  11105                                 UnallocatedT32(instr);
  11106                                 return;
  11107                               }
  11108                               UnimplementedT32_32("STRHT", instr);
  11109                               break;
  11110                             }
  11111                           }
  11112                           break;
  11113                         }
  11114                         case 0x00000d00: {
  11115                           // 0xf8200d00
  11116                           if (((instr & 0xf0000) == 0xf0000)) {
  11117                             UnallocatedT32(instr);
  11118                             return;
  11119                           }
  11120                           unsigned rt = (instr >> 12) & 0xf;
  11121                           unsigned rn = (instr >> 16) & 0xf;
  11122                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
  11123                           int32_t offset = instr & 0xff;
  11124                           // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3
  11125                           strh(CurrentCond(),
  11126                                Best,
  11127                                Register(rt),
  11128                                MemOperand(Register(rn),
  11129                                           sign,
  11130                                           offset,
  11131                                           PreIndex));
  11132                           break;
  11133                         }
  11134                         default:
  11135                           UnallocatedT32(instr);
  11136                           break;
  11137                       }
  11138                       break;
  11139                     }
  11140                     case 0x00800000: {
  11141                       // 0xf8800000
  11142                       switch (instr & 0x00400000) {
  11143                         case 0x00000000: {
  11144                           // 0xf8800000
  11145                           if (((instr & 0xf0000) == 0xf0000)) {
  11146                             UnallocatedT32(instr);
  11147                             return;
  11148                           }
  11149                           unsigned rt = (instr >> 12) & 0xf;
  11150                           unsigned rn = (instr >> 16) & 0xf;
  11151                           int32_t offset = instr & 0xfff;
  11152                           if ((rt < kNumberOfT32LowRegisters) &&
  11153                               (rn < kNumberOfT32LowRegisters) &&
  11154                               ((offset >= 0) && (offset <= 31))) {
  11155                             // STRB{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
  11156                             strb(CurrentCond(),
  11157                                  Wide,
  11158                                  Register(rt),
  11159                                  MemOperand(Register(rn),
  11160                                             plus,
  11161                                             offset,
  11162                                             Offset));
  11163                           } else {
  11164                             // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
  11165                             strb(CurrentCond(),
  11166                                  Best,
  11167                                  Register(rt),
  11168                                  MemOperand(Register(rn),
  11169                                             plus,
  11170                                             offset,
  11171                                             Offset));
  11172                           }
  11173                           break;
  11174                         }
  11175                         case 0x00400000: {
  11176                           // 0xf8c00000
  11177                           if (((instr & 0xf0000) == 0xf0000)) {
  11178                             UnallocatedT32(instr);
  11179                             return;
  11180                           }
  11181                           unsigned rt = (instr >> 12) & 0xf;
  11182                           unsigned rn = (instr >> 16) & 0xf;
  11183                           int32_t offset = instr & 0xfff;
  11184                           if (((rt < kNumberOfT32LowRegisters) &&
  11185                                (rn < kNumberOfT32LowRegisters) &&
  11186                                ((offset >= 0) && (offset <= 124) &&
  11187                                 ((offset & 3) == 0))) ||
  11188                               ((rt < kNumberOfT32LowRegisters) &&
  11189                                (rn == sp.GetCode()) &&
  11190                                ((offset >= 0) && (offset <= 1020) &&
  11191                                 ((offset & 3) == 0)))) {
  11192                             // STR{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3
  11193                             str(CurrentCond(),
  11194                                 Wide,
  11195                                 Register(rt),
  11196                                 MemOperand(Register(rn), plus, offset, Offset));
  11197                           } else {
  11198                             // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3
  11199                             str(CurrentCond(),
  11200                                 Best,
  11201                                 Register(rt),
  11202                                 MemOperand(Register(rn), plus, offset, Offset));
  11203                           }
  11204                           break;
  11205                         }
  11206                       }
  11207                       break;
  11208                     }
  11209                     case 0x00a00000: {
  11210                       // 0xf8a00000
  11211                       if ((instr & 0x00400000) == 0x00000000) {
  11212                         if (((instr & 0xf0000) == 0xf0000)) {
  11213                           UnallocatedT32(instr);
  11214                           return;
  11215                         }
  11216                         unsigned rt = (instr >> 12) & 0xf;
  11217                         unsigned rn = (instr >> 16) & 0xf;
  11218                         int32_t offset = instr & 0xfff;
  11219                         if ((rt < kNumberOfT32LowRegisters) &&
  11220                             (rn < kNumberOfT32LowRegisters) &&
  11221                             ((offset >= 0) && (offset <= 62) &&
  11222                              ((offset & 1) == 0))) {
  11223                           // STRH{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
  11224                           strh(CurrentCond(),
  11225                                Wide,
  11226                                Register(rt),
  11227                                MemOperand(Register(rn), plus, offset, Offset));
  11228                         } else {
  11229                           // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2
  11230                           strh(CurrentCond(),
  11231                                Best,
  11232                                Register(rt),
  11233                                MemOperand(Register(rn), plus, offset, Offset));
  11234                         }
  11235                       } else {
  11236                         UnallocatedT32(instr);
  11237                       }
  11238                       break;
  11239                     }
  11240                     case 0x01000000: {
  11241                       // 0xf9000000
  11242                       switch (instr & 0x0000000d) {
  11243                         case 0x0000000d: {
  11244                           // 0xf900000d
  11245                           switch (instr & 0x00000002) {
  11246                             case 0x00000000: {
  11247                               // 0xf900000d
  11248                               switch (instr & 0x00000f00) {
  11249                                 case 0x00000000: {
  11250                                   // 0xf900000d
  11251                                   DataType dt =
  11252                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  11253                                   if (dt.Is(kDataTypeValueInvalid)) {
  11254                                     UnallocatedT32(instr);
  11255                                     return;
  11256                                   }
  11257                                   Alignment align =
  11258                                       Align_align_4_Decode((instr >> 4) & 0x3);
  11259                                   if (dt.Is(kDataTypeValueInvalid) ||
  11260                                       align.Is(kBadAlignment)) {
  11261                                     UnallocatedT32(instr);
  11262                                     return;
  11263                                   }
  11264                                   unsigned first =
  11265                                       ExtractDRegister(instr, 22, 12);
  11266                                   unsigned length;
  11267                                   SpacingType spacing;
  11268                                   switch ((instr >> 8) & 0xf) {
  11269                                     default:
  11270                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  11271                                     case 0x0:
  11272                                       length = 4;
  11273                                       spacing = kSingle;
  11274                                       break;
  11275                                     case 0x1:
  11276                                       length = 4;
  11277                                       spacing = kDouble;
  11278                                       break;
  11279                                   }
  11280                                   unsigned last =
  11281                                       first +
  11282                                       (length - 1) *
  11283                                           (spacing == kSingle ? 1 : 2);
  11284                                   TransferType transfer = kMultipleLanes;
  11285                                   unsigned rn = (instr >> 16) & 0xf;
  11286                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  11287                                   vst4(CurrentCond(),
  11288                                        dt,
  11289                                        NeonRegisterList(DRegister(first),
  11290                                                         DRegister(last),
  11291                                                         spacing,
  11292                                                         transfer),
  11293                                        AlignedMemOperand(Register(rn),
  11294                                                          align,
  11295                                                          PostIndex));
  11296                                   break;
  11297                                 }
  11298                                 case 0x00000100: {
  11299                                   // 0xf900010d
  11300                                   DataType dt =
  11301                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  11302                                   if (dt.Is(kDataTypeValueInvalid)) {
  11303                                     UnallocatedT32(instr);
  11304                                     return;
  11305                                   }
  11306                                   Alignment align =
  11307                                       Align_align_4_Decode((instr >> 4) & 0x3);
  11308                                   if (dt.Is(kDataTypeValueInvalid) ||
  11309                                       align.Is(kBadAlignment)) {
  11310                                     UnallocatedT32(instr);
  11311                                     return;
  11312                                   }
  11313                                   unsigned first =
  11314                                       ExtractDRegister(instr, 22, 12);
  11315                                   unsigned length;
  11316                                   SpacingType spacing;
  11317                                   switch ((instr >> 8) & 0xf) {
  11318                                     default:
  11319                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  11320                                     case 0x0:
  11321                                       length = 4;
  11322                                       spacing = kSingle;
  11323                                       break;
  11324                                     case 0x1:
  11325                                       length = 4;
  11326                                       spacing = kDouble;
  11327                                       break;
  11328                                   }
  11329                                   unsigned last =
  11330                                       first +
  11331                                       (length - 1) *
  11332                                           (spacing == kSingle ? 1 : 2);
  11333                                   TransferType transfer = kMultipleLanes;
  11334                                   unsigned rn = (instr >> 16) & 0xf;
  11335                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  11336                                   vst4(CurrentCond(),
  11337                                        dt,
  11338                                        NeonRegisterList(DRegister(first),
  11339                                                         DRegister(last),
  11340                                                         spacing,
  11341                                                         transfer),
  11342                                        AlignedMemOperand(Register(rn),
  11343                                                          align,
  11344                                                          PostIndex));
  11345                                   break;
  11346                                 }
  11347                                 case 0x00000200: {
  11348                                   // 0xf900020d
  11349                                   if (((instr & 0xe20) == 0x620) ||
  11350                                       ((instr & 0xf30) == 0xa30)) {
  11351                                     UnallocatedT32(instr);
  11352                                     return;
  11353                                   }
  11354                                   DataType dt =
  11355                                       Dt_size_6_Decode((instr >> 6) & 0x3);
  11356                                   if (dt.Is(kDataTypeValueInvalid)) {
  11357                                     UnallocatedT32(instr);
  11358                                     return;
  11359                                   }
  11360                                   Alignment align =
  11361                                       Align_align_5_Decode((instr >> 4) & 0x3);
  11362                                   if (dt.Is(kDataTypeValueInvalid) ||
  11363                                       align.Is(kBadAlignment)) {
  11364                                     UnallocatedT32(instr);
  11365                                     return;
  11366                                   }
  11367                                   unsigned first =
  11368                                       ExtractDRegister(instr, 22, 12);
  11369                                   unsigned length;
  11370                                   SpacingType spacing = kSingle;
  11371                                   switch ((instr >> 8) & 0xf) {
  11372                                     default:
  11373                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  11374                                     case 0x7:
  11375                                       length = 1;
  11376                                       break;
  11377                                     case 0xa:
  11378                                       length = 2;
  11379                                       break;
  11380                                     case 0x6:
  11381                                       length = 3;
  11382                                       break;
  11383                                     case 0x2:
  11384                                       length = 4;
  11385                                       break;
  11386                                   }
  11387                                   unsigned last = first + length - 1;
  11388                                   TransferType transfer = kMultipleLanes;
  11389                                   unsigned rn = (instr >> 16) & 0xf;
  11390                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  11391                                   vst1(CurrentCond(),
  11392                                        dt,
  11393                                        NeonRegisterList(DRegister(first),
  11394                                                         DRegister(last),
  11395                                                         spacing,
  11396                                                         transfer),
  11397                                        AlignedMemOperand(Register(rn),
  11398                                                          align,
  11399                                                          PostIndex));
  11400                                   break;
  11401                                 }
  11402                                 case 0x00000300: {
  11403                                   // 0xf900030d
  11404                                   if (((instr & 0xe30) == 0x830)) {
  11405                                     UnallocatedT32(instr);
  11406                                     return;
  11407                                   }
  11408                                   DataType dt =
  11409                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  11410                                   if (dt.Is(kDataTypeValueInvalid)) {
  11411                                     UnallocatedT32(instr);
  11412                                     return;
  11413                                   }
  11414                                   Alignment align =
  11415                                       Align_align_2_Decode((instr >> 4) & 0x3);
  11416                                   if (dt.Is(kDataTypeValueInvalid) ||
  11417                                       align.Is(kBadAlignment)) {
  11418                                     UnallocatedT32(instr);
  11419                                     return;
  11420                                   }
  11421                                   unsigned first =
  11422                                       ExtractDRegister(instr, 22, 12);
  11423                                   unsigned length;
  11424                                   SpacingType spacing;
  11425                                   switch ((instr >> 8) & 0xf) {
  11426                                     default:
  11427                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  11428                                     case 0x8:
  11429                                       length = 2;
  11430                                       spacing = kSingle;
  11431                                       break;
  11432                                     case 0x9:
  11433                                       length = 2;
  11434                                       spacing = kDouble;
  11435                                       break;
  11436                                     case 0x3:
  11437                                       length = 4;
  11438                                       spacing = kSingle;
  11439                                       break;
  11440                                   }
  11441                                   unsigned last =
  11442                                       first +
  11443                                       (length - 1) *
  11444                                           (spacing == kSingle ? 1 : 2);
  11445                                   TransferType transfer = kMultipleLanes;
  11446                                   unsigned rn = (instr >> 16) & 0xf;
  11447                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  11448                                   vst2(CurrentCond(),
  11449                                        dt,
  11450                                        NeonRegisterList(DRegister(first),
  11451                                                         DRegister(last),
  11452                                                         spacing,
  11453                                                         transfer),
  11454                                        AlignedMemOperand(Register(rn),
  11455                                                          align,
  11456                                                          PostIndex));
  11457                                   break;
  11458                                 }
  11459                                 case 0x00000400: {
  11460                                   // 0xf900040d
  11461                                   if (((instr & 0x20) == 0x20)) {
  11462                                     UnallocatedT32(instr);
  11463                                     return;
  11464                                   }
  11465                                   DataType dt =
  11466                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  11467                                   if (dt.Is(kDataTypeValueInvalid)) {
  11468                                     UnallocatedT32(instr);
  11469                                     return;
  11470                                   }
  11471                                   Alignment align =
  11472                                       Align_align_3_Decode((instr >> 4) & 0x3);
  11473                                   if (dt.Is(kDataTypeValueInvalid) ||
  11474                                       align.Is(kBadAlignment)) {
  11475                                     UnallocatedT32(instr);
  11476                                     return;
  11477                                   }
  11478                                   unsigned first =
  11479                                       ExtractDRegister(instr, 22, 12);
  11480                                   unsigned length;
  11481                                   SpacingType spacing;
  11482                                   switch ((instr >> 8) & 0xf) {
  11483                                     default:
  11484                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  11485                                     case 0x4:
  11486                                       length = 3;
  11487                                       spacing = kSingle;
  11488                                       break;
  11489                                     case 0x5:
  11490                                       length = 3;
  11491                                       spacing = kDouble;
  11492                                       break;
  11493                                   }
  11494                                   unsigned last =
  11495                                       first +
  11496                                       (length - 1) *
  11497                                           (spacing == kSingle ? 1 : 2);
  11498                                   TransferType transfer = kMultipleLanes;
  11499                                   unsigned rn = (instr >> 16) & 0xf;
  11500                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  11501                                   vst3(CurrentCond(),
  11502                                        dt,
  11503                                        NeonRegisterList(DRegister(first),
  11504                                                         DRegister(last),
  11505                                                         spacing,
  11506                                                         transfer),
  11507                                        AlignedMemOperand(Register(rn),
  11508                                                          align,
  11509                                                          PostIndex));
  11510                                   break;
  11511                                 }
  11512                                 case 0x00000500: {
  11513                                   // 0xf900050d
  11514                                   if (((instr & 0x20) == 0x20)) {
  11515                                     UnallocatedT32(instr);
  11516                                     return;
  11517                                   }
  11518                                   DataType dt =
  11519                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  11520                                   if (dt.Is(kDataTypeValueInvalid)) {
  11521                                     UnallocatedT32(instr);
  11522                                     return;
  11523                                   }
  11524                                   Alignment align =
  11525                                       Align_align_3_Decode((instr >> 4) & 0x3);
  11526                                   if (dt.Is(kDataTypeValueInvalid) ||
  11527                                       align.Is(kBadAlignment)) {
  11528                                     UnallocatedT32(instr);
  11529                                     return;
  11530                                   }
  11531                                   unsigned first =
  11532                                       ExtractDRegister(instr, 22, 12);
  11533                                   unsigned length;
  11534                                   SpacingType spacing;
  11535                                   switch ((instr >> 8) & 0xf) {
  11536                                     default:
  11537                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  11538                                     case 0x4:
  11539                                       length = 3;
  11540                                       spacing = kSingle;
  11541                                       break;
  11542                                     case 0x5:
  11543                                       length = 3;
  11544                                       spacing = kDouble;
  11545                                       break;
  11546                                   }
  11547                                   unsigned last =
  11548                                       first +
  11549                                       (length - 1) *
  11550                                           (spacing == kSingle ? 1 : 2);
  11551                                   TransferType transfer = kMultipleLanes;
  11552                                   unsigned rn = (instr >> 16) & 0xf;
  11553                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  11554                                   vst3(CurrentCond(),
  11555                                        dt,
  11556                                        NeonRegisterList(DRegister(first),
  11557                                                         DRegister(last),
  11558                                                         spacing,
  11559                                                         transfer),
  11560                                        AlignedMemOperand(Register(rn),
  11561                                                          align,
  11562                                                          PostIndex));
  11563                                   break;
  11564                                 }
  11565                                 case 0x00000600: {
  11566                                   // 0xf900060d
  11567                                   if (((instr & 0xe20) == 0x620) ||
  11568                                       ((instr & 0xf30) == 0xa30)) {
  11569                                     UnallocatedT32(instr);
  11570                                     return;
  11571                                   }
  11572                                   DataType dt =
  11573                                       Dt_size_6_Decode((instr >> 6) & 0x3);
  11574                                   if (dt.Is(kDataTypeValueInvalid)) {
  11575                                     UnallocatedT32(instr);
  11576                                     return;
  11577                                   }
  11578                                   Alignment align =
  11579                                       Align_align_5_Decode((instr >> 4) & 0x3);
  11580                                   if (dt.Is(kDataTypeValueInvalid) ||
  11581                                       align.Is(kBadAlignment)) {
  11582                                     UnallocatedT32(instr);
  11583                                     return;
  11584                                   }
  11585                                   unsigned first =
  11586                                       ExtractDRegister(instr, 22, 12);
  11587                                   unsigned length;
  11588                                   SpacingType spacing = kSingle;
  11589                                   switch ((instr >> 8) & 0xf) {
  11590                                     default:
  11591                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  11592                                     case 0x7:
  11593                                       length = 1;
  11594                                       break;
  11595                                     case 0xa:
  11596                                       length = 2;
  11597                                       break;
  11598                                     case 0x6:
  11599                                       length = 3;
  11600                                       break;
  11601                                     case 0x2:
  11602                                       length = 4;
  11603                                       break;
  11604                                   }
  11605                                   unsigned last = first + length - 1;
  11606                                   TransferType transfer = kMultipleLanes;
  11607                                   unsigned rn = (instr >> 16) & 0xf;
  11608                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  11609                                   vst1(CurrentCond(),
  11610                                        dt,
  11611                                        NeonRegisterList(DRegister(first),
  11612                                                         DRegister(last),
  11613                                                         spacing,
  11614                                                         transfer),
  11615                                        AlignedMemOperand(Register(rn),
  11616                                                          align,
  11617                                                          PostIndex));
  11618                                   break;
  11619                                 }
  11620                                 case 0x00000700: {
  11621                                   // 0xf900070d
  11622                                   if (((instr & 0xe20) == 0x620) ||
  11623                                       ((instr & 0xf30) == 0xa30)) {
  11624                                     UnallocatedT32(instr);
  11625                                     return;
  11626                                   }
  11627                                   DataType dt =
  11628                                       Dt_size_6_Decode((instr >> 6) & 0x3);
  11629                                   if (dt.Is(kDataTypeValueInvalid)) {
  11630                                     UnallocatedT32(instr);
  11631                                     return;
  11632                                   }
  11633                                   Alignment align =
  11634                                       Align_align_5_Decode((instr >> 4) & 0x3);
  11635                                   if (dt.Is(kDataTypeValueInvalid) ||
  11636                                       align.Is(kBadAlignment)) {
  11637                                     UnallocatedT32(instr);
  11638                                     return;
  11639                                   }
  11640                                   unsigned first =
  11641                                       ExtractDRegister(instr, 22, 12);
  11642                                   unsigned length;
  11643                                   SpacingType spacing = kSingle;
  11644                                   switch ((instr >> 8) & 0xf) {
  11645                                     default:
  11646                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  11647                                     case 0x7:
  11648                                       length = 1;
  11649                                       break;
  11650                                     case 0xa:
  11651                                       length = 2;
  11652                                       break;
  11653                                     case 0x6:
  11654                                       length = 3;
  11655                                       break;
  11656                                     case 0x2:
  11657                                       length = 4;
  11658                                       break;
  11659                                   }
  11660                                   unsigned last = first + length - 1;
  11661                                   TransferType transfer = kMultipleLanes;
  11662                                   unsigned rn = (instr >> 16) & 0xf;
  11663                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  11664                                   vst1(CurrentCond(),
  11665                                        dt,
  11666                                        NeonRegisterList(DRegister(first),
  11667                                                         DRegister(last),
  11668                                                         spacing,
  11669                                                         transfer),
  11670                                        AlignedMemOperand(Register(rn),
  11671                                                          align,
  11672                                                          PostIndex));
  11673                                   break;
  11674                                 }
  11675                                 case 0x00000800: {
  11676                                   // 0xf900080d
  11677                                   if (((instr & 0xe30) == 0x830)) {
  11678                                     UnallocatedT32(instr);
  11679                                     return;
  11680                                   }
  11681                                   DataType dt =
  11682                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  11683                                   if (dt.Is(kDataTypeValueInvalid)) {
  11684                                     UnallocatedT32(instr);
  11685                                     return;
  11686                                   }
  11687                                   Alignment align =
  11688                                       Align_align_2_Decode((instr >> 4) & 0x3);
  11689                                   if (dt.Is(kDataTypeValueInvalid) ||
  11690                                       align.Is(kBadAlignment)) {
  11691                                     UnallocatedT32(instr);
  11692                                     return;
  11693                                   }
  11694                                   unsigned first =
  11695                                       ExtractDRegister(instr, 22, 12);
  11696                                   unsigned length;
  11697                                   SpacingType spacing;
  11698                                   switch ((instr >> 8) & 0xf) {
  11699                                     default:
  11700                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  11701                                     case 0x8:
  11702                                       length = 2;
  11703                                       spacing = kSingle;
  11704                                       break;
  11705                                     case 0x9:
  11706                                       length = 2;
  11707                                       spacing = kDouble;
  11708                                       break;
  11709                                     case 0x3:
  11710                                       length = 4;
  11711                                       spacing = kSingle;
  11712                                       break;
  11713                                   }
  11714                                   unsigned last =
  11715                                       first +
  11716                                       (length - 1) *
  11717                                           (spacing == kSingle ? 1 : 2);
  11718                                   TransferType transfer = kMultipleLanes;
  11719                                   unsigned rn = (instr >> 16) & 0xf;
  11720                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  11721                                   vst2(CurrentCond(),
  11722                                        dt,
  11723                                        NeonRegisterList(DRegister(first),
  11724                                                         DRegister(last),
  11725                                                         spacing,
  11726                                                         transfer),
  11727                                        AlignedMemOperand(Register(rn),
  11728                                                          align,
  11729                                                          PostIndex));
  11730                                   break;
  11731                                 }
  11732                                 case 0x00000900: {
  11733                                   // 0xf900090d
  11734                                   if (((instr & 0xe30) == 0x830)) {
  11735                                     UnallocatedT32(instr);
  11736                                     return;
  11737                                   }
  11738                                   DataType dt =
  11739                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  11740                                   if (dt.Is(kDataTypeValueInvalid)) {
  11741                                     UnallocatedT32(instr);
  11742                                     return;
  11743                                   }
  11744                                   Alignment align =
  11745                                       Align_align_2_Decode((instr >> 4) & 0x3);
  11746                                   if (dt.Is(kDataTypeValueInvalid) ||
  11747                                       align.Is(kBadAlignment)) {
  11748                                     UnallocatedT32(instr);
  11749                                     return;
  11750                                   }
  11751                                   unsigned first =
  11752                                       ExtractDRegister(instr, 22, 12);
  11753                                   unsigned length;
  11754                                   SpacingType spacing;
  11755                                   switch ((instr >> 8) & 0xf) {
  11756                                     default:
  11757                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  11758                                     case 0x8:
  11759                                       length = 2;
  11760                                       spacing = kSingle;
  11761                                       break;
  11762                                     case 0x9:
  11763                                       length = 2;
  11764                                       spacing = kDouble;
  11765                                       break;
  11766                                     case 0x3:
  11767                                       length = 4;
  11768                                       spacing = kSingle;
  11769                                       break;
  11770                                   }
  11771                                   unsigned last =
  11772                                       first +
  11773                                       (length - 1) *
  11774                                           (spacing == kSingle ? 1 : 2);
  11775                                   TransferType transfer = kMultipleLanes;
  11776                                   unsigned rn = (instr >> 16) & 0xf;
  11777                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  11778                                   vst2(CurrentCond(),
  11779                                        dt,
  11780                                        NeonRegisterList(DRegister(first),
  11781                                                         DRegister(last),
  11782                                                         spacing,
  11783                                                         transfer),
  11784                                        AlignedMemOperand(Register(rn),
  11785                                                          align,
  11786                                                          PostIndex));
  11787                                   break;
  11788                                 }
  11789                                 case 0x00000a00: {
  11790                                   // 0xf9000a0d
  11791                                   if (((instr & 0xe20) == 0x620) ||
  11792                                       ((instr & 0xf30) == 0xa30)) {
  11793                                     UnallocatedT32(instr);
  11794                                     return;
  11795                                   }
  11796                                   DataType dt =
  11797                                       Dt_size_6_Decode((instr >> 6) & 0x3);
  11798                                   if (dt.Is(kDataTypeValueInvalid)) {
  11799                                     UnallocatedT32(instr);
  11800                                     return;
  11801                                   }
  11802                                   Alignment align =
  11803                                       Align_align_5_Decode((instr >> 4) & 0x3);
  11804                                   if (dt.Is(kDataTypeValueInvalid) ||
  11805                                       align.Is(kBadAlignment)) {
  11806                                     UnallocatedT32(instr);
  11807                                     return;
  11808                                   }
  11809                                   unsigned first =
  11810                                       ExtractDRegister(instr, 22, 12);
  11811                                   unsigned length;
  11812                                   SpacingType spacing = kSingle;
  11813                                   switch ((instr >> 8) & 0xf) {
  11814                                     default:
  11815                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  11816                                     case 0x7:
  11817                                       length = 1;
  11818                                       break;
  11819                                     case 0xa:
  11820                                       length = 2;
  11821                                       break;
  11822                                     case 0x6:
  11823                                       length = 3;
  11824                                       break;
  11825                                     case 0x2:
  11826                                       length = 4;
  11827                                       break;
  11828                                   }
  11829                                   unsigned last = first + length - 1;
  11830                                   TransferType transfer = kMultipleLanes;
  11831                                   unsigned rn = (instr >> 16) & 0xf;
  11832                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  11833                                   vst1(CurrentCond(),
  11834                                        dt,
  11835                                        NeonRegisterList(DRegister(first),
  11836                                                         DRegister(last),
  11837                                                         spacing,
  11838                                                         transfer),
  11839                                        AlignedMemOperand(Register(rn),
  11840                                                          align,
  11841                                                          PostIndex));
  11842                                   break;
  11843                                 }
  11844                                 default:
  11845                                   UnallocatedT32(instr);
  11846                                   break;
  11847                               }
  11848                               break;
  11849                             }
  11850                             case 0x00000002: {
  11851                               // 0xf900000f
  11852                               switch (instr & 0x00000f00) {
  11853                                 case 0x00000000: {
  11854                                   // 0xf900000d
  11855                                   DataType dt =
  11856                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  11857                                   if (dt.Is(kDataTypeValueInvalid)) {
  11858                                     UnallocatedT32(instr);
  11859                                     return;
  11860                                   }
  11861                                   Alignment align =
  11862                                       Align_align_4_Decode((instr >> 4) & 0x3);
  11863                                   if (dt.Is(kDataTypeValueInvalid) ||
  11864                                       align.Is(kBadAlignment)) {
  11865                                     UnallocatedT32(instr);
  11866                                     return;
  11867                                   }
  11868                                   unsigned first =
  11869                                       ExtractDRegister(instr, 22, 12);
  11870                                   unsigned length;
  11871                                   SpacingType spacing;
  11872                                   switch ((instr >> 8) & 0xf) {
  11873                                     default:
  11874                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  11875                                     case 0x0:
  11876                                       length = 4;
  11877                                       spacing = kSingle;
  11878                                       break;
  11879                                     case 0x1:
  11880                                       length = 4;
  11881                                       spacing = kDouble;
  11882                                       break;
  11883                                   }
  11884                                   unsigned last =
  11885                                       first +
  11886                                       (length - 1) *
  11887                                           (spacing == kSingle ? 1 : 2);
  11888                                   TransferType transfer = kMultipleLanes;
  11889                                   unsigned rn = (instr >> 16) & 0xf;
  11890                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  11891                                   vst4(CurrentCond(),
  11892                                        dt,
  11893                                        NeonRegisterList(DRegister(first),
  11894                                                         DRegister(last),
  11895                                                         spacing,
  11896                                                         transfer),
  11897                                        AlignedMemOperand(Register(rn),
  11898                                                          align,
  11899                                                          Offset));
  11900                                   break;
  11901                                 }
  11902                                 case 0x00000100: {
  11903                                   // 0xf900010d
  11904                                   DataType dt =
  11905                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  11906                                   if (dt.Is(kDataTypeValueInvalid)) {
  11907                                     UnallocatedT32(instr);
  11908                                     return;
  11909                                   }
  11910                                   Alignment align =
  11911                                       Align_align_4_Decode((instr >> 4) & 0x3);
  11912                                   if (dt.Is(kDataTypeValueInvalid) ||
  11913                                       align.Is(kBadAlignment)) {
  11914                                     UnallocatedT32(instr);
  11915                                     return;
  11916                                   }
  11917                                   unsigned first =
  11918                                       ExtractDRegister(instr, 22, 12);
  11919                                   unsigned length;
  11920                                   SpacingType spacing;
  11921                                   switch ((instr >> 8) & 0xf) {
  11922                                     default:
  11923                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  11924                                     case 0x0:
  11925                                       length = 4;
  11926                                       spacing = kSingle;
  11927                                       break;
  11928                                     case 0x1:
  11929                                       length = 4;
  11930                                       spacing = kDouble;
  11931                                       break;
  11932                                   }
  11933                                   unsigned last =
  11934                                       first +
  11935                                       (length - 1) *
  11936                                           (spacing == kSingle ? 1 : 2);
  11937                                   TransferType transfer = kMultipleLanes;
  11938                                   unsigned rn = (instr >> 16) & 0xf;
  11939                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  11940                                   vst4(CurrentCond(),
  11941                                        dt,
  11942                                        NeonRegisterList(DRegister(first),
  11943                                                         DRegister(last),
  11944                                                         spacing,
  11945                                                         transfer),
  11946                                        AlignedMemOperand(Register(rn),
  11947                                                          align,
  11948                                                          Offset));
  11949                                   break;
  11950                                 }
  11951                                 case 0x00000200: {
  11952                                   // 0xf900020d
  11953                                   if (((instr & 0xe20) == 0x620) ||
  11954                                       ((instr & 0xf30) == 0xa30)) {
  11955                                     UnallocatedT32(instr);
  11956                                     return;
  11957                                   }
  11958                                   DataType dt =
  11959                                       Dt_size_6_Decode((instr >> 6) & 0x3);
  11960                                   if (dt.Is(kDataTypeValueInvalid)) {
  11961                                     UnallocatedT32(instr);
  11962                                     return;
  11963                                   }
  11964                                   Alignment align =
  11965                                       Align_align_5_Decode((instr >> 4) & 0x3);
  11966                                   if (dt.Is(kDataTypeValueInvalid) ||
  11967                                       align.Is(kBadAlignment)) {
  11968                                     UnallocatedT32(instr);
  11969                                     return;
  11970                                   }
  11971                                   unsigned first =
  11972                                       ExtractDRegister(instr, 22, 12);
  11973                                   unsigned length;
  11974                                   SpacingType spacing = kSingle;
  11975                                   switch ((instr >> 8) & 0xf) {
  11976                                     default:
  11977                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  11978                                     case 0x7:
  11979                                       length = 1;
  11980                                       break;
  11981                                     case 0xa:
  11982                                       length = 2;
  11983                                       break;
  11984                                     case 0x6:
  11985                                       length = 3;
  11986                                       break;
  11987                                     case 0x2:
  11988                                       length = 4;
  11989                                       break;
  11990                                   }
  11991                                   unsigned last = first + length - 1;
  11992                                   TransferType transfer = kMultipleLanes;
  11993                                   unsigned rn = (instr >> 16) & 0xf;
  11994                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  11995                                   vst1(CurrentCond(),
  11996                                        dt,
  11997                                        NeonRegisterList(DRegister(first),
  11998                                                         DRegister(last),
  11999                                                         spacing,
  12000                                                         transfer),
  12001                                        AlignedMemOperand(Register(rn),
  12002                                                          align,
  12003                                                          Offset));
  12004                                   break;
  12005                                 }
  12006                                 case 0x00000300: {
  12007                                   // 0xf900030d
  12008                                   if (((instr & 0xe30) == 0x830)) {
  12009                                     UnallocatedT32(instr);
  12010                                     return;
  12011                                   }
  12012                                   DataType dt =
  12013                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  12014                                   if (dt.Is(kDataTypeValueInvalid)) {
  12015                                     UnallocatedT32(instr);
  12016                                     return;
  12017                                   }
  12018                                   Alignment align =
  12019                                       Align_align_2_Decode((instr >> 4) & 0x3);
  12020                                   if (dt.Is(kDataTypeValueInvalid) ||
  12021                                       align.Is(kBadAlignment)) {
  12022                                     UnallocatedT32(instr);
  12023                                     return;
  12024                                   }
  12025                                   unsigned first =
  12026                                       ExtractDRegister(instr, 22, 12);
  12027                                   unsigned length;
  12028                                   SpacingType spacing;
  12029                                   switch ((instr >> 8) & 0xf) {
  12030                                     default:
  12031                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  12032                                     case 0x8:
  12033                                       length = 2;
  12034                                       spacing = kSingle;
  12035                                       break;
  12036                                     case 0x9:
  12037                                       length = 2;
  12038                                       spacing = kDouble;
  12039                                       break;
  12040                                     case 0x3:
  12041                                       length = 4;
  12042                                       spacing = kSingle;
  12043                                       break;
  12044                                   }
  12045                                   unsigned last =
  12046                                       first +
  12047                                       (length - 1) *
  12048                                           (spacing == kSingle ? 1 : 2);
  12049                                   TransferType transfer = kMultipleLanes;
  12050                                   unsigned rn = (instr >> 16) & 0xf;
  12051                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  12052                                   vst2(CurrentCond(),
  12053                                        dt,
  12054                                        NeonRegisterList(DRegister(first),
  12055                                                         DRegister(last),
  12056                                                         spacing,
  12057                                                         transfer),
  12058                                        AlignedMemOperand(Register(rn),
  12059                                                          align,
  12060                                                          Offset));
  12061                                   break;
  12062                                 }
  12063                                 case 0x00000400: {
  12064                                   // 0xf900040d
  12065                                   if (((instr & 0x20) == 0x20)) {
  12066                                     UnallocatedT32(instr);
  12067                                     return;
  12068                                   }
  12069                                   DataType dt =
  12070                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  12071                                   if (dt.Is(kDataTypeValueInvalid)) {
  12072                                     UnallocatedT32(instr);
  12073                                     return;
  12074                                   }
  12075                                   Alignment align =
  12076                                       Align_align_3_Decode((instr >> 4) & 0x3);
  12077                                   if (dt.Is(kDataTypeValueInvalid) ||
  12078                                       align.Is(kBadAlignment)) {
  12079                                     UnallocatedT32(instr);
  12080                                     return;
  12081                                   }
  12082                                   unsigned first =
  12083                                       ExtractDRegister(instr, 22, 12);
  12084                                   unsigned length;
  12085                                   SpacingType spacing;
  12086                                   switch ((instr >> 8) & 0xf) {
  12087                                     default:
  12088                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  12089                                     case 0x4:
  12090                                       length = 3;
  12091                                       spacing = kSingle;
  12092                                       break;
  12093                                     case 0x5:
  12094                                       length = 3;
  12095                                       spacing = kDouble;
  12096                                       break;
  12097                                   }
  12098                                   unsigned last =
  12099                                       first +
  12100                                       (length - 1) *
  12101                                           (spacing == kSingle ? 1 : 2);
  12102                                   TransferType transfer = kMultipleLanes;
  12103                                   unsigned rn = (instr >> 16) & 0xf;
  12104                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  12105                                   vst3(CurrentCond(),
  12106                                        dt,
  12107                                        NeonRegisterList(DRegister(first),
  12108                                                         DRegister(last),
  12109                                                         spacing,
  12110                                                         transfer),
  12111                                        AlignedMemOperand(Register(rn),
  12112                                                          align,
  12113                                                          Offset));
  12114                                   break;
  12115                                 }
  12116                                 case 0x00000500: {
  12117                                   // 0xf900050d
  12118                                   if (((instr & 0x20) == 0x20)) {
  12119                                     UnallocatedT32(instr);
  12120                                     return;
  12121                                   }
  12122                                   DataType dt =
  12123                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  12124                                   if (dt.Is(kDataTypeValueInvalid)) {
  12125                                     UnallocatedT32(instr);
  12126                                     return;
  12127                                   }
  12128                                   Alignment align =
  12129                                       Align_align_3_Decode((instr >> 4) & 0x3);
  12130                                   if (dt.Is(kDataTypeValueInvalid) ||
  12131                                       align.Is(kBadAlignment)) {
  12132                                     UnallocatedT32(instr);
  12133                                     return;
  12134                                   }
  12135                                   unsigned first =
  12136                                       ExtractDRegister(instr, 22, 12);
  12137                                   unsigned length;
  12138                                   SpacingType spacing;
  12139                                   switch ((instr >> 8) & 0xf) {
  12140                                     default:
  12141                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  12142                                     case 0x4:
  12143                                       length = 3;
  12144                                       spacing = kSingle;
  12145                                       break;
  12146                                     case 0x5:
  12147                                       length = 3;
  12148                                       spacing = kDouble;
  12149                                       break;
  12150                                   }
  12151                                   unsigned last =
  12152                                       first +
  12153                                       (length - 1) *
  12154                                           (spacing == kSingle ? 1 : 2);
  12155                                   TransferType transfer = kMultipleLanes;
  12156                                   unsigned rn = (instr >> 16) & 0xf;
  12157                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  12158                                   vst3(CurrentCond(),
  12159                                        dt,
  12160                                        NeonRegisterList(DRegister(first),
  12161                                                         DRegister(last),
  12162                                                         spacing,
  12163                                                         transfer),
  12164                                        AlignedMemOperand(Register(rn),
  12165                                                          align,
  12166                                                          Offset));
  12167                                   break;
  12168                                 }
  12169                                 case 0x00000600: {
  12170                                   // 0xf900060d
  12171                                   if (((instr & 0xe20) == 0x620) ||
  12172                                       ((instr & 0xf30) == 0xa30)) {
  12173                                     UnallocatedT32(instr);
  12174                                     return;
  12175                                   }
  12176                                   DataType dt =
  12177                                       Dt_size_6_Decode((instr >> 6) & 0x3);
  12178                                   if (dt.Is(kDataTypeValueInvalid)) {
  12179                                     UnallocatedT32(instr);
  12180                                     return;
  12181                                   }
  12182                                   Alignment align =
  12183                                       Align_align_5_Decode((instr >> 4) & 0x3);
  12184                                   if (dt.Is(kDataTypeValueInvalid) ||
  12185                                       align.Is(kBadAlignment)) {
  12186                                     UnallocatedT32(instr);
  12187                                     return;
  12188                                   }
  12189                                   unsigned first =
  12190                                       ExtractDRegister(instr, 22, 12);
  12191                                   unsigned length;
  12192                                   SpacingType spacing = kSingle;
  12193                                   switch ((instr >> 8) & 0xf) {
  12194                                     default:
  12195                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  12196                                     case 0x7:
  12197                                       length = 1;
  12198                                       break;
  12199                                     case 0xa:
  12200                                       length = 2;
  12201                                       break;
  12202                                     case 0x6:
  12203                                       length = 3;
  12204                                       break;
  12205                                     case 0x2:
  12206                                       length = 4;
  12207                                       break;
  12208                                   }
  12209                                   unsigned last = first + length - 1;
  12210                                   TransferType transfer = kMultipleLanes;
  12211                                   unsigned rn = (instr >> 16) & 0xf;
  12212                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  12213                                   vst1(CurrentCond(),
  12214                                        dt,
  12215                                        NeonRegisterList(DRegister(first),
  12216                                                         DRegister(last),
  12217                                                         spacing,
  12218                                                         transfer),
  12219                                        AlignedMemOperand(Register(rn),
  12220                                                          align,
  12221                                                          Offset));
  12222                                   break;
  12223                                 }
  12224                                 case 0x00000700: {
  12225                                   // 0xf900070d
  12226                                   if (((instr & 0xe20) == 0x620) ||
  12227                                       ((instr & 0xf30) == 0xa30)) {
  12228                                     UnallocatedT32(instr);
  12229                                     return;
  12230                                   }
  12231                                   DataType dt =
  12232                                       Dt_size_6_Decode((instr >> 6) & 0x3);
  12233                                   if (dt.Is(kDataTypeValueInvalid)) {
  12234                                     UnallocatedT32(instr);
  12235                                     return;
  12236                                   }
  12237                                   Alignment align =
  12238                                       Align_align_5_Decode((instr >> 4) & 0x3);
  12239                                   if (dt.Is(kDataTypeValueInvalid) ||
  12240                                       align.Is(kBadAlignment)) {
  12241                                     UnallocatedT32(instr);
  12242                                     return;
  12243                                   }
  12244                                   unsigned first =
  12245                                       ExtractDRegister(instr, 22, 12);
  12246                                   unsigned length;
  12247                                   SpacingType spacing = kSingle;
  12248                                   switch ((instr >> 8) & 0xf) {
  12249                                     default:
  12250                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  12251                                     case 0x7:
  12252                                       length = 1;
  12253                                       break;
  12254                                     case 0xa:
  12255                                       length = 2;
  12256                                       break;
  12257                                     case 0x6:
  12258                                       length = 3;
  12259                                       break;
  12260                                     case 0x2:
  12261                                       length = 4;
  12262                                       break;
  12263                                   }
  12264                                   unsigned last = first + length - 1;
  12265                                   TransferType transfer = kMultipleLanes;
  12266                                   unsigned rn = (instr >> 16) & 0xf;
  12267                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  12268                                   vst1(CurrentCond(),
  12269                                        dt,
  12270                                        NeonRegisterList(DRegister(first),
  12271                                                         DRegister(last),
  12272                                                         spacing,
  12273                                                         transfer),
  12274                                        AlignedMemOperand(Register(rn),
  12275                                                          align,
  12276                                                          Offset));
  12277                                   break;
  12278                                 }
  12279                                 case 0x00000800: {
  12280                                   // 0xf900080d
  12281                                   if (((instr & 0xe30) == 0x830)) {
  12282                                     UnallocatedT32(instr);
  12283                                     return;
  12284                                   }
  12285                                   DataType dt =
  12286                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  12287                                   if (dt.Is(kDataTypeValueInvalid)) {
  12288                                     UnallocatedT32(instr);
  12289                                     return;
  12290                                   }
  12291                                   Alignment align =
  12292                                       Align_align_2_Decode((instr >> 4) & 0x3);
  12293                                   if (dt.Is(kDataTypeValueInvalid) ||
  12294                                       align.Is(kBadAlignment)) {
  12295                                     UnallocatedT32(instr);
  12296                                     return;
  12297                                   }
  12298                                   unsigned first =
  12299                                       ExtractDRegister(instr, 22, 12);
  12300                                   unsigned length;
  12301                                   SpacingType spacing;
  12302                                   switch ((instr >> 8) & 0xf) {
  12303                                     default:
  12304                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  12305                                     case 0x8:
  12306                                       length = 2;
  12307                                       spacing = kSingle;
  12308                                       break;
  12309                                     case 0x9:
  12310                                       length = 2;
  12311                                       spacing = kDouble;
  12312                                       break;
  12313                                     case 0x3:
  12314                                       length = 4;
  12315                                       spacing = kSingle;
  12316                                       break;
  12317                                   }
  12318                                   unsigned last =
  12319                                       first +
  12320                                       (length - 1) *
  12321                                           (spacing == kSingle ? 1 : 2);
  12322                                   TransferType transfer = kMultipleLanes;
  12323                                   unsigned rn = (instr >> 16) & 0xf;
  12324                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  12325                                   vst2(CurrentCond(),
  12326                                        dt,
  12327                                        NeonRegisterList(DRegister(first),
  12328                                                         DRegister(last),
  12329                                                         spacing,
  12330                                                         transfer),
  12331                                        AlignedMemOperand(Register(rn),
  12332                                                          align,
  12333                                                          Offset));
  12334                                   break;
  12335                                 }
  12336                                 case 0x00000900: {
  12337                                   // 0xf900090d
  12338                                   if (((instr & 0xe30) == 0x830)) {
  12339                                     UnallocatedT32(instr);
  12340                                     return;
  12341                                   }
  12342                                   DataType dt =
  12343                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  12344                                   if (dt.Is(kDataTypeValueInvalid)) {
  12345                                     UnallocatedT32(instr);
  12346                                     return;
  12347                                   }
  12348                                   Alignment align =
  12349                                       Align_align_2_Decode((instr >> 4) & 0x3);
  12350                                   if (dt.Is(kDataTypeValueInvalid) ||
  12351                                       align.Is(kBadAlignment)) {
  12352                                     UnallocatedT32(instr);
  12353                                     return;
  12354                                   }
  12355                                   unsigned first =
  12356                                       ExtractDRegister(instr, 22, 12);
  12357                                   unsigned length;
  12358                                   SpacingType spacing;
  12359                                   switch ((instr >> 8) & 0xf) {
  12360                                     default:
  12361                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  12362                                     case 0x8:
  12363                                       length = 2;
  12364                                       spacing = kSingle;
  12365                                       break;
  12366                                     case 0x9:
  12367                                       length = 2;
  12368                                       spacing = kDouble;
  12369                                       break;
  12370                                     case 0x3:
  12371                                       length = 4;
  12372                                       spacing = kSingle;
  12373                                       break;
  12374                                   }
  12375                                   unsigned last =
  12376                                       first +
  12377                                       (length - 1) *
  12378                                           (spacing == kSingle ? 1 : 2);
  12379                                   TransferType transfer = kMultipleLanes;
  12380                                   unsigned rn = (instr >> 16) & 0xf;
  12381                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  12382                                   vst2(CurrentCond(),
  12383                                        dt,
  12384                                        NeonRegisterList(DRegister(first),
  12385                                                         DRegister(last),
  12386                                                         spacing,
  12387                                                         transfer),
  12388                                        AlignedMemOperand(Register(rn),
  12389                                                          align,
  12390                                                          Offset));
  12391                                   break;
  12392                                 }
  12393                                 case 0x00000a00: {
  12394                                   // 0xf9000a0d
  12395                                   if (((instr & 0xe20) == 0x620) ||
  12396                                       ((instr & 0xf30) == 0xa30)) {
  12397                                     UnallocatedT32(instr);
  12398                                     return;
  12399                                   }
  12400                                   DataType dt =
  12401                                       Dt_size_6_Decode((instr >> 6) & 0x3);
  12402                                   if (dt.Is(kDataTypeValueInvalid)) {
  12403                                     UnallocatedT32(instr);
  12404                                     return;
  12405                                   }
  12406                                   Alignment align =
  12407                                       Align_align_5_Decode((instr >> 4) & 0x3);
  12408                                   if (dt.Is(kDataTypeValueInvalid) ||
  12409                                       align.Is(kBadAlignment)) {
  12410                                     UnallocatedT32(instr);
  12411                                     return;
  12412                                   }
  12413                                   unsigned first =
  12414                                       ExtractDRegister(instr, 22, 12);
  12415                                   unsigned length;
  12416                                   SpacingType spacing = kSingle;
  12417                                   switch ((instr >> 8) & 0xf) {
  12418                                     default:
  12419                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  12420                                     case 0x7:
  12421                                       length = 1;
  12422                                       break;
  12423                                     case 0xa:
  12424                                       length = 2;
  12425                                       break;
  12426                                     case 0x6:
  12427                                       length = 3;
  12428                                       break;
  12429                                     case 0x2:
  12430                                       length = 4;
  12431                                       break;
  12432                                   }
  12433                                   unsigned last = first + length - 1;
  12434                                   TransferType transfer = kMultipleLanes;
  12435                                   unsigned rn = (instr >> 16) & 0xf;
  12436                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  12437                                   vst1(CurrentCond(),
  12438                                        dt,
  12439                                        NeonRegisterList(DRegister(first),
  12440                                                         DRegister(last),
  12441                                                         spacing,
  12442                                                         transfer),
  12443                                        AlignedMemOperand(Register(rn),
  12444                                                          align,
  12445                                                          Offset));
  12446                                   break;
  12447                                 }
  12448                                 default:
  12449                                   UnallocatedT32(instr);
  12450                                   break;
  12451                               }
  12452                               break;
  12453                             }
  12454                           }
  12455                           break;
  12456                         }
  12457                         default: {
  12458                           switch (instr & 0x00000f00) {
  12459                             case 0x00000000: {
  12460                               // 0xf9000000
  12461                               if (((instr & 0xd) == 0xd)) {
  12462                                 UnallocatedT32(instr);
  12463                                 return;
  12464                               }
  12465                               DataType dt =
  12466                                   Dt_size_7_Decode((instr >> 6) & 0x3);
  12467                               if (dt.Is(kDataTypeValueInvalid)) {
  12468                                 UnallocatedT32(instr);
  12469                                 return;
  12470                               }
  12471                               Alignment align =
  12472                                   Align_align_4_Decode((instr >> 4) & 0x3);
  12473                               if (dt.Is(kDataTypeValueInvalid) ||
  12474                                   align.Is(kBadAlignment)) {
  12475                                 UnallocatedT32(instr);
  12476                                 return;
  12477                               }
  12478                               unsigned first = ExtractDRegister(instr, 22, 12);
  12479                               unsigned length;
  12480                               SpacingType spacing;
  12481                               switch ((instr >> 8) & 0xf) {
  12482                                 default:
  12483                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  12484                                 case 0x0:
  12485                                   length = 4;
  12486                                   spacing = kSingle;
  12487                                   break;
  12488                                 case 0x1:
  12489                                   length = 4;
  12490                                   spacing = kDouble;
  12491                                   break;
  12492                               }
  12493                               unsigned last =
  12494                                   first +
  12495                                   (length - 1) * (spacing == kSingle ? 1 : 2);
  12496                               TransferType transfer = kMultipleLanes;
  12497                               unsigned rn = (instr >> 16) & 0xf;
  12498                               unsigned rm = instr & 0xf;
  12499                               // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  12500                               vst4(CurrentCond(),
  12501                                    dt,
  12502                                    NeonRegisterList(DRegister(first),
  12503                                                     DRegister(last),
  12504                                                     spacing,
  12505                                                     transfer),
  12506                                    AlignedMemOperand(Register(rn),
  12507                                                      align,
  12508                                                      Register(rm),
  12509                                                      PostIndex));
  12510                               break;
  12511                             }
  12512                             case 0x00000100: {
  12513                               // 0xf9000100
  12514                               if (((instr & 0xd) == 0xd)) {
  12515                                 UnallocatedT32(instr);
  12516                                 return;
  12517                               }
  12518                               DataType dt =
  12519                                   Dt_size_7_Decode((instr >> 6) & 0x3);
  12520                               if (dt.Is(kDataTypeValueInvalid)) {
  12521                                 UnallocatedT32(instr);
  12522                                 return;
  12523                               }
  12524                               Alignment align =
  12525                                   Align_align_4_Decode((instr >> 4) & 0x3);
  12526                               if (dt.Is(kDataTypeValueInvalid) ||
  12527                                   align.Is(kBadAlignment)) {
  12528                                 UnallocatedT32(instr);
  12529                                 return;
  12530                               }
  12531                               unsigned first = ExtractDRegister(instr, 22, 12);
  12532                               unsigned length;
  12533                               SpacingType spacing;
  12534                               switch ((instr >> 8) & 0xf) {
  12535                                 default:
  12536                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  12537                                 case 0x0:
  12538                                   length = 4;
  12539                                   spacing = kSingle;
  12540                                   break;
  12541                                 case 0x1:
  12542                                   length = 4;
  12543                                   spacing = kDouble;
  12544                                   break;
  12545                               }
  12546                               unsigned last =
  12547                                   first +
  12548                                   (length - 1) * (spacing == kSingle ? 1 : 2);
  12549                               TransferType transfer = kMultipleLanes;
  12550                               unsigned rn = (instr >> 16) & 0xf;
  12551                               unsigned rm = instr & 0xf;
  12552                               // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  12553                               vst4(CurrentCond(),
  12554                                    dt,
  12555                                    NeonRegisterList(DRegister(first),
  12556                                                     DRegister(last),
  12557                                                     spacing,
  12558                                                     transfer),
  12559                                    AlignedMemOperand(Register(rn),
  12560                                                      align,
  12561                                                      Register(rm),
  12562                                                      PostIndex));
  12563                               break;
  12564                             }
  12565                             case 0x00000200: {
  12566                               // 0xf9000200
  12567                               if (((instr & 0xd) == 0xd) ||
  12568                                   ((instr & 0xe20) == 0x620) ||
  12569                                   ((instr & 0xf30) == 0xa30)) {
  12570                                 UnallocatedT32(instr);
  12571                                 return;
  12572                               }
  12573                               DataType dt =
  12574                                   Dt_size_6_Decode((instr >> 6) & 0x3);
  12575                               if (dt.Is(kDataTypeValueInvalid)) {
  12576                                 UnallocatedT32(instr);
  12577                                 return;
  12578                               }
  12579                               Alignment align =
  12580                                   Align_align_5_Decode((instr >> 4) & 0x3);
  12581                               if (dt.Is(kDataTypeValueInvalid) ||
  12582                                   align.Is(kBadAlignment)) {
  12583                                 UnallocatedT32(instr);
  12584                                 return;
  12585                               }
  12586                               unsigned first = ExtractDRegister(instr, 22, 12);
  12587                               unsigned length;
  12588                               SpacingType spacing = kSingle;
  12589                               switch ((instr >> 8) & 0xf) {
  12590                                 default:
  12591                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  12592                                 case 0x7:
  12593                                   length = 1;
  12594                                   break;
  12595                                 case 0xa:
  12596                                   length = 2;
  12597                                   break;
  12598                                 case 0x6:
  12599                                   length = 3;
  12600                                   break;
  12601                                 case 0x2:
  12602                                   length = 4;
  12603                                   break;
  12604                               }
  12605                               unsigned last = first + length - 1;
  12606                               TransferType transfer = kMultipleLanes;
  12607                               unsigned rn = (instr >> 16) & 0xf;
  12608                               unsigned rm = instr & 0xf;
  12609                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  12610                               vst1(CurrentCond(),
  12611                                    dt,
  12612                                    NeonRegisterList(DRegister(first),
  12613                                                     DRegister(last),
  12614                                                     spacing,
  12615                                                     transfer),
  12616                                    AlignedMemOperand(Register(rn),
  12617                                                      align,
  12618                                                      Register(rm),
  12619                                                      PostIndex));
  12620                               break;
  12621                             }
  12622                             case 0x00000300: {
  12623                               // 0xf9000300
  12624                               if (((instr & 0xd) == 0xd) ||
  12625                                   ((instr & 0xe30) == 0x830)) {
  12626                                 UnallocatedT32(instr);
  12627                                 return;
  12628                               }
  12629                               DataType dt =
  12630                                   Dt_size_7_Decode((instr >> 6) & 0x3);
  12631                               if (dt.Is(kDataTypeValueInvalid)) {
  12632                                 UnallocatedT32(instr);
  12633                                 return;
  12634                               }
  12635                               Alignment align =
  12636                                   Align_align_2_Decode((instr >> 4) & 0x3);
  12637                               if (dt.Is(kDataTypeValueInvalid) ||
  12638                                   align.Is(kBadAlignment)) {
  12639                                 UnallocatedT32(instr);
  12640                                 return;
  12641                               }
  12642                               unsigned first = ExtractDRegister(instr, 22, 12);
  12643                               unsigned length;
  12644                               SpacingType spacing;
  12645                               switch ((instr >> 8) & 0xf) {
  12646                                 default:
  12647                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  12648                                 case 0x8:
  12649                                   length = 2;
  12650                                   spacing = kSingle;
  12651                                   break;
  12652                                 case 0x9:
  12653                                   length = 2;
  12654                                   spacing = kDouble;
  12655                                   break;
  12656                                 case 0x3:
  12657                                   length = 4;
  12658                                   spacing = kSingle;
  12659                                   break;
  12660                               }
  12661                               unsigned last =
  12662                                   first +
  12663                                   (length - 1) * (spacing == kSingle ? 1 : 2);
  12664                               TransferType transfer = kMultipleLanes;
  12665                               unsigned rn = (instr >> 16) & 0xf;
  12666                               unsigned rm = instr & 0xf;
  12667                               // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  12668                               vst2(CurrentCond(),
  12669                                    dt,
  12670                                    NeonRegisterList(DRegister(first),
  12671                                                     DRegister(last),
  12672                                                     spacing,
  12673                                                     transfer),
  12674                                    AlignedMemOperand(Register(rn),
  12675                                                      align,
  12676                                                      Register(rm),
  12677                                                      PostIndex));
  12678                               break;
  12679                             }
  12680                             case 0x00000400: {
  12681                               // 0xf9000400
  12682                               if (((instr & 0xd) == 0xd) ||
  12683                                   ((instr & 0x20) == 0x20)) {
  12684                                 UnallocatedT32(instr);
  12685                                 return;
  12686                               }
  12687                               DataType dt =
  12688                                   Dt_size_7_Decode((instr >> 6) & 0x3);
  12689                               if (dt.Is(kDataTypeValueInvalid)) {
  12690                                 UnallocatedT32(instr);
  12691                                 return;
  12692                               }
  12693                               Alignment align =
  12694                                   Align_align_3_Decode((instr >> 4) & 0x3);
  12695                               if (dt.Is(kDataTypeValueInvalid) ||
  12696                                   align.Is(kBadAlignment)) {
  12697                                 UnallocatedT32(instr);
  12698                                 return;
  12699                               }
  12700                               unsigned first = ExtractDRegister(instr, 22, 12);
  12701                               unsigned length;
  12702                               SpacingType spacing;
  12703                               switch ((instr >> 8) & 0xf) {
  12704                                 default:
  12705                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  12706                                 case 0x4:
  12707                                   length = 3;
  12708                                   spacing = kSingle;
  12709                                   break;
  12710                                 case 0x5:
  12711                                   length = 3;
  12712                                   spacing = kDouble;
  12713                                   break;
  12714                               }
  12715                               unsigned last =
  12716                                   first +
  12717                                   (length - 1) * (spacing == kSingle ? 1 : 2);
  12718                               TransferType transfer = kMultipleLanes;
  12719                               unsigned rn = (instr >> 16) & 0xf;
  12720                               unsigned rm = instr & 0xf;
  12721                               // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  12722                               vst3(CurrentCond(),
  12723                                    dt,
  12724                                    NeonRegisterList(DRegister(first),
  12725                                                     DRegister(last),
  12726                                                     spacing,
  12727                                                     transfer),
  12728                                    AlignedMemOperand(Register(rn),
  12729                                                      align,
  12730                                                      Register(rm),
  12731                                                      PostIndex));
  12732                               break;
  12733                             }
  12734                             case 0x00000500: {
  12735                               // 0xf9000500
  12736                               if (((instr & 0xd) == 0xd) ||
  12737                                   ((instr & 0x20) == 0x20)) {
  12738                                 UnallocatedT32(instr);
  12739                                 return;
  12740                               }
  12741                               DataType dt =
  12742                                   Dt_size_7_Decode((instr >> 6) & 0x3);
  12743                               if (dt.Is(kDataTypeValueInvalid)) {
  12744                                 UnallocatedT32(instr);
  12745                                 return;
  12746                               }
  12747                               Alignment align =
  12748                                   Align_align_3_Decode((instr >> 4) & 0x3);
  12749                               if (dt.Is(kDataTypeValueInvalid) ||
  12750                                   align.Is(kBadAlignment)) {
  12751                                 UnallocatedT32(instr);
  12752                                 return;
  12753                               }
  12754                               unsigned first = ExtractDRegister(instr, 22, 12);
  12755                               unsigned length;
  12756                               SpacingType spacing;
  12757                               switch ((instr >> 8) & 0xf) {
  12758                                 default:
  12759                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  12760                                 case 0x4:
  12761                                   length = 3;
  12762                                   spacing = kSingle;
  12763                                   break;
  12764                                 case 0x5:
  12765                                   length = 3;
  12766                                   spacing = kDouble;
  12767                                   break;
  12768                               }
  12769                               unsigned last =
  12770                                   first +
  12771                                   (length - 1) * (spacing == kSingle ? 1 : 2);
  12772                               TransferType transfer = kMultipleLanes;
  12773                               unsigned rn = (instr >> 16) & 0xf;
  12774                               unsigned rm = instr & 0xf;
  12775                               // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  12776                               vst3(CurrentCond(),
  12777                                    dt,
  12778                                    NeonRegisterList(DRegister(first),
  12779                                                     DRegister(last),
  12780                                                     spacing,
  12781                                                     transfer),
  12782                                    AlignedMemOperand(Register(rn),
  12783                                                      align,
  12784                                                      Register(rm),
  12785                                                      PostIndex));
  12786                               break;
  12787                             }
  12788                             case 0x00000600: {
  12789                               // 0xf9000600
  12790                               if (((instr & 0xd) == 0xd) ||
  12791                                   ((instr & 0xe20) == 0x620) ||
  12792                                   ((instr & 0xf30) == 0xa30)) {
  12793                                 UnallocatedT32(instr);
  12794                                 return;
  12795                               }
  12796                               DataType dt =
  12797                                   Dt_size_6_Decode((instr >> 6) & 0x3);
  12798                               if (dt.Is(kDataTypeValueInvalid)) {
  12799                                 UnallocatedT32(instr);
  12800                                 return;
  12801                               }
  12802                               Alignment align =
  12803                                   Align_align_5_Decode((instr >> 4) & 0x3);
  12804                               if (dt.Is(kDataTypeValueInvalid) ||
  12805                                   align.Is(kBadAlignment)) {
  12806                                 UnallocatedT32(instr);
  12807                                 return;
  12808                               }
  12809                               unsigned first = ExtractDRegister(instr, 22, 12);
  12810                               unsigned length;
  12811                               SpacingType spacing = kSingle;
  12812                               switch ((instr >> 8) & 0xf) {
  12813                                 default:
  12814                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  12815                                 case 0x7:
  12816                                   length = 1;
  12817                                   break;
  12818                                 case 0xa:
  12819                                   length = 2;
  12820                                   break;
  12821                                 case 0x6:
  12822                                   length = 3;
  12823                                   break;
  12824                                 case 0x2:
  12825                                   length = 4;
  12826                                   break;
  12827                               }
  12828                               unsigned last = first + length - 1;
  12829                               TransferType transfer = kMultipleLanes;
  12830                               unsigned rn = (instr >> 16) & 0xf;
  12831                               unsigned rm = instr & 0xf;
  12832                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  12833                               vst1(CurrentCond(),
  12834                                    dt,
  12835                                    NeonRegisterList(DRegister(first),
  12836                                                     DRegister(last),
  12837                                                     spacing,
  12838                                                     transfer),
  12839                                    AlignedMemOperand(Register(rn),
  12840                                                      align,
  12841                                                      Register(rm),
  12842                                                      PostIndex));
  12843                               break;
  12844                             }
  12845                             case 0x00000700: {
  12846                               // 0xf9000700
  12847                               if (((instr & 0xd) == 0xd) ||
  12848                                   ((instr & 0xe20) == 0x620) ||
  12849                                   ((instr & 0xf30) == 0xa30)) {
  12850                                 UnallocatedT32(instr);
  12851                                 return;
  12852                               }
  12853                               DataType dt =
  12854                                   Dt_size_6_Decode((instr >> 6) & 0x3);
  12855                               if (dt.Is(kDataTypeValueInvalid)) {
  12856                                 UnallocatedT32(instr);
  12857                                 return;
  12858                               }
  12859                               Alignment align =
  12860                                   Align_align_5_Decode((instr >> 4) & 0x3);
  12861                               if (dt.Is(kDataTypeValueInvalid) ||
  12862                                   align.Is(kBadAlignment)) {
  12863                                 UnallocatedT32(instr);
  12864                                 return;
  12865                               }
  12866                               unsigned first = ExtractDRegister(instr, 22, 12);
  12867                               unsigned length;
  12868                               SpacingType spacing = kSingle;
  12869                               switch ((instr >> 8) & 0xf) {
  12870                                 default:
  12871                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  12872                                 case 0x7:
  12873                                   length = 1;
  12874                                   break;
  12875                                 case 0xa:
  12876                                   length = 2;
  12877                                   break;
  12878                                 case 0x6:
  12879                                   length = 3;
  12880                                   break;
  12881                                 case 0x2:
  12882                                   length = 4;
  12883                                   break;
  12884                               }
  12885                               unsigned last = first + length - 1;
  12886                               TransferType transfer = kMultipleLanes;
  12887                               unsigned rn = (instr >> 16) & 0xf;
  12888                               unsigned rm = instr & 0xf;
  12889                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  12890                               vst1(CurrentCond(),
  12891                                    dt,
  12892                                    NeonRegisterList(DRegister(first),
  12893                                                     DRegister(last),
  12894                                                     spacing,
  12895                                                     transfer),
  12896                                    AlignedMemOperand(Register(rn),
  12897                                                      align,
  12898                                                      Register(rm),
  12899                                                      PostIndex));
  12900                               break;
  12901                             }
  12902                             case 0x00000800: {
  12903                               // 0xf9000800
  12904                               if (((instr & 0xd) == 0xd) ||
  12905                                   ((instr & 0xe30) == 0x830)) {
  12906                                 UnallocatedT32(instr);
  12907                                 return;
  12908                               }
  12909                               DataType dt =
  12910                                   Dt_size_7_Decode((instr >> 6) & 0x3);
  12911                               if (dt.Is(kDataTypeValueInvalid)) {
  12912                                 UnallocatedT32(instr);
  12913                                 return;
  12914                               }
  12915                               Alignment align =
  12916                                   Align_align_2_Decode((instr >> 4) & 0x3);
  12917                               if (dt.Is(kDataTypeValueInvalid) ||
  12918                                   align.Is(kBadAlignment)) {
  12919                                 UnallocatedT32(instr);
  12920                                 return;
  12921                               }
  12922                               unsigned first = ExtractDRegister(instr, 22, 12);
  12923                               unsigned length;
  12924                               SpacingType spacing;
  12925                               switch ((instr >> 8) & 0xf) {
  12926                                 default:
  12927                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  12928                                 case 0x8:
  12929                                   length = 2;
  12930                                   spacing = kSingle;
  12931                                   break;
  12932                                 case 0x9:
  12933                                   length = 2;
  12934                                   spacing = kDouble;
  12935                                   break;
  12936                                 case 0x3:
  12937                                   length = 4;
  12938                                   spacing = kSingle;
  12939                                   break;
  12940                               }
  12941                               unsigned last =
  12942                                   first +
  12943                                   (length - 1) * (spacing == kSingle ? 1 : 2);
  12944                               TransferType transfer = kMultipleLanes;
  12945                               unsigned rn = (instr >> 16) & 0xf;
  12946                               unsigned rm = instr & 0xf;
  12947                               // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  12948                               vst2(CurrentCond(),
  12949                                    dt,
  12950                                    NeonRegisterList(DRegister(first),
  12951                                                     DRegister(last),
  12952                                                     spacing,
  12953                                                     transfer),
  12954                                    AlignedMemOperand(Register(rn),
  12955                                                      align,
  12956                                                      Register(rm),
  12957                                                      PostIndex));
  12958                               break;
  12959                             }
  12960                             case 0x00000900: {
  12961                               // 0xf9000900
  12962                               if (((instr & 0xd) == 0xd) ||
  12963                                   ((instr & 0xe30) == 0x830)) {
  12964                                 UnallocatedT32(instr);
  12965                                 return;
  12966                               }
  12967                               DataType dt =
  12968                                   Dt_size_7_Decode((instr >> 6) & 0x3);
  12969                               if (dt.Is(kDataTypeValueInvalid)) {
  12970                                 UnallocatedT32(instr);
  12971                                 return;
  12972                               }
  12973                               Alignment align =
  12974                                   Align_align_2_Decode((instr >> 4) & 0x3);
  12975                               if (dt.Is(kDataTypeValueInvalid) ||
  12976                                   align.Is(kBadAlignment)) {
  12977                                 UnallocatedT32(instr);
  12978                                 return;
  12979                               }
  12980                               unsigned first = ExtractDRegister(instr, 22, 12);
  12981                               unsigned length;
  12982                               SpacingType spacing;
  12983                               switch ((instr >> 8) & 0xf) {
  12984                                 default:
  12985                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  12986                                 case 0x8:
  12987                                   length = 2;
  12988                                   spacing = kSingle;
  12989                                   break;
  12990                                 case 0x9:
  12991                                   length = 2;
  12992                                   spacing = kDouble;
  12993                                   break;
  12994                                 case 0x3:
  12995                                   length = 4;
  12996                                   spacing = kSingle;
  12997                                   break;
  12998                               }
  12999                               unsigned last =
  13000                                   first +
  13001                                   (length - 1) * (spacing == kSingle ? 1 : 2);
  13002                               TransferType transfer = kMultipleLanes;
  13003                               unsigned rn = (instr >> 16) & 0xf;
  13004                               unsigned rm = instr & 0xf;
  13005                               // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  13006                               vst2(CurrentCond(),
  13007                                    dt,
  13008                                    NeonRegisterList(DRegister(first),
  13009                                                     DRegister(last),
  13010                                                     spacing,
  13011                                                     transfer),
  13012                                    AlignedMemOperand(Register(rn),
  13013                                                      align,
  13014                                                      Register(rm),
  13015                                                      PostIndex));
  13016                               break;
  13017                             }
  13018                             case 0x00000a00: {
  13019                               // 0xf9000a00
  13020                               if (((instr & 0xd) == 0xd) ||
  13021                                   ((instr & 0xe20) == 0x620) ||
  13022                                   ((instr & 0xf30) == 0xa30)) {
  13023                                 UnallocatedT32(instr);
  13024                                 return;
  13025                               }
  13026                               DataType dt =
  13027                                   Dt_size_6_Decode((instr >> 6) & 0x3);
  13028                               if (dt.Is(kDataTypeValueInvalid)) {
  13029                                 UnallocatedT32(instr);
  13030                                 return;
  13031                               }
  13032                               Alignment align =
  13033                                   Align_align_5_Decode((instr >> 4) & 0x3);
  13034                               if (dt.Is(kDataTypeValueInvalid) ||
  13035                                   align.Is(kBadAlignment)) {
  13036                                 UnallocatedT32(instr);
  13037                                 return;
  13038                               }
  13039                               unsigned first = ExtractDRegister(instr, 22, 12);
  13040                               unsigned length;
  13041                               SpacingType spacing = kSingle;
  13042                               switch ((instr >> 8) & 0xf) {
  13043                                 default:
  13044                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  13045                                 case 0x7:
  13046                                   length = 1;
  13047                                   break;
  13048                                 case 0xa:
  13049                                   length = 2;
  13050                                   break;
  13051                                 case 0x6:
  13052                                   length = 3;
  13053                                   break;
  13054                                 case 0x2:
  13055                                   length = 4;
  13056                                   break;
  13057                               }
  13058                               unsigned last = first + length - 1;
  13059                               TransferType transfer = kMultipleLanes;
  13060                               unsigned rn = (instr >> 16) & 0xf;
  13061                               unsigned rm = instr & 0xf;
  13062                               // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  13063                               vst1(CurrentCond(),
  13064                                    dt,
  13065                                    NeonRegisterList(DRegister(first),
  13066                                                     DRegister(last),
  13067                                                     spacing,
  13068                                                     transfer),
  13069                                    AlignedMemOperand(Register(rn),
  13070                                                      align,
  13071                                                      Register(rm),
  13072                                                      PostIndex));
  13073                               break;
  13074                             }
  13075                             default:
  13076                               UnallocatedT32(instr);
  13077                               break;
  13078                           }
  13079                           break;
  13080                         }
  13081                       }
  13082                       break;
  13083                     }
  13084                     case 0x01200000: {
  13085                       // 0xf9200000
  13086                       switch (instr & 0x0000000d) {
  13087                         case 0x0000000d: {
  13088                           // 0xf920000d
  13089                           switch (instr & 0x00000002) {
  13090                             case 0x00000000: {
  13091                               // 0xf920000d
  13092                               switch (instr & 0x00000f00) {
  13093                                 case 0x00000000: {
  13094                                   // 0xf920000d
  13095                                   DataType dt =
  13096                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  13097                                   if (dt.Is(kDataTypeValueInvalid)) {
  13098                                     UnallocatedT32(instr);
  13099                                     return;
  13100                                   }
  13101                                   Alignment align =
  13102                                       Align_align_4_Decode((instr >> 4) & 0x3);
  13103                                   if (dt.Is(kDataTypeValueInvalid) ||
  13104                                       align.Is(kBadAlignment)) {
  13105                                     UnallocatedT32(instr);
  13106                                     return;
  13107                                   }
  13108                                   unsigned first =
  13109                                       ExtractDRegister(instr, 22, 12);
  13110                                   unsigned length;
  13111                                   SpacingType spacing;
  13112                                   switch ((instr >> 8) & 0xf) {
  13113                                     default:
  13114                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  13115                                     case 0x0:
  13116                                       length = 4;
  13117                                       spacing = kSingle;
  13118                                       break;
  13119                                     case 0x1:
  13120                                       length = 4;
  13121                                       spacing = kDouble;
  13122                                       break;
  13123                                   }
  13124                                   unsigned last =
  13125                                       first +
  13126                                       (length - 1) *
  13127                                           (spacing == kSingle ? 1 : 2);
  13128                                   TransferType transfer = kMultipleLanes;
  13129                                   unsigned rn = (instr >> 16) & 0xf;
  13130                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  13131                                   vld4(CurrentCond(),
  13132                                        dt,
  13133                                        NeonRegisterList(DRegister(first),
  13134                                                         DRegister(last),
  13135                                                         spacing,
  13136                                                         transfer),
  13137                                        AlignedMemOperand(Register(rn),
  13138                                                          align,
  13139                                                          PostIndex));
  13140                                   break;
  13141                                 }
  13142                                 case 0x00000100: {
  13143                                   // 0xf920010d
  13144                                   DataType dt =
  13145                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  13146                                   if (dt.Is(kDataTypeValueInvalid)) {
  13147                                     UnallocatedT32(instr);
  13148                                     return;
  13149                                   }
  13150                                   Alignment align =
  13151                                       Align_align_4_Decode((instr >> 4) & 0x3);
  13152                                   if (dt.Is(kDataTypeValueInvalid) ||
  13153                                       align.Is(kBadAlignment)) {
  13154                                     UnallocatedT32(instr);
  13155                                     return;
  13156                                   }
  13157                                   unsigned first =
  13158                                       ExtractDRegister(instr, 22, 12);
  13159                                   unsigned length;
  13160                                   SpacingType spacing;
  13161                                   switch ((instr >> 8) & 0xf) {
  13162                                     default:
  13163                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  13164                                     case 0x0:
  13165                                       length = 4;
  13166                                       spacing = kSingle;
  13167                                       break;
  13168                                     case 0x1:
  13169                                       length = 4;
  13170                                       spacing = kDouble;
  13171                                       break;
  13172                                   }
  13173                                   unsigned last =
  13174                                       first +
  13175                                       (length - 1) *
  13176                                           (spacing == kSingle ? 1 : 2);
  13177                                   TransferType transfer = kMultipleLanes;
  13178                                   unsigned rn = (instr >> 16) & 0xf;
  13179                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  13180                                   vld4(CurrentCond(),
  13181                                        dt,
  13182                                        NeonRegisterList(DRegister(first),
  13183                                                         DRegister(last),
  13184                                                         spacing,
  13185                                                         transfer),
  13186                                        AlignedMemOperand(Register(rn),
  13187                                                          align,
  13188                                                          PostIndex));
  13189                                   break;
  13190                                 }
  13191                                 case 0x00000200: {
  13192                                   // 0xf920020d
  13193                                   if (((instr & 0xe20) == 0x620) ||
  13194                                       ((instr & 0xf30) == 0xa30)) {
  13195                                     UnallocatedT32(instr);
  13196                                     return;
  13197                                   }
  13198                                   DataType dt =
  13199                                       Dt_size_6_Decode((instr >> 6) & 0x3);
  13200                                   if (dt.Is(kDataTypeValueInvalid)) {
  13201                                     UnallocatedT32(instr);
  13202                                     return;
  13203                                   }
  13204                                   Alignment align =
  13205                                       Align_align_1_Decode((instr >> 4) & 0x3);
  13206                                   if (dt.Is(kDataTypeValueInvalid) ||
  13207                                       align.Is(kBadAlignment)) {
  13208                                     UnallocatedT32(instr);
  13209                                     return;
  13210                                   }
  13211                                   unsigned first =
  13212                                       ExtractDRegister(instr, 22, 12);
  13213                                   unsigned length;
  13214                                   SpacingType spacing = kSingle;
  13215                                   switch ((instr >> 8) & 0xf) {
  13216                                     default:
  13217                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  13218                                     case 0x7:
  13219                                       length = 1;
  13220                                       break;
  13221                                     case 0xa:
  13222                                       length = 2;
  13223                                       break;
  13224                                     case 0x6:
  13225                                       length = 3;
  13226                                       break;
  13227                                     case 0x2:
  13228                                       length = 4;
  13229                                       break;
  13230                                   }
  13231                                   unsigned last = first + length - 1;
  13232                                   TransferType transfer = kMultipleLanes;
  13233                                   unsigned rn = (instr >> 16) & 0xf;
  13234                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  13235                                   vld1(CurrentCond(),
  13236                                        dt,
  13237                                        NeonRegisterList(DRegister(first),
  13238                                                         DRegister(last),
  13239                                                         spacing,
  13240                                                         transfer),
  13241                                        AlignedMemOperand(Register(rn),
  13242                                                          align,
  13243                                                          PostIndex));
  13244                                   break;
  13245                                 }
  13246                                 case 0x00000300: {
  13247                                   // 0xf920030d
  13248                                   if (((instr & 0xe30) == 0x830)) {
  13249                                     UnallocatedT32(instr);
  13250                                     return;
  13251                                   }
  13252                                   DataType dt =
  13253                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  13254                                   if (dt.Is(kDataTypeValueInvalid)) {
  13255                                     UnallocatedT32(instr);
  13256                                     return;
  13257                                   }
  13258                                   Alignment align =
  13259                                       Align_align_2_Decode((instr >> 4) & 0x3);
  13260                                   if (dt.Is(kDataTypeValueInvalid) ||
  13261                                       align.Is(kBadAlignment)) {
  13262                                     UnallocatedT32(instr);
  13263                                     return;
  13264                                   }
  13265                                   unsigned first =
  13266                                       ExtractDRegister(instr, 22, 12);
  13267                                   unsigned length;
  13268                                   SpacingType spacing;
  13269                                   switch ((instr >> 8) & 0xf) {
  13270                                     default:
  13271                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  13272                                     case 0x8:
  13273                                       length = 2;
  13274                                       spacing = kSingle;
  13275                                       break;
  13276                                     case 0x9:
  13277                                       length = 2;
  13278                                       spacing = kDouble;
  13279                                       break;
  13280                                     case 0x3:
  13281                                       length = 4;
  13282                                       spacing = kSingle;
  13283                                       break;
  13284                                   }
  13285                                   unsigned last =
  13286                                       first +
  13287                                       (length - 1) *
  13288                                           (spacing == kSingle ? 1 : 2);
  13289                                   TransferType transfer = kMultipleLanes;
  13290                                   unsigned rn = (instr >> 16) & 0xf;
  13291                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  13292                                   vld2(CurrentCond(),
  13293                                        dt,
  13294                                        NeonRegisterList(DRegister(first),
  13295                                                         DRegister(last),
  13296                                                         spacing,
  13297                                                         transfer),
  13298                                        AlignedMemOperand(Register(rn),
  13299                                                          align,
  13300                                                          PostIndex));
  13301                                   break;
  13302                                 }
  13303                                 case 0x00000400: {
  13304                                   // 0xf920040d
  13305                                   DataType dt =
  13306                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  13307                                   if (dt.Is(kDataTypeValueInvalid)) {
  13308                                     UnallocatedT32(instr);
  13309                                     return;
  13310                                   }
  13311                                   Alignment align =
  13312                                       Align_align_3_Decode((instr >> 4) & 0x3);
  13313                                   if (dt.Is(kDataTypeValueInvalid) ||
  13314                                       align.Is(kBadAlignment)) {
  13315                                     UnallocatedT32(instr);
  13316                                     return;
  13317                                   }
  13318                                   unsigned first =
  13319                                       ExtractDRegister(instr, 22, 12);
  13320                                   unsigned length;
  13321                                   SpacingType spacing;
  13322                                   switch ((instr >> 8) & 0xf) {
  13323                                     default:
  13324                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  13325                                     case 0x4:
  13326                                       length = 3;
  13327                                       spacing = kSingle;
  13328                                       break;
  13329                                     case 0x5:
  13330                                       length = 3;
  13331                                       spacing = kDouble;
  13332                                       break;
  13333                                   }
  13334                                   unsigned last =
  13335                                       first +
  13336                                       (length - 1) *
  13337                                           (spacing == kSingle ? 1 : 2);
  13338                                   TransferType transfer = kMultipleLanes;
  13339                                   unsigned rn = (instr >> 16) & 0xf;
  13340                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  13341                                   vld3(CurrentCond(),
  13342                                        dt,
  13343                                        NeonRegisterList(DRegister(first),
  13344                                                         DRegister(last),
  13345                                                         spacing,
  13346                                                         transfer),
  13347                                        AlignedMemOperand(Register(rn),
  13348                                                          align,
  13349                                                          PostIndex));
  13350                                   break;
  13351                                 }
  13352                                 case 0x00000500: {
  13353                                   // 0xf920050d
  13354                                   DataType dt =
  13355                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  13356                                   if (dt.Is(kDataTypeValueInvalid)) {
  13357                                     UnallocatedT32(instr);
  13358                                     return;
  13359                                   }
  13360                                   Alignment align =
  13361                                       Align_align_3_Decode((instr >> 4) & 0x3);
  13362                                   if (dt.Is(kDataTypeValueInvalid) ||
  13363                                       align.Is(kBadAlignment)) {
  13364                                     UnallocatedT32(instr);
  13365                                     return;
  13366                                   }
  13367                                   unsigned first =
  13368                                       ExtractDRegister(instr, 22, 12);
  13369                                   unsigned length;
  13370                                   SpacingType spacing;
  13371                                   switch ((instr >> 8) & 0xf) {
  13372                                     default:
  13373                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  13374                                     case 0x4:
  13375                                       length = 3;
  13376                                       spacing = kSingle;
  13377                                       break;
  13378                                     case 0x5:
  13379                                       length = 3;
  13380                                       spacing = kDouble;
  13381                                       break;
  13382                                   }
  13383                                   unsigned last =
  13384                                       first +
  13385                                       (length - 1) *
  13386                                           (spacing == kSingle ? 1 : 2);
  13387                                   TransferType transfer = kMultipleLanes;
  13388                                   unsigned rn = (instr >> 16) & 0xf;
  13389                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  13390                                   vld3(CurrentCond(),
  13391                                        dt,
  13392                                        NeonRegisterList(DRegister(first),
  13393                                                         DRegister(last),
  13394                                                         spacing,
  13395                                                         transfer),
  13396                                        AlignedMemOperand(Register(rn),
  13397                                                          align,
  13398                                                          PostIndex));
  13399                                   break;
  13400                                 }
  13401                                 case 0x00000600: {
  13402                                   // 0xf920060d
  13403                                   if (((instr & 0xe20) == 0x620) ||
  13404                                       ((instr & 0xf30) == 0xa30)) {
  13405                                     UnallocatedT32(instr);
  13406                                     return;
  13407                                   }
  13408                                   DataType dt =
  13409                                       Dt_size_6_Decode((instr >> 6) & 0x3);
  13410                                   if (dt.Is(kDataTypeValueInvalid)) {
  13411                                     UnallocatedT32(instr);
  13412                                     return;
  13413                                   }
  13414                                   Alignment align =
  13415                                       Align_align_1_Decode((instr >> 4) & 0x3);
  13416                                   if (dt.Is(kDataTypeValueInvalid) ||
  13417                                       align.Is(kBadAlignment)) {
  13418                                     UnallocatedT32(instr);
  13419                                     return;
  13420                                   }
  13421                                   unsigned first =
  13422                                       ExtractDRegister(instr, 22, 12);
  13423                                   unsigned length;
  13424                                   SpacingType spacing = kSingle;
  13425                                   switch ((instr >> 8) & 0xf) {
  13426                                     default:
  13427                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  13428                                     case 0x7:
  13429                                       length = 1;
  13430                                       break;
  13431                                     case 0xa:
  13432                                       length = 2;
  13433                                       break;
  13434                                     case 0x6:
  13435                                       length = 3;
  13436                                       break;
  13437                                     case 0x2:
  13438                                       length = 4;
  13439                                       break;
  13440                                   }
  13441                                   unsigned last = first + length - 1;
  13442                                   TransferType transfer = kMultipleLanes;
  13443                                   unsigned rn = (instr >> 16) & 0xf;
  13444                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  13445                                   vld1(CurrentCond(),
  13446                                        dt,
  13447                                        NeonRegisterList(DRegister(first),
  13448                                                         DRegister(last),
  13449                                                         spacing,
  13450                                                         transfer),
  13451                                        AlignedMemOperand(Register(rn),
  13452                                                          align,
  13453                                                          PostIndex));
  13454                                   break;
  13455                                 }
  13456                                 case 0x00000700: {
  13457                                   // 0xf920070d
  13458                                   if (((instr & 0xe20) == 0x620) ||
  13459                                       ((instr & 0xf30) == 0xa30)) {
  13460                                     UnallocatedT32(instr);
  13461                                     return;
  13462                                   }
  13463                                   DataType dt =
  13464                                       Dt_size_6_Decode((instr >> 6) & 0x3);
  13465                                   if (dt.Is(kDataTypeValueInvalid)) {
  13466                                     UnallocatedT32(instr);
  13467                                     return;
  13468                                   }
  13469                                   Alignment align =
  13470                                       Align_align_1_Decode((instr >> 4) & 0x3);
  13471                                   if (dt.Is(kDataTypeValueInvalid) ||
  13472                                       align.Is(kBadAlignment)) {
  13473                                     UnallocatedT32(instr);
  13474                                     return;
  13475                                   }
  13476                                   unsigned first =
  13477                                       ExtractDRegister(instr, 22, 12);
  13478                                   unsigned length;
  13479                                   SpacingType spacing = kSingle;
  13480                                   switch ((instr >> 8) & 0xf) {
  13481                                     default:
  13482                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  13483                                     case 0x7:
  13484                                       length = 1;
  13485                                       break;
  13486                                     case 0xa:
  13487                                       length = 2;
  13488                                       break;
  13489                                     case 0x6:
  13490                                       length = 3;
  13491                                       break;
  13492                                     case 0x2:
  13493                                       length = 4;
  13494                                       break;
  13495                                   }
  13496                                   unsigned last = first + length - 1;
  13497                                   TransferType transfer = kMultipleLanes;
  13498                                   unsigned rn = (instr >> 16) & 0xf;
  13499                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  13500                                   vld1(CurrentCond(),
  13501                                        dt,
  13502                                        NeonRegisterList(DRegister(first),
  13503                                                         DRegister(last),
  13504                                                         spacing,
  13505                                                         transfer),
  13506                                        AlignedMemOperand(Register(rn),
  13507                                                          align,
  13508                                                          PostIndex));
  13509                                   break;
  13510                                 }
  13511                                 case 0x00000800: {
  13512                                   // 0xf920080d
  13513                                   if (((instr & 0xe30) == 0x830)) {
  13514                                     UnallocatedT32(instr);
  13515                                     return;
  13516                                   }
  13517                                   DataType dt =
  13518                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  13519                                   if (dt.Is(kDataTypeValueInvalid)) {
  13520                                     UnallocatedT32(instr);
  13521                                     return;
  13522                                   }
  13523                                   Alignment align =
  13524                                       Align_align_2_Decode((instr >> 4) & 0x3);
  13525                                   if (dt.Is(kDataTypeValueInvalid) ||
  13526                                       align.Is(kBadAlignment)) {
  13527                                     UnallocatedT32(instr);
  13528                                     return;
  13529                                   }
  13530                                   unsigned first =
  13531                                       ExtractDRegister(instr, 22, 12);
  13532                                   unsigned length;
  13533                                   SpacingType spacing;
  13534                                   switch ((instr >> 8) & 0xf) {
  13535                                     default:
  13536                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  13537                                     case 0x8:
  13538                                       length = 2;
  13539                                       spacing = kSingle;
  13540                                       break;
  13541                                     case 0x9:
  13542                                       length = 2;
  13543                                       spacing = kDouble;
  13544                                       break;
  13545                                     case 0x3:
  13546                                       length = 4;
  13547                                       spacing = kSingle;
  13548                                       break;
  13549                                   }
  13550                                   unsigned last =
  13551                                       first +
  13552                                       (length - 1) *
  13553                                           (spacing == kSingle ? 1 : 2);
  13554                                   TransferType transfer = kMultipleLanes;
  13555                                   unsigned rn = (instr >> 16) & 0xf;
  13556                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  13557                                   vld2(CurrentCond(),
  13558                                        dt,
  13559                                        NeonRegisterList(DRegister(first),
  13560                                                         DRegister(last),
  13561                                                         spacing,
  13562                                                         transfer),
  13563                                        AlignedMemOperand(Register(rn),
  13564                                                          align,
  13565                                                          PostIndex));
  13566                                   break;
  13567                                 }
  13568                                 case 0x00000900: {
  13569                                   // 0xf920090d
  13570                                   if (((instr & 0xe30) == 0x830)) {
  13571                                     UnallocatedT32(instr);
  13572                                     return;
  13573                                   }
  13574                                   DataType dt =
  13575                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  13576                                   if (dt.Is(kDataTypeValueInvalid)) {
  13577                                     UnallocatedT32(instr);
  13578                                     return;
  13579                                   }
  13580                                   Alignment align =
  13581                                       Align_align_2_Decode((instr >> 4) & 0x3);
  13582                                   if (dt.Is(kDataTypeValueInvalid) ||
  13583                                       align.Is(kBadAlignment)) {
  13584                                     UnallocatedT32(instr);
  13585                                     return;
  13586                                   }
  13587                                   unsigned first =
  13588                                       ExtractDRegister(instr, 22, 12);
  13589                                   unsigned length;
  13590                                   SpacingType spacing;
  13591                                   switch ((instr >> 8) & 0xf) {
  13592                                     default:
  13593                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  13594                                     case 0x8:
  13595                                       length = 2;
  13596                                       spacing = kSingle;
  13597                                       break;
  13598                                     case 0x9:
  13599                                       length = 2;
  13600                                       spacing = kDouble;
  13601                                       break;
  13602                                     case 0x3:
  13603                                       length = 4;
  13604                                       spacing = kSingle;
  13605                                       break;
  13606                                   }
  13607                                   unsigned last =
  13608                                       first +
  13609                                       (length - 1) *
  13610                                           (spacing == kSingle ? 1 : 2);
  13611                                   TransferType transfer = kMultipleLanes;
  13612                                   unsigned rn = (instr >> 16) & 0xf;
  13613                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  13614                                   vld2(CurrentCond(),
  13615                                        dt,
  13616                                        NeonRegisterList(DRegister(first),
  13617                                                         DRegister(last),
  13618                                                         spacing,
  13619                                                         transfer),
  13620                                        AlignedMemOperand(Register(rn),
  13621                                                          align,
  13622                                                          PostIndex));
  13623                                   break;
  13624                                 }
  13625                                 case 0x00000a00: {
  13626                                   // 0xf9200a0d
  13627                                   if (((instr & 0xe20) == 0x620) ||
  13628                                       ((instr & 0xf30) == 0xa30)) {
  13629                                     UnallocatedT32(instr);
  13630                                     return;
  13631                                   }
  13632                                   DataType dt =
  13633                                       Dt_size_6_Decode((instr >> 6) & 0x3);
  13634                                   if (dt.Is(kDataTypeValueInvalid)) {
  13635                                     UnallocatedT32(instr);
  13636                                     return;
  13637                                   }
  13638                                   Alignment align =
  13639                                       Align_align_1_Decode((instr >> 4) & 0x3);
  13640                                   if (dt.Is(kDataTypeValueInvalid) ||
  13641                                       align.Is(kBadAlignment)) {
  13642                                     UnallocatedT32(instr);
  13643                                     return;
  13644                                   }
  13645                                   unsigned first =
  13646                                       ExtractDRegister(instr, 22, 12);
  13647                                   unsigned length;
  13648                                   SpacingType spacing = kSingle;
  13649                                   switch ((instr >> 8) & 0xf) {
  13650                                     default:
  13651                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  13652                                     case 0x7:
  13653                                       length = 1;
  13654                                       break;
  13655                                     case 0xa:
  13656                                       length = 2;
  13657                                       break;
  13658                                     case 0x6:
  13659                                       length = 3;
  13660                                       break;
  13661                                     case 0x2:
  13662                                       length = 4;
  13663                                       break;
  13664                                   }
  13665                                   unsigned last = first + length - 1;
  13666                                   TransferType transfer = kMultipleLanes;
  13667                                   unsigned rn = (instr >> 16) & 0xf;
  13668                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  13669                                   vld1(CurrentCond(),
  13670                                        dt,
  13671                                        NeonRegisterList(DRegister(first),
  13672                                                         DRegister(last),
  13673                                                         spacing,
  13674                                                         transfer),
  13675                                        AlignedMemOperand(Register(rn),
  13676                                                          align,
  13677                                                          PostIndex));
  13678                                   break;
  13679                                 }
  13680                                 default:
  13681                                   UnallocatedT32(instr);
  13682                                   break;
  13683                               }
  13684                               break;
  13685                             }
  13686                             case 0x00000002: {
  13687                               // 0xf920000f
  13688                               switch (instr & 0x00000f00) {
  13689                                 case 0x00000000: {
  13690                                   // 0xf920000d
  13691                                   DataType dt =
  13692                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  13693                                   if (dt.Is(kDataTypeValueInvalid)) {
  13694                                     UnallocatedT32(instr);
  13695                                     return;
  13696                                   }
  13697                                   Alignment align =
  13698                                       Align_align_4_Decode((instr >> 4) & 0x3);
  13699                                   if (dt.Is(kDataTypeValueInvalid) ||
  13700                                       align.Is(kBadAlignment)) {
  13701                                     UnallocatedT32(instr);
  13702                                     return;
  13703                                   }
  13704                                   unsigned first =
  13705                                       ExtractDRegister(instr, 22, 12);
  13706                                   unsigned length;
  13707                                   SpacingType spacing;
  13708                                   switch ((instr >> 8) & 0xf) {
  13709                                     default:
  13710                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  13711                                     case 0x0:
  13712                                       length = 4;
  13713                                       spacing = kSingle;
  13714                                       break;
  13715                                     case 0x1:
  13716                                       length = 4;
  13717                                       spacing = kDouble;
  13718                                       break;
  13719                                   }
  13720                                   unsigned last =
  13721                                       first +
  13722                                       (length - 1) *
  13723                                           (spacing == kSingle ? 1 : 2);
  13724                                   TransferType transfer = kMultipleLanes;
  13725                                   unsigned rn = (instr >> 16) & 0xf;
  13726                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  13727                                   vld4(CurrentCond(),
  13728                                        dt,
  13729                                        NeonRegisterList(DRegister(first),
  13730                                                         DRegister(last),
  13731                                                         spacing,
  13732                                                         transfer),
  13733                                        AlignedMemOperand(Register(rn),
  13734                                                          align,
  13735                                                          Offset));
  13736                                   break;
  13737                                 }
  13738                                 case 0x00000100: {
  13739                                   // 0xf920010d
  13740                                   DataType dt =
  13741                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  13742                                   if (dt.Is(kDataTypeValueInvalid)) {
  13743                                     UnallocatedT32(instr);
  13744                                     return;
  13745                                   }
  13746                                   Alignment align =
  13747                                       Align_align_4_Decode((instr >> 4) & 0x3);
  13748                                   if (dt.Is(kDataTypeValueInvalid) ||
  13749                                       align.Is(kBadAlignment)) {
  13750                                     UnallocatedT32(instr);
  13751                                     return;
  13752                                   }
  13753                                   unsigned first =
  13754                                       ExtractDRegister(instr, 22, 12);
  13755                                   unsigned length;
  13756                                   SpacingType spacing;
  13757                                   switch ((instr >> 8) & 0xf) {
  13758                                     default:
  13759                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  13760                                     case 0x0:
  13761                                       length = 4;
  13762                                       spacing = kSingle;
  13763                                       break;
  13764                                     case 0x1:
  13765                                       length = 4;
  13766                                       spacing = kDouble;
  13767                                       break;
  13768                                   }
  13769                                   unsigned last =
  13770                                       first +
  13771                                       (length - 1) *
  13772                                           (spacing == kSingle ? 1 : 2);
  13773                                   TransferType transfer = kMultipleLanes;
  13774                                   unsigned rn = (instr >> 16) & 0xf;
  13775                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  13776                                   vld4(CurrentCond(),
  13777                                        dt,
  13778                                        NeonRegisterList(DRegister(first),
  13779                                                         DRegister(last),
  13780                                                         spacing,
  13781                                                         transfer),
  13782                                        AlignedMemOperand(Register(rn),
  13783                                                          align,
  13784                                                          Offset));
  13785                                   break;
  13786                                 }
  13787                                 case 0x00000200: {
  13788                                   // 0xf920020d
  13789                                   if (((instr & 0xe20) == 0x620) ||
  13790                                       ((instr & 0xf30) == 0xa30)) {
  13791                                     UnallocatedT32(instr);
  13792                                     return;
  13793                                   }
  13794                                   DataType dt =
  13795                                       Dt_size_6_Decode((instr >> 6) & 0x3);
  13796                                   if (dt.Is(kDataTypeValueInvalid)) {
  13797                                     UnallocatedT32(instr);
  13798                                     return;
  13799                                   }
  13800                                   Alignment align =
  13801                                       Align_align_1_Decode((instr >> 4) & 0x3);
  13802                                   if (dt.Is(kDataTypeValueInvalid) ||
  13803                                       align.Is(kBadAlignment)) {
  13804                                     UnallocatedT32(instr);
  13805                                     return;
  13806                                   }
  13807                                   unsigned first =
  13808                                       ExtractDRegister(instr, 22, 12);
  13809                                   unsigned length;
  13810                                   SpacingType spacing = kSingle;
  13811                                   switch ((instr >> 8) & 0xf) {
  13812                                     default:
  13813                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  13814                                     case 0x7:
  13815                                       length = 1;
  13816                                       break;
  13817                                     case 0xa:
  13818                                       length = 2;
  13819                                       break;
  13820                                     case 0x6:
  13821                                       length = 3;
  13822                                       break;
  13823                                     case 0x2:
  13824                                       length = 4;
  13825                                       break;
  13826                                   }
  13827                                   unsigned last = first + length - 1;
  13828                                   TransferType transfer = kMultipleLanes;
  13829                                   unsigned rn = (instr >> 16) & 0xf;
  13830                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  13831                                   vld1(CurrentCond(),
  13832                                        dt,
  13833                                        NeonRegisterList(DRegister(first),
  13834                                                         DRegister(last),
  13835                                                         spacing,
  13836                                                         transfer),
  13837                                        AlignedMemOperand(Register(rn),
  13838                                                          align,
  13839                                                          Offset));
  13840                                   break;
  13841                                 }
  13842                                 case 0x00000300: {
  13843                                   // 0xf920030d
  13844                                   if (((instr & 0xe30) == 0x830)) {
  13845                                     UnallocatedT32(instr);
  13846                                     return;
  13847                                   }
  13848                                   DataType dt =
  13849                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  13850                                   if (dt.Is(kDataTypeValueInvalid)) {
  13851                                     UnallocatedT32(instr);
  13852                                     return;
  13853                                   }
  13854                                   Alignment align =
  13855                                       Align_align_2_Decode((instr >> 4) & 0x3);
  13856                                   if (dt.Is(kDataTypeValueInvalid) ||
  13857                                       align.Is(kBadAlignment)) {
  13858                                     UnallocatedT32(instr);
  13859                                     return;
  13860                                   }
  13861                                   unsigned first =
  13862                                       ExtractDRegister(instr, 22, 12);
  13863                                   unsigned length;
  13864                                   SpacingType spacing;
  13865                                   switch ((instr >> 8) & 0xf) {
  13866                                     default:
  13867                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  13868                                     case 0x8:
  13869                                       length = 2;
  13870                                       spacing = kSingle;
  13871                                       break;
  13872                                     case 0x9:
  13873                                       length = 2;
  13874                                       spacing = kDouble;
  13875                                       break;
  13876                                     case 0x3:
  13877                                       length = 4;
  13878                                       spacing = kSingle;
  13879                                       break;
  13880                                   }
  13881                                   unsigned last =
  13882                                       first +
  13883                                       (length - 1) *
  13884                                           (spacing == kSingle ? 1 : 2);
  13885                                   TransferType transfer = kMultipleLanes;
  13886                                   unsigned rn = (instr >> 16) & 0xf;
  13887                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  13888                                   vld2(CurrentCond(),
  13889                                        dt,
  13890                                        NeonRegisterList(DRegister(first),
  13891                                                         DRegister(last),
  13892                                                         spacing,
  13893                                                         transfer),
  13894                                        AlignedMemOperand(Register(rn),
  13895                                                          align,
  13896                                                          Offset));
  13897                                   break;
  13898                                 }
  13899                                 case 0x00000400: {
  13900                                   // 0xf920040d
  13901                                   DataType dt =
  13902                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  13903                                   if (dt.Is(kDataTypeValueInvalid)) {
  13904                                     UnallocatedT32(instr);
  13905                                     return;
  13906                                   }
  13907                                   Alignment align =
  13908                                       Align_align_3_Decode((instr >> 4) & 0x3);
  13909                                   if (dt.Is(kDataTypeValueInvalid) ||
  13910                                       align.Is(kBadAlignment)) {
  13911                                     UnallocatedT32(instr);
  13912                                     return;
  13913                                   }
  13914                                   unsigned first =
  13915                                       ExtractDRegister(instr, 22, 12);
  13916                                   unsigned length;
  13917                                   SpacingType spacing;
  13918                                   switch ((instr >> 8) & 0xf) {
  13919                                     default:
  13920                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  13921                                     case 0x4:
  13922                                       length = 3;
  13923                                       spacing = kSingle;
  13924                                       break;
  13925                                     case 0x5:
  13926                                       length = 3;
  13927                                       spacing = kDouble;
  13928                                       break;
  13929                                   }
  13930                                   unsigned last =
  13931                                       first +
  13932                                       (length - 1) *
  13933                                           (spacing == kSingle ? 1 : 2);
  13934                                   TransferType transfer = kMultipleLanes;
  13935                                   unsigned rn = (instr >> 16) & 0xf;
  13936                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  13937                                   vld3(CurrentCond(),
  13938                                        dt,
  13939                                        NeonRegisterList(DRegister(first),
  13940                                                         DRegister(last),
  13941                                                         spacing,
  13942                                                         transfer),
  13943                                        AlignedMemOperand(Register(rn),
  13944                                                          align,
  13945                                                          Offset));
  13946                                   break;
  13947                                 }
  13948                                 case 0x00000500: {
  13949                                   // 0xf920050d
  13950                                   DataType dt =
  13951                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  13952                                   if (dt.Is(kDataTypeValueInvalid)) {
  13953                                     UnallocatedT32(instr);
  13954                                     return;
  13955                                   }
  13956                                   Alignment align =
  13957                                       Align_align_3_Decode((instr >> 4) & 0x3);
  13958                                   if (dt.Is(kDataTypeValueInvalid) ||
  13959                                       align.Is(kBadAlignment)) {
  13960                                     UnallocatedT32(instr);
  13961                                     return;
  13962                                   }
  13963                                   unsigned first =
  13964                                       ExtractDRegister(instr, 22, 12);
  13965                                   unsigned length;
  13966                                   SpacingType spacing;
  13967                                   switch ((instr >> 8) & 0xf) {
  13968                                     default:
  13969                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  13970                                     case 0x4:
  13971                                       length = 3;
  13972                                       spacing = kSingle;
  13973                                       break;
  13974                                     case 0x5:
  13975                                       length = 3;
  13976                                       spacing = kDouble;
  13977                                       break;
  13978                                   }
  13979                                   unsigned last =
  13980                                       first +
  13981                                       (length - 1) *
  13982                                           (spacing == kSingle ? 1 : 2);
  13983                                   TransferType transfer = kMultipleLanes;
  13984                                   unsigned rn = (instr >> 16) & 0xf;
  13985                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  13986                                   vld3(CurrentCond(),
  13987                                        dt,
  13988                                        NeonRegisterList(DRegister(first),
  13989                                                         DRegister(last),
  13990                                                         spacing,
  13991                                                         transfer),
  13992                                        AlignedMemOperand(Register(rn),
  13993                                                          align,
  13994                                                          Offset));
  13995                                   break;
  13996                                 }
  13997                                 case 0x00000600: {
  13998                                   // 0xf920060d
  13999                                   if (((instr & 0xe20) == 0x620) ||
  14000                                       ((instr & 0xf30) == 0xa30)) {
  14001                                     UnallocatedT32(instr);
  14002                                     return;
  14003                                   }
  14004                                   DataType dt =
  14005                                       Dt_size_6_Decode((instr >> 6) & 0x3);
  14006                                   if (dt.Is(kDataTypeValueInvalid)) {
  14007                                     UnallocatedT32(instr);
  14008                                     return;
  14009                                   }
  14010                                   Alignment align =
  14011                                       Align_align_1_Decode((instr >> 4) & 0x3);
  14012                                   if (dt.Is(kDataTypeValueInvalid) ||
  14013                                       align.Is(kBadAlignment)) {
  14014                                     UnallocatedT32(instr);
  14015                                     return;
  14016                                   }
  14017                                   unsigned first =
  14018                                       ExtractDRegister(instr, 22, 12);
  14019                                   unsigned length;
  14020                                   SpacingType spacing = kSingle;
  14021                                   switch ((instr >> 8) & 0xf) {
  14022                                     default:
  14023                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  14024                                     case 0x7:
  14025                                       length = 1;
  14026                                       break;
  14027                                     case 0xa:
  14028                                       length = 2;
  14029                                       break;
  14030                                     case 0x6:
  14031                                       length = 3;
  14032                                       break;
  14033                                     case 0x2:
  14034                                       length = 4;
  14035                                       break;
  14036                                   }
  14037                                   unsigned last = first + length - 1;
  14038                                   TransferType transfer = kMultipleLanes;
  14039                                   unsigned rn = (instr >> 16) & 0xf;
  14040                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  14041                                   vld1(CurrentCond(),
  14042                                        dt,
  14043                                        NeonRegisterList(DRegister(first),
  14044                                                         DRegister(last),
  14045                                                         spacing,
  14046                                                         transfer),
  14047                                        AlignedMemOperand(Register(rn),
  14048                                                          align,
  14049                                                          Offset));
  14050                                   break;
  14051                                 }
  14052                                 case 0x00000700: {
  14053                                   // 0xf920070d
  14054                                   if (((instr & 0xe20) == 0x620) ||
  14055                                       ((instr & 0xf30) == 0xa30)) {
  14056                                     UnallocatedT32(instr);
  14057                                     return;
  14058                                   }
  14059                                   DataType dt =
  14060                                       Dt_size_6_Decode((instr >> 6) & 0x3);
  14061                                   if (dt.Is(kDataTypeValueInvalid)) {
  14062                                     UnallocatedT32(instr);
  14063                                     return;
  14064                                   }
  14065                                   Alignment align =
  14066                                       Align_align_1_Decode((instr >> 4) & 0x3);
  14067                                   if (dt.Is(kDataTypeValueInvalid) ||
  14068                                       align.Is(kBadAlignment)) {
  14069                                     UnallocatedT32(instr);
  14070                                     return;
  14071                                   }
  14072                                   unsigned first =
  14073                                       ExtractDRegister(instr, 22, 12);
  14074                                   unsigned length;
  14075                                   SpacingType spacing = kSingle;
  14076                                   switch ((instr >> 8) & 0xf) {
  14077                                     default:
  14078                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  14079                                     case 0x7:
  14080                                       length = 1;
  14081                                       break;
  14082                                     case 0xa:
  14083                                       length = 2;
  14084                                       break;
  14085                                     case 0x6:
  14086                                       length = 3;
  14087                                       break;
  14088                                     case 0x2:
  14089                                       length = 4;
  14090                                       break;
  14091                                   }
  14092                                   unsigned last = first + length - 1;
  14093                                   TransferType transfer = kMultipleLanes;
  14094                                   unsigned rn = (instr >> 16) & 0xf;
  14095                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  14096                                   vld1(CurrentCond(),
  14097                                        dt,
  14098                                        NeonRegisterList(DRegister(first),
  14099                                                         DRegister(last),
  14100                                                         spacing,
  14101                                                         transfer),
  14102                                        AlignedMemOperand(Register(rn),
  14103                                                          align,
  14104                                                          Offset));
  14105                                   break;
  14106                                 }
  14107                                 case 0x00000800: {
  14108                                   // 0xf920080d
  14109                                   if (((instr & 0xe30) == 0x830)) {
  14110                                     UnallocatedT32(instr);
  14111                                     return;
  14112                                   }
  14113                                   DataType dt =
  14114                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  14115                                   if (dt.Is(kDataTypeValueInvalid)) {
  14116                                     UnallocatedT32(instr);
  14117                                     return;
  14118                                   }
  14119                                   Alignment align =
  14120                                       Align_align_2_Decode((instr >> 4) & 0x3);
  14121                                   if (dt.Is(kDataTypeValueInvalid) ||
  14122                                       align.Is(kBadAlignment)) {
  14123                                     UnallocatedT32(instr);
  14124                                     return;
  14125                                   }
  14126                                   unsigned first =
  14127                                       ExtractDRegister(instr, 22, 12);
  14128                                   unsigned length;
  14129                                   SpacingType spacing;
  14130                                   switch ((instr >> 8) & 0xf) {
  14131                                     default:
  14132                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  14133                                     case 0x8:
  14134                                       length = 2;
  14135                                       spacing = kSingle;
  14136                                       break;
  14137                                     case 0x9:
  14138                                       length = 2;
  14139                                       spacing = kDouble;
  14140                                       break;
  14141                                     case 0x3:
  14142                                       length = 4;
  14143                                       spacing = kSingle;
  14144                                       break;
  14145                                   }
  14146                                   unsigned last =
  14147                                       first +
  14148                                       (length - 1) *
  14149                                           (spacing == kSingle ? 1 : 2);
  14150                                   TransferType transfer = kMultipleLanes;
  14151                                   unsigned rn = (instr >> 16) & 0xf;
  14152                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  14153                                   vld2(CurrentCond(),
  14154                                        dt,
  14155                                        NeonRegisterList(DRegister(first),
  14156                                                         DRegister(last),
  14157                                                         spacing,
  14158                                                         transfer),
  14159                                        AlignedMemOperand(Register(rn),
  14160                                                          align,
  14161                                                          Offset));
  14162                                   break;
  14163                                 }
  14164                                 case 0x00000900: {
  14165                                   // 0xf920090d
  14166                                   if (((instr & 0xe30) == 0x830)) {
  14167                                     UnallocatedT32(instr);
  14168                                     return;
  14169                                   }
  14170                                   DataType dt =
  14171                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  14172                                   if (dt.Is(kDataTypeValueInvalid)) {
  14173                                     UnallocatedT32(instr);
  14174                                     return;
  14175                                   }
  14176                                   Alignment align =
  14177                                       Align_align_2_Decode((instr >> 4) & 0x3);
  14178                                   if (dt.Is(kDataTypeValueInvalid) ||
  14179                                       align.Is(kBadAlignment)) {
  14180                                     UnallocatedT32(instr);
  14181                                     return;
  14182                                   }
  14183                                   unsigned first =
  14184                                       ExtractDRegister(instr, 22, 12);
  14185                                   unsigned length;
  14186                                   SpacingType spacing;
  14187                                   switch ((instr >> 8) & 0xf) {
  14188                                     default:
  14189                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  14190                                     case 0x8:
  14191                                       length = 2;
  14192                                       spacing = kSingle;
  14193                                       break;
  14194                                     case 0x9:
  14195                                       length = 2;
  14196                                       spacing = kDouble;
  14197                                       break;
  14198                                     case 0x3:
  14199                                       length = 4;
  14200                                       spacing = kSingle;
  14201                                       break;
  14202                                   }
  14203                                   unsigned last =
  14204                                       first +
  14205                                       (length - 1) *
  14206                                           (spacing == kSingle ? 1 : 2);
  14207                                   TransferType transfer = kMultipleLanes;
  14208                                   unsigned rn = (instr >> 16) & 0xf;
  14209                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  14210                                   vld2(CurrentCond(),
  14211                                        dt,
  14212                                        NeonRegisterList(DRegister(first),
  14213                                                         DRegister(last),
  14214                                                         spacing,
  14215                                                         transfer),
  14216                                        AlignedMemOperand(Register(rn),
  14217                                                          align,
  14218                                                          Offset));
  14219                                   break;
  14220                                 }
  14221                                 case 0x00000a00: {
  14222                                   // 0xf9200a0d
  14223                                   if (((instr & 0xe20) == 0x620) ||
  14224                                       ((instr & 0xf30) == 0xa30)) {
  14225                                     UnallocatedT32(instr);
  14226                                     return;
  14227                                   }
  14228                                   DataType dt =
  14229                                       Dt_size_6_Decode((instr >> 6) & 0x3);
  14230                                   if (dt.Is(kDataTypeValueInvalid)) {
  14231                                     UnallocatedT32(instr);
  14232                                     return;
  14233                                   }
  14234                                   Alignment align =
  14235                                       Align_align_1_Decode((instr >> 4) & 0x3);
  14236                                   if (dt.Is(kDataTypeValueInvalid) ||
  14237                                       align.Is(kBadAlignment)) {
  14238                                     UnallocatedT32(instr);
  14239                                     return;
  14240                                   }
  14241                                   unsigned first =
  14242                                       ExtractDRegister(instr, 22, 12);
  14243                                   unsigned length;
  14244                                   SpacingType spacing = kSingle;
  14245                                   switch ((instr >> 8) & 0xf) {
  14246                                     default:
  14247                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  14248                                     case 0x7:
  14249                                       length = 1;
  14250                                       break;
  14251                                     case 0xa:
  14252                                       length = 2;
  14253                                       break;
  14254                                     case 0x6:
  14255                                       length = 3;
  14256                                       break;
  14257                                     case 0x2:
  14258                                       length = 4;
  14259                                       break;
  14260                                   }
  14261                                   unsigned last = first + length - 1;
  14262                                   TransferType transfer = kMultipleLanes;
  14263                                   unsigned rn = (instr >> 16) & 0xf;
  14264                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  14265                                   vld1(CurrentCond(),
  14266                                        dt,
  14267                                        NeonRegisterList(DRegister(first),
  14268                                                         DRegister(last),
  14269                                                         spacing,
  14270                                                         transfer),
  14271                                        AlignedMemOperand(Register(rn),
  14272                                                          align,
  14273                                                          Offset));
  14274                                   break;
  14275                                 }
  14276                                 default:
  14277                                   UnallocatedT32(instr);
  14278                                   break;
  14279                               }
  14280                               break;
  14281                             }
  14282                           }
  14283                           break;
  14284                         }
  14285                         default: {
  14286                           switch (instr & 0x00000f00) {
  14287                             case 0x00000000: {
  14288                               // 0xf9200000
  14289                               if (((instr & 0xd) == 0xd)) {
  14290                                 UnallocatedT32(instr);
  14291                                 return;
  14292                               }
  14293                               DataType dt =
  14294                                   Dt_size_7_Decode((instr >> 6) & 0x3);
  14295                               if (dt.Is(kDataTypeValueInvalid)) {
  14296                                 UnallocatedT32(instr);
  14297                                 return;
  14298                               }
  14299                               Alignment align =
  14300                                   Align_align_4_Decode((instr >> 4) & 0x3);
  14301                               if (dt.Is(kDataTypeValueInvalid) ||
  14302                                   align.Is(kBadAlignment)) {
  14303                                 UnallocatedT32(instr);
  14304                                 return;
  14305                               }
  14306                               unsigned first = ExtractDRegister(instr, 22, 12);
  14307                               unsigned length;
  14308                               SpacingType spacing;
  14309                               switch ((instr >> 8) & 0xf) {
  14310                                 default:
  14311                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  14312                                 case 0x0:
  14313                                   length = 4;
  14314                                   spacing = kSingle;
  14315                                   break;
  14316                                 case 0x1:
  14317                                   length = 4;
  14318                                   spacing = kDouble;
  14319                                   break;
  14320                               }
  14321                               unsigned last =
  14322                                   first +
  14323                                   (length - 1) * (spacing == kSingle ? 1 : 2);
  14324                               TransferType transfer = kMultipleLanes;
  14325                               unsigned rn = (instr >> 16) & 0xf;
  14326                               unsigned rm = instr & 0xf;
  14327                               // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  14328                               vld4(CurrentCond(),
  14329                                    dt,
  14330                                    NeonRegisterList(DRegister(first),
  14331                                                     DRegister(last),
  14332                                                     spacing,
  14333                                                     transfer),
  14334                                    AlignedMemOperand(Register(rn),
  14335                                                      align,
  14336                                                      Register(rm),
  14337                                                      PostIndex));
  14338                               break;
  14339                             }
  14340                             case 0x00000100: {
  14341                               // 0xf9200100
  14342                               if (((instr & 0xd) == 0xd)) {
  14343                                 UnallocatedT32(instr);
  14344                                 return;
  14345                               }
  14346                               DataType dt =
  14347                                   Dt_size_7_Decode((instr >> 6) & 0x3);
  14348                               if (dt.Is(kDataTypeValueInvalid)) {
  14349                                 UnallocatedT32(instr);
  14350                                 return;
  14351                               }
  14352                               Alignment align =
  14353                                   Align_align_4_Decode((instr >> 4) & 0x3);
  14354                               if (dt.Is(kDataTypeValueInvalid) ||
  14355                                   align.Is(kBadAlignment)) {
  14356                                 UnallocatedT32(instr);
  14357                                 return;
  14358                               }
  14359                               unsigned first = ExtractDRegister(instr, 22, 12);
  14360                               unsigned length;
  14361                               SpacingType spacing;
  14362                               switch ((instr >> 8) & 0xf) {
  14363                                 default:
  14364                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  14365                                 case 0x0:
  14366                                   length = 4;
  14367                                   spacing = kSingle;
  14368                                   break;
  14369                                 case 0x1:
  14370                                   length = 4;
  14371                                   spacing = kDouble;
  14372                                   break;
  14373                               }
  14374                               unsigned last =
  14375                                   first +
  14376                                   (length - 1) * (spacing == kSingle ? 1 : 2);
  14377                               TransferType transfer = kMultipleLanes;
  14378                               unsigned rn = (instr >> 16) & 0xf;
  14379                               unsigned rm = instr & 0xf;
  14380                               // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  14381                               vld4(CurrentCond(),
  14382                                    dt,
  14383                                    NeonRegisterList(DRegister(first),
  14384                                                     DRegister(last),
  14385                                                     spacing,
  14386                                                     transfer),
  14387                                    AlignedMemOperand(Register(rn),
  14388                                                      align,
  14389                                                      Register(rm),
  14390                                                      PostIndex));
  14391                               break;
  14392                             }
  14393                             case 0x00000200: {
  14394                               // 0xf9200200
  14395                               if (((instr & 0xd) == 0xd) ||
  14396                                   ((instr & 0xe20) == 0x620) ||
  14397                                   ((instr & 0xf30) == 0xa30)) {
  14398                                 UnallocatedT32(instr);
  14399                                 return;
  14400                               }
  14401                               DataType dt =
  14402                                   Dt_size_6_Decode((instr >> 6) & 0x3);
  14403                               if (dt.Is(kDataTypeValueInvalid)) {
  14404                                 UnallocatedT32(instr);
  14405                                 return;
  14406                               }
  14407                               Alignment align =
  14408                                   Align_align_1_Decode((instr >> 4) & 0x3);
  14409                               if (dt.Is(kDataTypeValueInvalid) ||
  14410                                   align.Is(kBadAlignment)) {
  14411                                 UnallocatedT32(instr);
  14412                                 return;
  14413                               }
  14414                               unsigned first = ExtractDRegister(instr, 22, 12);
  14415                               unsigned length;
  14416                               SpacingType spacing = kSingle;
  14417                               switch ((instr >> 8) & 0xf) {
  14418                                 default:
  14419                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  14420                                 case 0x7:
  14421                                   length = 1;
  14422                                   break;
  14423                                 case 0xa:
  14424                                   length = 2;
  14425                                   break;
  14426                                 case 0x6:
  14427                                   length = 3;
  14428                                   break;
  14429                                 case 0x2:
  14430                                   length = 4;
  14431                                   break;
  14432                               }
  14433                               unsigned last = first + length - 1;
  14434                               TransferType transfer = kMultipleLanes;
  14435                               unsigned rn = (instr >> 16) & 0xf;
  14436                               unsigned rm = instr & 0xf;
  14437                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  14438                               vld1(CurrentCond(),
  14439                                    dt,
  14440                                    NeonRegisterList(DRegister(first),
  14441                                                     DRegister(last),
  14442                                                     spacing,
  14443                                                     transfer),
  14444                                    AlignedMemOperand(Register(rn),
  14445                                                      align,
  14446                                                      Register(rm),
  14447                                                      PostIndex));
  14448                               break;
  14449                             }
  14450                             case 0x00000300: {
  14451                               // 0xf9200300
  14452                               if (((instr & 0xd) == 0xd) ||
  14453                                   ((instr & 0xe30) == 0x830)) {
  14454                                 UnallocatedT32(instr);
  14455                                 return;
  14456                               }
  14457                               DataType dt =
  14458                                   Dt_size_7_Decode((instr >> 6) & 0x3);
  14459                               if (dt.Is(kDataTypeValueInvalid)) {
  14460                                 UnallocatedT32(instr);
  14461                                 return;
  14462                               }
  14463                               Alignment align =
  14464                                   Align_align_2_Decode((instr >> 4) & 0x3);
  14465                               if (dt.Is(kDataTypeValueInvalid) ||
  14466                                   align.Is(kBadAlignment)) {
  14467                                 UnallocatedT32(instr);
  14468                                 return;
  14469                               }
  14470                               unsigned first = ExtractDRegister(instr, 22, 12);
  14471                               unsigned length;
  14472                               SpacingType spacing;
  14473                               switch ((instr >> 8) & 0xf) {
  14474                                 default:
  14475                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  14476                                 case 0x8:
  14477                                   length = 2;
  14478                                   spacing = kSingle;
  14479                                   break;
  14480                                 case 0x9:
  14481                                   length = 2;
  14482                                   spacing = kDouble;
  14483                                   break;
  14484                                 case 0x3:
  14485                                   length = 4;
  14486                                   spacing = kSingle;
  14487                                   break;
  14488                               }
  14489                               unsigned last =
  14490                                   first +
  14491                                   (length - 1) * (spacing == kSingle ? 1 : 2);
  14492                               TransferType transfer = kMultipleLanes;
  14493                               unsigned rn = (instr >> 16) & 0xf;
  14494                               unsigned rm = instr & 0xf;
  14495                               // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  14496                               vld2(CurrentCond(),
  14497                                    dt,
  14498                                    NeonRegisterList(DRegister(first),
  14499                                                     DRegister(last),
  14500                                                     spacing,
  14501                                                     transfer),
  14502                                    AlignedMemOperand(Register(rn),
  14503                                                      align,
  14504                                                      Register(rm),
  14505                                                      PostIndex));
  14506                               break;
  14507                             }
  14508                             case 0x00000400: {
  14509                               // 0xf9200400
  14510                               if (((instr & 0xd) == 0xd)) {
  14511                                 UnallocatedT32(instr);
  14512                                 return;
  14513                               }
  14514                               DataType dt =
  14515                                   Dt_size_7_Decode((instr >> 6) & 0x3);
  14516                               if (dt.Is(kDataTypeValueInvalid)) {
  14517                                 UnallocatedT32(instr);
  14518                                 return;
  14519                               }
  14520                               Alignment align =
  14521                                   Align_align_3_Decode((instr >> 4) & 0x3);
  14522                               if (dt.Is(kDataTypeValueInvalid) ||
  14523                                   align.Is(kBadAlignment)) {
  14524                                 UnallocatedT32(instr);
  14525                                 return;
  14526                               }
  14527                               unsigned first = ExtractDRegister(instr, 22, 12);
  14528                               unsigned length;
  14529                               SpacingType spacing;
  14530                               switch ((instr >> 8) & 0xf) {
  14531                                 default:
  14532                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  14533                                 case 0x4:
  14534                                   length = 3;
  14535                                   spacing = kSingle;
  14536                                   break;
  14537                                 case 0x5:
  14538                                   length = 3;
  14539                                   spacing = kDouble;
  14540                                   break;
  14541                               }
  14542                               unsigned last =
  14543                                   first +
  14544                                   (length - 1) * (spacing == kSingle ? 1 : 2);
  14545                               TransferType transfer = kMultipleLanes;
  14546                               unsigned rn = (instr >> 16) & 0xf;
  14547                               unsigned rm = instr & 0xf;
  14548                               // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  14549                               vld3(CurrentCond(),
  14550                                    dt,
  14551                                    NeonRegisterList(DRegister(first),
  14552                                                     DRegister(last),
  14553                                                     spacing,
  14554                                                     transfer),
  14555                                    AlignedMemOperand(Register(rn),
  14556                                                      align,
  14557                                                      Register(rm),
  14558                                                      PostIndex));
  14559                               break;
  14560                             }
  14561                             case 0x00000500: {
  14562                               // 0xf9200500
  14563                               if (((instr & 0xd) == 0xd)) {
  14564                                 UnallocatedT32(instr);
  14565                                 return;
  14566                               }
  14567                               DataType dt =
  14568                                   Dt_size_7_Decode((instr >> 6) & 0x3);
  14569                               if (dt.Is(kDataTypeValueInvalid)) {
  14570                                 UnallocatedT32(instr);
  14571                                 return;
  14572                               }
  14573                               Alignment align =
  14574                                   Align_align_3_Decode((instr >> 4) & 0x3);
  14575                               if (dt.Is(kDataTypeValueInvalid) ||
  14576                                   align.Is(kBadAlignment)) {
  14577                                 UnallocatedT32(instr);
  14578                                 return;
  14579                               }
  14580                               unsigned first = ExtractDRegister(instr, 22, 12);
  14581                               unsigned length;
  14582                               SpacingType spacing;
  14583                               switch ((instr >> 8) & 0xf) {
  14584                                 default:
  14585                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  14586                                 case 0x4:
  14587                                   length = 3;
  14588                                   spacing = kSingle;
  14589                                   break;
  14590                                 case 0x5:
  14591                                   length = 3;
  14592                                   spacing = kDouble;
  14593                                   break;
  14594                               }
  14595                               unsigned last =
  14596                                   first +
  14597                                   (length - 1) * (spacing == kSingle ? 1 : 2);
  14598                               TransferType transfer = kMultipleLanes;
  14599                               unsigned rn = (instr >> 16) & 0xf;
  14600                               unsigned rm = instr & 0xf;
  14601                               // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  14602                               vld3(CurrentCond(),
  14603                                    dt,
  14604                                    NeonRegisterList(DRegister(first),
  14605                                                     DRegister(last),
  14606                                                     spacing,
  14607                                                     transfer),
  14608                                    AlignedMemOperand(Register(rn),
  14609                                                      align,
  14610                                                      Register(rm),
  14611                                                      PostIndex));
  14612                               break;
  14613                             }
  14614                             case 0x00000600: {
  14615                               // 0xf9200600
  14616                               if (((instr & 0xd) == 0xd) ||
  14617                                   ((instr & 0xe20) == 0x620) ||
  14618                                   ((instr & 0xf30) == 0xa30)) {
  14619                                 UnallocatedT32(instr);
  14620                                 return;
  14621                               }
  14622                               DataType dt =
  14623                                   Dt_size_6_Decode((instr >> 6) & 0x3);
  14624                               if (dt.Is(kDataTypeValueInvalid)) {
  14625                                 UnallocatedT32(instr);
  14626                                 return;
  14627                               }
  14628                               Alignment align =
  14629                                   Align_align_1_Decode((instr >> 4) & 0x3);
  14630                               if (dt.Is(kDataTypeValueInvalid) ||
  14631                                   align.Is(kBadAlignment)) {
  14632                                 UnallocatedT32(instr);
  14633                                 return;
  14634                               }
  14635                               unsigned first = ExtractDRegister(instr, 22, 12);
  14636                               unsigned length;
  14637                               SpacingType spacing = kSingle;
  14638                               switch ((instr >> 8) & 0xf) {
  14639                                 default:
  14640                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  14641                                 case 0x7:
  14642                                   length = 1;
  14643                                   break;
  14644                                 case 0xa:
  14645                                   length = 2;
  14646                                   break;
  14647                                 case 0x6:
  14648                                   length = 3;
  14649                                   break;
  14650                                 case 0x2:
  14651                                   length = 4;
  14652                                   break;
  14653                               }
  14654                               unsigned last = first + length - 1;
  14655                               TransferType transfer = kMultipleLanes;
  14656                               unsigned rn = (instr >> 16) & 0xf;
  14657                               unsigned rm = instr & 0xf;
  14658                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  14659                               vld1(CurrentCond(),
  14660                                    dt,
  14661                                    NeonRegisterList(DRegister(first),
  14662                                                     DRegister(last),
  14663                                                     spacing,
  14664                                                     transfer),
  14665                                    AlignedMemOperand(Register(rn),
  14666                                                      align,
  14667                                                      Register(rm),
  14668                                                      PostIndex));
  14669                               break;
  14670                             }
  14671                             case 0x00000700: {
  14672                               // 0xf9200700
  14673                               if (((instr & 0xd) == 0xd) ||
  14674                                   ((instr & 0xe20) == 0x620) ||
  14675                                   ((instr & 0xf30) == 0xa30)) {
  14676                                 UnallocatedT32(instr);
  14677                                 return;
  14678                               }
  14679                               DataType dt =
  14680                                   Dt_size_6_Decode((instr >> 6) & 0x3);
  14681                               if (dt.Is(kDataTypeValueInvalid)) {
  14682                                 UnallocatedT32(instr);
  14683                                 return;
  14684                               }
  14685                               Alignment align =
  14686                                   Align_align_1_Decode((instr >> 4) & 0x3);
  14687                               if (dt.Is(kDataTypeValueInvalid) ||
  14688                                   align.Is(kBadAlignment)) {
  14689                                 UnallocatedT32(instr);
  14690                                 return;
  14691                               }
  14692                               unsigned first = ExtractDRegister(instr, 22, 12);
  14693                               unsigned length;
  14694                               SpacingType spacing = kSingle;
  14695                               switch ((instr >> 8) & 0xf) {
  14696                                 default:
  14697                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  14698                                 case 0x7:
  14699                                   length = 1;
  14700                                   break;
  14701                                 case 0xa:
  14702                                   length = 2;
  14703                                   break;
  14704                                 case 0x6:
  14705                                   length = 3;
  14706                                   break;
  14707                                 case 0x2:
  14708                                   length = 4;
  14709                                   break;
  14710                               }
  14711                               unsigned last = first + length - 1;
  14712                               TransferType transfer = kMultipleLanes;
  14713                               unsigned rn = (instr >> 16) & 0xf;
  14714                               unsigned rm = instr & 0xf;
  14715                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  14716                               vld1(CurrentCond(),
  14717                                    dt,
  14718                                    NeonRegisterList(DRegister(first),
  14719                                                     DRegister(last),
  14720                                                     spacing,
  14721                                                     transfer),
  14722                                    AlignedMemOperand(Register(rn),
  14723                                                      align,
  14724                                                      Register(rm),
  14725                                                      PostIndex));
  14726                               break;
  14727                             }
  14728                             case 0x00000800: {
  14729                               // 0xf9200800
  14730                               if (((instr & 0xd) == 0xd) ||
  14731                                   ((instr & 0xe30) == 0x830)) {
  14732                                 UnallocatedT32(instr);
  14733                                 return;
  14734                               }
  14735                               DataType dt =
  14736                                   Dt_size_7_Decode((instr >> 6) & 0x3);
  14737                               if (dt.Is(kDataTypeValueInvalid)) {
  14738                                 UnallocatedT32(instr);
  14739                                 return;
  14740                               }
  14741                               Alignment align =
  14742                                   Align_align_2_Decode((instr >> 4) & 0x3);
  14743                               if (dt.Is(kDataTypeValueInvalid) ||
  14744                                   align.Is(kBadAlignment)) {
  14745                                 UnallocatedT32(instr);
  14746                                 return;
  14747                               }
  14748                               unsigned first = ExtractDRegister(instr, 22, 12);
  14749                               unsigned length;
  14750                               SpacingType spacing;
  14751                               switch ((instr >> 8) & 0xf) {
  14752                                 default:
  14753                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  14754                                 case 0x8:
  14755                                   length = 2;
  14756                                   spacing = kSingle;
  14757                                   break;
  14758                                 case 0x9:
  14759                                   length = 2;
  14760                                   spacing = kDouble;
  14761                                   break;
  14762                                 case 0x3:
  14763                                   length = 4;
  14764                                   spacing = kSingle;
  14765                                   break;
  14766                               }
  14767                               unsigned last =
  14768                                   first +
  14769                                   (length - 1) * (spacing == kSingle ? 1 : 2);
  14770                               TransferType transfer = kMultipleLanes;
  14771                               unsigned rn = (instr >> 16) & 0xf;
  14772                               unsigned rm = instr & 0xf;
  14773                               // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  14774                               vld2(CurrentCond(),
  14775                                    dt,
  14776                                    NeonRegisterList(DRegister(first),
  14777                                                     DRegister(last),
  14778                                                     spacing,
  14779                                                     transfer),
  14780                                    AlignedMemOperand(Register(rn),
  14781                                                      align,
  14782                                                      Register(rm),
  14783                                                      PostIndex));
  14784                               break;
  14785                             }
  14786                             case 0x00000900: {
  14787                               // 0xf9200900
  14788                               if (((instr & 0xd) == 0xd) ||
  14789                                   ((instr & 0xe30) == 0x830)) {
  14790                                 UnallocatedT32(instr);
  14791                                 return;
  14792                               }
  14793                               DataType dt =
  14794                                   Dt_size_7_Decode((instr >> 6) & 0x3);
  14795                               if (dt.Is(kDataTypeValueInvalid)) {
  14796                                 UnallocatedT32(instr);
  14797                                 return;
  14798                               }
  14799                               Alignment align =
  14800                                   Align_align_2_Decode((instr >> 4) & 0x3);
  14801                               if (dt.Is(kDataTypeValueInvalid) ||
  14802                                   align.Is(kBadAlignment)) {
  14803                                 UnallocatedT32(instr);
  14804                                 return;
  14805                               }
  14806                               unsigned first = ExtractDRegister(instr, 22, 12);
  14807                               unsigned length;
  14808                               SpacingType spacing;
  14809                               switch ((instr >> 8) & 0xf) {
  14810                                 default:
  14811                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  14812                                 case 0x8:
  14813                                   length = 2;
  14814                                   spacing = kSingle;
  14815                                   break;
  14816                                 case 0x9:
  14817                                   length = 2;
  14818                                   spacing = kDouble;
  14819                                   break;
  14820                                 case 0x3:
  14821                                   length = 4;
  14822                                   spacing = kSingle;
  14823                                   break;
  14824                               }
  14825                               unsigned last =
  14826                                   first +
  14827                                   (length - 1) * (spacing == kSingle ? 1 : 2);
  14828                               TransferType transfer = kMultipleLanes;
  14829                               unsigned rn = (instr >> 16) & 0xf;
  14830                               unsigned rm = instr & 0xf;
  14831                               // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  14832                               vld2(CurrentCond(),
  14833                                    dt,
  14834                                    NeonRegisterList(DRegister(first),
  14835                                                     DRegister(last),
  14836                                                     spacing,
  14837                                                     transfer),
  14838                                    AlignedMemOperand(Register(rn),
  14839                                                      align,
  14840                                                      Register(rm),
  14841                                                      PostIndex));
  14842                               break;
  14843                             }
  14844                             case 0x00000a00: {
  14845                               // 0xf9200a00
  14846                               if (((instr & 0xd) == 0xd) ||
  14847                                   ((instr & 0xe20) == 0x620) ||
  14848                                   ((instr & 0xf30) == 0xa30)) {
  14849                                 UnallocatedT32(instr);
  14850                                 return;
  14851                               }
  14852                               DataType dt =
  14853                                   Dt_size_6_Decode((instr >> 6) & 0x3);
  14854                               if (dt.Is(kDataTypeValueInvalid)) {
  14855                                 UnallocatedT32(instr);
  14856                                 return;
  14857                               }
  14858                               Alignment align =
  14859                                   Align_align_1_Decode((instr >> 4) & 0x3);
  14860                               if (dt.Is(kDataTypeValueInvalid) ||
  14861                                   align.Is(kBadAlignment)) {
  14862                                 UnallocatedT32(instr);
  14863                                 return;
  14864                               }
  14865                               unsigned first = ExtractDRegister(instr, 22, 12);
  14866                               unsigned length;
  14867                               SpacingType spacing = kSingle;
  14868                               switch ((instr >> 8) & 0xf) {
  14869                                 default:
  14870                                   VIXL_UNREACHABLE_OR_FALLTHROUGH();
  14871                                 case 0x7:
  14872                                   length = 1;
  14873                                   break;
  14874                                 case 0xa:
  14875                                   length = 2;
  14876                                   break;
  14877                                 case 0x6:
  14878                                   length = 3;
  14879                                   break;
  14880                                 case 0x2:
  14881                                   length = 4;
  14882                                   break;
  14883                               }
  14884                               unsigned last = first + length - 1;
  14885                               TransferType transfer = kMultipleLanes;
  14886                               unsigned rn = (instr >> 16) & 0xf;
  14887                               unsigned rm = instr & 0xf;
  14888                               // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  14889                               vld1(CurrentCond(),
  14890                                    dt,
  14891                                    NeonRegisterList(DRegister(first),
  14892                                                     DRegister(last),
  14893                                                     spacing,
  14894                                                     transfer),
  14895                                    AlignedMemOperand(Register(rn),
  14896                                                      align,
  14897                                                      Register(rm),
  14898                                                      PostIndex));
  14899                               break;
  14900                             }
  14901                             default:
  14902                               UnallocatedT32(instr);
  14903                               break;
  14904                           }
  14905                           break;
  14906                         }
  14907                       }
  14908                       break;
  14909                     }
  14910                     case 0x01800000: {
  14911                       // 0xf9800000
  14912                       switch (instr & 0x00000300) {
  14913                         case 0x00000000: {
  14914                           // 0xf9800000
  14915                           switch (instr & 0x00000c00) {
  14916                             case 0x00000c00: {
  14917                               // 0xf9800c00
  14918                               UnallocatedT32(instr);
  14919                               break;
  14920                             }
  14921                             default: {
  14922                               switch (instr & 0x0000000d) {
  14923                                 case 0x0000000d: {
  14924                                   // 0xf980000d
  14925                                   switch (instr & 0x00000002) {
  14926                                     case 0x00000000: {
  14927                                       // 0xf980000d
  14928                                       if (((instr & 0xc00) == 0xc00)) {
  14929                                         UnallocatedT32(instr);
  14930                                         return;
  14931                                       }
  14932                                       DataType dt =
  14933                                           Dt_size_7_Decode((instr >> 10) & 0x3);
  14934                                       if (dt.Is(kDataTypeValueInvalid)) {
  14935                                         UnallocatedT32(instr);
  14936                                         return;
  14937                                       }
  14938                                       DecodeNeonAndAlign decode_neon =
  14939                                           Align_index_align_1_Decode((instr >>
  14940                                                                       4) &
  14941                                                                          0xf,
  14942                                                                      dt);
  14943                                       if (!decode_neon.IsValid()) {
  14944                                         UnallocatedT32(instr);
  14945                                         return;
  14946                                       }
  14947                                       Alignment align = decode_neon.GetAlign();
  14948                                       int lane = decode_neon.GetLane();
  14949                                       SpacingType spacing =
  14950                                           decode_neon.GetSpacing();
  14951                                       unsigned first =
  14952                                           ExtractDRegister(instr, 22, 12);
  14953                                       unsigned length = 1;
  14954                                       unsigned last = first + length - 1;
  14955                                       unsigned rn = (instr >> 16) & 0xf;
  14956                                       // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  14957                                       vst1(CurrentCond(),
  14958                                            dt,
  14959                                            NeonRegisterList(DRegister(first),
  14960                                                             DRegister(last),
  14961                                                             spacing,
  14962                                                             lane),
  14963                                            AlignedMemOperand(Register(rn),
  14964                                                              align,
  14965                                                              PostIndex));
  14966                                       break;
  14967                                     }
  14968                                     case 0x00000002: {
  14969                                       // 0xf980000f
  14970                                       if (((instr & 0xc00) == 0xc00)) {
  14971                                         UnallocatedT32(instr);
  14972                                         return;
  14973                                       }
  14974                                       DataType dt =
  14975                                           Dt_size_7_Decode((instr >> 10) & 0x3);
  14976                                       if (dt.Is(kDataTypeValueInvalid)) {
  14977                                         UnallocatedT32(instr);
  14978                                         return;
  14979                                       }
  14980                                       DecodeNeonAndAlign decode_neon =
  14981                                           Align_index_align_1_Decode((instr >>
  14982                                                                       4) &
  14983                                                                          0xf,
  14984                                                                      dt);
  14985                                       if (!decode_neon.IsValid()) {
  14986                                         UnallocatedT32(instr);
  14987                                         return;
  14988                                       }
  14989                                       Alignment align = decode_neon.GetAlign();
  14990                                       int lane = decode_neon.GetLane();
  14991                                       SpacingType spacing =
  14992                                           decode_neon.GetSpacing();
  14993                                       unsigned first =
  14994                                           ExtractDRegister(instr, 22, 12);
  14995                                       unsigned length = 1;
  14996                                       unsigned last = first + length - 1;
  14997                                       unsigned rn = (instr >> 16) & 0xf;
  14998                                       // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  14999                                       vst1(CurrentCond(),
  15000                                            dt,
  15001                                            NeonRegisterList(DRegister(first),
  15002                                                             DRegister(last),
  15003                                                             spacing,
  15004                                                             lane),
  15005                                            AlignedMemOperand(Register(rn),
  15006                                                              align,
  15007                                                              Offset));
  15008                                       break;
  15009                                     }
  15010                                   }
  15011                                   break;
  15012                                 }
  15013                                 default: {
  15014                                   if (((instr & 0xc00) == 0xc00) ||
  15015                                       ((instr & 0xd) == 0xd)) {
  15016                                     UnallocatedT32(instr);
  15017                                     return;
  15018                                   }
  15019                                   DataType dt =
  15020                                       Dt_size_7_Decode((instr >> 10) & 0x3);
  15021                                   if (dt.Is(kDataTypeValueInvalid)) {
  15022                                     UnallocatedT32(instr);
  15023                                     return;
  15024                                   }
  15025                                   DecodeNeonAndAlign decode_neon =
  15026                                       Align_index_align_1_Decode((instr >> 4) &
  15027                                                                      0xf,
  15028                                                                  dt);
  15029                                   if (!decode_neon.IsValid()) {
  15030                                     UnallocatedT32(instr);
  15031                                     return;
  15032                                   }
  15033                                   Alignment align = decode_neon.GetAlign();
  15034                                   int lane = decode_neon.GetLane();
  15035                                   SpacingType spacing =
  15036                                       decode_neon.GetSpacing();
  15037                                   unsigned first =
  15038                                       ExtractDRegister(instr, 22, 12);
  15039                                   unsigned length = 1;
  15040                                   unsigned last = first + length - 1;
  15041                                   unsigned rn = (instr >> 16) & 0xf;
  15042                                   unsigned rm = instr & 0xf;
  15043                                   // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  15044                                   vst1(CurrentCond(),
  15045                                        dt,
  15046                                        NeonRegisterList(DRegister(first),
  15047                                                         DRegister(last),
  15048                                                         spacing,
  15049                                                         lane),
  15050                                        AlignedMemOperand(Register(rn),
  15051                                                          align,
  15052                                                          Register(rm),
  15053                                                          PostIndex));
  15054                                   break;
  15055                                 }
  15056                               }
  15057                               break;
  15058                             }
  15059                           }
  15060                           break;
  15061                         }
  15062                         case 0x00000100: {
  15063                           // 0xf9800100
  15064                           switch (instr & 0x00000c00) {
  15065                             case 0x00000c00: {
  15066                               // 0xf9800d00
  15067                               UnallocatedT32(instr);
  15068                               break;
  15069                             }
  15070                             default: {
  15071                               switch (instr & 0x0000000d) {
  15072                                 case 0x0000000d: {
  15073                                   // 0xf980010d
  15074                                   switch (instr & 0x00000002) {
  15075                                     case 0x00000000: {
  15076                                       // 0xf980010d
  15077                                       if (((instr & 0xc00) == 0xc00)) {
  15078                                         UnallocatedT32(instr);
  15079                                         return;
  15080                                       }
  15081                                       DataType dt =
  15082                                           Dt_size_7_Decode((instr >> 10) & 0x3);
  15083                                       if (dt.Is(kDataTypeValueInvalid)) {
  15084                                         UnallocatedT32(instr);
  15085                                         return;
  15086                                       }
  15087                                       DecodeNeonAndAlign decode_neon =
  15088                                           Align_index_align_2_Decode((instr >>
  15089                                                                       4) &
  15090                                                                          0xf,
  15091                                                                      dt);
  15092                                       if (!decode_neon.IsValid()) {
  15093                                         UnallocatedT32(instr);
  15094                                         return;
  15095                                       }
  15096                                       Alignment align = decode_neon.GetAlign();
  15097                                       int lane = decode_neon.GetLane();
  15098                                       SpacingType spacing =
  15099                                           decode_neon.GetSpacing();
  15100                                       unsigned first =
  15101                                           ExtractDRegister(instr, 22, 12);
  15102                                       unsigned length = 2;
  15103                                       unsigned last =
  15104                                           first +
  15105                                           (length - 1) *
  15106                                               (spacing == kSingle ? 1 : 2);
  15107                                       unsigned rn = (instr >> 16) & 0xf;
  15108                                       // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  15109                                       vst2(CurrentCond(),
  15110                                            dt,
  15111                                            NeonRegisterList(DRegister(first),
  15112                                                             DRegister(last),
  15113                                                             spacing,
  15114                                                             lane),
  15115                                            AlignedMemOperand(Register(rn),
  15116                                                              align,
  15117                                                              PostIndex));
  15118                                       break;
  15119                                     }
  15120                                     case 0x00000002: {
  15121                                       // 0xf980010f
  15122                                       if (((instr & 0xc00) == 0xc00)) {
  15123                                         UnallocatedT32(instr);
  15124                                         return;
  15125                                       }
  15126                                       DataType dt =
  15127                                           Dt_size_7_Decode((instr >> 10) & 0x3);
  15128                                       if (dt.Is(kDataTypeValueInvalid)) {
  15129                                         UnallocatedT32(instr);
  15130                                         return;
  15131                                       }
  15132                                       DecodeNeonAndAlign decode_neon =
  15133                                           Align_index_align_2_Decode((instr >>
  15134                                                                       4) &
  15135                                                                          0xf,
  15136                                                                      dt);
  15137                                       if (!decode_neon.IsValid()) {
  15138                                         UnallocatedT32(instr);
  15139                                         return;
  15140                                       }
  15141                                       Alignment align = decode_neon.GetAlign();
  15142                                       int lane = decode_neon.GetLane();
  15143                                       SpacingType spacing =
  15144                                           decode_neon.GetSpacing();
  15145                                       unsigned first =
  15146                                           ExtractDRegister(instr, 22, 12);
  15147                                       unsigned length = 2;
  15148                                       unsigned last =
  15149                                           first +
  15150                                           (length - 1) *
  15151                                               (spacing == kSingle ? 1 : 2);
  15152                                       unsigned rn = (instr >> 16) & 0xf;
  15153                                       // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  15154                                       vst2(CurrentCond(),
  15155                                            dt,
  15156                                            NeonRegisterList(DRegister(first),
  15157                                                             DRegister(last),
  15158                                                             spacing,
  15159                                                             lane),
  15160                                            AlignedMemOperand(Register(rn),
  15161                                                              align,
  15162                                                              Offset));
  15163                                       break;
  15164                                     }
  15165                                   }
  15166                                   break;
  15167                                 }
  15168                                 default: {
  15169                                   if (((instr & 0xc00) == 0xc00) ||
  15170                                       ((instr & 0xd) == 0xd)) {
  15171                                     UnallocatedT32(instr);
  15172                                     return;
  15173                                   }
  15174                                   DataType dt =
  15175                                       Dt_size_7_Decode((instr >> 10) & 0x3);
  15176                                   if (dt.Is(kDataTypeValueInvalid)) {
  15177                                     UnallocatedT32(instr);
  15178                                     return;
  15179                                   }
  15180                                   DecodeNeonAndAlign decode_neon =
  15181                                       Align_index_align_2_Decode((instr >> 4) &
  15182                                                                      0xf,
  15183                                                                  dt);
  15184                                   if (!decode_neon.IsValid()) {
  15185                                     UnallocatedT32(instr);
  15186                                     return;
  15187                                   }
  15188                                   Alignment align = decode_neon.GetAlign();
  15189                                   int lane = decode_neon.GetLane();
  15190                                   SpacingType spacing =
  15191                                       decode_neon.GetSpacing();
  15192                                   unsigned first =
  15193                                       ExtractDRegister(instr, 22, 12);
  15194                                   unsigned length = 2;
  15195                                   unsigned last =
  15196                                       first +
  15197                                       (length - 1) *
  15198                                           (spacing == kSingle ? 1 : 2);
  15199                                   unsigned rn = (instr >> 16) & 0xf;
  15200                                   unsigned rm = instr & 0xf;
  15201                                   // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  15202                                   vst2(CurrentCond(),
  15203                                        dt,
  15204                                        NeonRegisterList(DRegister(first),
  15205                                                         DRegister(last),
  15206                                                         spacing,
  15207                                                         lane),
  15208                                        AlignedMemOperand(Register(rn),
  15209                                                          align,
  15210                                                          Register(rm),
  15211                                                          PostIndex));
  15212                                   break;
  15213                                 }
  15214                               }
  15215                               break;
  15216                             }
  15217                           }
  15218                           break;
  15219                         }
  15220                         case 0x00000200: {
  15221                           // 0xf9800200
  15222                           switch (instr & 0x00000c30) {
  15223                             case 0x00000010: {
  15224                               // 0xf9800210
  15225                               UnallocatedT32(instr);
  15226                               break;
  15227                             }
  15228                             case 0x00000030: {
  15229                               // 0xf9800230
  15230                               UnallocatedT32(instr);
  15231                               break;
  15232                             }
  15233                             case 0x00000410: {
  15234                               // 0xf9800610
  15235                               UnallocatedT32(instr);
  15236                               break;
  15237                             }
  15238                             case 0x00000430: {
  15239                               // 0xf9800630
  15240                               UnallocatedT32(instr);
  15241                               break;
  15242                             }
  15243                             case 0x00000810: {
  15244                               // 0xf9800a10
  15245                               UnallocatedT32(instr);
  15246                               break;
  15247                             }
  15248                             case 0x00000820: {
  15249                               // 0xf9800a20
  15250                               UnallocatedT32(instr);
  15251                               break;
  15252                             }
  15253                             case 0x00000830: {
  15254                               // 0xf9800a30
  15255                               UnallocatedT32(instr);
  15256                               break;
  15257                             }
  15258                             case 0x00000c00: {
  15259                               // 0xf9800e00
  15260                               UnallocatedT32(instr);
  15261                               break;
  15262                             }
  15263                             case 0x00000c10: {
  15264                               // 0xf9800e10
  15265                               UnallocatedT32(instr);
  15266                               break;
  15267                             }
  15268                             case 0x00000c20: {
  15269                               // 0xf9800e20
  15270                               UnallocatedT32(instr);
  15271                               break;
  15272                             }
  15273                             case 0x00000c30: {
  15274                               // 0xf9800e30
  15275                               UnallocatedT32(instr);
  15276                               break;
  15277                             }
  15278                             default: {
  15279                               switch (instr & 0x0000000d) {
  15280                                 case 0x0000000d: {
  15281                                   // 0xf980020d
  15282                                   switch (instr & 0x00000002) {
  15283                                     case 0x00000000: {
  15284                                       // 0xf980020d
  15285                                       if (((instr & 0xc00) == 0xc00) ||
  15286                                           ((instr & 0x810) == 0x10) ||
  15287                                           ((instr & 0xc30) == 0x810) ||
  15288                                           ((instr & 0xc30) == 0x820) ||
  15289                                           ((instr & 0xc30) == 0x830)) {
  15290                                         UnallocatedT32(instr);
  15291                                         return;
  15292                                       }
  15293                                       DataType dt =
  15294                                           Dt_size_7_Decode((instr >> 10) & 0x3);
  15295                                       if (dt.Is(kDataTypeValueInvalid)) {
  15296                                         UnallocatedT32(instr);
  15297                                         return;
  15298                                       }
  15299                                       DecodeNeon decode_neon =
  15300                                           Index_1_Decode((instr >> 4) & 0xf,
  15301                                                          dt);
  15302                                       if (!decode_neon.IsValid()) {
  15303                                         UnallocatedT32(instr);
  15304                                         return;
  15305                                       }
  15306                                       int lane = decode_neon.GetLane();
  15307                                       SpacingType spacing =
  15308                                           decode_neon.GetSpacing();
  15309                                       unsigned first =
  15310                                           ExtractDRegister(instr, 22, 12);
  15311                                       unsigned length = 3;
  15312                                       unsigned last =
  15313                                           first +
  15314                                           (length - 1) *
  15315                                               (spacing == kSingle ? 1 : 2);
  15316                                       unsigned rn = (instr >> 16) & 0xf;
  15317                                       // VST3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
  15318                                       vst3(CurrentCond(),
  15319                                            dt,
  15320                                            NeonRegisterList(DRegister(first),
  15321                                                             DRegister(last),
  15322                                                             spacing,
  15323                                                             lane),
  15324                                            MemOperand(Register(rn), PostIndex));
  15325                                       break;
  15326                                     }
  15327                                     case 0x00000002: {
  15328                                       // 0xf980020f
  15329                                       if (((instr & 0xc00) == 0xc00) ||
  15330                                           ((instr & 0x810) == 0x10) ||
  15331                                           ((instr & 0xc30) == 0x810) ||
  15332                                           ((instr & 0xc30) == 0x820) ||
  15333                                           ((instr & 0xc30) == 0x830)) {
  15334                                         UnallocatedT32(instr);
  15335                                         return;
  15336                                       }
  15337                                       DataType dt =
  15338                                           Dt_size_7_Decode((instr >> 10) & 0x3);
  15339                                       if (dt.Is(kDataTypeValueInvalid)) {
  15340                                         UnallocatedT32(instr);
  15341                                         return;
  15342                                       }
  15343                                       DecodeNeon decode_neon =
  15344                                           Index_1_Decode((instr >> 4) & 0xf,
  15345                                                          dt);
  15346                                       if (!decode_neon.IsValid()) {
  15347                                         UnallocatedT32(instr);
  15348                                         return;
  15349                                       }
  15350                                       int lane = decode_neon.GetLane();
  15351                                       SpacingType spacing =
  15352                                           decode_neon.GetSpacing();
  15353                                       unsigned first =
  15354                                           ExtractDRegister(instr, 22, 12);
  15355                                       unsigned length = 3;
  15356                                       unsigned last =
  15357                                           first +
  15358                                           (length - 1) *
  15359                                               (spacing == kSingle ? 1 : 2);
  15360                                       unsigned rn = (instr >> 16) & 0xf;
  15361                                       // VST3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1
  15362                                       vst3(CurrentCond(),
  15363                                            dt,
  15364                                            NeonRegisterList(DRegister(first),
  15365                                                             DRegister(last),
  15366                                                             spacing,
  15367                                                             lane),
  15368                                            MemOperand(Register(rn), Offset));
  15369                                       break;
  15370                                     }
  15371                                   }
  15372                                   break;
  15373                                 }
  15374                                 default: {
  15375                                   if (((instr & 0xc00) == 0xc00) ||
  15376                                       ((instr & 0xd) == 0xd) ||
  15377                                       ((instr & 0x810) == 0x10) ||
  15378                                       ((instr & 0xc30) == 0x810) ||
  15379                                       ((instr & 0xc30) == 0x820) ||
  15380                                       ((instr & 0xc30) == 0x830)) {
  15381                                     UnallocatedT32(instr);
  15382                                     return;
  15383                                   }
  15384                                   DataType dt =
  15385                                       Dt_size_7_Decode((instr >> 10) & 0x3);
  15386                                   if (dt.Is(kDataTypeValueInvalid)) {
  15387                                     UnallocatedT32(instr);
  15388                                     return;
  15389                                   }
  15390                                   DecodeNeon decode_neon =
  15391                                       Index_1_Decode((instr >> 4) & 0xf, dt);
  15392                                   if (!decode_neon.IsValid()) {
  15393                                     UnallocatedT32(instr);
  15394                                     return;
  15395                                   }
  15396                                   int lane = decode_neon.GetLane();
  15397                                   SpacingType spacing =
  15398                                       decode_neon.GetSpacing();
  15399                                   unsigned first =
  15400                                       ExtractDRegister(instr, 22, 12);
  15401                                   unsigned length = 3;
  15402                                   unsigned last =
  15403                                       first +
  15404                                       (length - 1) *
  15405                                           (spacing == kSingle ? 1 : 2);
  15406                                   unsigned rn = (instr >> 16) & 0xf;
  15407                                   Sign sign(plus);
  15408                                   unsigned rm = instr & 0xf;
  15409                                   // VST3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
  15410                                   vst3(CurrentCond(),
  15411                                        dt,
  15412                                        NeonRegisterList(DRegister(first),
  15413                                                         DRegister(last),
  15414                                                         spacing,
  15415                                                         lane),
  15416                                        MemOperand(Register(rn),
  15417                                                   sign,
  15418                                                   Register(rm),
  15419                                                   PostIndex));
  15420                                   break;
  15421                                 }
  15422                               }
  15423                               break;
  15424                             }
  15425                           }
  15426                           break;
  15427                         }
  15428                         case 0x00000300: {
  15429                           // 0xf9800300
  15430                           switch (instr & 0x00000c00) {
  15431                             case 0x00000c00: {
  15432                               // 0xf9800f00
  15433                               UnallocatedT32(instr);
  15434                               break;
  15435                             }
  15436                             default: {
  15437                               switch (instr & 0x0000000d) {
  15438                                 case 0x0000000d: {
  15439                                   // 0xf980030d
  15440                                   switch (instr & 0x00000002) {
  15441                                     case 0x00000000: {
  15442                                       // 0xf980030d
  15443                                       if (((instr & 0xc00) == 0xc00)) {
  15444                                         UnallocatedT32(instr);
  15445                                         return;
  15446                                       }
  15447                                       DataType dt =
  15448                                           Dt_size_7_Decode((instr >> 10) & 0x3);
  15449                                       if (dt.Is(kDataTypeValueInvalid)) {
  15450                                         UnallocatedT32(instr);
  15451                                         return;
  15452                                       }
  15453                                       DecodeNeonAndAlign decode_neon =
  15454                                           Align_index_align_3_Decode((instr >>
  15455                                                                       4) &
  15456                                                                          0xf,
  15457                                                                      dt);
  15458                                       if (!decode_neon.IsValid()) {
  15459                                         UnallocatedT32(instr);
  15460                                         return;
  15461                                       }
  15462                                       Alignment align = decode_neon.GetAlign();
  15463                                       int lane = decode_neon.GetLane();
  15464                                       SpacingType spacing =
  15465                                           decode_neon.GetSpacing();
  15466                                       unsigned first =
  15467                                           ExtractDRegister(instr, 22, 12);
  15468                                       unsigned length = 4;
  15469                                       unsigned last =
  15470                                           first +
  15471                                           (length - 1) *
  15472                                               (spacing == kSingle ? 1 : 2);
  15473                                       unsigned rn = (instr >> 16) & 0xf;
  15474                                       // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  15475                                       vst4(CurrentCond(),
  15476                                            dt,
  15477                                            NeonRegisterList(DRegister(first),
  15478                                                             DRegister(last),
  15479                                                             spacing,
  15480                                                             lane),
  15481                                            AlignedMemOperand(Register(rn),
  15482                                                              align,
  15483                                                              PostIndex));
  15484                                       break;
  15485                                     }
  15486                                     case 0x00000002: {
  15487                                       // 0xf980030f
  15488                                       if (((instr & 0xc00) == 0xc00)) {
  15489                                         UnallocatedT32(instr);
  15490                                         return;
  15491                                       }
  15492                                       DataType dt =
  15493                                           Dt_size_7_Decode((instr >> 10) & 0x3);
  15494                                       if (dt.Is(kDataTypeValueInvalid)) {
  15495                                         UnallocatedT32(instr);
  15496                                         return;
  15497                                       }
  15498                                       DecodeNeonAndAlign decode_neon =
  15499                                           Align_index_align_3_Decode((instr >>
  15500                                                                       4) &
  15501                                                                          0xf,
  15502                                                                      dt);
  15503                                       if (!decode_neon.IsValid()) {
  15504                                         UnallocatedT32(instr);
  15505                                         return;
  15506                                       }
  15507                                       Alignment align = decode_neon.GetAlign();
  15508                                       int lane = decode_neon.GetLane();
  15509                                       SpacingType spacing =
  15510                                           decode_neon.GetSpacing();
  15511                                       unsigned first =
  15512                                           ExtractDRegister(instr, 22, 12);
  15513                                       unsigned length = 4;
  15514                                       unsigned last =
  15515                                           first +
  15516                                           (length - 1) *
  15517                                               (spacing == kSingle ? 1 : 2);
  15518                                       unsigned rn = (instr >> 16) & 0xf;
  15519                                       // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  15520                                       vst4(CurrentCond(),
  15521                                            dt,
  15522                                            NeonRegisterList(DRegister(first),
  15523                                                             DRegister(last),
  15524                                                             spacing,
  15525                                                             lane),
  15526                                            AlignedMemOperand(Register(rn),
  15527                                                              align,
  15528                                                              Offset));
  15529                                       break;
  15530                                     }
  15531                                   }
  15532                                   break;
  15533                                 }
  15534                                 default: {
  15535                                   if (((instr & 0xc00) == 0xc00) ||
  15536                                       ((instr & 0xd) == 0xd)) {
  15537                                     UnallocatedT32(instr);
  15538                                     return;
  15539                                   }
  15540                                   DataType dt =
  15541                                       Dt_size_7_Decode((instr >> 10) & 0x3);
  15542                                   if (dt.Is(kDataTypeValueInvalid)) {
  15543                                     UnallocatedT32(instr);
  15544                                     return;
  15545                                   }
  15546                                   DecodeNeonAndAlign decode_neon =
  15547                                       Align_index_align_3_Decode((instr >> 4) &
  15548                                                                      0xf,
  15549                                                                  dt);
  15550                                   if (!decode_neon.IsValid()) {
  15551                                     UnallocatedT32(instr);
  15552                                     return;
  15553                                   }
  15554                                   Alignment align = decode_neon.GetAlign();
  15555                                   int lane = decode_neon.GetLane();
  15556                                   SpacingType spacing =
  15557                                       decode_neon.GetSpacing();
  15558                                   unsigned first =
  15559                                       ExtractDRegister(instr, 22, 12);
  15560                                   unsigned length = 4;
  15561                                   unsigned last =
  15562                                       first +
  15563                                       (length - 1) *
  15564                                           (spacing == kSingle ? 1 : 2);
  15565                                   unsigned rn = (instr >> 16) & 0xf;
  15566                                   unsigned rm = instr & 0xf;
  15567                                   // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  15568                                   vst4(CurrentCond(),
  15569                                        dt,
  15570                                        NeonRegisterList(DRegister(first),
  15571                                                         DRegister(last),
  15572                                                         spacing,
  15573                                                         lane),
  15574                                        AlignedMemOperand(Register(rn),
  15575                                                          align,
  15576                                                          Register(rm),
  15577                                                          PostIndex));
  15578                                   break;
  15579                                 }
  15580                               }
  15581                               break;
  15582                             }
  15583                           }
  15584                           break;
  15585                         }
  15586                       }
  15587                       break;
  15588                     }
  15589                     case 0x01a00000: {
  15590                       // 0xf9a00000
  15591                       switch (instr & 0x00000300) {
  15592                         case 0x00000000: {
  15593                           // 0xf9a00000
  15594                           switch (instr & 0x00000c00) {
  15595                             case 0x00000c00: {
  15596                               // 0xf9a00c00
  15597                               switch (instr & 0x0000000d) {
  15598                                 case 0x0000000d: {
  15599                                   // 0xf9a00c0d
  15600                                   switch (instr & 0x00000002) {
  15601                                     case 0x00000000: {
  15602                                       // 0xf9a00c0d
  15603                                       DataType dt =
  15604                                           Dt_size_7_Decode((instr >> 6) & 0x3);
  15605                                       if (dt.Is(kDataTypeValueInvalid)) {
  15606                                         UnallocatedT32(instr);
  15607                                         return;
  15608                                       }
  15609                                       Alignment align =
  15610                                           Align_a_1_Decode((instr >> 4) & 0x1,
  15611                                                            dt);
  15612                                       if (dt.Is(kDataTypeValueInvalid) ||
  15613                                           align.Is(kBadAlignment)) {
  15614                                         UnallocatedT32(instr);
  15615                                         return;
  15616                                       }
  15617                                       unsigned first =
  15618                                           ExtractDRegister(instr, 22, 12);
  15619                                       unsigned length;
  15620                                       SpacingType spacing = kSingle;
  15621                                       switch ((instr >> 5) & 0x1) {
  15622                                         default:
  15623                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
  15624                                         case 0x0:
  15625                                           length = 1;
  15626                                           break;
  15627                                         case 0x1:
  15628                                           length = 2;
  15629                                           break;
  15630                                       }
  15631                                       unsigned last = first + length - 1;
  15632                                       TransferType transfer = kAllLanes;
  15633                                       unsigned rn = (instr >> 16) & 0xf;
  15634                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  15635                                       vld1(CurrentCond(),
  15636                                            dt,
  15637                                            NeonRegisterList(DRegister(first),
  15638                                                             DRegister(last),
  15639                                                             spacing,
  15640                                                             transfer),
  15641                                            AlignedMemOperand(Register(rn),
  15642                                                              align,
  15643                                                              PostIndex));
  15644                                       break;
  15645                                     }
  15646                                     case 0x00000002: {
  15647                                       // 0xf9a00c0f
  15648                                       DataType dt =
  15649                                           Dt_size_7_Decode((instr >> 6) & 0x3);
  15650                                       if (dt.Is(kDataTypeValueInvalid)) {
  15651                                         UnallocatedT32(instr);
  15652                                         return;
  15653                                       }
  15654                                       Alignment align =
  15655                                           Align_a_1_Decode((instr >> 4) & 0x1,
  15656                                                            dt);
  15657                                       if (dt.Is(kDataTypeValueInvalid) ||
  15658                                           align.Is(kBadAlignment)) {
  15659                                         UnallocatedT32(instr);
  15660                                         return;
  15661                                       }
  15662                                       unsigned first =
  15663                                           ExtractDRegister(instr, 22, 12);
  15664                                       unsigned length;
  15665                                       SpacingType spacing = kSingle;
  15666                                       switch ((instr >> 5) & 0x1) {
  15667                                         default:
  15668                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
  15669                                         case 0x0:
  15670                                           length = 1;
  15671                                           break;
  15672                                         case 0x1:
  15673                                           length = 2;
  15674                                           break;
  15675                                       }
  15676                                       unsigned last = first + length - 1;
  15677                                       TransferType transfer = kAllLanes;
  15678                                       unsigned rn = (instr >> 16) & 0xf;
  15679                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  15680                                       vld1(CurrentCond(),
  15681                                            dt,
  15682                                            NeonRegisterList(DRegister(first),
  15683                                                             DRegister(last),
  15684                                                             spacing,
  15685                                                             transfer),
  15686                                            AlignedMemOperand(Register(rn),
  15687                                                              align,
  15688                                                              Offset));
  15689                                       break;
  15690                                     }
  15691                                   }
  15692                                   break;
  15693                                 }
  15694                                 default: {
  15695                                   if (((instr & 0xd) == 0xd)) {
  15696                                     UnallocatedT32(instr);
  15697                                     return;
  15698                                   }
  15699                                   DataType dt =
  15700                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  15701                                   if (dt.Is(kDataTypeValueInvalid)) {
  15702                                     UnallocatedT32(instr);
  15703                                     return;
  15704                                   }
  15705                                   Alignment align =
  15706                                       Align_a_1_Decode((instr >> 4) & 0x1, dt);
  15707                                   if (dt.Is(kDataTypeValueInvalid) ||
  15708                                       align.Is(kBadAlignment)) {
  15709                                     UnallocatedT32(instr);
  15710                                     return;
  15711                                   }
  15712                                   unsigned first =
  15713                                       ExtractDRegister(instr, 22, 12);
  15714                                   unsigned length;
  15715                                   SpacingType spacing = kSingle;
  15716                                   switch ((instr >> 5) & 0x1) {
  15717                                     default:
  15718                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  15719                                     case 0x0:
  15720                                       length = 1;
  15721                                       break;
  15722                                     case 0x1:
  15723                                       length = 2;
  15724                                       break;
  15725                                   }
  15726                                   unsigned last = first + length - 1;
  15727                                   TransferType transfer = kAllLanes;
  15728                                   unsigned rn = (instr >> 16) & 0xf;
  15729                                   unsigned rm = instr & 0xf;
  15730                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  15731                                   vld1(CurrentCond(),
  15732                                        dt,
  15733                                        NeonRegisterList(DRegister(first),
  15734                                                         DRegister(last),
  15735                                                         spacing,
  15736                                                         transfer),
  15737                                        AlignedMemOperand(Register(rn),
  15738                                                          align,
  15739                                                          Register(rm),
  15740                                                          PostIndex));
  15741                                   break;
  15742                                 }
  15743                               }
  15744                               break;
  15745                             }
  15746                             default: {
  15747                               switch (instr & 0x0000000d) {
  15748                                 case 0x0000000d: {
  15749                                   // 0xf9a0000d
  15750                                   switch (instr & 0x00000002) {
  15751                                     case 0x00000000: {
  15752                                       // 0xf9a0000d
  15753                                       if (((instr & 0xc00) == 0xc00)) {
  15754                                         UnallocatedT32(instr);
  15755                                         return;
  15756                                       }
  15757                                       DataType dt =
  15758                                           Dt_size_7_Decode((instr >> 10) & 0x3);
  15759                                       if (dt.Is(kDataTypeValueInvalid)) {
  15760                                         UnallocatedT32(instr);
  15761                                         return;
  15762                                       }
  15763                                       DecodeNeonAndAlign decode_neon =
  15764                                           Align_index_align_1_Decode((instr >>
  15765                                                                       4) &
  15766                                                                          0xf,
  15767                                                                      dt);
  15768                                       if (!decode_neon.IsValid()) {
  15769                                         UnallocatedT32(instr);
  15770                                         return;
  15771                                       }
  15772                                       Alignment align = decode_neon.GetAlign();
  15773                                       int lane = decode_neon.GetLane();
  15774                                       SpacingType spacing =
  15775                                           decode_neon.GetSpacing();
  15776                                       unsigned first =
  15777                                           ExtractDRegister(instr, 22, 12);
  15778                                       unsigned length = 1;
  15779                                       unsigned last = first + length - 1;
  15780                                       unsigned rn = (instr >> 16) & 0xf;
  15781                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  15782                                       vld1(CurrentCond(),
  15783                                            dt,
  15784                                            NeonRegisterList(DRegister(first),
  15785                                                             DRegister(last),
  15786                                                             spacing,
  15787                                                             lane),
  15788                                            AlignedMemOperand(Register(rn),
  15789                                                              align,
  15790                                                              PostIndex));
  15791                                       break;
  15792                                     }
  15793                                     case 0x00000002: {
  15794                                       // 0xf9a0000f
  15795                                       if (((instr & 0xc00) == 0xc00)) {
  15796                                         UnallocatedT32(instr);
  15797                                         return;
  15798                                       }
  15799                                       DataType dt =
  15800                                           Dt_size_7_Decode((instr >> 10) & 0x3);
  15801                                       if (dt.Is(kDataTypeValueInvalid)) {
  15802                                         UnallocatedT32(instr);
  15803                                         return;
  15804                                       }
  15805                                       DecodeNeonAndAlign decode_neon =
  15806                                           Align_index_align_1_Decode((instr >>
  15807                                                                       4) &
  15808                                                                          0xf,
  15809                                                                      dt);
  15810                                       if (!decode_neon.IsValid()) {
  15811                                         UnallocatedT32(instr);
  15812                                         return;
  15813                                       }
  15814                                       Alignment align = decode_neon.GetAlign();
  15815                                       int lane = decode_neon.GetLane();
  15816                                       SpacingType spacing =
  15817                                           decode_neon.GetSpacing();
  15818                                       unsigned first =
  15819                                           ExtractDRegister(instr, 22, 12);
  15820                                       unsigned length = 1;
  15821                                       unsigned last = first + length - 1;
  15822                                       unsigned rn = (instr >> 16) & 0xf;
  15823                                       // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  15824                                       vld1(CurrentCond(),
  15825                                            dt,
  15826                                            NeonRegisterList(DRegister(first),
  15827                                                             DRegister(last),
  15828                                                             spacing,
  15829                                                             lane),
  15830                                            AlignedMemOperand(Register(rn),
  15831                                                              align,
  15832                                                              Offset));
  15833                                       break;
  15834                                     }
  15835                                   }
  15836                                   break;
  15837                                 }
  15838                                 default: {
  15839                                   if (((instr & 0xc00) == 0xc00) ||
  15840                                       ((instr & 0xd) == 0xd)) {
  15841                                     UnallocatedT32(instr);
  15842                                     return;
  15843                                   }
  15844                                   DataType dt =
  15845                                       Dt_size_7_Decode((instr >> 10) & 0x3);
  15846                                   if (dt.Is(kDataTypeValueInvalid)) {
  15847                                     UnallocatedT32(instr);
  15848                                     return;
  15849                                   }
  15850                                   DecodeNeonAndAlign decode_neon =
  15851                                       Align_index_align_1_Decode((instr >> 4) &
  15852                                                                      0xf,
  15853                                                                  dt);
  15854                                   if (!decode_neon.IsValid()) {
  15855                                     UnallocatedT32(instr);
  15856                                     return;
  15857                                   }
  15858                                   Alignment align = decode_neon.GetAlign();
  15859                                   int lane = decode_neon.GetLane();
  15860                                   SpacingType spacing =
  15861                                       decode_neon.GetSpacing();
  15862                                   unsigned first =
  15863                                       ExtractDRegister(instr, 22, 12);
  15864                                   unsigned length = 1;
  15865                                   unsigned last = first + length - 1;
  15866                                   unsigned rn = (instr >> 16) & 0xf;
  15867                                   unsigned rm = instr & 0xf;
  15868                                   // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  15869                                   vld1(CurrentCond(),
  15870                                        dt,
  15871                                        NeonRegisterList(DRegister(first),
  15872                                                         DRegister(last),
  15873                                                         spacing,
  15874                                                         lane),
  15875                                        AlignedMemOperand(Register(rn),
  15876                                                          align,
  15877                                                          Register(rm),
  15878                                                          PostIndex));
  15879                                   break;
  15880                                 }
  15881                               }
  15882                               break;
  15883                             }
  15884                           }
  15885                           break;
  15886                         }
  15887                         case 0x00000100: {
  15888                           // 0xf9a00100
  15889                           switch (instr & 0x00000c00) {
  15890                             case 0x00000c00: {
  15891                               // 0xf9a00d00
  15892                               switch (instr & 0x0000000d) {
  15893                                 case 0x0000000d: {
  15894                                   // 0xf9a00d0d
  15895                                   switch (instr & 0x00000002) {
  15896                                     case 0x00000000: {
  15897                                       // 0xf9a00d0d
  15898                                       DataType dt =
  15899                                           Dt_size_7_Decode((instr >> 6) & 0x3);
  15900                                       if (dt.Is(kDataTypeValueInvalid)) {
  15901                                         UnallocatedT32(instr);
  15902                                         return;
  15903                                       }
  15904                                       Alignment align =
  15905                                           Align_a_2_Decode((instr >> 4) & 0x1,
  15906                                                            dt);
  15907                                       if (dt.Is(kDataTypeValueInvalid) ||
  15908                                           align.Is(kBadAlignment)) {
  15909                                         UnallocatedT32(instr);
  15910                                         return;
  15911                                       }
  15912                                       unsigned first =
  15913                                           ExtractDRegister(instr, 22, 12);
  15914                                       unsigned length;
  15915                                       SpacingType spacing;
  15916                                       switch ((instr >> 5) & 0x1) {
  15917                                         default:
  15918                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
  15919                                         case 0x0:
  15920                                           length = 2;
  15921                                           spacing = kSingle;
  15922                                           break;
  15923                                         case 0x1:
  15924                                           length = 2;
  15925                                           spacing = kDouble;
  15926                                           break;
  15927                                       }
  15928                                       unsigned last =
  15929                                           first +
  15930                                           (length - 1) *
  15931                                               (spacing == kSingle ? 1 : 2);
  15932                                       TransferType transfer = kAllLanes;
  15933                                       unsigned rn = (instr >> 16) & 0xf;
  15934                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  15935                                       vld2(CurrentCond(),
  15936                                            dt,
  15937                                            NeonRegisterList(DRegister(first),
  15938                                                             DRegister(last),
  15939                                                             spacing,
  15940                                                             transfer),
  15941                                            AlignedMemOperand(Register(rn),
  15942                                                              align,
  15943                                                              PostIndex));
  15944                                       break;
  15945                                     }
  15946                                     case 0x00000002: {
  15947                                       // 0xf9a00d0f
  15948                                       DataType dt =
  15949                                           Dt_size_7_Decode((instr >> 6) & 0x3);
  15950                                       if (dt.Is(kDataTypeValueInvalid)) {
  15951                                         UnallocatedT32(instr);
  15952                                         return;
  15953                                       }
  15954                                       Alignment align =
  15955                                           Align_a_2_Decode((instr >> 4) & 0x1,
  15956                                                            dt);
  15957                                       if (dt.Is(kDataTypeValueInvalid) ||
  15958                                           align.Is(kBadAlignment)) {
  15959                                         UnallocatedT32(instr);
  15960                                         return;
  15961                                       }
  15962                                       unsigned first =
  15963                                           ExtractDRegister(instr, 22, 12);
  15964                                       unsigned length;
  15965                                       SpacingType spacing;
  15966                                       switch ((instr >> 5) & 0x1) {
  15967                                         default:
  15968                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
  15969                                         case 0x0:
  15970                                           length = 2;
  15971                                           spacing = kSingle;
  15972                                           break;
  15973                                         case 0x1:
  15974                                           length = 2;
  15975                                           spacing = kDouble;
  15976                                           break;
  15977                                       }
  15978                                       unsigned last =
  15979                                           first +
  15980                                           (length - 1) *
  15981                                               (spacing == kSingle ? 1 : 2);
  15982                                       TransferType transfer = kAllLanes;
  15983                                       unsigned rn = (instr >> 16) & 0xf;
  15984                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  15985                                       vld2(CurrentCond(),
  15986                                            dt,
  15987                                            NeonRegisterList(DRegister(first),
  15988                                                             DRegister(last),
  15989                                                             spacing,
  15990                                                             transfer),
  15991                                            AlignedMemOperand(Register(rn),
  15992                                                              align,
  15993                                                              Offset));
  15994                                       break;
  15995                                     }
  15996                                   }
  15997                                   break;
  15998                                 }
  15999                                 default: {
  16000                                   if (((instr & 0xd) == 0xd)) {
  16001                                     UnallocatedT32(instr);
  16002                                     return;
  16003                                   }
  16004                                   DataType dt =
  16005                                       Dt_size_7_Decode((instr >> 6) & 0x3);
  16006                                   if (dt.Is(kDataTypeValueInvalid)) {
  16007                                     UnallocatedT32(instr);
  16008                                     return;
  16009                                   }
  16010                                   Alignment align =
  16011                                       Align_a_2_Decode((instr >> 4) & 0x1, dt);
  16012                                   if (dt.Is(kDataTypeValueInvalid) ||
  16013                                       align.Is(kBadAlignment)) {
  16014                                     UnallocatedT32(instr);
  16015                                     return;
  16016                                   }
  16017                                   unsigned first =
  16018                                       ExtractDRegister(instr, 22, 12);
  16019                                   unsigned length;
  16020                                   SpacingType spacing;
  16021                                   switch ((instr >> 5) & 0x1) {
  16022                                     default:
  16023                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  16024                                     case 0x0:
  16025                                       length = 2;
  16026                                       spacing = kSingle;
  16027                                       break;
  16028                                     case 0x1:
  16029                                       length = 2;
  16030                                       spacing = kDouble;
  16031                                       break;
  16032                                   }
  16033                                   unsigned last =
  16034                                       first +
  16035                                       (length - 1) *
  16036                                           (spacing == kSingle ? 1 : 2);
  16037                                   TransferType transfer = kAllLanes;
  16038                                   unsigned rn = (instr >> 16) & 0xf;
  16039                                   unsigned rm = instr & 0xf;
  16040                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  16041                                   vld2(CurrentCond(),
  16042                                        dt,
  16043                                        NeonRegisterList(DRegister(first),
  16044                                                         DRegister(last),
  16045                                                         spacing,
  16046                                                         transfer),
  16047                                        AlignedMemOperand(Register(rn),
  16048                                                          align,
  16049                                                          Register(rm),
  16050                                                          PostIndex));
  16051                                   break;
  16052                                 }
  16053                               }
  16054                               break;
  16055                             }
  16056                             default: {
  16057                               switch (instr & 0x0000000d) {
  16058                                 case 0x0000000d: {
  16059                                   // 0xf9a0010d
  16060                                   switch (instr & 0x00000002) {
  16061                                     case 0x00000000: {
  16062                                       // 0xf9a0010d
  16063                                       if (((instr & 0xc00) == 0xc00)) {
  16064                                         UnallocatedT32(instr);
  16065                                         return;
  16066                                       }
  16067                                       DataType dt =
  16068                                           Dt_size_7_Decode((instr >> 10) & 0x3);
  16069                                       if (dt.Is(kDataTypeValueInvalid)) {
  16070                                         UnallocatedT32(instr);
  16071                                         return;
  16072                                       }
  16073                                       DecodeNeonAndAlign decode_neon =
  16074                                           Align_index_align_2_Decode((instr >>
  16075                                                                       4) &
  16076                                                                          0xf,
  16077                                                                      dt);
  16078                                       if (!decode_neon.IsValid()) {
  16079                                         UnallocatedT32(instr);
  16080                                         return;
  16081                                       }
  16082                                       Alignment align = decode_neon.GetAlign();
  16083                                       int lane = decode_neon.GetLane();
  16084                                       SpacingType spacing =
  16085                                           decode_neon.GetSpacing();
  16086                                       unsigned first =
  16087                                           ExtractDRegister(instr, 22, 12);
  16088                                       unsigned length = 2;
  16089                                       unsigned last =
  16090                                           first +
  16091                                           (length - 1) *
  16092                                               (spacing == kSingle ? 1 : 2);
  16093                                       unsigned rn = (instr >> 16) & 0xf;
  16094                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  16095                                       vld2(CurrentCond(),
  16096                                            dt,
  16097                                            NeonRegisterList(DRegister(first),
  16098                                                             DRegister(last),
  16099                                                             spacing,
  16100                                                             lane),
  16101                                            AlignedMemOperand(Register(rn),
  16102                                                              align,
  16103                                                              PostIndex));
  16104                                       break;
  16105                                     }
  16106                                     case 0x00000002: {
  16107                                       // 0xf9a0010f
  16108                                       if (((instr & 0xc00) == 0xc00)) {
  16109                                         UnallocatedT32(instr);
  16110                                         return;
  16111                                       }
  16112                                       DataType dt =
  16113                                           Dt_size_7_Decode((instr >> 10) & 0x3);
  16114                                       if (dt.Is(kDataTypeValueInvalid)) {
  16115                                         UnallocatedT32(instr);
  16116                                         return;
  16117                                       }
  16118                                       DecodeNeonAndAlign decode_neon =
  16119                                           Align_index_align_2_Decode((instr >>
  16120                                                                       4) &
  16121                                                                          0xf,
  16122                                                                      dt);
  16123                                       if (!decode_neon.IsValid()) {
  16124                                         UnallocatedT32(instr);
  16125                                         return;
  16126                                       }
  16127                                       Alignment align = decode_neon.GetAlign();
  16128                                       int lane = decode_neon.GetLane();
  16129                                       SpacingType spacing =
  16130                                           decode_neon.GetSpacing();
  16131                                       unsigned first =
  16132                                           ExtractDRegister(instr, 22, 12);
  16133                                       unsigned length = 2;
  16134                                       unsigned last =
  16135                                           first +
  16136                                           (length - 1) *
  16137                                               (spacing == kSingle ? 1 : 2);
  16138                                       unsigned rn = (instr >> 16) & 0xf;
  16139                                       // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  16140                                       vld2(CurrentCond(),
  16141                                            dt,
  16142                                            NeonRegisterList(DRegister(first),
  16143                                                             DRegister(last),
  16144                                                             spacing,
  16145                                                             lane),
  16146                                            AlignedMemOperand(Register(rn),
  16147                                                              align,
  16148                                                              Offset));
  16149                                       break;
  16150                                     }
  16151                                   }
  16152                                   break;
  16153                                 }
  16154                                 default: {
  16155                                   if (((instr & 0xc00) == 0xc00) ||
  16156                                       ((instr & 0xd) == 0xd)) {
  16157                                     UnallocatedT32(instr);
  16158                                     return;
  16159                                   }
  16160                                   DataType dt =
  16161                                       Dt_size_7_Decode((instr >> 10) & 0x3);
  16162                                   if (dt.Is(kDataTypeValueInvalid)) {
  16163                                     UnallocatedT32(instr);
  16164                                     return;
  16165                                   }
  16166                                   DecodeNeonAndAlign decode_neon =
  16167                                       Align_index_align_2_Decode((instr >> 4) &
  16168                                                                      0xf,
  16169                                                                  dt);
  16170                                   if (!decode_neon.IsValid()) {
  16171                                     UnallocatedT32(instr);
  16172                                     return;
  16173                                   }
  16174                                   Alignment align = decode_neon.GetAlign();
  16175                                   int lane = decode_neon.GetLane();
  16176                                   SpacingType spacing =
  16177                                       decode_neon.GetSpacing();
  16178                                   unsigned first =
  16179                                       ExtractDRegister(instr, 22, 12);
  16180                                   unsigned length = 2;
  16181                                   unsigned last =
  16182                                       first +
  16183                                       (length - 1) *
  16184                                           (spacing == kSingle ? 1 : 2);
  16185                                   unsigned rn = (instr >> 16) & 0xf;
  16186                                   unsigned rm = instr & 0xf;
  16187                                   // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  16188                                   vld2(CurrentCond(),
  16189                                        dt,
  16190                                        NeonRegisterList(DRegister(first),
  16191                                                         DRegister(last),
  16192                                                         spacing,
  16193                                                         lane),
  16194                                        AlignedMemOperand(Register(rn),
  16195                                                          align,
  16196                                                          Register(rm),
  16197                                                          PostIndex));
  16198                                   break;
  16199                                 }
  16200                               }
  16201                               break;
  16202                             }
  16203                           }
  16204                           break;
  16205                         }
  16206                         case 0x00000200: {
  16207                           // 0xf9a00200
  16208                           switch (instr & 0x00000c00) {
  16209                             case 0x00000c00: {
  16210                               // 0xf9a00e00
  16211                               switch (instr & 0x00000010) {
  16212                                 case 0x00000000: {
  16213                                   // 0xf9a00e00
  16214                                   switch (instr & 0x0000000d) {
  16215                                     case 0x0000000d: {
  16216                                       // 0xf9a00e0d
  16217                                       switch (instr & 0x00000002) {
  16218                                         case 0x00000000: {
  16219                                           // 0xf9a00e0d
  16220                                           DataType dt = Dt_size_7_Decode(
  16221                                               (instr >> 6) & 0x3);
  16222                                           if (dt.Is(kDataTypeValueInvalid)) {
  16223                                             UnallocatedT32(instr);
  16224                                             return;
  16225                                           }
  16226                                           unsigned first =
  16227                                               ExtractDRegister(instr, 22, 12);
  16228                                           unsigned length;
  16229                                           SpacingType spacing;
  16230                                           switch ((instr >> 5) & 0x1) {
  16231                                             default:
  16232                                               VIXL_UNREACHABLE_OR_FALLTHROUGH();
  16233                                             case 0x0:
  16234                                               length = 3;
  16235                                               spacing = kSingle;
  16236                                               break;
  16237                                             case 0x1:
  16238                                               length = 3;
  16239                                               spacing = kDouble;
  16240                                               break;
  16241                                           }
  16242                                           unsigned last =
  16243                                               first +
  16244                                               (length - 1) *
  16245                                                   (spacing == kSingle ? 1 : 2);
  16246                                           TransferType transfer = kAllLanes;
  16247                                           unsigned rn = (instr >> 16) & 0xf;
  16248                                           // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
  16249                                           vld3(CurrentCond(),
  16250                                                dt,
  16251                                                NeonRegisterList(DRegister(
  16252                                                                     first),
  16253                                                                 DRegister(last),
  16254                                                                 spacing,
  16255                                                                 transfer),
  16256                                                MemOperand(Register(rn),
  16257                                                           PostIndex));
  16258                                           break;
  16259                                         }
  16260                                         case 0x00000002: {
  16261                                           // 0xf9a00e0f
  16262                                           DataType dt = Dt_size_7_Decode(
  16263                                               (instr >> 6) & 0x3);
  16264                                           if (dt.Is(kDataTypeValueInvalid)) {
  16265                                             UnallocatedT32(instr);
  16266                                             return;
  16267                                           }
  16268                                           unsigned first =
  16269                                               ExtractDRegister(instr, 22, 12);
  16270                                           unsigned length;
  16271                                           SpacingType spacing;
  16272                                           switch ((instr >> 5) & 0x1) {
  16273                                             default:
  16274                                               VIXL_UNREACHABLE_OR_FALLTHROUGH();
  16275                                             case 0x0:
  16276                                               length = 3;
  16277                                               spacing = kSingle;
  16278                                               break;
  16279                                             case 0x1:
  16280                                               length = 3;
  16281                                               spacing = kDouble;
  16282                                               break;
  16283                                           }
  16284                                           unsigned last =
  16285                                               first +
  16286                                               (length - 1) *
  16287                                                   (spacing == kSingle ? 1 : 2);
  16288                                           TransferType transfer = kAllLanes;
  16289                                           unsigned rn = (instr >> 16) & 0xf;
  16290                                           // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
  16291                                           vld3(CurrentCond(),
  16292                                                dt,
  16293                                                NeonRegisterList(DRegister(
  16294                                                                     first),
  16295                                                                 DRegister(last),
  16296                                                                 spacing,
  16297                                                                 transfer),
  16298                                                MemOperand(Register(rn),
  16299                                                           Offset));
  16300                                           break;
  16301                                         }
  16302                                       }
  16303                                       break;
  16304                                     }
  16305                                     default: {
  16306                                       if (((instr & 0xd) == 0xd)) {
  16307                                         UnallocatedT32(instr);
  16308                                         return;
  16309                                       }
  16310                                       DataType dt =
  16311                                           Dt_size_7_Decode((instr >> 6) & 0x3);
  16312                                       if (dt.Is(kDataTypeValueInvalid)) {
  16313                                         UnallocatedT32(instr);
  16314                                         return;
  16315                                       }
  16316                                       unsigned first =
  16317                                           ExtractDRegister(instr, 22, 12);
  16318                                       unsigned length;
  16319                                       SpacingType spacing;
  16320                                       switch ((instr >> 5) & 0x1) {
  16321                                         default:
  16322                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
  16323                                         case 0x0:
  16324                                           length = 3;
  16325                                           spacing = kSingle;
  16326                                           break;
  16327                                         case 0x1:
  16328                                           length = 3;
  16329                                           spacing = kDouble;
  16330                                           break;
  16331                                       }
  16332                                       unsigned last =
  16333                                           first +
  16334                                           (length - 1) *
  16335                                               (spacing == kSingle ? 1 : 2);
  16336                                       TransferType transfer = kAllLanes;
  16337                                       unsigned rn = (instr >> 16) & 0xf;
  16338                                       Sign sign(plus);
  16339                                       unsigned rm = instr & 0xf;
  16340                                       // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
  16341                                       vld3(CurrentCond(),
  16342                                            dt,
  16343                                            NeonRegisterList(DRegister(first),
  16344                                                             DRegister(last),
  16345                                                             spacing,
  16346                                                             transfer),
  16347                                            MemOperand(Register(rn),
  16348                                                       sign,
  16349                                                       Register(rm),
  16350                                                       PostIndex));
  16351                                       break;
  16352                                     }
  16353                                   }
  16354                                   break;
  16355                                 }
  16356                                 default:
  16357                                   UnallocatedT32(instr);
  16358                                   break;
  16359                               }
  16360                               break;
  16361                             }
  16362                             default: {
  16363                               switch (instr & 0x0000000d) {
  16364                                 case 0x0000000d: {
  16365                                   // 0xf9a0020d
  16366                                   switch (instr & 0x00000002) {
  16367                                     case 0x00000000: {
  16368                                       // 0xf9a0020d
  16369                                       if (((instr & 0xc00) == 0xc00)) {
  16370                                         UnallocatedT32(instr);
  16371                                         return;
  16372                                       }
  16373                                       DataType dt =
  16374                                           Dt_size_7_Decode((instr >> 10) & 0x3);
  16375                                       if (dt.Is(kDataTypeValueInvalid)) {
  16376                                         UnallocatedT32(instr);
  16377                                         return;
  16378                                       }
  16379                                       DecodeNeon decode_neon =
  16380                                           Index_1_Decode((instr >> 4) & 0xf,
  16381                                                          dt);
  16382                                       if (!decode_neon.IsValid()) {
  16383                                         UnallocatedT32(instr);
  16384                                         return;
  16385                                       }
  16386                                       int lane = decode_neon.GetLane();
  16387                                       SpacingType spacing =
  16388                                           decode_neon.GetSpacing();
  16389                                       unsigned first =
  16390                                           ExtractDRegister(instr, 22, 12);
  16391                                       unsigned length = 3;
  16392                                       unsigned last =
  16393                                           first +
  16394                                           (length - 1) *
  16395                                               (spacing == kSingle ? 1 : 2);
  16396                                       unsigned rn = (instr >> 16) & 0xf;
  16397                                       // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length)
  16398                                       vld3(CurrentCond(),
  16399                                            dt,
  16400                                            NeonRegisterList(DRegister(first),
  16401                                                             DRegister(last),
  16402                                                             spacing,
  16403                                                             lane),
  16404                                            MemOperand(Register(rn), PostIndex));
  16405                                       break;
  16406                                     }
  16407                                     case 0x00000002: {
  16408                                       // 0xf9a0020f
  16409                                       if (((instr & 0xc00) == 0xc00)) {
  16410                                         UnallocatedT32(instr);
  16411                                         return;
  16412                                       }
  16413                                       DataType dt =
  16414                                           Dt_size_7_Decode((instr >> 10) & 0x3);
  16415                                       if (dt.Is(kDataTypeValueInvalid)) {
  16416                                         UnallocatedT32(instr);
  16417                                         return;
  16418                                       }
  16419                                       DecodeNeon decode_neon =
  16420                                           Index_1_Decode((instr >> 4) & 0xf,
  16421                                                          dt);
  16422                                       if (!decode_neon.IsValid()) {
  16423                                         UnallocatedT32(instr);
  16424                                         return;
  16425                                       }
  16426                                       int lane = decode_neon.GetLane();
  16427                                       SpacingType spacing =
  16428                                           decode_neon.GetSpacing();
  16429                                       unsigned first =
  16430                                           ExtractDRegister(instr, 22, 12);
  16431                                       unsigned length = 3;
  16432                                       unsigned last =
  16433                                           first +
  16434                                           (length - 1) *
  16435                                               (spacing == kSingle ? 1 : 2);
  16436                                       unsigned rn = (instr >> 16) & 0xf;
  16437                                       // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1
  16438                                       vld3(CurrentCond(),
  16439                                            dt,
  16440                                            NeonRegisterList(DRegister(first),
  16441                                                             DRegister(last),
  16442                                                             spacing,
  16443                                                             lane),
  16444                                            MemOperand(Register(rn), Offset));
  16445                                       break;
  16446                                     }
  16447                                   }
  16448                                   break;
  16449                                 }
  16450                                 default: {
  16451                                   if (((instr & 0xc00) == 0xc00) ||
  16452                                       ((instr & 0xd) == 0xd)) {
  16453                                     UnallocatedT32(instr);
  16454                                     return;
  16455                                   }
  16456                                   DataType dt =
  16457                                       Dt_size_7_Decode((instr >> 10) & 0x3);
  16458                                   if (dt.Is(kDataTypeValueInvalid)) {
  16459                                     UnallocatedT32(instr);
  16460                                     return;
  16461                                   }
  16462                                   DecodeNeon decode_neon =
  16463                                       Index_1_Decode((instr >> 4) & 0xf, dt);
  16464                                   if (!decode_neon.IsValid()) {
  16465                                     UnallocatedT32(instr);
  16466                                     return;
  16467                                   }
  16468                                   int lane = decode_neon.GetLane();
  16469                                   SpacingType spacing =
  16470                                       decode_neon.GetSpacing();
  16471                                   unsigned first =
  16472                                       ExtractDRegister(instr, 22, 12);
  16473                                   unsigned length = 3;
  16474                                   unsigned last =
  16475                                       first +
  16476                                       (length - 1) *
  16477                                           (spacing == kSingle ? 1 : 2);
  16478                                   unsigned rn = (instr >> 16) & 0xf;
  16479                                   Sign sign(plus);
  16480                                   unsigned rm = instr & 0xf;
  16481                                   // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length)
  16482                                   vld3(CurrentCond(),
  16483                                        dt,
  16484                                        NeonRegisterList(DRegister(first),
  16485                                                         DRegister(last),
  16486                                                         spacing,
  16487                                                         lane),
  16488                                        MemOperand(Register(rn),
  16489                                                   sign,
  16490                                                   Register(rm),
  16491                                                   PostIndex));
  16492                                   break;
  16493                                 }
  16494                               }
  16495                               break;
  16496                             }
  16497                           }
  16498                           break;
  16499                         }
  16500                         case 0x00000300: {
  16501                           // 0xf9a00300
  16502                           switch (instr & 0x00000c00) {
  16503                             case 0x00000c00: {
  16504                               // 0xf9a00f00
  16505                               switch (instr & 0x0000000d) {
  16506                                 case 0x0000000d: {
  16507                                   // 0xf9a00f0d
  16508                                   switch (instr & 0x00000002) {
  16509                                     case 0x00000000: {
  16510                                       // 0xf9a00f0d
  16511                                       DataType dt =
  16512                                           Dt_size_8_Decode((instr >> 6) & 0x3);
  16513                                       if (dt.Is(kDataTypeValueInvalid)) {
  16514                                         UnallocatedT32(instr);
  16515                                         return;
  16516                                       }
  16517                                       Alignment align =
  16518                                           Align_a_3_Decode((instr >> 4) & 0x1,
  16519                                                            dt,
  16520                                                            (instr >> 6) & 0x3);
  16521                                       if (dt.Is(kDataTypeValueInvalid) ||
  16522                                           align.Is(kBadAlignment)) {
  16523                                         UnallocatedT32(instr);
  16524                                         return;
  16525                                       }
  16526                                       unsigned first =
  16527                                           ExtractDRegister(instr, 22, 12);
  16528                                       unsigned length;
  16529                                       SpacingType spacing;
  16530                                       switch ((instr >> 5) & 0x1) {
  16531                                         default:
  16532                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
  16533                                         case 0x0:
  16534                                           length = 4;
  16535                                           spacing = kSingle;
  16536                                           break;
  16537                                         case 0x1:
  16538                                           length = 4;
  16539                                           spacing = kDouble;
  16540                                           break;
  16541                                       }
  16542                                       unsigned last =
  16543                                           first +
  16544                                           (length - 1) *
  16545                                               (spacing == kSingle ? 1 : 2);
  16546                                       TransferType transfer = kAllLanes;
  16547                                       unsigned rn = (instr >> 16) & 0xf;
  16548                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  16549                                       vld4(CurrentCond(),
  16550                                            dt,
  16551                                            NeonRegisterList(DRegister(first),
  16552                                                             DRegister(last),
  16553                                                             spacing,
  16554                                                             transfer),
  16555                                            AlignedMemOperand(Register(rn),
  16556                                                              align,
  16557                                                              PostIndex));
  16558                                       break;
  16559                                     }
  16560                                     case 0x00000002: {
  16561                                       // 0xf9a00f0f
  16562                                       DataType dt =
  16563                                           Dt_size_8_Decode((instr >> 6) & 0x3);
  16564                                       if (dt.Is(kDataTypeValueInvalid)) {
  16565                                         UnallocatedT32(instr);
  16566                                         return;
  16567                                       }
  16568                                       Alignment align =
  16569                                           Align_a_3_Decode((instr >> 4) & 0x1,
  16570                                                            dt,
  16571                                                            (instr >> 6) & 0x3);
  16572                                       if (dt.Is(kDataTypeValueInvalid) ||
  16573                                           align.Is(kBadAlignment)) {
  16574                                         UnallocatedT32(instr);
  16575                                         return;
  16576                                       }
  16577                                       unsigned first =
  16578                                           ExtractDRegister(instr, 22, 12);
  16579                                       unsigned length;
  16580                                       SpacingType spacing;
  16581                                       switch ((instr >> 5) & 0x1) {
  16582                                         default:
  16583                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
  16584                                         case 0x0:
  16585                                           length = 4;
  16586                                           spacing = kSingle;
  16587                                           break;
  16588                                         case 0x1:
  16589                                           length = 4;
  16590                                           spacing = kDouble;
  16591                                           break;
  16592                                       }
  16593                                       unsigned last =
  16594                                           first +
  16595                                           (length - 1) *
  16596                                               (spacing == kSingle ? 1 : 2);
  16597                                       TransferType transfer = kAllLanes;
  16598                                       unsigned rn = (instr >> 16) & 0xf;
  16599                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  16600                                       vld4(CurrentCond(),
  16601                                            dt,
  16602                                            NeonRegisterList(DRegister(first),
  16603                                                             DRegister(last),
  16604                                                             spacing,
  16605                                                             transfer),
  16606                                            AlignedMemOperand(Register(rn),
  16607                                                              align,
  16608                                                              Offset));
  16609                                       break;
  16610                                     }
  16611                                   }
  16612                                   break;
  16613                                 }
  16614                                 default: {
  16615                                   if (((instr & 0xd) == 0xd)) {
  16616                                     UnallocatedT32(instr);
  16617                                     return;
  16618                                   }
  16619                                   DataType dt =
  16620                                       Dt_size_8_Decode((instr >> 6) & 0x3);
  16621                                   if (dt.Is(kDataTypeValueInvalid)) {
  16622                                     UnallocatedT32(instr);
  16623                                     return;
  16624                                   }
  16625                                   Alignment align =
  16626                                       Align_a_3_Decode((instr >> 4) & 0x1,
  16627                                                        dt,
  16628                                                        (instr >> 6) & 0x3);
  16629                                   if (dt.Is(kDataTypeValueInvalid) ||
  16630                                       align.Is(kBadAlignment)) {
  16631                                     UnallocatedT32(instr);
  16632                                     return;
  16633                                   }
  16634                                   unsigned first =
  16635                                       ExtractDRegister(instr, 22, 12);
  16636                                   unsigned length;
  16637                                   SpacingType spacing;
  16638                                   switch ((instr >> 5) & 0x1) {
  16639                                     default:
  16640                                       VIXL_UNREACHABLE_OR_FALLTHROUGH();
  16641                                     case 0x0:
  16642                                       length = 4;
  16643                                       spacing = kSingle;
  16644                                       break;
  16645                                     case 0x1:
  16646                                       length = 4;
  16647                                       spacing = kDouble;
  16648                                       break;
  16649                                   }
  16650                                   unsigned last =
  16651                                       first +
  16652                                       (length - 1) *
  16653                                           (spacing == kSingle ? 1 : 2);
  16654                                   TransferType transfer = kAllLanes;
  16655                                   unsigned rn = (instr >> 16) & 0xf;
  16656                                   unsigned rm = instr & 0xf;
  16657                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  16658                                   vld4(CurrentCond(),
  16659                                        dt,
  16660                                        NeonRegisterList(DRegister(first),
  16661                                                         DRegister(last),
  16662                                                         spacing,
  16663                                                         transfer),
  16664                                        AlignedMemOperand(Register(rn),
  16665                                                          align,
  16666                                                          Register(rm),
  16667                                                          PostIndex));
  16668                                   break;
  16669                                 }
  16670                               }
  16671                               break;
  16672                             }
  16673                             default: {
  16674                               switch (instr & 0x0000000d) {
  16675                                 case 0x0000000d: {
  16676                                   // 0xf9a0030d
  16677                                   switch (instr & 0x00000002) {
  16678                                     case 0x00000000: {
  16679                                       // 0xf9a0030d
  16680                                       if (((instr & 0xc00) == 0xc00)) {
  16681                                         UnallocatedT32(instr);
  16682                                         return;
  16683                                       }
  16684                                       DataType dt =
  16685                                           Dt_size_7_Decode((instr >> 10) & 0x3);
  16686                                       if (dt.Is(kDataTypeValueInvalid)) {
  16687                                         UnallocatedT32(instr);
  16688                                         return;
  16689                                       }
  16690                                       DecodeNeonAndAlign decode_neon =
  16691                                           Align_index_align_3_Decode((instr >>
  16692                                                                       4) &
  16693                                                                          0xf,
  16694                                                                      dt);
  16695                                       if (!decode_neon.IsValid()) {
  16696                                         UnallocatedT32(instr);
  16697                                         return;
  16698                                       }
  16699                                       Alignment align = decode_neon.GetAlign();
  16700                                       int lane = decode_neon.GetLane();
  16701                                       SpacingType spacing =
  16702                                           decode_neon.GetSpacing();
  16703                                       unsigned first =
  16704                                           ExtractDRegister(instr, 22, 12);
  16705                                       unsigned length = 4;
  16706                                       unsigned last =
  16707                                           first +
  16708                                           (length - 1) *
  16709                                               (spacing == kSingle ? 1 : 2);
  16710                                       unsigned rn = (instr >> 16) & 0xf;
  16711                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length)
  16712                                       vld4(CurrentCond(),
  16713                                            dt,
  16714                                            NeonRegisterList(DRegister(first),
  16715                                                             DRegister(last),
  16716                                                             spacing,
  16717                                                             lane),
  16718                                            AlignedMemOperand(Register(rn),
  16719                                                              align,
  16720                                                              PostIndex));
  16721                                       break;
  16722                                     }
  16723                                     case 0x00000002: {
  16724                                       // 0xf9a0030f
  16725                                       if (((instr & 0xc00) == 0xc00)) {
  16726                                         UnallocatedT32(instr);
  16727                                         return;
  16728                                       }
  16729                                       DataType dt =
  16730                                           Dt_size_7_Decode((instr >> 10) & 0x3);
  16731                                       if (dt.Is(kDataTypeValueInvalid)) {
  16732                                         UnallocatedT32(instr);
  16733                                         return;
  16734                                       }
  16735                                       DecodeNeonAndAlign decode_neon =
  16736                                           Align_index_align_3_Decode((instr >>
  16737                                                                       4) &
  16738                                                                          0xf,
  16739                                                                      dt);
  16740                                       if (!decode_neon.IsValid()) {
  16741                                         UnallocatedT32(instr);
  16742                                         return;
  16743                                       }
  16744                                       Alignment align = decode_neon.GetAlign();
  16745                                       int lane = decode_neon.GetLane();
  16746                                       SpacingType spacing =
  16747                                           decode_neon.GetSpacing();
  16748                                       unsigned first =
  16749                                           ExtractDRegister(instr, 22, 12);
  16750                                       unsigned length = 4;
  16751                                       unsigned last =
  16752                                           first +
  16753                                           (length - 1) *
  16754                                               (spacing == kSingle ? 1 : 2);
  16755                                       unsigned rn = (instr >> 16) & 0xf;
  16756                                       // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length)
  16757                                       vld4(CurrentCond(),
  16758                                            dt,
  16759                                            NeonRegisterList(DRegister(first),
  16760                                                             DRegister(last),
  16761                                                             spacing,
  16762                                                             lane),
  16763                                            AlignedMemOperand(Register(rn),
  16764                                                              align,
  16765                                                              Offset));
  16766                                       break;
  16767                                     }
  16768                                   }
  16769                                   break;
  16770                                 }
  16771                                 default: {
  16772                                   if (((instr & 0xc00) == 0xc00) ||
  16773                                       ((instr & 0xd) == 0xd)) {
  16774                                     UnallocatedT32(instr);
  16775                                     return;
  16776                                   }
  16777                                   DataType dt =
  16778                                       Dt_size_7_Decode((instr >> 10) & 0x3);
  16779                                   if (dt.Is(kDataTypeValueInvalid)) {
  16780                                     UnallocatedT32(instr);
  16781                                     return;
  16782                                   }
  16783                                   DecodeNeonAndAlign decode_neon =
  16784                                       Align_index_align_3_Decode((instr >> 4) &
  16785                                                                      0xf,
  16786                                                                  dt);
  16787                                   if (!decode_neon.IsValid()) {
  16788                                     UnallocatedT32(instr);
  16789                                     return;
  16790                                   }
  16791                                   Alignment align = decode_neon.GetAlign();
  16792                                   int lane = decode_neon.GetLane();
  16793                                   SpacingType spacing =
  16794                                       decode_neon.GetSpacing();
  16795                                   unsigned first =
  16796                                       ExtractDRegister(instr, 22, 12);
  16797                                   unsigned length = 4;
  16798                                   unsigned last =
  16799                                       first +
  16800                                       (length - 1) *
  16801                                           (spacing == kSingle ? 1 : 2);
  16802                                   unsigned rn = (instr >> 16) & 0xf;
  16803                                   unsigned rm = instr & 0xf;
  16804                                   // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length)
  16805                                   vld4(CurrentCond(),
  16806                                        dt,
  16807                                        NeonRegisterList(DRegister(first),
  16808                                                         DRegister(last),
  16809                                                         spacing,
  16810                                                         lane),
  16811                                        AlignedMemOperand(Register(rn),
  16812                                                          align,
  16813                                                          Register(rm),
  16814                                                          PostIndex));
  16815                                   break;
  16816                                 }
  16817                               }
  16818                               break;
  16819                             }
  16820                           }
  16821                           break;
  16822                         }
  16823                       }
  16824                       break;
  16825                     }
  16826                   }
  16827                   break;
  16828                 }
  16829                 case 0x10100000: {
  16830                   // 0xf8100000
  16831                   switch (instr & 0x01400000) {
  16832                     case 0x00000000: {
  16833                       // 0xf8100000
  16834                       switch (instr & 0x000f0000) {
  16835                         case 0x000f0000: {
  16836                           // 0xf81f0000
  16837                           switch (instr & 0x0000f000) {
  16838                             case 0x0000f000: {
  16839                               // 0xf81ff000
  16840                               uint32_t U = (instr >> 23) & 0x1;
  16841                               int32_t imm = instr & 0xfff;
  16842                               if (U == 0) imm = -imm;
  16843                               bool minus_zero = (imm == 0) && (U == 0);
  16844                               Location location(imm, kT32PcDelta);
  16845                               // PLD{<c>}{<q>} <label> ; T1
  16846                               if (minus_zero) {
  16847                                 pld(CurrentCond(), MemOperand(pc, minus, 0));
  16848                               } else {
  16849                                 pld(CurrentCond(), &location);
  16850                               }
  16851                               if (((instr & 0xff7ff000) != 0xf81ff000)) {
  16852                                 UnpredictableT32(instr);
  16853                               }
  16854                               break;
  16855                             }
  16856                             default: {
  16857                               switch (instr & 0x00200000) {
  16858                                 case 0x00000000: {
  16859                                   // 0xf81f0000
  16860                                   if (((instr & 0xf000) == 0xf000)) {
  16861                                     UnallocatedT32(instr);
  16862                                     return;
  16863                                   }
  16864                                   unsigned rt = (instr >> 12) & 0xf;
  16865                                   uint32_t U = (instr >> 23) & 0x1;
  16866                                   int32_t imm = instr & 0xfff;
  16867                                   if (U == 0) imm = -imm;
  16868                                   bool minus_zero = (imm == 0) && (U == 0);
  16869                                   Location location(imm, kT32PcDelta);
  16870                                   // LDRB{<c>}{<q>} <Rt>, <label> ; T1
  16871                                   if (minus_zero) {
  16872                                     ldrb(CurrentCond(),
  16873                                          Best,
  16874                                          Register(rt),
  16875                                          MemOperand(pc, minus, 0));
  16876                                   } else {
  16877                                     ldrb(CurrentCond(),
  16878                                          Register(rt),
  16879                                          &location);
  16880                                   }
  16881                                   break;
  16882                                 }
  16883                                 case 0x00200000: {
  16884                                   // 0xf83f0000
  16885                                   if (((instr & 0xf000) == 0xf000)) {
  16886                                     UnallocatedT32(instr);
  16887                                     return;
  16888                                   }
  16889                                   unsigned rt = (instr >> 12) & 0xf;
  16890                                   uint32_t U = (instr >> 23) & 0x1;
  16891                                   int32_t imm = instr & 0xfff;
  16892                                   if (U == 0) imm = -imm;
  16893                                   bool minus_zero = (imm == 0) && (U == 0);
  16894                                   Location location(imm, kT32PcDelta);
  16895                                   // LDRH{<c>}{<q>} <Rt>, <label> ; T1
  16896                                   if (minus_zero) {
  16897                                     ldrh(CurrentCond(),
  16898                                          Best,
  16899                                          Register(rt),
  16900                                          MemOperand(pc, minus, 0));
  16901                                   } else {
  16902                                     ldrh(CurrentCond(),
  16903                                          Register(rt),
  16904                                          &location);
  16905                                   }
  16906                                   break;
  16907                                 }
  16908                               }
  16909                               break;
  16910                             }
  16911                           }
  16912                           break;
  16913                         }
  16914                         default: {
  16915                           switch (instr & 0x00a00000) {
  16916                             case 0x00000000: {
  16917                               // 0xf8100000
  16918                               switch (instr & 0x00000d00) {
  16919                                 case 0x00000000: {
  16920                                   // 0xf8100000
  16921                                   switch (instr & 0x000002c0) {
  16922                                     case 0x00000000: {
  16923                                       // 0xf8100000
  16924                                       switch (instr & 0x0000f000) {
  16925                                         case 0x0000f000: {
  16926                                           // 0xf810f000
  16927                                           if (((instr & 0xf0000) == 0xf0000)) {
  16928                                             UnallocatedT32(instr);
  16929                                             return;
  16930                                           }
  16931                                           unsigned rn = (instr >> 16) & 0xf;
  16932                                           Sign sign(plus);
  16933                                           unsigned rm = instr & 0xf;
  16934                                           Shift shift = LSL;
  16935                                           uint32_t amount = (instr >> 4) & 0x3;
  16936                                           AddrMode addrmode = Offset;
  16937                                           // PLD{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
  16938                                           pld(CurrentCond(),
  16939                                               MemOperand(Register(rn),
  16940                                                          sign,
  16941                                                          Register(rm),
  16942                                                          shift,
  16943                                                          amount,
  16944                                                          addrmode));
  16945                                           break;
  16946                                         }
  16947                                         default: {
  16948                                           if (((instr & 0xf0000) == 0xf0000) ||
  16949                                               ((instr & 0xf000) == 0xf000)) {
  16950                                             UnallocatedT32(instr);
  16951                                             return;
  16952                                           }
  16953                                           unsigned rt = (instr >> 12) & 0xf;
  16954                                           unsigned rn = (instr >> 16) & 0xf;
  16955                                           Sign sign(plus);
  16956                                           unsigned rm = instr & 0xf;
  16957                                           Shift shift = LSL;
  16958                                           uint32_t amount = (instr >> 4) & 0x3;
  16959                                           AddrMode addrmode = Offset;
  16960                                           if ((rt < kNumberOfT32LowRegisters) &&
  16961                                               (rn < kNumberOfT32LowRegisters) &&
  16962                                               (rm < kNumberOfT32LowRegisters) &&
  16963                                               shift.IsLSL() && (amount == 0) &&
  16964                                               sign.IsPlus()) {
  16965                                             // LDRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
  16966                                             ldrb(CurrentCond(),
  16967                                                  Wide,
  16968                                                  Register(rt),
  16969                                                  MemOperand(Register(rn),
  16970                                                             sign,
  16971                                                             Register(rm),
  16972                                                             addrmode));
  16973                                           } else {
  16974                                             // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
  16975                                             ldrb(CurrentCond(),
  16976                                                  Best,
  16977                                                  Register(rt),
  16978                                                  MemOperand(Register(rn),
  16979                                                             sign,
  16980                                                             Register(rm),
  16981                                                             shift,
  16982                                                             amount,
  16983                                                             addrmode));
  16984                                           }
  16985                                           break;
  16986                                         }
  16987                                       }
  16988                                       break;
  16989                                     }
  16990                                     default:
  16991                                       UnallocatedT32(instr);
  16992                                       break;
  16993                                   }
  16994                                   break;
  16995                                 }
  16996                                 case 0x00000900: {
  16997                                   // 0xf8100900
  16998                                   if (((instr & 0xf0000) == 0xf0000)) {
  16999                                     UnallocatedT32(instr);
  17000                                     return;
  17001                                   }
  17002                                   unsigned rt = (instr >> 12) & 0xf;
  17003                                   unsigned rn = (instr >> 16) & 0xf;
  17004                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
  17005                                                                         : plus);
  17006                                   int32_t offset = instr & 0xff;
  17007                                   // LDRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 NOLINT(whitespace/line_length)
  17008                                   ldrb(CurrentCond(),
  17009                                        Best,
  17010                                        Register(rt),
  17011                                        MemOperand(Register(rn),
  17012                                                   sign,
  17013                                                   offset,
  17014                                                   PostIndex));
  17015                                   break;
  17016                                 }
  17017                                 case 0x00000c00: {
  17018                                   // 0xf8100c00
  17019                                   switch (instr & 0x00000200) {
  17020                                     case 0x00000000: {
  17021                                       // 0xf8100c00
  17022                                       switch (instr & 0x0000f000) {
  17023                                         case 0x0000f000: {
  17024                                           // 0xf810fc00
  17025                                           if (((instr & 0xf0000) == 0xf0000)) {
  17026                                             UnallocatedT32(instr);
  17027                                             return;
  17028                                           }
  17029                                           unsigned rn = (instr >> 16) & 0xf;
  17030                                           int32_t offset = instr & 0xff;
  17031                                           // PLD{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
  17032                                           pld(CurrentCond(),
  17033                                               MemOperand(Register(rn),
  17034                                                          minus,
  17035                                                          offset,
  17036                                                          Offset));
  17037                                           break;
  17038                                         }
  17039                                         default: {
  17040                                           if (((instr & 0xf0000) == 0xf0000) ||
  17041                                               ((instr & 0xf000) == 0xf000)) {
  17042                                             UnallocatedT32(instr);
  17043                                             return;
  17044                                           }
  17045                                           unsigned rt = (instr >> 12) & 0xf;
  17046                                           unsigned rn = (instr >> 16) & 0xf;
  17047                                           int32_t offset = instr & 0xff;
  17048                                           // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 NOLINT(whitespace/line_length)
  17049                                           ldrb(CurrentCond(),
  17050                                                Best,
  17051                                                Register(rt),
  17052                                                MemOperand(Register(rn),
  17053                                                           minus,
  17054                                                           offset,
  17055                                                           Offset));
  17056                                           break;
  17057                                         }
  17058                                       }
  17059                                       break;
  17060                                     }
  17061                                     case 0x00000200: {
  17062                                       // 0xf8100e00
  17063                                       if (((instr & 0xf0000) == 0xf0000)) {
  17064                                         UnallocatedT32(instr);
  17065                                         return;
  17066                                       }
  17067                                       UnimplementedT32_32("LDRBT", instr);
  17068                                       break;
  17069                                     }
  17070                                   }
  17071                                   break;
  17072                                 }
  17073                                 case 0x00000d00: {
  17074                                   // 0xf8100d00
  17075                                   if (((instr & 0xf0000) == 0xf0000)) {
  17076                                     UnallocatedT32(instr);
  17077                                     return;
  17078                                   }
  17079                                   unsigned rt = (instr >> 12) & 0xf;
  17080                                   unsigned rn = (instr >> 16) & 0xf;
  17081                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
  17082                                                                         : plus);
  17083                                   int32_t offset = instr & 0xff;
  17084                                   // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 NOLINT(whitespace/line_length)
  17085                                   ldrb(CurrentCond(),
  17086                                        Best,
  17087                                        Register(rt),
  17088                                        MemOperand(Register(rn),
  17089                                                   sign,
  17090                                                   offset,
  17091                                                   PreIndex));
  17092                                   break;
  17093                                 }
  17094                                 default:
  17095                                   UnallocatedT32(instr);
  17096                                   break;
  17097                               }
  17098                               break;
  17099                             }
  17100                             case 0x00200000: {
  17101                               // 0xf8300000
  17102                               switch (instr & 0x00000d00) {
  17103                                 case 0x00000000: {
  17104                                   // 0xf8300000
  17105                                   switch (instr & 0x000002c0) {
  17106                                     case 0x00000000: {
  17107                                       // 0xf8300000
  17108                                       switch (instr & 0x0000f000) {
  17109                                         case 0x0000f000: {
  17110                                           // 0xf830f000
  17111                                           if (((instr & 0xf0000) == 0xf0000)) {
  17112                                             UnallocatedT32(instr);
  17113                                             return;
  17114                                           }
  17115                                           unsigned rn = (instr >> 16) & 0xf;
  17116                                           Sign sign(plus);
  17117                                           unsigned rm = instr & 0xf;
  17118                                           Shift shift = LSL;
  17119                                           uint32_t amount = (instr >> 4) & 0x3;
  17120                                           AddrMode addrmode = Offset;
  17121                                           // PLDW{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
  17122                                           pldw(CurrentCond(),
  17123                                                MemOperand(Register(rn),
  17124                                                           sign,
  17125                                                           Register(rm),
  17126                                                           shift,
  17127                                                           amount,
  17128                                                           addrmode));
  17129                                           break;
  17130                                         }
  17131                                         default: {
  17132                                           if (((instr & 0xf0000) == 0xf0000) ||
  17133                                               ((instr & 0xf000) == 0xf000)) {
  17134                                             UnallocatedT32(instr);
  17135                                             return;
  17136                                           }
  17137                                           unsigned rt = (instr >> 12) & 0xf;
  17138                                           unsigned rn = (instr >> 16) & 0xf;
  17139                                           Sign sign(plus);
  17140                                           unsigned rm = instr & 0xf;
  17141                                           Shift shift = LSL;
  17142                                           uint32_t amount = (instr >> 4) & 0x3;
  17143                                           AddrMode addrmode = Offset;
  17144                                           if ((rt < kNumberOfT32LowRegisters) &&
  17145                                               (rn < kNumberOfT32LowRegisters) &&
  17146                                               (rm < kNumberOfT32LowRegisters) &&
  17147                                               shift.IsLSL() && (amount == 0) &&
  17148                                               sign.IsPlus()) {
  17149                                             // LDRH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
  17150                                             ldrh(CurrentCond(),
  17151                                                  Wide,
  17152                                                  Register(rt),
  17153                                                  MemOperand(Register(rn),
  17154                                                             sign,
  17155                                                             Register(rm),
  17156                                                             addrmode));
  17157                                           } else {
  17158                                             // LDRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
  17159                                             ldrh(CurrentCond(),
  17160                                                  Best,
  17161                                                  Register(rt),
  17162                                                  MemOperand(Register(rn),
  17163                                                             sign,
  17164                                                             Register(rm),
  17165                                                             shift,
  17166                                                             amount,
  17167                                                             addrmode));
  17168                                           }
  17169                                           break;
  17170                                         }
  17171                                       }
  17172                                       break;
  17173                                     }
  17174                                     default:
  17175                                       UnallocatedT32(instr);
  17176                                       break;
  17177                                   }
  17178                                   break;
  17179                                 }
  17180                                 case 0x00000900: {
  17181                                   // 0xf8300900
  17182                                   if (((instr & 0xf0000) == 0xf0000)) {
  17183                                     UnallocatedT32(instr);
  17184                                     return;
  17185                                   }
  17186                                   unsigned rt = (instr >> 12) & 0xf;
  17187                                   unsigned rn = (instr >> 16) & 0xf;
  17188                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
  17189                                                                         : plus);
  17190                                   int32_t offset = instr & 0xff;
  17191                                   // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 NOLINT(whitespace/line_length)
  17192                                   ldrh(CurrentCond(),
  17193                                        Best,
  17194                                        Register(rt),
  17195                                        MemOperand(Register(rn),
  17196                                                   sign,
  17197                                                   offset,
  17198                                                   PostIndex));
  17199                                   break;
  17200                                 }
  17201                                 case 0x00000c00: {
  17202                                   // 0xf8300c00
  17203                                   switch (instr & 0x00000200) {
  17204                                     case 0x00000000: {
  17205                                       // 0xf8300c00
  17206                                       switch (instr & 0x0000f000) {
  17207                                         case 0x0000f000: {
  17208                                           // 0xf830fc00
  17209                                           if (((instr & 0xf0000) == 0xf0000)) {
  17210                                             UnallocatedT32(instr);
  17211                                             return;
  17212                                           }
  17213                                           unsigned rn = (instr >> 16) & 0xf;
  17214                                           int32_t offset = instr & 0xff;
  17215                                           // PLDW{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
  17216                                           pldw(CurrentCond(),
  17217                                                MemOperand(Register(rn),
  17218                                                           minus,
  17219                                                           offset,
  17220                                                           Offset));
  17221                                           break;
  17222                                         }
  17223                                         default: {
  17224                                           if (((instr & 0xf0000) == 0xf0000) ||
  17225                                               ((instr & 0xf000) == 0xf000)) {
  17226                                             UnallocatedT32(instr);
  17227                                             return;
  17228                                           }
  17229                                           unsigned rt = (instr >> 12) & 0xf;
  17230                                           unsigned rn = (instr >> 16) & 0xf;
  17231                                           int32_t offset = instr & 0xff;
  17232                                           // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 NOLINT(whitespace/line_length)
  17233                                           ldrh(CurrentCond(),
  17234                                                Best,
  17235                                                Register(rt),
  17236                                                MemOperand(Register(rn),
  17237                                                           minus,
  17238                                                           offset,
  17239                                                           Offset));
  17240                                           break;
  17241                                         }
  17242                                       }
  17243                                       break;
  17244                                     }
  17245                                     case 0x00000200: {
  17246                                       // 0xf8300e00
  17247                                       if (((instr & 0xf0000) == 0xf0000)) {
  17248                                         UnallocatedT32(instr);
  17249                                         return;
  17250                                       }
  17251                                       UnimplementedT32_32("LDRHT", instr);
  17252                                       break;
  17253                                     }
  17254                                   }
  17255                                   break;
  17256                                 }
  17257                                 case 0x00000d00: {
  17258                                   // 0xf8300d00
  17259                                   if (((instr & 0xf0000) == 0xf0000)) {
  17260                                     UnallocatedT32(instr);
  17261                                     return;
  17262                                   }
  17263                                   unsigned rt = (instr >> 12) & 0xf;
  17264                                   unsigned rn = (instr >> 16) & 0xf;
  17265                                   Sign sign((((instr >> 9) & 0x1) == 0) ? minus
  17266                                                                         : plus);
  17267                                   int32_t offset = instr & 0xff;
  17268                                   // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 NOLINT(whitespace/line_length)
  17269                                   ldrh(CurrentCond(),
  17270                                        Best,
  17271                                        Register(rt),
  17272                                        MemOperand(Register(rn),
  17273                                                   sign,
  17274                                                   offset,
  17275                                                   PreIndex));
  17276                                   break;
  17277                                 }
  17278                                 default:
  17279                                   UnallocatedT32(instr);
  17280                                   break;
  17281                               }
  17282                               break;
  17283                             }
  17284                             case 0x00800000: {
  17285                               // 0xf8900000
  17286                               switch (instr & 0x0000f000) {
  17287                                 case 0x0000f000: {
  17288                                   // 0xf890f000
  17289                                   if (((instr & 0xf0000) == 0xf0000)) {
  17290                                     UnallocatedT32(instr);
  17291                                     return;
  17292                                   }
  17293                                   unsigned rn = (instr >> 16) & 0xf;
  17294                                   int32_t offset = instr & 0xfff;
  17295                                   // PLD{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
  17296                                   pld(CurrentCond(),
  17297                                       MemOperand(Register(rn),
  17298                                                  plus,
  17299                                                  offset,
  17300                                                  Offset));
  17301                                   break;
  17302                                 }
  17303                                 default: {
  17304                                   if (((instr & 0xf0000) == 0xf0000) ||
  17305                                       ((instr & 0xf000) == 0xf000)) {
  17306                                     UnallocatedT32(instr);
  17307                                     return;
  17308                                   }
  17309                                   unsigned rt = (instr >> 12) & 0xf;
  17310                                   unsigned rn = (instr >> 16) & 0xf;
  17311                                   int32_t offset = instr & 0xfff;
  17312                                   if ((rt < kNumberOfT32LowRegisters) &&
  17313                                       (rn < kNumberOfT32LowRegisters) &&
  17314                                       ((offset >= 0) && (offset <= 31))) {
  17315                                     // LDRB{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
  17316                                     ldrb(CurrentCond(),
  17317                                          Wide,
  17318                                          Register(rt),
  17319                                          MemOperand(Register(rn),
  17320                                                     plus,
  17321                                                     offset,
  17322                                                     Offset));
  17323                                   } else {
  17324                                     // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
  17325                                     ldrb(CurrentCond(),
  17326                                          Best,
  17327                                          Register(rt),
  17328                                          MemOperand(Register(rn),
  17329                                                     plus,
  17330                                                     offset,
  17331                                                     Offset));
  17332                                   }
  17333                                   break;
  17334                                 }
  17335                               }
  17336                               break;
  17337                             }
  17338                             case 0x00a00000: {
  17339                               // 0xf8b00000
  17340                               switch (instr & 0x0000f000) {
  17341                                 case 0x0000f000: {
  17342                                   // 0xf8b0f000
  17343                                   if (((instr & 0xf0000) == 0xf0000)) {
  17344                                     UnallocatedT32(instr);
  17345                                     return;
  17346                                   }
  17347                                   unsigned rn = (instr >> 16) & 0xf;
  17348                                   int32_t offset = instr & 0xfff;
  17349                                   // PLDW{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
  17350                                   pldw(CurrentCond(),
  17351                                        MemOperand(Register(rn),
  17352                                                   plus,
  17353                                                   offset,
  17354                                                   Offset));
  17355                                   break;
  17356                                 }
  17357                                 default: {
  17358                                   if (((instr & 0xf0000) == 0xf0000) ||
  17359                                       ((instr & 0xf000) == 0xf000)) {
  17360                                     UnallocatedT32(instr);
  17361                                     return;
  17362                                   }
  17363                                   unsigned rt = (instr >> 12) & 0xf;
  17364                                   unsigned rn = (instr >> 16) & 0xf;
  17365                                   int32_t offset = instr & 0xfff;
  17366                                   if ((rt < kNumberOfT32LowRegisters) &&
  17367                                       (rn < kNumberOfT32LowRegisters) &&
  17368                                       ((offset >= 0) && (offset <= 62) &&
  17369                                        ((offset & 1) == 0))) {
  17370                                     // LDRH{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
  17371                                     ldrh(CurrentCond(),
  17372                                          Wide,
  17373                                          Register(rt),
  17374                                          MemOperand(Register(rn),
  17375                                                     plus,
  17376                                                     offset,
  17377                                                     Offset));
  17378                                   } else {
  17379                                     // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length)
  17380                                     ldrh(CurrentCond(),
  17381                                          Best,
  17382                                          Register(rt),
  17383                                          MemOperand(Register(rn),
  17384                                                     plus,
  17385                                                     offset,
  17386                                                     Offset));
  17387                                   }
  17388                                   break;
  17389                                 }
  17390                               }
  17391                               break;
  17392                             }
  17393                           }
  17394                           break;
  17395                         }
  17396                       }
  17397                       break;
  17398                     }
  17399                     case 0x00400000: {
  17400                       // 0xf8500000
  17401                       switch (instr & 0x00200000) {
  17402                         case 0x00000000: {
  17403                           // 0xf8500000
  17404                           switch (instr & 0x000f0000) {
  17405                             case 0x000f0000: {
  17406                               // 0xf85f0000
  17407                               unsigned rt = (instr >> 12) & 0xf;
  17408                               uint32_t U = (instr >> 23) & 0x1;
  17409                               int32_t imm = instr & 0xfff;
  17410                               if (U == 0) imm = -imm;
  17411                               bool minus_zero = (imm == 0) && (U == 0);
  17412                               Location location(imm, kT32PcDelta);
  17413                               if ((imm >= -4095) && (imm <= 4095) &&
  17414                                   ((rt < kNumberOfT32LowRegisters) &&
  17415                                    (imm >= 0) && (imm <= 1020) &&
  17416                                    ((imm & 3) == 0))) {
  17417                                 // LDR{<c>}.W <Rt>, <label> ; T2
  17418                                 if (minus_zero) {
  17419                                   ldr(CurrentCond(),
  17420                                       Wide,
  17421                                       Register(rt),
  17422                                       MemOperand(pc, minus, 0));
  17423                                 } else {
  17424                                   ldr(CurrentCond(),
  17425                                       Wide,
  17426                                       Register(rt),
  17427                                       &location);
  17428                                 }
  17429                               } else if ((imm >= -4095) && (imm <= 4095)) {
  17430                                 // LDR{<c>}{<q>} <Rt>, <label> ; T2
  17431                                 if (minus_zero) {
  17432                                   ldr(CurrentCond(),
  17433                                       Best,
  17434                                       Register(rt),
  17435                                       MemOperand(pc, minus, 0));
  17436                                 } else {
  17437                                   ldr(CurrentCond(),
  17438                                       Best,
  17439                                       Register(rt),
  17440                                       &location);
  17441                                 }
  17442                               } else {
  17443                                 UnallocatedT32(instr);
  17444                               }
  17445                               break;
  17446                             }
  17447                             default: {
  17448                               switch (instr & 0x00800000) {
  17449                                 case 0x00000000: {
  17450                                   // 0xf8500000
  17451                                   switch (instr & 0x00000d00) {
  17452                                     case 0x00000000: {
  17453                                       // 0xf8500000
  17454                                       if ((instr & 0x000002c0) == 0x00000000) {
  17455                                         if (((instr & 0xf0000) == 0xf0000)) {
  17456                                           UnallocatedT32(instr);
  17457                                           return;
  17458                                         }
  17459                                         unsigned rt = (instr >> 12) & 0xf;
  17460                                         unsigned rn = (instr >> 16) & 0xf;
  17461                                         Sign sign(plus);
  17462                                         unsigned rm = instr & 0xf;
  17463                                         Shift shift = LSL;
  17464                                         uint32_t amount = (instr >> 4) & 0x3;
  17465                                         AddrMode addrmode = Offset;
  17466                                         if ((rt < kNumberOfT32LowRegisters) &&
  17467                                             (rn < kNumberOfT32LowRegisters) &&
  17468                                             (rm < kNumberOfT32LowRegisters) &&
  17469                                             shift.IsLSL() && (amount == 0) &&
  17470                                             sign.IsPlus()) {
  17471                                           // LDR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
  17472                                           ldr(CurrentCond(),
  17473                                               Wide,
  17474                                               Register(rt),
  17475                                               MemOperand(Register(rn),
  17476                                                          sign,
  17477                                                          Register(rm),
  17478                                                          addrmode));
  17479                                         } else {
  17480                                           // LDR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
  17481                                           ldr(CurrentCond(),
  17482                                               Best,
  17483                                               Register(rt),
  17484                                               MemOperand(Register(rn),
  17485                                                          sign,
  17486                                                          Register(rm),
  17487                                                          shift,
  17488                                                          amount,
  17489                                                          addrmode));
  17490                                         }
  17491                                       } else {
  17492                                         UnallocatedT32(instr);
  17493                                       }
  17494                                       break;
  17495                                     }
  17496                                     case 0x00000900: {
  17497                                       // 0xf8500900
  17498                                       if (((instr & 0xf0000) == 0xf0000)) {
  17499                                         UnallocatedT32(instr);
  17500                                         return;
  17501                                       }
  17502                                       if (((Uint32((instr >> 16)) &
  17503                                             Uint32(0xf)) == Uint32(0xd)) &&
  17504                                           ((Uint32((instr >> 9)) &
  17505                                             Uint32(0x1)) == Uint32(0x1)) &&
  17506                                           ((Uint32(instr) & Uint32(0xff)) ==
  17507                                            Uint32(0x4))) {
  17508                                         unsigned rt = (instr >> 12) & 0xf;
  17509                                         if ((rt <= 7) || (rt == kPCRegNum)) {
  17510                                           // POP{<c>}.W <single_register_list> ; T4 NOLINT(whitespace/line_length)
  17511                                           pop(CurrentCond(),
  17512                                               Wide,
  17513                                               Register(rt));
  17514                                         } else {
  17515                                           // POP{<c>}{<q>} <single_register_list> ; T4 NOLINT(whitespace/line_length)
  17516                                           pop(CurrentCond(),
  17517                                               Best,
  17518                                               Register(rt));
  17519                                         }
  17520                                         return;
  17521                                       }
  17522                                       unsigned rt = (instr >> 12) & 0xf;
  17523                                       unsigned rn = (instr >> 16) & 0xf;
  17524                                       Sign sign((((instr >> 9) & 0x1) == 0)
  17525                                                     ? minus
  17526                                                     : plus);
  17527                                       int32_t offset = instr & 0xff;
  17528                                       // LDR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4 NOLINT(whitespace/line_length)
  17529                                       ldr(CurrentCond(),
  17530                                           Best,
  17531                                           Register(rt),
  17532                                           MemOperand(Register(rn),
  17533                                                      sign,
  17534                                                      offset,
  17535                                                      PostIndex));
  17536                                       break;
  17537                                     }
  17538                                     case 0x00000c00: {
  17539                                       // 0xf8500c00
  17540                                       switch (instr & 0x00000200) {
  17541                                         case 0x00000000: {
  17542                                           // 0xf8500c00
  17543                                           if (((instr & 0xf0000) == 0xf0000)) {
  17544                                             UnallocatedT32(instr);
  17545                                             return;
  17546                                           }
  17547                                           unsigned rt = (instr >> 12) & 0xf;
  17548                                           unsigned rn = (instr >> 16) & 0xf;
  17549                                           int32_t offset = instr & 0xff;
  17550                                           // LDR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4 NOLINT(whitespace/line_length)
  17551                                           ldr(CurrentCond(),
  17552                                               Best,
  17553                                               Register(rt),
  17554                                               MemOperand(Register(rn),
  17555                                                          minus,
  17556                                                          offset,
  17557                                                          Offset));
  17558                                           break;
  17559                                         }
  17560                                         case 0x00000200: {
  17561                                           // 0xf8500e00
  17562                                           if (((instr & 0xf0000) == 0xf0000)) {
  17563                                             UnallocatedT32(instr);
  17564                                             return;
  17565                                           }
  17566                                           UnimplementedT32_32("LDRT", instr);
  17567                                           break;
  17568                                         }
  17569                                       }
  17570                                       break;
  17571                                     }
  17572                                     case 0x00000d00: {
  17573                                       // 0xf8500d00
  17574                                       if (((instr & 0xf0000) == 0xf0000)) {
  17575                                         UnallocatedT32(instr);
  17576                                         return;
  17577                                       }
  17578                                       unsigned rt = (instr >> 12) & 0xf;
  17579                                       unsigned rn = (instr >> 16) & 0xf;
  17580                                       Sign sign((((instr >> 9) & 0x1) == 0)
  17581                                                     ? minus
  17582                                                     : plus);
  17583                                       int32_t offset = instr & 0xff;
  17584                                       // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4 NOLINT(whitespace/line_length)
  17585                                       ldr(CurrentCond(),
  17586                                           Best,
  17587                                           Register(rt),
  17588                                           MemOperand(Register(rn),
  17589                                                      sign,
  17590                                                      offset,
  17591                                                      PreIndex));
  17592                                       break;
  17593                                     }
  17594                                     default:
  17595                                       UnallocatedT32(instr);
  17596                                       break;
  17597                                   }
  17598                                   break;
  17599                                 }
  17600                                 case 0x00800000: {
  17601                                   // 0xf8d00000
  17602                                   if (((instr & 0xf0000) == 0xf0000)) {
  17603                                     UnallocatedT32(instr);
  17604                                     return;
  17605                                   }
  17606                                   unsigned rt = (instr >> 12) & 0xf;
  17607                                   unsigned rn = (instr >> 16) & 0xf;
  17608                                   int32_t offset = instr & 0xfff;
  17609                                   if (((rt < kNumberOfT32LowRegisters) &&
  17610                                        (rn < kNumberOfT32LowRegisters) &&
  17611                                        ((offset >= 0) && (offset <= 124) &&
  17612                                         ((offset & 3) == 0))) ||
  17613                                       ((rt < kNumberOfT32LowRegisters) &&
  17614                                        (rn == sp.GetCode()) &&
  17615                                        ((offset >= 0) && (offset <= 1020) &&
  17616                                         ((offset & 3) == 0)))) {
  17617                                     // LDR{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 NOLINT(whitespace/line_length)
  17618                                     ldr(CurrentCond(),
  17619                                         Wide,
  17620                                         Register(rt),
  17621                                         MemOperand(Register(rn),
  17622                                                    plus,
  17623                                                    offset,
  17624                                                    Offset));
  17625                                   } else {
  17626                                     // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 NOLINT(whitespace/line_length)
  17627                                     ldr(CurrentCond(),
  17628                                         Best,
  17629                                         Register(rt),
  17630                                         MemOperand(Register(rn),
  17631                                                    plus,
  17632                                                    offset,
  17633                                                    Offset));
  17634                                   }
  17635                                   break;
  17636                                 }
  17637                               }
  17638                               break;
  17639                             }
  17640                           }
  17641                           break;
  17642                         }
  17643                         default:
  17644                           UnallocatedT32(instr);
  17645                           break;
  17646                       }
  17647                       break;
  17648                     }
  17649                     case 0x01000000: {
  17650                       // 0xf9100000
  17651                       switch (instr & 0x00200000) {
  17652                         case 0x00000000: {
  17653                           // 0xf9100000
  17654                           switch (instr & 0x000f0000) {
  17655                             case 0x000f0000: {
  17656                               // 0xf91f0000
  17657                               switch (instr & 0x0000f000) {
  17658                                 case 0x0000f000: {
  17659                                   // 0xf91ff000
  17660                                   uint32_t U = (instr >> 23) & 0x1;
  17661                                   int32_t imm = instr & 0xfff;
  17662                                   if (U == 0) imm = -imm;
  17663                                   bool minus_zero = (imm == 0) && (U == 0);
  17664                                   Location location(imm, kT32PcDelta);
  17665                                   // PLI{<c>}{<q>} <label> ; T3
  17666                                   if (minus_zero) {
  17667                                     pli(CurrentCond(),
  17668                                         MemOperand(pc, minus, 0));
  17669                                   } else {
  17670                                     pli(CurrentCond(), &location);
  17671                                   }
  17672                                   break;
  17673                                 }
  17674                                 default: {
  17675                                   if (((instr & 0xf000) == 0xf000)) {
  17676                                     UnallocatedT32(instr);
  17677                                     return;
  17678                                   }
  17679                                   unsigned rt = (instr >> 12) & 0xf;
  17680                                   uint32_t U = (instr >> 23) & 0x1;
  17681                                   int32_t imm = instr & 0xfff;
  17682                                   if (U == 0) imm = -imm;
  17683                                   bool minus_zero = (imm == 0) && (U == 0);
  17684                                   Location location(imm, kT32PcDelta);
  17685                                   // LDRSB{<c>}{<q>} <Rt>, <label> ; T1
  17686                                   if (minus_zero) {
  17687                                     ldrsb(CurrentCond(),
  17688                                           Best,
  17689                                           Register(rt),
  17690                                           MemOperand(pc, minus, 0));
  17691                                   } else {
  17692                                     ldrsb(CurrentCond(),
  17693                                           Register(rt),
  17694                                           &location);
  17695                                   }
  17696                                   break;
  17697                                 }
  17698                               }
  17699                               break;
  17700                             }
  17701                             default: {
  17702                               switch (instr & 0x00800000) {
  17703                                 case 0x00000000: {
  17704                                   // 0xf9100000
  17705                                   switch (instr & 0x00000d00) {
  17706                                     case 0x00000000: {
  17707                                       // 0xf9100000
  17708                                       switch (instr & 0x000002c0) {
  17709                                         case 0x00000000: {
  17710                                           // 0xf9100000
  17711                                           switch (instr & 0x0000f000) {
  17712                                             case 0x0000f000: {
  17713                                               // 0xf910f000
  17714                                               if (((instr & 0xf0000) ==
  17715                                                    0xf0000)) {
  17716                                                 UnallocatedT32(instr);
  17717                                                 return;
  17718                                               }
  17719                                               unsigned rn = (instr >> 16) & 0xf;
  17720                                               Sign sign(plus);
  17721                                               unsigned rm = instr & 0xf;
  17722                                               Shift shift = LSL;
  17723                                               uint32_t amount =
  17724                                                   (instr >> 4) & 0x3;
  17725                                               AddrMode addrmode = Offset;
  17726                                               // PLI{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length)
  17727                                               pli(CurrentCond(),
  17728                                                   MemOperand(Register(rn),
  17729                                                              sign,
  17730                                                              Register(rm),
  17731                                                              shift,
  17732                                                              amount,
  17733                                                              addrmode));
  17734                                               break;
  17735                                             }
  17736                                             default: {
  17737                                               if (((instr & 0xf0000) ==
  17738                                                    0xf0000) ||
  17739                                                   ((instr & 0xf000) ==
  17740                                                    0xf000)) {
  17741                                                 UnallocatedT32(instr);
  17742                                                 return;
  17743                                               }
  17744                                               unsigned rt = (instr >> 12) & 0xf;
  17745                                               unsigned rn = (instr >> 16) & 0xf;
  17746                                               Sign sign(plus);
  17747                                               unsigned rm = instr & 0xf;
  17748                                               Shift shift = LSL;
  17749                                               uint32_t amount =
  17750                                                   (instr >> 4) & 0x3;
  17751                                               AddrMode addrmode = Offset;
  17752                                               if ((rt <
  17753                                                    kNumberOfT32LowRegisters) &&
  17754                                                   (rn <
  17755                                                    kNumberOfT32LowRegisters) &&
  17756                                                   (rm <
  17757                                                    kNumberOfT32LowRegisters) &&
  17758                                                   shift.IsLSL() &&
  17759                                                   (amount == 0) &&
  17760                                                   sign.IsPlus()) {
  17761                                                 // LDRSB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
  17762                                                 ldrsb(CurrentCond(),
  17763                                                       Wide,
  17764                                                       Register(rt),
  17765                                                       MemOperand(Register(rn),
  17766                                                                  sign,
  17767                                                                  Register(rm),
  17768                                                                  addrmode));
  17769                                               } else {
  17770                                                 // LDRSB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
  17771                                                 ldrsb(CurrentCond(),
  17772                                                       Best,
  17773                                                       Register(rt),
  17774                                                       MemOperand(Register(rn),
  17775                                                                  sign,
  17776                                                                  Register(rm),
  17777                                                                  shift,
  17778                                                                  amount,
  17779                                                                  addrmode));
  17780                                               }
  17781                                               break;
  17782                                             }
  17783                                           }
  17784                                           break;
  17785                                         }
  17786                                         default:
  17787                                           UnallocatedT32(instr);
  17788                                           break;
  17789                                       }
  17790                                       break;
  17791                                     }
  17792                                     case 0x00000900: {
  17793                                       // 0xf9100900
  17794                                       if (((instr & 0xf0000) == 0xf0000)) {
  17795                                         UnallocatedT32(instr);
  17796                                         return;
  17797                                       }
  17798                                       unsigned rt = (instr >> 12) & 0xf;
  17799                                       unsigned rn = (instr >> 16) & 0xf;
  17800                                       Sign sign((((instr >> 9) & 0x1) == 0)
  17801                                                     ? minus
  17802                                                     : plus);
  17803                                       int32_t offset = instr & 0xff;
  17804                                       // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_1> ; T2 NOLINT(whitespace/line_length)
  17805                                       ldrsb(CurrentCond(),
  17806                                             Best,
  17807                                             Register(rt),
  17808                                             MemOperand(Register(rn),
  17809                                                        sign,
  17810                                                        offset,
  17811                                                        PostIndex));
  17812                                       break;
  17813                                     }
  17814                                     case 0x00000c00: {
  17815                                       // 0xf9100c00
  17816                                       switch (instr & 0x00000200) {
  17817                                         case 0x00000000: {
  17818                                           // 0xf9100c00
  17819                                           switch (instr & 0x0000f000) {
  17820                                             case 0x0000f000: {
  17821                                               // 0xf910fc00
  17822                                               if (((instr & 0xf0000) ==
  17823                                                    0xf0000)) {
  17824                                                 UnallocatedT32(instr);
  17825                                                 return;
  17826                                               }
  17827                                               unsigned rn = (instr >> 16) & 0xf;
  17828                                               int32_t offset = instr & 0xff;
  17829                                               // PLI{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
  17830                                               pli(CurrentCond(),
  17831                                                   MemOperand(Register(rn),
  17832                                                              minus,
  17833                                                              offset,
  17834                                                              Offset));
  17835                                               break;
  17836                                             }
  17837                                             default: {
  17838                                               if (((instr & 0xf0000) ==
  17839                                                    0xf0000) ||
  17840                                                   ((instr & 0xf000) ==
  17841                                                    0xf000)) {
  17842                                                 UnallocatedT32(instr);
  17843                                                 return;
  17844                                               }
  17845                                               unsigned rt = (instr >> 12) & 0xf;
  17846                                               unsigned rn = (instr >> 16) & 0xf;
  17847                                               int32_t offset = instr & 0xff;
  17848                                               // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
  17849                                               ldrsb(CurrentCond(),
  17850                                                     Best,
  17851                                                     Register(rt),
  17852                                                     MemOperand(Register(rn),
  17853                                                                minus,
  17854                                                                offset,
  17855                                                                Offset));
  17856                                               break;
  17857                                             }
  17858                                           }
  17859                                           break;
  17860                                         }
  17861                                         case 0x00000200: {
  17862                                           // 0xf9100e00
  17863                                           if (((instr & 0xf0000) == 0xf0000)) {
  17864                                             UnallocatedT32(instr);
  17865                                             return;
  17866                                           }
  17867                                           UnimplementedT32_32("LDRSBT", instr);
  17868                                           break;
  17869                                         }
  17870                                       }
  17871                                       break;
  17872                                     }
  17873                                     case 0x00000d00: {
  17874                                       // 0xf9100d00
  17875                                       if (((instr & 0xf0000) == 0xf0000)) {
  17876                                         UnallocatedT32(instr);
  17877                                         return;
  17878                                       }
  17879                                       unsigned rt = (instr >> 12) & 0xf;
  17880                                       unsigned rn = (instr >> 16) & 0xf;
  17881                                       Sign sign((((instr >> 9) & 0x1) == 0)
  17882                                                     ? minus
  17883                                                     : plus);
  17884                                       int32_t offset = instr & 0xff;
  17885                                       // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_1>}]! ; T2 NOLINT(whitespace/line_length)
  17886                                       ldrsb(CurrentCond(),
  17887                                             Best,
  17888                                             Register(rt),
  17889                                             MemOperand(Register(rn),
  17890                                                        sign,
  17891                                                        offset,
  17892                                                        PreIndex));
  17893                                       break;
  17894                                     }
  17895                                     default:
  17896                                       UnallocatedT32(instr);
  17897                                       break;
  17898                                   }
  17899                                   break;
  17900                                 }
  17901                                 case 0x00800000: {
  17902                                   // 0xf9900000
  17903                                   switch (instr & 0x0000f000) {
  17904                                     case 0x0000f000: {
  17905                                       // 0xf990f000
  17906                                       if (((instr & 0xf0000) == 0xf0000)) {
  17907                                         UnallocatedT32(instr);
  17908                                         return;
  17909                                       }
  17910                                       unsigned rn = (instr >> 16) & 0xf;
  17911                                       int32_t offset = instr & 0xfff;
  17912                                       // PLI{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1
  17913                                       pli(CurrentCond(),
  17914                                           MemOperand(Register(rn),
  17915                                                      plus,
  17916                                                      offset,
  17917                                                      Offset));
  17918                                       break;
  17919                                     }
  17920                                     default: {
  17921                                       if (((instr & 0xf0000) == 0xf0000) ||
  17922                                           ((instr & 0xf000) == 0xf000)) {
  17923                                         UnallocatedT32(instr);
  17924                                         return;
  17925                                       }
  17926                                       unsigned rt = (instr >> 12) & 0xf;
  17927                                       unsigned rn = (instr >> 16) & 0xf;
  17928                                       int32_t offset = instr & 0xfff;
  17929                                       // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 NOLINT(whitespace/line_length)
  17930                                       ldrsb(CurrentCond(),
  17931                                             Best,
  17932                                             Register(rt),
  17933                                             MemOperand(Register(rn),
  17934                                                        plus,
  17935                                                        offset,
  17936                                                        Offset));
  17937                                       break;
  17938                                     }
  17939                                   }
  17940                                   break;
  17941                                 }
  17942                               }
  17943                               break;
  17944                             }
  17945                           }
  17946                           break;
  17947                         }
  17948                         case 0x00200000: {
  17949                           // 0xf9300000
  17950                           switch (instr & 0x000f0000) {
  17951                             case 0x000f0000: {
  17952                               // 0xf93f0000
  17953                               if (((instr & 0xf000) == 0xf000)) {
  17954                                 UnallocatedT32(instr);
  17955                                 return;
  17956                               }
  17957                               unsigned rt = (instr >> 12) & 0xf;
  17958                               uint32_t U = (instr >> 23) & 0x1;
  17959                               int32_t imm = instr & 0xfff;
  17960                               if (U == 0) imm = -imm;
  17961                               bool minus_zero = (imm == 0) && (U == 0);
  17962                               Location location(imm, kT32PcDelta);
  17963                               // LDRSH{<c>}{<q>} <Rt>, <label> ; T1
  17964                               if (minus_zero) {
  17965                                 ldrsh(CurrentCond(),
  17966                                       Best,
  17967                                       Register(rt),
  17968                                       MemOperand(pc, minus, 0));
  17969                               } else {
  17970                                 ldrsh(CurrentCond(), Register(rt), &location);
  17971                               }
  17972                               break;
  17973                             }
  17974                             default: {
  17975                               switch (instr & 0x00800000) {
  17976                                 case 0x00000000: {
  17977                                   // 0xf9300000
  17978                                   switch (instr & 0x00000d00) {
  17979                                     case 0x00000000: {
  17980                                       // 0xf9300000
  17981                                       if ((instr & 0x000002c0) == 0x00000000) {
  17982                                         if (((instr & 0xf0000) == 0xf0000) ||
  17983                                             ((instr & 0xf000) == 0xf000)) {
  17984                                           UnallocatedT32(instr);
  17985                                           return;
  17986                                         }
  17987                                         unsigned rt = (instr >> 12) & 0xf;
  17988                                         unsigned rn = (instr >> 16) & 0xf;
  17989                                         Sign sign(plus);
  17990                                         unsigned rm = instr & 0xf;
  17991                                         Shift shift = LSL;
  17992                                         uint32_t amount = (instr >> 4) & 0x3;
  17993                                         AddrMode addrmode = Offset;
  17994                                         if ((rt < kNumberOfT32LowRegisters) &&
  17995                                             (rn < kNumberOfT32LowRegisters) &&
  17996                                             (rm < kNumberOfT32LowRegisters) &&
  17997                                             shift.IsLSL() && (amount == 0) &&
  17998                                             sign.IsPlus()) {
  17999                                           // LDRSH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length)
  18000                                           ldrsh(CurrentCond(),
  18001                                                 Wide,
  18002                                                 Register(rt),
  18003                                                 MemOperand(Register(rn),
  18004                                                            sign,
  18005                                                            Register(rm),
  18006                                                            addrmode));
  18007                                         } else {
  18008                                           // LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
  18009                                           ldrsh(CurrentCond(),
  18010                                                 Best,
  18011                                                 Register(rt),
  18012                                                 MemOperand(Register(rn),
  18013                                                            sign,
  18014                                                            Register(rm),
  18015                                                            shift,
  18016                                                            amount,
  18017                                                            addrmode));
  18018                                         }
  18019                                       } else {
  18020                                         UnallocatedT32(instr);
  18021                                       }
  18022                                       break;
  18023                                     }
  18024                                     case 0x00000900: {
  18025                                       // 0xf9300900
  18026                                       if (((instr & 0xf0000) == 0xf0000)) {
  18027                                         UnallocatedT32(instr);
  18028                                         return;
  18029                                       }
  18030                                       unsigned rt = (instr >> 12) & 0xf;
  18031                                       unsigned rn = (instr >> 16) & 0xf;
  18032                                       Sign sign((((instr >> 9) & 0x1) == 0)
  18033                                                     ? minus
  18034                                                     : plus);
  18035                                       int32_t offset = instr & 0xff;
  18036                                       // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_1> ; T2 NOLINT(whitespace/line_length)
  18037                                       ldrsh(CurrentCond(),
  18038                                             Best,
  18039                                             Register(rt),
  18040                                             MemOperand(Register(rn),
  18041                                                        sign,
  18042                                                        offset,
  18043                                                        PostIndex));
  18044                                       break;
  18045                                     }
  18046                                     case 0x00000c00: {
  18047                                       // 0xf9300c00
  18048                                       switch (instr & 0x00000200) {
  18049                                         case 0x00000000: {
  18050                                           // 0xf9300c00
  18051                                           if (((instr & 0xf0000) == 0xf0000) ||
  18052                                               ((instr & 0xf000) == 0xf000)) {
  18053                                             UnallocatedT32(instr);
  18054                                             return;
  18055                                           }
  18056                                           unsigned rt = (instr >> 12) & 0xf;
  18057                                           unsigned rn = (instr >> 16) & 0xf;
  18058                                           int32_t offset = instr & 0xff;
  18059                                           // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length)
  18060                                           ldrsh(CurrentCond(),
  18061                                                 Best,
  18062                                                 Register(rt),
  18063                                                 MemOperand(Register(rn),
  18064                                                            minus,
  18065                                                            offset,
  18066                                                            Offset));
  18067                                           break;
  18068                                         }
  18069                                         case 0x00000200: {
  18070                                           // 0xf9300e00
  18071                                           if (((instr & 0xf0000) == 0xf0000)) {
  18072                                             UnallocatedT32(instr);
  18073                                             return;
  18074                                           }
  18075                                           UnimplementedT32_32("LDRSHT", instr);
  18076                                           break;
  18077                                         }
  18078                                       }
  18079                                       break;
  18080                                     }
  18081                                     case 0x00000d00: {
  18082                                       // 0xf9300d00
  18083                                       if (((instr & 0xf0000) == 0xf0000)) {
  18084                                         UnallocatedT32(instr);
  18085                                         return;
  18086                                       }
  18087                                       unsigned rt = (instr >> 12) & 0xf;
  18088                                       unsigned rn = (instr >> 16) & 0xf;
  18089                                       Sign sign((((instr >> 9) & 0x1) == 0)
  18090                                                     ? minus
  18091                                                     : plus);
  18092                                       int32_t offset = instr & 0xff;
  18093                                       // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_1>}]! ; T2 NOLINT(whitespace/line_length)
  18094                                       ldrsh(CurrentCond(),
  18095                                             Best,
  18096                                             Register(rt),
  18097                                             MemOperand(Register(rn),
  18098                                                        sign,
  18099                                                        offset,
  18100                                                        PreIndex));
  18101                                       break;
  18102                                     }
  18103                                     default:
  18104                                       UnallocatedT32(instr);
  18105                                       break;
  18106                                   }
  18107                                   break;
  18108                                 }
  18109                                 case 0x00800000: {
  18110                                   // 0xf9b00000
  18111                                   if (((instr & 0xf0000) == 0xf0000) ||
  18112                                       ((instr & 0xf000) == 0xf000)) {
  18113                                     UnallocatedT32(instr);
  18114                                     return;
  18115                                   }
  18116                                   unsigned rt = (instr >> 12) & 0xf;
  18117                                   unsigned rn = (instr >> 16) & 0xf;
  18118                                   int32_t offset = instr & 0xfff;
  18119                                   // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 NOLINT(whitespace/line_length)
  18120                                   ldrsh(CurrentCond(),
  18121                                         Best,
  18122                                         Register(rt),
  18123                                         MemOperand(Register(rn),
  18124                                                    plus,
  18125                                                    offset,
  18126                                                    Offset));
  18127                                   break;
  18128                                 }
  18129                               }
  18130                               break;
  18131                             }
  18132                           }
  18133                           break;
  18134                         }
  18135                       }
  18136                       break;
  18137                     }
  18138                     default:
  18139                       UnallocatedT32(instr);
  18140                       break;
  18141                   }
  18142                   break;
  18143                 }
  18144               }
  18145               break;
  18146             }
  18147             case 0x02000000: {
  18148               // 0xea000000
  18149               switch (instr & 0x11900000) {
  18150                 case 0x00000000: {
  18151                   // 0xea000000
  18152                   switch (instr & 0x00600000) {
  18153                     case 0x00000000: {
  18154                       // 0xea000000
  18155                       switch (instr & 0x000070f0) {
  18156                         case 0x00000030: {
  18157                           // 0xea000030
  18158                           unsigned rd = (instr >> 8) & 0xf;
  18159                           unsigned rn = (instr >> 16) & 0xf;
  18160                           unsigned rm = instr & 0xf;
  18161                           // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
  18162                           and_(CurrentCond(),
  18163                                Best,
  18164                                Register(rd),
  18165                                Register(rn),
  18166                                Operand(Register(rm), RRX));
  18167                           if (((instr & 0xfff0f0f0) != 0xea000030)) {
  18168                             UnpredictableT32(instr);
  18169                           }
  18170                           break;
  18171                         }
  18172                         default: {
  18173                           if (((instr & 0x70f0) == 0x30)) {
  18174                             UnallocatedT32(instr);
  18175                             return;
  18176                           }
  18177                           unsigned rd = (instr >> 8) & 0xf;
  18178                           unsigned rn = (instr >> 16) & 0xf;
  18179                           unsigned rm = instr & 0xf;
  18180                           ImmediateShiftOperand
  18181                               shift_operand((instr >> 4) & 0x3,
  18182                                             ((instr >> 6) & 0x3) |
  18183                                                 ((instr >> 10) & 0x1c));
  18184                           if (InITBlock() &&
  18185                               (instr & 0x00100000) == 0x00000000 &&
  18186                               shift_operand.GetShift().IsLSL() &&
  18187                               (shift_operand.GetAmount() == 0) &&
  18188                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
  18189                                (rm < kNumberOfT32LowRegisters))) {
  18190                             // AND<c>.W {<Rd>}, <Rn>, <Rm> ; T2
  18191                             and_(CurrentCond(),
  18192                                  Wide,
  18193                                  Register(rd),
  18194                                  Register(rn),
  18195                                  Register(rm));
  18196                             if (((instr & 0xfff08000) != 0xea000000)) {
  18197                               UnpredictableT32(instr);
  18198                             }
  18199                           } else if ((instr & 0x00100000) == 0x00000000) {
  18200                             // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
  18201                             and_(CurrentCond(),
  18202                                  Best,
  18203                                  Register(rd),
  18204                                  Register(rn),
  18205                                  Operand(Register(rm),
  18206                                          shift_operand.GetType(),
  18207                                          shift_operand.GetAmount()));
  18208                             if (((instr & 0xfff08000) != 0xea000000)) {
  18209                               UnpredictableT32(instr);
  18210                             }
  18211                           } else {
  18212                             UnallocatedT32(instr);
  18213                           }
  18214                           break;
  18215                         }
  18216                       }
  18217                       break;
  18218                     }
  18219                     case 0x00200000: {
  18220                       // 0xea200000
  18221                       switch (instr & 0x000070f0) {
  18222                         case 0x00000030: {
  18223                           // 0xea200030
  18224                           unsigned rd = (instr >> 8) & 0xf;
  18225                           unsigned rn = (instr >> 16) & 0xf;
  18226                           unsigned rm = instr & 0xf;
  18227                           // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
  18228                           bic(CurrentCond(),
  18229                               Best,
  18230                               Register(rd),
  18231                               Register(rn),
  18232                               Operand(Register(rm), RRX));
  18233                           if (((instr & 0xfff0f0f0) != 0xea200030)) {
  18234                             UnpredictableT32(instr);
  18235                           }
  18236                           break;
  18237                         }
  18238                         default: {
  18239                           if (((instr & 0x70f0) == 0x30)) {
  18240                             UnallocatedT32(instr);
  18241                             return;
  18242                           }
  18243                           unsigned rd = (instr >> 8) & 0xf;
  18244                           unsigned rn = (instr >> 16) & 0xf;
  18245                           unsigned rm = instr & 0xf;
  18246                           ImmediateShiftOperand
  18247                               shift_operand((instr >> 4) & 0x3,
  18248                                             ((instr >> 6) & 0x3) |
  18249                                                 ((instr >> 10) & 0x1c));
  18250                           if (InITBlock() &&
  18251                               (instr & 0x00100000) == 0x00000000 &&
  18252                               shift_operand.GetShift().IsLSL() &&
  18253                               (shift_operand.GetAmount() == 0) &&
  18254                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
  18255                                (rm < kNumberOfT32LowRegisters))) {
  18256                             // BIC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
  18257                             bic(CurrentCond(),
  18258                                 Wide,
  18259                                 Register(rd),
  18260                                 Register(rn),
  18261                                 Register(rm));
  18262                             if (((instr & 0xfff08000) != 0xea200000)) {
  18263                               UnpredictableT32(instr);
  18264                             }
  18265                           } else if ((instr & 0x00100000) == 0x00000000) {
  18266                             // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
  18267                             bic(CurrentCond(),
  18268                                 Best,
  18269                                 Register(rd),
  18270                                 Register(rn),
  18271                                 Operand(Register(rm),
  18272                                         shift_operand.GetType(),
  18273                                         shift_operand.GetAmount()));
  18274                             if (((instr & 0xfff08000) != 0xea200000)) {
  18275                               UnpredictableT32(instr);
  18276                             }
  18277                           } else {
  18278                             UnallocatedT32(instr);
  18279                           }
  18280                           break;
  18281                         }
  18282                       }
  18283                       break;
  18284                     }
  18285                     case 0x00400000: {
  18286                       // 0xea400000
  18287                       switch (instr & 0x000f0000) {
  18288                         case 0x000f0000: {
  18289                           // 0xea4f0000
  18290                           switch (instr & 0x000070f0) {
  18291                             case 0x00000030: {
  18292                               // 0xea4f0030
  18293                               unsigned rd = (instr >> 8) & 0xf;
  18294                               unsigned rm = instr & 0xf;
  18295                               // RRX{<c>}{<q>} {<Rd>}, <Rm> ; T3
  18296                               rrx(CurrentCond(), Register(rd), Register(rm));
  18297                               if (((instr & 0xfffff0f0) != 0xea4f0030)) {
  18298                                 UnpredictableT32(instr);
  18299                               }
  18300                               break;
  18301                             }
  18302                             default: {
  18303                               if (((instr & 0x70f0) == 0x30)) {
  18304                                 UnallocatedT32(instr);
  18305                                 return;
  18306                               }
  18307                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
  18308                                    Uint32(0x2))) {
  18309                                 unsigned rd = (instr >> 8) & 0xf;
  18310                                 unsigned rm = instr & 0xf;
  18311                                 uint32_t amount = ((instr >> 6) & 0x3) |
  18312                                                   ((instr >> 10) & 0x1c);
  18313                                 if (amount == 0) amount = 32;
  18314                                 if (InITBlock() &&
  18315                                     ((rd < kNumberOfT32LowRegisters) &&
  18316                                      (rm < kNumberOfT32LowRegisters) &&
  18317                                      ((amount >= 1) && (amount <= 32)))) {
  18318                                   // ASR<c>.W {<Rd>}, <Rm>, #<imm> ; T3
  18319                                   asr(CurrentCond(),
  18320                                       Wide,
  18321                                       Register(rd),
  18322                                       Register(rm),
  18323                                       amount);
  18324                                   if (((instr & 0xffff8030) != 0xea4f0020)) {
  18325                                     UnpredictableT32(instr);
  18326                                   }
  18327                                 } else {
  18328                                   // ASR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
  18329                                   asr(CurrentCond(),
  18330                                       Best,
  18331                                       Register(rd),
  18332                                       Register(rm),
  18333                                       amount);
  18334                                   if (((instr & 0xffff8030) != 0xea4f0020)) {
  18335                                     UnpredictableT32(instr);
  18336                                   }
  18337                                 }
  18338                                 return;
  18339                               }
  18340                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
  18341                                    Uint32(0x0)) &&
  18342                                   ((instr & 0x000070c0) != 0x00000000)) {
  18343                                 unsigned rd = (instr >> 8) & 0xf;
  18344                                 unsigned rm = instr & 0xf;
  18345                                 uint32_t amount = ((instr >> 6) & 0x3) |
  18346                                                   ((instr >> 10) & 0x1c);
  18347                                 if (InITBlock() &&
  18348                                     ((rd < kNumberOfT32LowRegisters) &&
  18349                                      (rm < kNumberOfT32LowRegisters) &&
  18350                                      ((amount >= 1) && (amount <= 31)))) {
  18351                                   // LSL<c>.W {<Rd>}, <Rm>, #<imm> ; T3
  18352                                   lsl(CurrentCond(),
  18353                                       Wide,
  18354                                       Register(rd),
  18355                                       Register(rm),
  18356                                       amount);
  18357                                   if (((instr & 0xffff8030) != 0xea4f0000)) {
  18358                                     UnpredictableT32(instr);
  18359                                   }
  18360                                 } else {
  18361                                   // LSL{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
  18362                                   lsl(CurrentCond(),
  18363                                       Best,
  18364                                       Register(rd),
  18365                                       Register(rm),
  18366                                       amount);
  18367                                   if (((instr & 0xffff8030) != 0xea4f0000)) {
  18368                                     UnpredictableT32(instr);
  18369                                   }
  18370                                 }
  18371                                 return;
  18372                               }
  18373                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
  18374                                    Uint32(0x1))) {
  18375                                 unsigned rd = (instr >> 8) & 0xf;
  18376                                 unsigned rm = instr & 0xf;
  18377                                 uint32_t amount = ((instr >> 6) & 0x3) |
  18378                                                   ((instr >> 10) & 0x1c);
  18379                                 if (amount == 0) amount = 32;
  18380                                 if (InITBlock() &&
  18381                                     ((rd < kNumberOfT32LowRegisters) &&
  18382                                      (rm < kNumberOfT32LowRegisters) &&
  18383                                      ((amount >= 1) && (amount <= 32)))) {
  18384                                   // LSR<c>.W {<Rd>}, <Rm>, #<imm> ; T3
  18385                                   lsr(CurrentCond(),
  18386                                       Wide,
  18387                                       Register(rd),
  18388                                       Register(rm),
  18389                                       amount);
  18390                                   if (((instr & 0xffff8030) != 0xea4f0010)) {
  18391                                     UnpredictableT32(instr);
  18392                                   }
  18393                                 } else {
  18394                                   // LSR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
  18395                                   lsr(CurrentCond(),
  18396                                       Best,
  18397                                       Register(rd),
  18398                                       Register(rm),
  18399                                       amount);
  18400                                   if (((instr & 0xffff8030) != 0xea4f0010)) {
  18401                                     UnpredictableT32(instr);
  18402                                   }
  18403                                 }
  18404                                 return;
  18405                               }
  18406                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
  18407                                    Uint32(0x3)) &&
  18408                                   ((instr & 0x000070c0) != 0x00000000)) {
  18409                                 unsigned rd = (instr >> 8) & 0xf;
  18410                                 unsigned rm = instr & 0xf;
  18411                                 uint32_t amount = ((instr >> 6) & 0x3) |
  18412                                                   ((instr >> 10) & 0x1c);
  18413                                 // ROR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
  18414                                 ror(CurrentCond(),
  18415                                     Best,
  18416                                     Register(rd),
  18417                                     Register(rm),
  18418                                     amount);
  18419                                 if (((instr & 0xffff8030) != 0xea4f0030)) {
  18420                                   UnpredictableT32(instr);
  18421                                 }
  18422                                 return;
  18423                               }
  18424                               unsigned rd = (instr >> 8) & 0xf;
  18425                               unsigned rm = instr & 0xf;
  18426                               ImmediateShiftOperand
  18427                                   shift_operand((instr >> 4) & 0x3,
  18428                                                 ((instr >> 6) & 0x3) |
  18429                                                     ((instr >> 10) & 0x1c));
  18430                               if ((instr & 0x00100000) == 0x00000000 &&
  18431                                   (shift_operand.GetShift().IsLSL() &&
  18432                                    (shift_operand.GetAmount() == 0))) {
  18433                                 // MOV<c>.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
  18434                                 mov(CurrentCond(),
  18435                                     Wide,
  18436                                     Register(rd),
  18437                                     Operand(Register(rm),
  18438                                             shift_operand.GetType(),
  18439                                             shift_operand.GetAmount()));
  18440                                 if (((instr & 0xffff8000) != 0xea4f0000)) {
  18441                                   UnpredictableT32(instr);
  18442                                 }
  18443                               } else if (InITBlock() &&
  18444                                          (instr & 0x00100000) == 0x00000000 &&
  18445                                          ((rd < kNumberOfT32LowRegisters) &&
  18446                                           (rm < kNumberOfT32LowRegisters))) {
  18447                                 // MOV<c>.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
  18448                                 mov(CurrentCond(),
  18449                                     Wide,
  18450                                     Register(rd),
  18451                                     Operand(Register(rm),
  18452                                             shift_operand.GetType(),
  18453                                             shift_operand.GetAmount()));
  18454                                 if (((instr & 0xffff8000) != 0xea4f0000)) {
  18455                                   UnpredictableT32(instr);
  18456                                 }
  18457                               } else if ((instr & 0x00100000) == 0x00000000) {
  18458                                 // MOV{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
  18459                                 mov(CurrentCond(),
  18460                                     Best,
  18461                                     Register(rd),
  18462                                     Operand(Register(rm),
  18463                                             shift_operand.GetType(),
  18464                                             shift_operand.GetAmount()));
  18465                                 if (((instr & 0xffff8000) != 0xea4f0000)) {
  18466                                   UnpredictableT32(instr);
  18467                                 }
  18468                               } else {
  18469                                 UnallocatedT32(instr);
  18470                               }
  18471                               break;
  18472                             }
  18473                           }
  18474                           break;
  18475                         }
  18476                         default: {
  18477                           switch (instr & 0x000070f0) {
  18478                             case 0x00000030: {
  18479                               // 0xea400030
  18480                               if (((instr & 0xf0000) == 0xf0000)) {
  18481                                 UnallocatedT32(instr);
  18482                                 return;
  18483                               }
  18484                               unsigned rd = (instr >> 8) & 0xf;
  18485                               unsigned rn = (instr >> 16) & 0xf;
  18486                               unsigned rm = instr & 0xf;
  18487                               // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
  18488                               orr(CurrentCond(),
  18489                                   Best,
  18490                                   Register(rd),
  18491                                   Register(rn),
  18492                                   Operand(Register(rm), RRX));
  18493                               if (((instr & 0xfff0f0f0) != 0xea400030)) {
  18494                                 UnpredictableT32(instr);
  18495                               }
  18496                               break;
  18497                             }
  18498                             default: {
  18499                               if (((instr & 0xf0000) == 0xf0000) ||
  18500                                   ((instr & 0x70f0) == 0x30)) {
  18501                                 UnallocatedT32(instr);
  18502                                 return;
  18503                               }
  18504                               unsigned rd = (instr >> 8) & 0xf;
  18505                               unsigned rn = (instr >> 16) & 0xf;
  18506                               unsigned rm = instr & 0xf;
  18507                               ImmediateShiftOperand
  18508                                   shift_operand((instr >> 4) & 0x3,
  18509                                                 ((instr >> 6) & 0x3) |
  18510                                                     ((instr >> 10) & 0x1c));
  18511                               if (InITBlock() &&
  18512                                   (instr & 0x00100000) == 0x00000000 &&
  18513                                   shift_operand.GetShift().IsLSL() &&
  18514                                   (shift_operand.GetAmount() == 0) &&
  18515                                   ((rd == rn) &&
  18516                                    (rd < kNumberOfT32LowRegisters) &&
  18517                                    (rm < kNumberOfT32LowRegisters))) {
  18518                                 // ORR<c>.W {<Rd>}, <Rn>, <Rm> ; T2
  18519                                 orr(CurrentCond(),
  18520                                     Wide,
  18521                                     Register(rd),
  18522                                     Register(rn),
  18523                                     Register(rm));
  18524                                 if (((instr & 0xfff08000) != 0xea400000)) {
  18525                                   UnpredictableT32(instr);
  18526                                 }
  18527                               } else if ((instr & 0x00100000) == 0x00000000) {
  18528                                 // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
  18529                                 orr(CurrentCond(),
  18530                                     Best,
  18531                                     Register(rd),
  18532                                     Register(rn),
  18533                                     Operand(Register(rm),
  18534                                             shift_operand.GetType(),
  18535                                             shift_operand.GetAmount()));
  18536                                 if (((instr & 0xfff08000) != 0xea400000)) {
  18537                                   UnpredictableT32(instr);
  18538                                 }
  18539                               } else {
  18540                                 UnallocatedT32(instr);
  18541                               }
  18542                               break;
  18543                             }
  18544                           }
  18545                           break;
  18546                         }
  18547                       }
  18548                       break;
  18549                     }
  18550                     case 0x00600000: {
  18551                       // 0xea600000
  18552                       switch (instr & 0x000f0000) {
  18553                         case 0x000f0000: {
  18554                           // 0xea6f0000
  18555                           switch (instr & 0x000070f0) {
  18556                             case 0x00000030: {
  18557                               // 0xea6f0030
  18558                               unsigned rd = (instr >> 8) & 0xf;
  18559                               unsigned rm = instr & 0xf;
  18560                               // MVN{<c>}{<q>} <Rd>, <Rm>, RRX ; T2
  18561                               mvn(CurrentCond(),
  18562                                   Best,
  18563                                   Register(rd),
  18564                                   Operand(Register(rm), RRX));
  18565                               if (((instr & 0xfffff0f0) != 0xea6f0030)) {
  18566                                 UnpredictableT32(instr);
  18567                               }
  18568                               break;
  18569                             }
  18570                             default: {
  18571                               if (((instr & 0x70f0) == 0x30)) {
  18572                                 UnallocatedT32(instr);
  18573                                 return;
  18574                               }
  18575                               unsigned rd = (instr >> 8) & 0xf;
  18576                               unsigned rm = instr & 0xf;
  18577                               ImmediateShiftOperand
  18578                                   shift_operand((instr >> 4) & 0x3,
  18579                                                 ((instr >> 6) & 0x3) |
  18580                                                     ((instr >> 10) & 0x1c));
  18581                               if (InITBlock() &&
  18582                                   (instr & 0x00100000) == 0x00000000 &&
  18583                                   shift_operand.GetShift().IsLSL() &&
  18584                                   (shift_operand.GetAmount() == 0) &&
  18585                                   ((rd < kNumberOfT32LowRegisters) &&
  18586                                    (rm < kNumberOfT32LowRegisters))) {
  18587                                 // MVN<c>.W <Rd>, <Rm> ; T2
  18588                                 mvn(CurrentCond(),
  18589                                     Wide,
  18590                                     Register(rd),
  18591                                     Register(rm));
  18592                                 if (((instr & 0xffff8000) != 0xea6f0000)) {
  18593                                   UnpredictableT32(instr);
  18594                                 }
  18595                               } else if ((instr & 0x00100000) == 0x00000000) {
  18596                                 // MVN{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
  18597                                 mvn(CurrentCond(),
  18598                                     Best,
  18599                                     Register(rd),
  18600                                     Operand(Register(rm),
  18601                                             shift_operand.GetType(),
  18602                                             shift_operand.GetAmount()));
  18603                                 if (((instr & 0xffff8000) != 0xea6f0000)) {
  18604                                   UnpredictableT32(instr);
  18605                                 }
  18606                               } else {
  18607                                 UnallocatedT32(instr);
  18608                               }
  18609                               break;
  18610                             }
  18611                           }
  18612                           break;
  18613                         }
  18614                         default: {
  18615                           switch (instr & 0x000070f0) {
  18616                             case 0x00000030: {
  18617                               // 0xea600030
  18618                               if (((instr & 0xf0000) == 0xf0000)) {
  18619                                 UnallocatedT32(instr);
  18620                                 return;
  18621                               }
  18622                               unsigned rd = (instr >> 8) & 0xf;
  18623                               unsigned rn = (instr >> 16) & 0xf;
  18624                               unsigned rm = instr & 0xf;
  18625                               // ORN{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
  18626                               orn(CurrentCond(),
  18627                                   Register(rd),
  18628                                   Register(rn),
  18629                                   Operand(Register(rm), RRX));
  18630                               if (((instr & 0xfff0f0f0) != 0xea600030)) {
  18631                                 UnpredictableT32(instr);
  18632                               }
  18633                               break;
  18634                             }
  18635                             default: {
  18636                               if (((instr & 0xf0000) == 0xf0000) ||
  18637                                   ((instr & 0x70f0) == 0x30)) {
  18638                                 UnallocatedT32(instr);
  18639                                 return;
  18640                               }
  18641                               unsigned rd = (instr >> 8) & 0xf;
  18642                               unsigned rn = (instr >> 16) & 0xf;
  18643                               unsigned rm = instr & 0xf;
  18644                               ImmediateShiftOperand
  18645                                   shift_operand((instr >> 4) & 0x3,
  18646                                                 ((instr >> 6) & 0x3) |
  18647                                                     ((instr >> 10) & 0x1c));
  18648                               // ORN{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
  18649                               orn(CurrentCond(),
  18650                                   Register(rd),
  18651                                   Register(rn),
  18652                                   Operand(Register(rm),
  18653                                           shift_operand.GetType(),
  18654                                           shift_operand.GetAmount()));
  18655                               if (((instr & 0xfff08000) != 0xea600000)) {
  18656                                 UnpredictableT32(instr);
  18657                               }
  18658                               break;
  18659                             }
  18660                           }
  18661                           break;
  18662                         }
  18663                       }
  18664                       break;
  18665                     }
  18666                   }
  18667                   break;
  18668                 }
  18669                 case 0x00100000: {
  18670                   // 0xea100000
  18671                   switch (instr & 0x00600000) {
  18672                     case 0x00000000: {
  18673                       // 0xea100000
  18674                       switch (instr & 0x00000f00) {
  18675                         case 0x00000f00: {
  18676                           // 0xea100f00
  18677                           switch (instr & 0x000070f0) {
  18678                             case 0x00000030: {
  18679                               // 0xea100f30
  18680                               unsigned rn = (instr >> 16) & 0xf;
  18681                               unsigned rm = instr & 0xf;
  18682                               // TST{<c>}{<q>} <Rn>, <Rm>, RRX ; T2
  18683                               tst(CurrentCond(),
  18684                                   Best,
  18685                                   Register(rn),
  18686                                   Operand(Register(rm), RRX));
  18687                               if (((instr & 0xfff0fff0) != 0xea100f30)) {
  18688                                 UnpredictableT32(instr);
  18689                               }
  18690                               break;
  18691                             }
  18692                             default: {
  18693                               if (((instr & 0x70f0) == 0x30)) {
  18694                                 UnallocatedT32(instr);
  18695                                 return;
  18696                               }
  18697                               unsigned rn = (instr >> 16) & 0xf;
  18698                               unsigned rm = instr & 0xf;
  18699                               ImmediateShiftOperand
  18700                                   shift_operand((instr >> 4) & 0x3,
  18701                                                 ((instr >> 6) & 0x3) |
  18702                                                     ((instr >> 10) & 0x1c));
  18703                               if (shift_operand.GetShift().IsLSL() &&
  18704                                   (shift_operand.GetAmount() == 0) &&
  18705                                   ((rn < kNumberOfT32LowRegisters) &&
  18706                                    (rm < kNumberOfT32LowRegisters))) {
  18707                                 // TST{<c>}.W <Rn>, <Rm> ; T2
  18708                                 tst(CurrentCond(),
  18709                                     Wide,
  18710                                     Register(rn),
  18711                                     Register(rm));
  18712                                 if (((instr & 0xfff08f00) != 0xea100f00)) {
  18713                                   UnpredictableT32(instr);
  18714                                 }
  18715                               } else {
  18716                                 // TST{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
  18717                                 tst(CurrentCond(),
  18718                                     Best,
  18719                                     Register(rn),
  18720                                     Operand(Register(rm),
  18721                                             shift_operand.GetType(),
  18722                                             shift_operand.GetAmount()));
  18723                                 if (((instr & 0xfff08f00) != 0xea100f00)) {
  18724                                   UnpredictableT32(instr);
  18725                                 }
  18726                               }
  18727                               break;
  18728                             }
  18729                           }
  18730                           break;
  18731                         }
  18732                         default: {
  18733                           switch (instr & 0x000070f0) {
  18734                             case 0x00000030: {
  18735                               // 0xea100030
  18736                               if (((instr & 0xf00) == 0xf00)) {
  18737                                 UnallocatedT32(instr);
  18738                                 return;
  18739                               }
  18740                               unsigned rd = (instr >> 8) & 0xf;
  18741                               unsigned rn = (instr >> 16) & 0xf;
  18742                               unsigned rm = instr & 0xf;
  18743                               // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
  18744                               ands(CurrentCond(),
  18745                                    Best,
  18746                                    Register(rd),
  18747                                    Register(rn),
  18748                                    Operand(Register(rm), RRX));
  18749                               if (((instr & 0xfff0f0f0) != 0xea100030)) {
  18750                                 UnpredictableT32(instr);
  18751                               }
  18752                               break;
  18753                             }
  18754                             default: {
  18755                               if (((instr & 0x70f0) == 0x30) ||
  18756                                   ((instr & 0xf00) == 0xf00)) {
  18757                                 UnallocatedT32(instr);
  18758                                 return;
  18759                               }
  18760                               unsigned rd = (instr >> 8) & 0xf;
  18761                               unsigned rn = (instr >> 16) & 0xf;
  18762                               unsigned rm = instr & 0xf;
  18763                               ImmediateShiftOperand
  18764                                   shift_operand((instr >> 4) & 0x3,
  18765                                                 ((instr >> 6) & 0x3) |
  18766                                                     ((instr >> 10) & 0x1c));
  18767                               if (OutsideITBlock() &&
  18768                                   (instr & 0x00100000) == 0x00100000 &&
  18769                                   shift_operand.GetShift().IsLSL() &&
  18770                                   (shift_operand.GetAmount() == 0) &&
  18771                                   ((rd == rn) &&
  18772                                    (rd < kNumberOfT32LowRegisters) &&
  18773                                    (rm < kNumberOfT32LowRegisters))) {
  18774                                 // ANDS.W {<Rd>}, <Rn>, <Rm> ; T2
  18775                                 ands(Condition::None(),
  18776                                      Wide,
  18777                                      Register(rd),
  18778                                      Register(rn),
  18779                                      Register(rm));
  18780                                 if (((instr & 0xfff08000) != 0xea100000)) {
  18781                                   UnpredictableT32(instr);
  18782                                 }
  18783                               } else if ((instr & 0x00100000) == 0x00100000) {
  18784                                 // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
  18785                                 ands(CurrentCond(),
  18786                                      Best,
  18787                                      Register(rd),
  18788                                      Register(rn),
  18789                                      Operand(Register(rm),
  18790                                              shift_operand.GetType(),
  18791                                              shift_operand.GetAmount()));
  18792                                 if (((instr & 0xfff08000) != 0xea100000)) {
  18793                                   UnpredictableT32(instr);
  18794                                 }
  18795                               } else {
  18796                                 UnallocatedT32(instr);
  18797                               }
  18798                               break;
  18799                             }
  18800                           }
  18801                           break;
  18802                         }
  18803                       }
  18804                       break;
  18805                     }
  18806                     case 0x00200000: {
  18807                       // 0xea300000
  18808                       switch (instr & 0x000070f0) {
  18809                         case 0x00000030: {
  18810                           // 0xea300030
  18811                           unsigned rd = (instr >> 8) & 0xf;
  18812                           unsigned rn = (instr >> 16) & 0xf;
  18813                           unsigned rm = instr & 0xf;
  18814                           // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
  18815                           bics(CurrentCond(),
  18816                                Best,
  18817                                Register(rd),
  18818                                Register(rn),
  18819                                Operand(Register(rm), RRX));
  18820                           if (((instr & 0xfff0f0f0) != 0xea300030)) {
  18821                             UnpredictableT32(instr);
  18822                           }
  18823                           break;
  18824                         }
  18825                         default: {
  18826                           if (((instr & 0x70f0) == 0x30)) {
  18827                             UnallocatedT32(instr);
  18828                             return;
  18829                           }
  18830                           unsigned rd = (instr >> 8) & 0xf;
  18831                           unsigned rn = (instr >> 16) & 0xf;
  18832                           unsigned rm = instr & 0xf;
  18833                           ImmediateShiftOperand
  18834                               shift_operand((instr >> 4) & 0x3,
  18835                                             ((instr >> 6) & 0x3) |
  18836                                                 ((instr >> 10) & 0x1c));
  18837                           if (OutsideITBlock() &&
  18838                               (instr & 0x00100000) == 0x00100000 &&
  18839                               shift_operand.GetShift().IsLSL() &&
  18840                               (shift_operand.GetAmount() == 0) &&
  18841                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
  18842                                (rm < kNumberOfT32LowRegisters))) {
  18843                             // BICS.W {<Rd>}, <Rn>, <Rm> ; T2
  18844                             bics(Condition::None(),
  18845                                  Wide,
  18846                                  Register(rd),
  18847                                  Register(rn),
  18848                                  Register(rm));
  18849                             if (((instr & 0xfff08000) != 0xea300000)) {
  18850                               UnpredictableT32(instr);
  18851                             }
  18852                           } else if ((instr & 0x00100000) == 0x00100000) {
  18853                             // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
  18854                             bics(CurrentCond(),
  18855                                  Best,
  18856                                  Register(rd),
  18857                                  Register(rn),
  18858                                  Operand(Register(rm),
  18859                                          shift_operand.GetType(),
  18860                                          shift_operand.GetAmount()));
  18861                             if (((instr & 0xfff08000) != 0xea300000)) {
  18862                               UnpredictableT32(instr);
  18863                             }
  18864                           } else {
  18865                             UnallocatedT32(instr);
  18866                           }
  18867                           break;
  18868                         }
  18869                       }
  18870                       break;
  18871                     }
  18872                     case 0x00400000: {
  18873                       // 0xea500000
  18874                       switch (instr & 0x000f0000) {
  18875                         case 0x000f0000: {
  18876                           // 0xea5f0000
  18877                           switch (instr & 0x000070f0) {
  18878                             case 0x00000030: {
  18879                               // 0xea5f0030
  18880                               unsigned rd = (instr >> 8) & 0xf;
  18881                               unsigned rm = instr & 0xf;
  18882                               // RRXS{<c>}{<q>} {<Rd>}, <Rm> ; T3
  18883                               rrxs(CurrentCond(), Register(rd), Register(rm));
  18884                               if (((instr & 0xfffff0f0) != 0xea5f0030)) {
  18885                                 UnpredictableT32(instr);
  18886                               }
  18887                               break;
  18888                             }
  18889                             default: {
  18890                               if (((instr & 0x70f0) == 0x30)) {
  18891                                 UnallocatedT32(instr);
  18892                                 return;
  18893                               }
  18894                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
  18895                                    Uint32(0x2))) {
  18896                                 unsigned rd = (instr >> 8) & 0xf;
  18897                                 unsigned rm = instr & 0xf;
  18898                                 uint32_t amount = ((instr >> 6) & 0x3) |
  18899                                                   ((instr >> 10) & 0x1c);
  18900                                 if (amount == 0) amount = 32;
  18901                                 if (OutsideITBlock() &&
  18902                                     ((rd < kNumberOfT32LowRegisters) &&
  18903                                      (rm < kNumberOfT32LowRegisters) &&
  18904                                      ((amount >= 1) && (amount <= 32)))) {
  18905                                   // ASRS.W {<Rd>}, <Rm>, #<imm> ; T3
  18906                                   asrs(Condition::None(),
  18907                                        Wide,
  18908                                        Register(rd),
  18909                                        Register(rm),
  18910                                        amount);
  18911                                   if (((instr & 0xffff8030) != 0xea5f0020)) {
  18912                                     UnpredictableT32(instr);
  18913                                   }
  18914                                 } else {
  18915                                   // ASRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
  18916                                   asrs(CurrentCond(),
  18917                                        Best,
  18918                                        Register(rd),
  18919                                        Register(rm),
  18920                                        amount);
  18921                                   if (((instr & 0xffff8030) != 0xea5f0020)) {
  18922                                     UnpredictableT32(instr);
  18923                                   }
  18924                                 }
  18925                                 return;
  18926                               }
  18927                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
  18928                                    Uint32(0x0)) &&
  18929                                   ((instr & 0x000070c0) != 0x00000000)) {
  18930                                 unsigned rd = (instr >> 8) & 0xf;
  18931                                 unsigned rm = instr & 0xf;
  18932                                 uint32_t amount = ((instr >> 6) & 0x3) |
  18933                                                   ((instr >> 10) & 0x1c);
  18934                                 if (OutsideITBlock() &&
  18935                                     ((rd < kNumberOfT32LowRegisters) &&
  18936                                      (rm < kNumberOfT32LowRegisters) &&
  18937                                      ((amount >= 1) && (amount <= 31)))) {
  18938                                   // LSLS.W {<Rd>}, <Rm>, #<imm> ; T3
  18939                                   lsls(Condition::None(),
  18940                                        Wide,
  18941                                        Register(rd),
  18942                                        Register(rm),
  18943                                        amount);
  18944                                   if (((instr & 0xffff8030) != 0xea5f0000)) {
  18945                                     UnpredictableT32(instr);
  18946                                   }
  18947                                 } else {
  18948                                   // LSLS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
  18949                                   lsls(CurrentCond(),
  18950                                        Best,
  18951                                        Register(rd),
  18952                                        Register(rm),
  18953                                        amount);
  18954                                   if (((instr & 0xffff8030) != 0xea5f0000)) {
  18955                                     UnpredictableT32(instr);
  18956                                   }
  18957                                 }
  18958                                 return;
  18959                               }
  18960                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
  18961                                    Uint32(0x1))) {
  18962                                 unsigned rd = (instr >> 8) & 0xf;
  18963                                 unsigned rm = instr & 0xf;
  18964                                 uint32_t amount = ((instr >> 6) & 0x3) |
  18965                                                   ((instr >> 10) & 0x1c);
  18966                                 if (amount == 0) amount = 32;
  18967                                 if (OutsideITBlock() &&
  18968                                     ((rd < kNumberOfT32LowRegisters) &&
  18969                                      (rm < kNumberOfT32LowRegisters) &&
  18970                                      ((amount >= 1) && (amount <= 32)))) {
  18971                                   // LSRS.W {<Rd>}, <Rm>, #<imm> ; T3
  18972                                   lsrs(Condition::None(),
  18973                                        Wide,
  18974                                        Register(rd),
  18975                                        Register(rm),
  18976                                        amount);
  18977                                   if (((instr & 0xffff8030) != 0xea5f0010)) {
  18978                                     UnpredictableT32(instr);
  18979                                   }
  18980                                 } else {
  18981                                   // LSRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
  18982                                   lsrs(CurrentCond(),
  18983                                        Best,
  18984                                        Register(rd),
  18985                                        Register(rm),
  18986                                        amount);
  18987                                   if (((instr & 0xffff8030) != 0xea5f0010)) {
  18988                                     UnpredictableT32(instr);
  18989                                   }
  18990                                 }
  18991                                 return;
  18992                               }
  18993                               if (((Uint32((instr >> 4)) & Uint32(0x3)) ==
  18994                                    Uint32(0x3)) &&
  18995                                   ((instr & 0x000070c0) != 0x00000000)) {
  18996                                 unsigned rd = (instr >> 8) & 0xf;
  18997                                 unsigned rm = instr & 0xf;
  18998                                 uint32_t amount = ((instr >> 6) & 0x3) |
  18999                                                   ((instr >> 10) & 0x1c);
  19000                                 // RORS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3
  19001                                 rors(CurrentCond(),
  19002                                      Best,
  19003                                      Register(rd),
  19004                                      Register(rm),
  19005                                      amount);
  19006                                 if (((instr & 0xffff8030) != 0xea5f0030)) {
  19007                                   UnpredictableT32(instr);
  19008                                 }
  19009                                 return;
  19010                               }
  19011                               unsigned rd = (instr >> 8) & 0xf;
  19012                               unsigned rm = instr & 0xf;
  19013                               ImmediateShiftOperand
  19014                                   shift_operand((instr >> 4) & 0x3,
  19015                                                 ((instr >> 6) & 0x3) |
  19016                                                     ((instr >> 10) & 0x1c));
  19017                               if (OutsideITBlock() &&
  19018                                   (instr & 0x00100000) == 0x00100000 &&
  19019                                   ((rd < kNumberOfT32LowRegisters) &&
  19020                                    (rm < kNumberOfT32LowRegisters))) {
  19021                                 // MOVS.W <Rd>, <Rm> {, <shift> #<amount> } ; T3
  19022                                 movs(Condition::None(),
  19023                                      Wide,
  19024                                      Register(rd),
  19025                                      Operand(Register(rm),
  19026                                              shift_operand.GetType(),
  19027                                              shift_operand.GetAmount()));
  19028                                 if (((instr & 0xffff8000) != 0xea5f0000)) {
  19029                                   UnpredictableT32(instr);
  19030                                 }
  19031                               } else if ((instr & 0x00100000) == 0x00100000) {
  19032                                 // MOVS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
  19033                                 movs(CurrentCond(),
  19034                                      Best,
  19035                                      Register(rd),
  19036                                      Operand(Register(rm),
  19037                                              shift_operand.GetType(),
  19038                                              shift_operand.GetAmount()));
  19039                                 if (((instr & 0xffff8000) != 0xea5f0000)) {
  19040                                   UnpredictableT32(instr);
  19041                                 }
  19042                               } else {
  19043                                 UnallocatedT32(instr);
  19044                               }
  19045                               break;
  19046                             }
  19047                           }
  19048                           break;
  19049                         }
  19050                         default: {
  19051                           switch (instr & 0x000070f0) {
  19052                             case 0x00000030: {
  19053                               // 0xea500030
  19054                               if (((instr & 0xf0000) == 0xf0000)) {
  19055                                 UnallocatedT32(instr);
  19056                                 return;
  19057                               }
  19058                               unsigned rd = (instr >> 8) & 0xf;
  19059                               unsigned rn = (instr >> 16) & 0xf;
  19060                               unsigned rm = instr & 0xf;
  19061                               // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
  19062                               orrs(CurrentCond(),
  19063                                    Best,
  19064                                    Register(rd),
  19065                                    Register(rn),
  19066                                    Operand(Register(rm), RRX));
  19067                               if (((instr & 0xfff0f0f0) != 0xea500030)) {
  19068                                 UnpredictableT32(instr);
  19069                               }
  19070                               break;
  19071                             }
  19072                             default: {
  19073                               if (((instr & 0xf0000) == 0xf0000) ||
  19074                                   ((instr & 0x70f0) == 0x30)) {
  19075                                 UnallocatedT32(instr);
  19076                                 return;
  19077                               }
  19078                               unsigned rd = (instr >> 8) & 0xf;
  19079                               unsigned rn = (instr >> 16) & 0xf;
  19080                               unsigned rm = instr & 0xf;
  19081                               ImmediateShiftOperand
  19082                                   shift_operand((instr >> 4) & 0x3,
  19083                                                 ((instr >> 6) & 0x3) |
  19084                                                     ((instr >> 10) & 0x1c));
  19085                               if (OutsideITBlock() &&
  19086                                   (instr & 0x00100000) == 0x00100000 &&
  19087                                   shift_operand.GetShift().IsLSL() &&
  19088                                   (shift_operand.GetAmount() == 0) &&
  19089                                   ((rd == rn) &&
  19090                                    (rd < kNumberOfT32LowRegisters) &&
  19091                                    (rm < kNumberOfT32LowRegisters))) {
  19092                                 // ORRS.W {<Rd>}, <Rn>, <Rm> ; T2
  19093                                 orrs(Condition::None(),
  19094                                      Wide,
  19095                                      Register(rd),
  19096                                      Register(rn),
  19097                                      Register(rm));
  19098                                 if (((instr & 0xfff08000) != 0xea500000)) {
  19099                                   UnpredictableT32(instr);
  19100                                 }
  19101                               } else if ((instr & 0x00100000) == 0x00100000) {
  19102                                 // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
  19103                                 orrs(CurrentCond(),
  19104                                      Best,
  19105                                      Register(rd),
  19106                                      Register(rn),
  19107                                      Operand(Register(rm),
  19108                                              shift_operand.GetType(),
  19109                                              shift_operand.GetAmount()));
  19110                                 if (((instr & 0xfff08000) != 0xea500000)) {
  19111                                   UnpredictableT32(instr);
  19112                                 }
  19113                               } else {
  19114                                 UnallocatedT32(instr);
  19115                               }
  19116                               break;
  19117                             }
  19118                           }
  19119                           break;
  19120                         }
  19121                       }
  19122                       break;
  19123                     }
  19124                     case 0x00600000: {
  19125                       // 0xea700000
  19126                       switch (instr & 0x000f0000) {
  19127                         case 0x000f0000: {
  19128                           // 0xea7f0000
  19129                           switch (instr & 0x000070f0) {
  19130                             case 0x00000030: {
  19131                               // 0xea7f0030
  19132                               unsigned rd = (instr >> 8) & 0xf;
  19133                               unsigned rm = instr & 0xf;
  19134                               // MVNS{<c>}{<q>} <Rd>, <Rm>, RRX ; T2
  19135                               mvns(CurrentCond(),
  19136                                    Best,
  19137                                    Register(rd),
  19138                                    Operand(Register(rm), RRX));
  19139                               if (((instr & 0xfffff0f0) != 0xea7f0030)) {
  19140                                 UnpredictableT32(instr);
  19141                               }
  19142                               break;
  19143                             }
  19144                             default: {
  19145                               if (((instr & 0x70f0) == 0x30)) {
  19146                                 UnallocatedT32(instr);
  19147                                 return;
  19148                               }
  19149                               unsigned rd = (instr >> 8) & 0xf;
  19150                               unsigned rm = instr & 0xf;
  19151                               ImmediateShiftOperand
  19152                                   shift_operand((instr >> 4) & 0x3,
  19153                                                 ((instr >> 6) & 0x3) |
  19154                                                     ((instr >> 10) & 0x1c));
  19155                               if (OutsideITBlock() &&
  19156                                   (instr & 0x00100000) == 0x00100000 &&
  19157                                   shift_operand.GetShift().IsLSL() &&
  19158                                   (shift_operand.GetAmount() == 0) &&
  19159                                   ((rd < kNumberOfT32LowRegisters) &&
  19160                                    (rm < kNumberOfT32LowRegisters))) {
  19161                                 // MVNS.W <Rd>, <Rm> ; T2
  19162                                 mvns(Condition::None(),
  19163                                      Wide,
  19164                                      Register(rd),
  19165                                      Register(rm));
  19166                                 if (((instr & 0xffff8000) != 0xea7f0000)) {
  19167                                   UnpredictableT32(instr);
  19168                                 }
  19169                               } else if ((instr & 0x00100000) == 0x00100000) {
  19170                                 // MVNS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
  19171                                 mvns(CurrentCond(),
  19172                                      Best,
  19173                                      Register(rd),
  19174                                      Operand(Register(rm),
  19175                                              shift_operand.GetType(),
  19176                                              shift_operand.GetAmount()));
  19177                                 if (((instr & 0xffff8000) != 0xea7f0000)) {
  19178                                   UnpredictableT32(instr);
  19179                                 }
  19180                               } else {
  19181                                 UnallocatedT32(instr);
  19182                               }
  19183                               break;
  19184                             }
  19185                           }
  19186                           break;
  19187                         }
  19188                         default: {
  19189                           switch (instr & 0x000070f0) {
  19190                             case 0x00000030: {
  19191                               // 0xea700030
  19192                               if (((instr & 0xf0000) == 0xf0000)) {
  19193                                 UnallocatedT32(instr);
  19194                                 return;
  19195                               }
  19196                               unsigned rd = (instr >> 8) & 0xf;
  19197                               unsigned rn = (instr >> 16) & 0xf;
  19198                               unsigned rm = instr & 0xf;
  19199                               // ORNS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
  19200                               orns(CurrentCond(),
  19201                                    Register(rd),
  19202                                    Register(rn),
  19203                                    Operand(Register(rm), RRX));
  19204                               if (((instr & 0xfff0f0f0) != 0xea700030)) {
  19205                                 UnpredictableT32(instr);
  19206                               }
  19207                               break;
  19208                             }
  19209                             default: {
  19210                               if (((instr & 0xf0000) == 0xf0000) ||
  19211                                   ((instr & 0x70f0) == 0x30)) {
  19212                                 UnallocatedT32(instr);
  19213                                 return;
  19214                               }
  19215                               unsigned rd = (instr >> 8) & 0xf;
  19216                               unsigned rn = (instr >> 16) & 0xf;
  19217                               unsigned rm = instr & 0xf;
  19218                               ImmediateShiftOperand
  19219                                   shift_operand((instr >> 4) & 0x3,
  19220                                                 ((instr >> 6) & 0x3) |
  19221                                                     ((instr >> 10) & 0x1c));
  19222                               // ORNS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
  19223                               orns(CurrentCond(),
  19224                                    Register(rd),
  19225                                    Register(rn),
  19226                                    Operand(Register(rm),
  19227                                            shift_operand.GetType(),
  19228                                            shift_operand.GetAmount()));
  19229                               if (((instr & 0xfff08000) != 0xea700000)) {
  19230                                 UnpredictableT32(instr);
  19231                               }
  19232                               break;
  19233                             }
  19234                           }
  19235                           break;
  19236                         }
  19237                       }
  19238                       break;
  19239                     }
  19240                   }
  19241                   break;
  19242                 }
  19243                 case 0x00800000: {
  19244                   // 0xea800000
  19245                   switch (instr & 0x00600000) {
  19246                     case 0x00000000: {
  19247                       // 0xea800000
  19248                       switch (instr & 0x000070f0) {
  19249                         case 0x00000030: {
  19250                           // 0xea800030
  19251                           unsigned rd = (instr >> 8) & 0xf;
  19252                           unsigned rn = (instr >> 16) & 0xf;
  19253                           unsigned rm = instr & 0xf;
  19254                           // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
  19255                           eor(CurrentCond(),
  19256                               Best,
  19257                               Register(rd),
  19258                               Register(rn),
  19259                               Operand(Register(rm), RRX));
  19260                           if (((instr & 0xfff0f0f0) != 0xea800030)) {
  19261                             UnpredictableT32(instr);
  19262                           }
  19263                           break;
  19264                         }
  19265                         default: {
  19266                           if (((instr & 0x70f0) == 0x30)) {
  19267                             UnallocatedT32(instr);
  19268                             return;
  19269                           }
  19270                           unsigned rd = (instr >> 8) & 0xf;
  19271                           unsigned rn = (instr >> 16) & 0xf;
  19272                           unsigned rm = instr & 0xf;
  19273                           ImmediateShiftOperand
  19274                               shift_operand((instr >> 4) & 0x3,
  19275                                             ((instr >> 6) & 0x3) |
  19276                                                 ((instr >> 10) & 0x1c));
  19277                           if (InITBlock() &&
  19278                               (instr & 0x00100000) == 0x00000000 &&
  19279                               shift_operand.GetShift().IsLSL() &&
  19280                               (shift_operand.GetAmount() == 0) &&
  19281                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
  19282                                (rm < kNumberOfT32LowRegisters))) {
  19283                             // EOR<c>.W {<Rd>}, <Rn>, <Rm> ; T2
  19284                             eor(CurrentCond(),
  19285                                 Wide,
  19286                                 Register(rd),
  19287                                 Register(rn),
  19288                                 Register(rm));
  19289                             if (((instr & 0xfff08000) != 0xea800000)) {
  19290                               UnpredictableT32(instr);
  19291                             }
  19292                           } else if ((instr & 0x00100000) == 0x00000000) {
  19293                             // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
  19294                             eor(CurrentCond(),
  19295                                 Best,
  19296                                 Register(rd),
  19297                                 Register(rn),
  19298                                 Operand(Register(rm),
  19299                                         shift_operand.GetType(),
  19300                                         shift_operand.GetAmount()));
  19301                             if (((instr & 0xfff08000) != 0xea800000)) {
  19302                               UnpredictableT32(instr);
  19303                             }
  19304                           } else {
  19305                             UnallocatedT32(instr);
  19306                           }
  19307                           break;
  19308                         }
  19309                       }
  19310                       break;
  19311                     }
  19312                     case 0x00400000: {
  19313                       // 0xeac00000
  19314                       switch (instr & 0x00000030) {
  19315                         case 0x00000000: {
  19316                           // 0xeac00000
  19317                           unsigned rd = (instr >> 8) & 0xf;
  19318                           unsigned rn = (instr >> 16) & 0xf;
  19319                           unsigned rm = instr & 0xf;
  19320                           uint32_t amount =
  19321                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
  19322                           // PKHBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, LSL #<imm> } ; T1 NOLINT(whitespace/line_length)
  19323                           pkhbt(CurrentCond(),
  19324                                 Register(rd),
  19325                                 Register(rn),
  19326                                 Operand(Register(rm), LSL, amount));
  19327                           if (((instr & 0xfff08030) != 0xeac00000)) {
  19328                             UnpredictableT32(instr);
  19329                           }
  19330                           break;
  19331                         }
  19332                         case 0x00000020: {
  19333                           // 0xeac00020
  19334                           unsigned rd = (instr >> 8) & 0xf;
  19335                           unsigned rn = (instr >> 16) & 0xf;
  19336                           unsigned rm = instr & 0xf;
  19337                           uint32_t amount =
  19338                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
  19339                           if (amount == 0) amount = 32;
  19340                           // PKHTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ASR #<imm> } ; T1 NOLINT(whitespace/line_length)
  19341                           pkhtb(CurrentCond(),
  19342                                 Register(rd),
  19343                                 Register(rn),
  19344                                 Operand(Register(rm), ASR, amount));
  19345                           if (((instr & 0xfff08030) != 0xeac00020)) {
  19346                             UnpredictableT32(instr);
  19347                           }
  19348                           break;
  19349                         }
  19350                         default:
  19351                           UnallocatedT32(instr);
  19352                           break;
  19353                       }
  19354                       break;
  19355                     }
  19356                     default:
  19357                       UnallocatedT32(instr);
  19358                       break;
  19359                   }
  19360                   break;
  19361                 }
  19362                 case 0x00900000: {
  19363                   // 0xea900000
  19364                   switch (instr & 0x00600000) {
  19365                     case 0x00000000: {
  19366                       // 0xea900000
  19367                       switch (instr & 0x00000f00) {
  19368                         case 0x00000f00: {
  19369                           // 0xea900f00
  19370                           switch (instr & 0x000070f0) {
  19371                             case 0x00000030: {
  19372                               // 0xea900f30
  19373                               unsigned rn = (instr >> 16) & 0xf;
  19374                               unsigned rm = instr & 0xf;
  19375                               // TEQ{<c>}{<q>} <Rn>, <Rm>, RRX ; T1
  19376                               teq(CurrentCond(),
  19377                                   Register(rn),
  19378                                   Operand(Register(rm), RRX));
  19379                               if (((instr & 0xfff0fff0) != 0xea900f30)) {
  19380                                 UnpredictableT32(instr);
  19381                               }
  19382                               break;
  19383                             }
  19384                             default: {
  19385                               if (((instr & 0x70f0) == 0x30)) {
  19386                                 UnallocatedT32(instr);
  19387                                 return;
  19388                               }
  19389                               unsigned rn = (instr >> 16) & 0xf;
  19390                               unsigned rm = instr & 0xf;
  19391                               ImmediateShiftOperand
  19392                                   shift_operand((instr >> 4) & 0x3,
  19393                                                 ((instr >> 6) & 0x3) |
  19394                                                     ((instr >> 10) & 0x1c));
  19395                               // TEQ{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
  19396                               teq(CurrentCond(),
  19397                                   Register(rn),
  19398                                   Operand(Register(rm),
  19399                                           shift_operand.GetType(),
  19400                                           shift_operand.GetAmount()));
  19401                               if (((instr & 0xfff08f00) != 0xea900f00)) {
  19402                                 UnpredictableT32(instr);
  19403                               }
  19404                               break;
  19405                             }
  19406                           }
  19407                           break;
  19408                         }
  19409                         default: {
  19410                           switch (instr & 0x000070f0) {
  19411                             case 0x00000030: {
  19412                               // 0xea900030
  19413                               if (((instr & 0xf00) == 0xf00)) {
  19414                                 UnallocatedT32(instr);
  19415                                 return;
  19416                               }
  19417                               unsigned rd = (instr >> 8) & 0xf;
  19418                               unsigned rn = (instr >> 16) & 0xf;
  19419                               unsigned rm = instr & 0xf;
  19420                               // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
  19421                               eors(CurrentCond(),
  19422                                    Best,
  19423                                    Register(rd),
  19424                                    Register(rn),
  19425                                    Operand(Register(rm), RRX));
  19426                               if (((instr & 0xfff0f0f0) != 0xea900030)) {
  19427                                 UnpredictableT32(instr);
  19428                               }
  19429                               break;
  19430                             }
  19431                             default: {
  19432                               if (((instr & 0x70f0) == 0x30) ||
  19433                                   ((instr & 0xf00) == 0xf00)) {
  19434                                 UnallocatedT32(instr);
  19435                                 return;
  19436                               }
  19437                               unsigned rd = (instr >> 8) & 0xf;
  19438                               unsigned rn = (instr >> 16) & 0xf;
  19439                               unsigned rm = instr & 0xf;
  19440                               ImmediateShiftOperand
  19441                                   shift_operand((instr >> 4) & 0x3,
  19442                                                 ((instr >> 6) & 0x3) |
  19443                                                     ((instr >> 10) & 0x1c));
  19444                               if (OutsideITBlock() &&
  19445                                   (instr & 0x00100000) == 0x00100000 &&
  19446                                   shift_operand.GetShift().IsLSL() &&
  19447                                   (shift_operand.GetAmount() == 0) &&
  19448                                   ((rd == rn) &&
  19449                                    (rd < kNumberOfT32LowRegisters) &&
  19450                                    (rm < kNumberOfT32LowRegisters))) {
  19451                                 // EORS.W {<Rd>}, <Rn>, <Rm> ; T2
  19452                                 eors(Condition::None(),
  19453                                      Wide,
  19454                                      Register(rd),
  19455                                      Register(rn),
  19456                                      Register(rm));
  19457                                 if (((instr & 0xfff08000) != 0xea900000)) {
  19458                                   UnpredictableT32(instr);
  19459                                 }
  19460                               } else if ((instr & 0x00100000) == 0x00100000) {
  19461                                 // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
  19462                                 eors(CurrentCond(),
  19463                                      Best,
  19464                                      Register(rd),
  19465                                      Register(rn),
  19466                                      Operand(Register(rm),
  19467                                              shift_operand.GetType(),
  19468                                              shift_operand.GetAmount()));
  19469                                 if (((instr & 0xfff08000) != 0xea900000)) {
  19470                                   UnpredictableT32(instr);
  19471                                 }
  19472                               } else {
  19473                                 UnallocatedT32(instr);
  19474                               }
  19475                               break;
  19476                             }
  19477                           }
  19478                           break;
  19479                         }
  19480                       }
  19481                       break;
  19482                     }
  19483                     default:
  19484                       UnallocatedT32(instr);
  19485                       break;
  19486                   }
  19487                   break;
  19488                 }
  19489                 case 0x01000000: {
  19490                   // 0xeb000000
  19491                   switch (instr & 0x00600000) {
  19492                     case 0x00000000: {
  19493                       // 0xeb000000
  19494                       switch (instr & 0x000f0000) {
  19495                         case 0x000d0000: {
  19496                           // 0xeb0d0000
  19497                           switch (instr & 0x000070f0) {
  19498                             case 0x00000030: {
  19499                               // 0xeb0d0030
  19500                               unsigned rd = (instr >> 8) & 0xf;
  19501                               unsigned rm = instr & 0xf;
  19502                               // ADD{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T3
  19503                               add(CurrentCond(),
  19504                                   Best,
  19505                                   Register(rd),
  19506                                   sp,
  19507                                   Operand(Register(rm), RRX));
  19508                               if (((instr & 0xfffff0f0) != 0xeb0d0030)) {
  19509                                 UnpredictableT32(instr);
  19510                               }
  19511                               break;
  19512                             }
  19513                             default: {
  19514                               if (((instr & 0x70f0) == 0x30)) {
  19515                                 UnallocatedT32(instr);
  19516                                 return;
  19517                               }
  19518                               unsigned rd = (instr >> 8) & 0xf;
  19519                               unsigned rm = instr & 0xf;
  19520                               ImmediateShiftOperand
  19521                                   shift_operand((instr >> 4) & 0x3,
  19522                                                 ((instr >> 6) & 0x3) |
  19523                                                     ((instr >> 10) & 0x1c));
  19524                               if ((instr & 0x00100000) == 0x00000000 &&
  19525                                   shift_operand.GetShift().IsLSL() &&
  19526                                   (shift_operand.GetAmount() == 0) &&
  19527                                   (((rd == rm)) || ((rd == sp.GetCode())))) {
  19528                                 // ADD{<c>}.W {<Rd>}, SP, <Rm> ; T3
  19529                                 add(CurrentCond(),
  19530                                     Wide,
  19531                                     Register(rd),
  19532                                     sp,
  19533                                     Register(rm));
  19534                                 if (((instr & 0xffff8000) != 0xeb0d0000)) {
  19535                                   UnpredictableT32(instr);
  19536                                 }
  19537                               } else if ((instr & 0x00100000) == 0x00000000) {
  19538                                 // ADD{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
  19539                                 add(CurrentCond(),
  19540                                     Best,
  19541                                     Register(rd),
  19542                                     sp,
  19543                                     Operand(Register(rm),
  19544                                             shift_operand.GetType(),
  19545                                             shift_operand.GetAmount()));
  19546                                 if (((instr & 0xffff8000) != 0xeb0d0000)) {
  19547                                   UnpredictableT32(instr);
  19548                                 }
  19549                               } else {
  19550                                 UnallocatedT32(instr);
  19551                               }
  19552                               break;
  19553                             }
  19554                           }
  19555                           break;
  19556                         }
  19557                         default: {
  19558                           switch (instr & 0x000070f0) {
  19559                             case 0x00000030: {
  19560                               // 0xeb000030
  19561                               if (((instr & 0xf0000) == 0xd0000)) {
  19562                                 UnallocatedT32(instr);
  19563                                 return;
  19564                               }
  19565                               unsigned rd = (instr >> 8) & 0xf;
  19566                               unsigned rn = (instr >> 16) & 0xf;
  19567                               unsigned rm = instr & 0xf;
  19568                               // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T3
  19569                               add(CurrentCond(),
  19570                                   Best,
  19571                                   Register(rd),
  19572                                   Register(rn),
  19573                                   Operand(Register(rm), RRX));
  19574                               if (((instr & 0xfff0f0f0) != 0xeb000030)) {
  19575                                 UnpredictableT32(instr);
  19576                               }
  19577                               break;
  19578                             }
  19579                             default: {
  19580                               if (((instr & 0xf0000) == 0xd0000) ||
  19581                                   ((instr & 0x70f0) == 0x30)) {
  19582                                 UnallocatedT32(instr);
  19583                                 return;
  19584                               }
  19585                               unsigned rd = (instr >> 8) & 0xf;
  19586                               unsigned rn = (instr >> 16) & 0xf;
  19587                               unsigned rm = instr & 0xf;
  19588                               ImmediateShiftOperand
  19589                                   shift_operand((instr >> 4) & 0x3,
  19590                                                 ((instr >> 6) & 0x3) |
  19591                                                     ((instr >> 10) & 0x1c));
  19592                               if (InITBlock() &&
  19593                                   (instr & 0x00100000) == 0x00000000 &&
  19594                                   shift_operand.GetShift().IsLSL() &&
  19595                                   (shift_operand.GetAmount() == 0) &&
  19596                                   ((rd < kNumberOfT32LowRegisters) &&
  19597                                    (rn < kNumberOfT32LowRegisters) &&
  19598                                    (rm < kNumberOfT32LowRegisters))) {
  19599                                 // ADD<c>.W {<Rd>}, <Rn>, <Rm> ; T3
  19600                                 add(CurrentCond(),
  19601                                     Wide,
  19602                                     Register(rd),
  19603                                     Register(rn),
  19604                                     Register(rm));
  19605                                 if (((instr & 0xfff08000) != 0xeb000000)) {
  19606                                   UnpredictableT32(instr);
  19607                                 }
  19608                               } else if ((instr & 0x00100000) == 0x00000000 &&
  19609                                          shift_operand.GetShift().IsLSL() &&
  19610                                          (shift_operand.GetAmount() == 0) &&
  19611                                          ((rd == rn))) {
  19612                                 // ADD<c>.W {<Rd>}, <Rn>, <Rm> ; T3
  19613                                 add(CurrentCond(),
  19614                                     Wide,
  19615                                     Register(rd),
  19616                                     Register(rn),
  19617                                     Register(rm));
  19618                                 if (((instr & 0xfff08000) != 0xeb000000)) {
  19619                                   UnpredictableT32(instr);
  19620                                 }
  19621                               } else if ((instr & 0x00100000) == 0x00000000) {
  19622                                 // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
  19623                                 add(CurrentCond(),
  19624                                     Best,
  19625                                     Register(rd),
  19626                                     Register(rn),
  19627                                     Operand(Register(rm),
  19628                                             shift_operand.GetType(),
  19629                                             shift_operand.GetAmount()));
  19630                                 if (((instr & 0xfff08000) != 0xeb000000)) {
  19631                                   UnpredictableT32(instr);
  19632                                 }
  19633                               } else {
  19634                                 UnallocatedT32(instr);
  19635                               }
  19636                               break;
  19637                             }
  19638                           }
  19639                           break;
  19640                         }
  19641                       }
  19642                       break;
  19643                     }
  19644                     case 0x00400000: {
  19645                       // 0xeb400000
  19646                       switch (instr & 0x000070f0) {
  19647                         case 0x00000030: {
  19648                           // 0xeb400030
  19649                           unsigned rd = (instr >> 8) & 0xf;
  19650                           unsigned rn = (instr >> 16) & 0xf;
  19651                           unsigned rm = instr & 0xf;
  19652                           // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
  19653                           adc(CurrentCond(),
  19654                               Best,
  19655                               Register(rd),
  19656                               Register(rn),
  19657                               Operand(Register(rm), RRX));
  19658                           if (((instr & 0xfff0f0f0) != 0xeb400030)) {
  19659                             UnpredictableT32(instr);
  19660                           }
  19661                           break;
  19662                         }
  19663                         default: {
  19664                           if (((instr & 0x70f0) == 0x30)) {
  19665                             UnallocatedT32(instr);
  19666                             return;
  19667                           }
  19668                           unsigned rd = (instr >> 8) & 0xf;
  19669                           unsigned rn = (instr >> 16) & 0xf;
  19670                           unsigned rm = instr & 0xf;
  19671                           ImmediateShiftOperand
  19672                               shift_operand((instr >> 4) & 0x3,
  19673                                             ((instr >> 6) & 0x3) |
  19674                                                 ((instr >> 10) & 0x1c));
  19675                           if (InITBlock() &&
  19676                               (instr & 0x00100000) == 0x00000000 &&
  19677                               shift_operand.GetShift().IsLSL() &&
  19678                               (shift_operand.GetAmount() == 0) &&
  19679                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
  19680                                (rm < kNumberOfT32LowRegisters))) {
  19681                             // ADC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
  19682                             adc(CurrentCond(),
  19683                                 Wide,
  19684                                 Register(rd),
  19685                                 Register(rn),
  19686                                 Register(rm));
  19687                             if (((instr & 0xfff08000) != 0xeb400000)) {
  19688                               UnpredictableT32(instr);
  19689                             }
  19690                           } else if ((instr & 0x00100000) == 0x00000000) {
  19691                             // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
  19692                             adc(CurrentCond(),
  19693                                 Best,
  19694                                 Register(rd),
  19695                                 Register(rn),
  19696                                 Operand(Register(rm),
  19697                                         shift_operand.GetType(),
  19698                                         shift_operand.GetAmount()));
  19699                             if (((instr & 0xfff08000) != 0xeb400000)) {
  19700                               UnpredictableT32(instr);
  19701                             }
  19702                           } else {
  19703                             UnallocatedT32(instr);
  19704                           }
  19705                           break;
  19706                         }
  19707                       }
  19708                       break;
  19709                     }
  19710                     case 0x00600000: {
  19711                       // 0xeb600000
  19712                       switch (instr & 0x000070f0) {
  19713                         case 0x00000030: {
  19714                           // 0xeb600030
  19715                           unsigned rd = (instr >> 8) & 0xf;
  19716                           unsigned rn = (instr >> 16) & 0xf;
  19717                           unsigned rm = instr & 0xf;
  19718                           // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
  19719                           sbc(CurrentCond(),
  19720                               Best,
  19721                               Register(rd),
  19722                               Register(rn),
  19723                               Operand(Register(rm), RRX));
  19724                           if (((instr & 0xfff0f0f0) != 0xeb600030)) {
  19725                             UnpredictableT32(instr);
  19726                           }
  19727                           break;
  19728                         }
  19729                         default: {
  19730                           if (((instr & 0x70f0) == 0x30)) {
  19731                             UnallocatedT32(instr);
  19732                             return;
  19733                           }
  19734                           unsigned rd = (instr >> 8) & 0xf;
  19735                           unsigned rn = (instr >> 16) & 0xf;
  19736                           unsigned rm = instr & 0xf;
  19737                           ImmediateShiftOperand
  19738                               shift_operand((instr >> 4) & 0x3,
  19739                                             ((instr >> 6) & 0x3) |
  19740                                                 ((instr >> 10) & 0x1c));
  19741                           if (InITBlock() &&
  19742                               (instr & 0x00100000) == 0x00000000 &&
  19743                               shift_operand.GetShift().IsLSL() &&
  19744                               (shift_operand.GetAmount() == 0) &&
  19745                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
  19746                                (rm < kNumberOfT32LowRegisters))) {
  19747                             // SBC<c>.W {<Rd>}, <Rn>, <Rm> ; T2
  19748                             sbc(CurrentCond(),
  19749                                 Wide,
  19750                                 Register(rd),
  19751                                 Register(rn),
  19752                                 Register(rm));
  19753                             if (((instr & 0xfff08000) != 0xeb600000)) {
  19754                               UnpredictableT32(instr);
  19755                             }
  19756                           } else if ((instr & 0x00100000) == 0x00000000) {
  19757                             // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
  19758                             sbc(CurrentCond(),
  19759                                 Best,
  19760                                 Register(rd),
  19761                                 Register(rn),
  19762                                 Operand(Register(rm),
  19763                                         shift_operand.GetType(),
  19764                                         shift_operand.GetAmount()));
  19765                             if (((instr & 0xfff08000) != 0xeb600000)) {
  19766                               UnpredictableT32(instr);
  19767                             }
  19768                           } else {
  19769                             UnallocatedT32(instr);
  19770                           }
  19771                           break;
  19772                         }
  19773                       }
  19774                       break;
  19775                     }
  19776                     default:
  19777                       UnallocatedT32(instr);
  19778                       break;
  19779                   }
  19780                   break;
  19781                 }
  19782                 case 0x01100000: {
  19783                   // 0xeb100000
  19784                   switch (instr & 0x00600000) {
  19785                     case 0x00000000: {
  19786                       // 0xeb100000
  19787                       switch (instr & 0x00000f00) {
  19788                         case 0x00000f00: {
  19789                           // 0xeb100f00
  19790                           switch (instr & 0x000070f0) {
  19791                             case 0x00000030: {
  19792                               // 0xeb100f30
  19793                               unsigned rn = (instr >> 16) & 0xf;
  19794                               unsigned rm = instr & 0xf;
  19795                               // CMN{<c>}{<q>} <Rn>, <Rm>, RRX ; T2
  19796                               cmn(CurrentCond(),
  19797                                   Best,
  19798                                   Register(rn),
  19799                                   Operand(Register(rm), RRX));
  19800                               if (((instr & 0xfff0fff0) != 0xeb100f30)) {
  19801                                 UnpredictableT32(instr);
  19802                               }
  19803                               break;
  19804                             }
  19805                             default: {
  19806                               if (((instr & 0x70f0) == 0x30)) {
  19807                                 UnallocatedT32(instr);
  19808                                 return;
  19809                               }
  19810                               unsigned rn = (instr >> 16) & 0xf;
  19811                               unsigned rm = instr & 0xf;
  19812                               ImmediateShiftOperand
  19813                                   shift_operand((instr >> 4) & 0x3,
  19814                                                 ((instr >> 6) & 0x3) |
  19815                                                     ((instr >> 10) & 0x1c));
  19816                               if (shift_operand.GetShift().IsLSL() &&
  19817                                   (shift_operand.GetAmount() == 0) &&
  19818                                   ((rn < kNumberOfT32LowRegisters) &&
  19819                                    (rm < kNumberOfT32LowRegisters))) {
  19820                                 // CMN{<c>}.W <Rn>, <Rm> ; T2
  19821                                 cmn(CurrentCond(),
  19822                                     Wide,
  19823                                     Register(rn),
  19824                                     Register(rm));
  19825                                 if (((instr & 0xfff08f00) != 0xeb100f00)) {
  19826                                   UnpredictableT32(instr);
  19827                                 }
  19828                               } else {
  19829                                 // CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
  19830                                 cmn(CurrentCond(),
  19831                                     Best,
  19832                                     Register(rn),
  19833                                     Operand(Register(rm),
  19834                                             shift_operand.GetType(),
  19835                                             shift_operand.GetAmount()));
  19836                                 if (((instr & 0xfff08f00) != 0xeb100f00)) {
  19837                                   UnpredictableT32(instr);
  19838                                 }
  19839                               }
  19840                               break;
  19841                             }
  19842                           }
  19843                           break;
  19844                         }
  19845                         default: {
  19846                           switch (instr & 0x000f0000) {
  19847                             case 0x000d0000: {
  19848                               // 0xeb1d0000
  19849                               switch (instr & 0x000070f0) {
  19850                                 case 0x00000030: {
  19851                                   // 0xeb1d0030
  19852                                   if (((instr & 0xf00) == 0xf00)) {
  19853                                     UnallocatedT32(instr);
  19854                                     return;
  19855                                   }
  19856                                   unsigned rd = (instr >> 8) & 0xf;
  19857                                   unsigned rm = instr & 0xf;
  19858                                   // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T3
  19859                                   adds(CurrentCond(),
  19860                                        Best,
  19861                                        Register(rd),
  19862                                        sp,
  19863                                        Operand(Register(rm), RRX));
  19864                                   if (((instr & 0xfffff0f0) != 0xeb1d0030)) {
  19865                                     UnpredictableT32(instr);
  19866                                   }
  19867                                   break;
  19868                                 }
  19869                                 default: {
  19870                                   if (((instr & 0x70f0) == 0x30) ||
  19871                                       ((instr & 0xf00) == 0xf00)) {
  19872                                     UnallocatedT32(instr);
  19873                                     return;
  19874                                   }
  19875                                   unsigned rd = (instr >> 8) & 0xf;
  19876                                   unsigned rm = instr & 0xf;
  19877                                   ImmediateShiftOperand
  19878                                       shift_operand((instr >> 4) & 0x3,
  19879                                                     ((instr >> 6) & 0x3) |
  19880                                                         ((instr >> 10) & 0x1c));
  19881                                   // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
  19882                                   adds(CurrentCond(),
  19883                                        Best,
  19884                                        Register(rd),
  19885                                        sp,
  19886                                        Operand(Register(rm),
  19887                                                shift_operand.GetType(),
  19888                                                shift_operand.GetAmount()));
  19889                                   if (((instr & 0xffff8000) != 0xeb1d0000)) {
  19890                                     UnpredictableT32(instr);
  19891                                   }
  19892                                   break;
  19893                                 }
  19894                               }
  19895                               break;
  19896                             }
  19897                             default: {
  19898                               switch (instr & 0x000070f0) {
  19899                                 case 0x00000030: {
  19900                                   // 0xeb100030
  19901                                   if (((instr & 0xf0000) == 0xd0000) ||
  19902                                       ((instr & 0xf00) == 0xf00)) {
  19903                                     UnallocatedT32(instr);
  19904                                     return;
  19905                                   }
  19906                                   unsigned rd = (instr >> 8) & 0xf;
  19907                                   unsigned rn = (instr >> 16) & 0xf;
  19908                                   unsigned rm = instr & 0xf;
  19909                                   // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T3
  19910                                   adds(CurrentCond(),
  19911                                        Best,
  19912                                        Register(rd),
  19913                                        Register(rn),
  19914                                        Operand(Register(rm), RRX));
  19915                                   if (((instr & 0xfff0f0f0) != 0xeb100030)) {
  19916                                     UnpredictableT32(instr);
  19917                                   }
  19918                                   break;
  19919                                 }
  19920                                 default: {
  19921                                   if (((instr & 0xf0000) == 0xd0000) ||
  19922                                       ((instr & 0x70f0) == 0x30) ||
  19923                                       ((instr & 0xf00) == 0xf00)) {
  19924                                     UnallocatedT32(instr);
  19925                                     return;
  19926                                   }
  19927                                   unsigned rd = (instr >> 8) & 0xf;
  19928                                   unsigned rn = (instr >> 16) & 0xf;
  19929                                   unsigned rm = instr & 0xf;
  19930                                   ImmediateShiftOperand
  19931                                       shift_operand((instr >> 4) & 0x3,
  19932                                                     ((instr >> 6) & 0x3) |
  19933                                                         ((instr >> 10) & 0x1c));
  19934                                   if (OutsideITBlock() &&
  19935                                       (instr & 0x00100000) == 0x00100000 &&
  19936                                       shift_operand.GetShift().IsLSL() &&
  19937                                       (shift_operand.GetAmount() == 0) &&
  19938                                       ((rd < kNumberOfT32LowRegisters) &&
  19939                                        (rn < kNumberOfT32LowRegisters) &&
  19940                                        (rm < kNumberOfT32LowRegisters))) {
  19941                                     // ADDS.W {<Rd>}, <Rn>, <Rm> ; T3
  19942                                     adds(Condition::None(),
  19943                                          Wide,
  19944                                          Register(rd),
  19945                                          Register(rn),
  19946                                          Register(rm));
  19947                                     if (((instr & 0xfff08000) != 0xeb100000)) {
  19948                                       UnpredictableT32(instr);
  19949                                     }
  19950                                   } else if ((instr & 0x00100000) ==
  19951                                              0x00100000) {
  19952                                     // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length)
  19953                                     adds(CurrentCond(),
  19954                                          Best,
  19955                                          Register(rd),
  19956                                          Register(rn),
  19957                                          Operand(Register(rm),
  19958                                                  shift_operand.GetType(),
  19959                                                  shift_operand.GetAmount()));
  19960                                     if (((instr & 0xfff08000) != 0xeb100000)) {
  19961                                       UnpredictableT32(instr);
  19962                                     }
  19963                                   } else {
  19964                                     UnallocatedT32(instr);
  19965                                   }
  19966                                   break;
  19967                                 }
  19968                               }
  19969                               break;
  19970                             }
  19971                           }
  19972                           break;
  19973                         }
  19974                       }
  19975                       break;
  19976                     }
  19977                     case 0x00400000: {
  19978                       // 0xeb500000
  19979                       switch (instr & 0x000070f0) {
  19980                         case 0x00000030: {
  19981                           // 0xeb500030
  19982                           unsigned rd = (instr >> 8) & 0xf;
  19983                           unsigned rn = (instr >> 16) & 0xf;
  19984                           unsigned rm = instr & 0xf;
  19985                           // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
  19986                           adcs(CurrentCond(),
  19987                                Best,
  19988                                Register(rd),
  19989                                Register(rn),
  19990                                Operand(Register(rm), RRX));
  19991                           if (((instr & 0xfff0f0f0) != 0xeb500030)) {
  19992                             UnpredictableT32(instr);
  19993                           }
  19994                           break;
  19995                         }
  19996                         default: {
  19997                           if (((instr & 0x70f0) == 0x30)) {
  19998                             UnallocatedT32(instr);
  19999                             return;
  20000                           }
  20001                           unsigned rd = (instr >> 8) & 0xf;
  20002                           unsigned rn = (instr >> 16) & 0xf;
  20003                           unsigned rm = instr & 0xf;
  20004                           ImmediateShiftOperand
  20005                               shift_operand((instr >> 4) & 0x3,
  20006                                             ((instr >> 6) & 0x3) |
  20007                                                 ((instr >> 10) & 0x1c));
  20008                           if (OutsideITBlock() &&
  20009                               (instr & 0x00100000) == 0x00100000 &&
  20010                               shift_operand.GetShift().IsLSL() &&
  20011                               (shift_operand.GetAmount() == 0) &&
  20012                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
  20013                                (rm < kNumberOfT32LowRegisters))) {
  20014                             // ADCS.W {<Rd>}, <Rn>, <Rm> ; T2
  20015                             adcs(Condition::None(),
  20016                                  Wide,
  20017                                  Register(rd),
  20018                                  Register(rn),
  20019                                  Register(rm));
  20020                             if (((instr & 0xfff08000) != 0xeb500000)) {
  20021                               UnpredictableT32(instr);
  20022                             }
  20023                           } else if ((instr & 0x00100000) == 0x00100000) {
  20024                             // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
  20025                             adcs(CurrentCond(),
  20026                                  Best,
  20027                                  Register(rd),
  20028                                  Register(rn),
  20029                                  Operand(Register(rm),
  20030                                          shift_operand.GetType(),
  20031                                          shift_operand.GetAmount()));
  20032                             if (((instr & 0xfff08000) != 0xeb500000)) {
  20033                               UnpredictableT32(instr);
  20034                             }
  20035                           } else {
  20036                             UnallocatedT32(instr);
  20037                           }
  20038                           break;
  20039                         }
  20040                       }
  20041                       break;
  20042                     }
  20043                     case 0x00600000: {
  20044                       // 0xeb700000
  20045                       switch (instr & 0x000070f0) {
  20046                         case 0x00000030: {
  20047                           // 0xeb700030
  20048                           unsigned rd = (instr >> 8) & 0xf;
  20049                           unsigned rn = (instr >> 16) & 0xf;
  20050                           unsigned rm = instr & 0xf;
  20051                           // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
  20052                           sbcs(CurrentCond(),
  20053                                Best,
  20054                                Register(rd),
  20055                                Register(rn),
  20056                                Operand(Register(rm), RRX));
  20057                           if (((instr & 0xfff0f0f0) != 0xeb700030)) {
  20058                             UnpredictableT32(instr);
  20059                           }
  20060                           break;
  20061                         }
  20062                         default: {
  20063                           if (((instr & 0x70f0) == 0x30)) {
  20064                             UnallocatedT32(instr);
  20065                             return;
  20066                           }
  20067                           unsigned rd = (instr >> 8) & 0xf;
  20068                           unsigned rn = (instr >> 16) & 0xf;
  20069                           unsigned rm = instr & 0xf;
  20070                           ImmediateShiftOperand
  20071                               shift_operand((instr >> 4) & 0x3,
  20072                                             ((instr >> 6) & 0x3) |
  20073                                                 ((instr >> 10) & 0x1c));
  20074                           if (OutsideITBlock() &&
  20075                               (instr & 0x00100000) == 0x00100000 &&
  20076                               shift_operand.GetShift().IsLSL() &&
  20077                               (shift_operand.GetAmount() == 0) &&
  20078                               ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
  20079                                (rm < kNumberOfT32LowRegisters))) {
  20080                             // SBCS.W {<Rd>}, <Rn>, <Rm> ; T2
  20081                             sbcs(Condition::None(),
  20082                                  Wide,
  20083                                  Register(rd),
  20084                                  Register(rn),
  20085                                  Register(rm));
  20086                             if (((instr & 0xfff08000) != 0xeb700000)) {
  20087                               UnpredictableT32(instr);
  20088                             }
  20089                           } else if ((instr & 0x00100000) == 0x00100000) {
  20090                             // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
  20091                             sbcs(CurrentCond(),
  20092                                  Best,
  20093                                  Register(rd),
  20094                                  Register(rn),
  20095                                  Operand(Register(rm),
  20096                                          shift_operand.GetType(),
  20097                                          shift_operand.GetAmount()));
  20098                             if (((instr & 0xfff08000) != 0xeb700000)) {
  20099                               UnpredictableT32(instr);
  20100                             }
  20101                           } else {
  20102                             UnallocatedT32(instr);
  20103                           }
  20104                           break;
  20105                         }
  20106                       }
  20107                       break;
  20108                     }
  20109                     default:
  20110                       UnallocatedT32(instr);
  20111                       break;
  20112                   }
  20113                   break;
  20114                 }
  20115                 case 0x01800000: {
  20116                   // 0xeb800000
  20117                   switch (instr & 0x00600000) {
  20118                     case 0x00200000: {
  20119                       // 0xeba00000
  20120                       switch (instr & 0x000f0000) {
  20121                         case 0x000d0000: {
  20122                           // 0xebad0000
  20123                           switch (instr & 0x000070f0) {
  20124                             case 0x00000030: {
  20125                               // 0xebad0030
  20126                               unsigned rd = (instr >> 8) & 0xf;
  20127                               unsigned rm = instr & 0xf;
  20128                               // SUB{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T1
  20129                               sub(CurrentCond(),
  20130                                   Best,
  20131                                   Register(rd),
  20132                                   sp,
  20133                                   Operand(Register(rm), RRX));
  20134                               if (((instr & 0xfffff0f0) != 0xebad0030)) {
  20135                                 UnpredictableT32(instr);
  20136                               }
  20137                               break;
  20138                             }
  20139                             default: {
  20140                               if (((instr & 0x70f0) == 0x30)) {
  20141                                 UnallocatedT32(instr);
  20142                                 return;
  20143                               }
  20144                               unsigned rd = (instr >> 8) & 0xf;
  20145                               unsigned rm = instr & 0xf;
  20146                               ImmediateShiftOperand
  20147                                   shift_operand((instr >> 4) & 0x3,
  20148                                                 ((instr >> 6) & 0x3) |
  20149                                                     ((instr >> 10) & 0x1c));
  20150                               if ((instr & 0x00100000) == 0x00000000 &&
  20151                                   shift_operand.GetShift().IsLSL() &&
  20152                                   (shift_operand.GetAmount() == 0)) {
  20153                                 // SUB{<c>} {<Rd>}, SP, <Rm> ; T1
  20154                                 sub(CurrentCond(),
  20155                                     Best,
  20156                                     Register(rd),
  20157                                     sp,
  20158                                     Register(rm));
  20159                                 if (((instr & 0xffff8000) != 0xebad0000)) {
  20160                                   UnpredictableT32(instr);
  20161                                 }
  20162                               } else if ((instr & 0x00100000) == 0x00000000) {
  20163                                 // SUB{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
  20164                                 sub(CurrentCond(),
  20165                                     Best,
  20166                                     Register(rd),
  20167                                     sp,
  20168                                     Operand(Register(rm),
  20169                                             shift_operand.GetType(),
  20170                                             shift_operand.GetAmount()));
  20171                                 if (((instr & 0xffff8000) != 0xebad0000)) {
  20172                                   UnpredictableT32(instr);
  20173                                 }
  20174                               } else {
  20175                                 UnallocatedT32(instr);
  20176                               }
  20177                               break;
  20178                             }
  20179                           }
  20180                           break;
  20181                         }
  20182                         default: {
  20183                           switch (instr & 0x000070f0) {
  20184                             case 0x00000030: {
  20185                               // 0xeba00030
  20186                               if (((instr & 0xf0000) == 0xd0000)) {
  20187                                 UnallocatedT32(instr);
  20188                                 return;
  20189                               }
  20190                               unsigned rd = (instr >> 8) & 0xf;
  20191                               unsigned rn = (instr >> 16) & 0xf;
  20192                               unsigned rm = instr & 0xf;
  20193                               // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
  20194                               sub(CurrentCond(),
  20195                                   Best,
  20196                                   Register(rd),
  20197                                   Register(rn),
  20198                                   Operand(Register(rm), RRX));
  20199                               if (((instr & 0xfff0f0f0) != 0xeba00030)) {
  20200                                 UnpredictableT32(instr);
  20201                               }
  20202                               break;
  20203                             }
  20204                             default: {
  20205                               if (((instr & 0xf0000) == 0xd0000) ||
  20206                                   ((instr & 0x70f0) == 0x30)) {
  20207                                 UnallocatedT32(instr);
  20208                                 return;
  20209                               }
  20210                               unsigned rd = (instr >> 8) & 0xf;
  20211                               unsigned rn = (instr >> 16) & 0xf;
  20212                               unsigned rm = instr & 0xf;
  20213                               ImmediateShiftOperand
  20214                                   shift_operand((instr >> 4) & 0x3,
  20215                                                 ((instr >> 6) & 0x3) |
  20216                                                     ((instr >> 10) & 0x1c));
  20217                               if (InITBlock() &&
  20218                                   (instr & 0x00100000) == 0x00000000 &&
  20219                                   shift_operand.GetShift().IsLSL() &&
  20220                                   (shift_operand.GetAmount() == 0) &&
  20221                                   ((rd < kNumberOfT32LowRegisters) &&
  20222                                    (rn < kNumberOfT32LowRegisters) &&
  20223                                    (rm < kNumberOfT32LowRegisters))) {
  20224                                 // SUB<c>.W {<Rd>}, <Rn>, <Rm> ; T2
  20225                                 sub(CurrentCond(),
  20226                                     Wide,
  20227                                     Register(rd),
  20228                                     Register(rn),
  20229                                     Register(rm));
  20230                                 if (((instr & 0xfff08000) != 0xeba00000)) {
  20231                                   UnpredictableT32(instr);
  20232                                 }
  20233                               } else if ((instr & 0x00100000) == 0x00000000) {
  20234                                 // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
  20235                                 sub(CurrentCond(),
  20236                                     Best,
  20237                                     Register(rd),
  20238                                     Register(rn),
  20239                                     Operand(Register(rm),
  20240                                             shift_operand.GetType(),
  20241                                             shift_operand.GetAmount()));
  20242                                 if (((instr & 0xfff08000) != 0xeba00000)) {
  20243                                   UnpredictableT32(instr);
  20244                                 }
  20245                               } else {
  20246                                 UnallocatedT32(instr);
  20247                               }
  20248                               break;
  20249                             }
  20250                           }
  20251                           break;
  20252                         }
  20253                       }
  20254                       break;
  20255                     }
  20256                     case 0x00400000: {
  20257                       // 0xebc00000
  20258                       switch (instr & 0x000070f0) {
  20259                         case 0x00000030: {
  20260                           // 0xebc00030
  20261                           unsigned rd = (instr >> 8) & 0xf;
  20262                           unsigned rn = (instr >> 16) & 0xf;
  20263                           unsigned rm = instr & 0xf;
  20264                           // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
  20265                           rsb(CurrentCond(),
  20266                               Best,
  20267                               Register(rd),
  20268                               Register(rn),
  20269                               Operand(Register(rm), RRX));
  20270                           if (((instr & 0xfff0f0f0) != 0xebc00030)) {
  20271                             UnpredictableT32(instr);
  20272                           }
  20273                           break;
  20274                         }
  20275                         default: {
  20276                           if (((instr & 0x70f0) == 0x30)) {
  20277                             UnallocatedT32(instr);
  20278                             return;
  20279                           }
  20280                           unsigned rd = (instr >> 8) & 0xf;
  20281                           unsigned rn = (instr >> 16) & 0xf;
  20282                           unsigned rm = instr & 0xf;
  20283                           ImmediateShiftOperand
  20284                               shift_operand((instr >> 4) & 0x3,
  20285                                             ((instr >> 6) & 0x3) |
  20286                                                 ((instr >> 10) & 0x1c));
  20287                           // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
  20288                           rsb(CurrentCond(),
  20289                               Best,
  20290                               Register(rd),
  20291                               Register(rn),
  20292                               Operand(Register(rm),
  20293                                       shift_operand.GetType(),
  20294                                       shift_operand.GetAmount()));
  20295                           if (((instr & 0xfff08000) != 0xebc00000)) {
  20296                             UnpredictableT32(instr);
  20297                           }
  20298                           break;
  20299                         }
  20300                       }
  20301                       break;
  20302                     }
  20303                     default:
  20304                       UnallocatedT32(instr);
  20305                       break;
  20306                   }
  20307                   break;
  20308                 }
  20309                 case 0x01900000: {
  20310                   // 0xeb900000
  20311                   switch (instr & 0x00600000) {
  20312                     case 0x00200000: {
  20313                       // 0xebb00000
  20314                       switch (instr & 0x00000f00) {
  20315                         case 0x00000f00: {
  20316                           // 0xebb00f00
  20317                           switch (instr & 0x000070f0) {
  20318                             case 0x00000030: {
  20319                               // 0xebb00f30
  20320                               unsigned rn = (instr >> 16) & 0xf;
  20321                               unsigned rm = instr & 0xf;
  20322                               // CMP{<c>}{<q>} <Rn>, <Rm>, RRX ; T3
  20323                               cmp(CurrentCond(),
  20324                                   Best,
  20325                                   Register(rn),
  20326                                   Operand(Register(rm), RRX));
  20327                               if (((instr & 0xfff0fff0) != 0xebb00f30)) {
  20328                                 UnpredictableT32(instr);
  20329                               }
  20330                               break;
  20331                             }
  20332                             default: {
  20333                               if (((instr & 0x70f0) == 0x30)) {
  20334                                 UnallocatedT32(instr);
  20335                                 return;
  20336                               }
  20337                               unsigned rn = (instr >> 16) & 0xf;
  20338                               unsigned rm = instr & 0xf;
  20339                               ImmediateShiftOperand
  20340                                   shift_operand((instr >> 4) & 0x3,
  20341                                                 ((instr >> 6) & 0x3) |
  20342                                                     ((instr >> 10) & 0x1c));
  20343                               if (shift_operand.GetShift().IsLSL() &&
  20344                                   (shift_operand.GetAmount() == 0)) {
  20345                                 // CMP{<c>}.W <Rn>, <Rm> ; T3
  20346                                 cmp(CurrentCond(),
  20347                                     Wide,
  20348                                     Register(rn),
  20349                                     Register(rm));
  20350                                 if (((instr & 0xfff08f00) != 0xebb00f00)) {
  20351                                   UnpredictableT32(instr);
  20352                                 }
  20353                               } else {
  20354                                 // CMP{<c>}{<q>} <Rn>, <Rm>, <shift> #<amount> ; T3 NOLINT(whitespace/line_length)
  20355                                 cmp(CurrentCond(),
  20356                                     Best,
  20357                                     Register(rn),
  20358                                     Operand(Register(rm),
  20359                                             shift_operand.GetType(),
  20360                                             shift_operand.GetAmount()));
  20361                                 if (((instr & 0xfff08f00) != 0xebb00f00)) {
  20362                                   UnpredictableT32(instr);
  20363                                 }
  20364                               }
  20365                               break;
  20366                             }
  20367                           }
  20368                           break;
  20369                         }
  20370                         default: {
  20371                           switch (instr & 0x000f0000) {
  20372                             case 0x000d0000: {
  20373                               // 0xebbd0000
  20374                               switch (instr & 0x000070f0) {
  20375                                 case 0x00000030: {
  20376                                   // 0xebbd0030
  20377                                   if (((instr & 0xf00) == 0xf00)) {
  20378                                     UnallocatedT32(instr);
  20379                                     return;
  20380                                   }
  20381                                   unsigned rd = (instr >> 8) & 0xf;
  20382                                   unsigned rm = instr & 0xf;
  20383                                   // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T1
  20384                                   subs(CurrentCond(),
  20385                                        Best,
  20386                                        Register(rd),
  20387                                        sp,
  20388                                        Operand(Register(rm), RRX));
  20389                                   if (((instr & 0xfffff0f0) != 0xebbd0030)) {
  20390                                     UnpredictableT32(instr);
  20391                                   }
  20392                                   break;
  20393                                 }
  20394                                 default: {
  20395                                   if (((instr & 0x70f0) == 0x30) ||
  20396                                       ((instr & 0xf00) == 0xf00)) {
  20397                                     UnallocatedT32(instr);
  20398                                     return;
  20399                                   }
  20400                                   unsigned rd = (instr >> 8) & 0xf;
  20401                                   unsigned rm = instr & 0xf;
  20402                                   ImmediateShiftOperand
  20403                                       shift_operand((instr >> 4) & 0x3,
  20404                                                     ((instr >> 6) & 0x3) |
  20405                                                         ((instr >> 10) & 0x1c));
  20406                                   // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
  20407                                   subs(CurrentCond(),
  20408                                        Best,
  20409                                        Register(rd),
  20410                                        sp,
  20411                                        Operand(Register(rm),
  20412                                                shift_operand.GetType(),
  20413                                                shift_operand.GetAmount()));
  20414                                   if (((instr & 0xffff8000) != 0xebbd0000)) {
  20415                                     UnpredictableT32(instr);
  20416                                   }
  20417                                   break;
  20418                                 }
  20419                               }
  20420                               break;
  20421                             }
  20422                             default: {
  20423                               switch (instr & 0x000070f0) {
  20424                                 case 0x00000030: {
  20425                                   // 0xebb00030
  20426                                   if (((instr & 0xf0000) == 0xd0000) ||
  20427                                       ((instr & 0xf00) == 0xf00)) {
  20428                                     UnallocatedT32(instr);
  20429                                     return;
  20430                                   }
  20431                                   unsigned rd = (instr >> 8) & 0xf;
  20432                                   unsigned rn = (instr >> 16) & 0xf;
  20433                                   unsigned rm = instr & 0xf;
  20434                                   // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2
  20435                                   subs(CurrentCond(),
  20436                                        Best,
  20437                                        Register(rd),
  20438                                        Register(rn),
  20439                                        Operand(Register(rm), RRX));
  20440                                   if (((instr & 0xfff0f0f0) != 0xebb00030)) {
  20441                                     UnpredictableT32(instr);
  20442                                   }
  20443                                   break;
  20444                                 }
  20445                                 default: {
  20446                                   if (((instr & 0xf0000) == 0xd0000) ||
  20447                                       ((instr & 0x70f0) == 0x30) ||
  20448                                       ((instr & 0xf00) == 0xf00)) {
  20449                                     UnallocatedT32(instr);
  20450                                     return;
  20451                                   }
  20452                                   unsigned rd = (instr >> 8) & 0xf;
  20453                                   unsigned rn = (instr >> 16) & 0xf;
  20454                                   unsigned rm = instr & 0xf;
  20455                                   ImmediateShiftOperand
  20456                                       shift_operand((instr >> 4) & 0x3,
  20457                                                     ((instr >> 6) & 0x3) |
  20458                                                         ((instr >> 10) & 0x1c));
  20459                                   if (OutsideITBlock() &&
  20460                                       (instr & 0x00100000) == 0x00100000 &&
  20461                                       shift_operand.GetShift().IsLSL() &&
  20462                                       (shift_operand.GetAmount() == 0) &&
  20463                                       ((rd < kNumberOfT32LowRegisters) &&
  20464                                        (rn < kNumberOfT32LowRegisters) &&
  20465                                        (rm < kNumberOfT32LowRegisters))) {
  20466                                     // SUBS.W {<Rd>}, <Rn>, <Rm> ; T2
  20467                                     subs(Condition::None(),
  20468                                          Wide,
  20469                                          Register(rd),
  20470                                          Register(rn),
  20471                                          Register(rm));
  20472                                     if (((instr & 0xfff08000) != 0xebb00000)) {
  20473                                       UnpredictableT32(instr);
  20474                                     }
  20475                                   } else if ((instr & 0x00100000) ==
  20476                                              0x00100000) {
  20477                                     // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length)
  20478                                     subs(CurrentCond(),
  20479                                          Best,
  20480                                          Register(rd),
  20481                                          Register(rn),
  20482                                          Operand(Register(rm),
  20483                                                  shift_operand.GetType(),
  20484                                                  shift_operand.GetAmount()));
  20485                                     if (((instr & 0xfff08000) != 0xebb00000)) {
  20486                                       UnpredictableT32(instr);
  20487                                     }
  20488                                   } else {
  20489                                     UnallocatedT32(instr);
  20490                                   }
  20491                                   break;
  20492                                 }
  20493                               }
  20494                               break;
  20495                             }
  20496                           }
  20497                           break;
  20498                         }
  20499                       }
  20500                       break;
  20501                     }
  20502                     case 0x00400000: {
  20503                       // 0xebd00000
  20504                       switch (instr & 0x000070f0) {
  20505                         case 0x00000030: {
  20506                           // 0xebd00030
  20507                           unsigned rd = (instr >> 8) & 0xf;
  20508                           unsigned rn = (instr >> 16) & 0xf;
  20509                           unsigned rm = instr & 0xf;
  20510                           // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1
  20511                           rsbs(CurrentCond(),
  20512                                Best,
  20513                                Register(rd),
  20514                                Register(rn),
  20515                                Operand(Register(rm), RRX));
  20516                           if (((instr & 0xfff0f0f0) != 0xebd00030)) {
  20517                             UnpredictableT32(instr);
  20518                           }
  20519                           break;
  20520                         }
  20521                         default: {
  20522                           if (((instr & 0x70f0) == 0x30)) {
  20523                             UnallocatedT32(instr);
  20524                             return;
  20525                           }
  20526                           unsigned rd = (instr >> 8) & 0xf;
  20527                           unsigned rn = (instr >> 16) & 0xf;
  20528                           unsigned rm = instr & 0xf;
  20529                           ImmediateShiftOperand
  20530                               shift_operand((instr >> 4) & 0x3,
  20531                                             ((instr >> 6) & 0x3) |
  20532                                                 ((instr >> 10) & 0x1c));
  20533                           // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length)
  20534                           rsbs(CurrentCond(),
  20535                                Best,
  20536                                Register(rd),
  20537                                Register(rn),
  20538                                Operand(Register(rm),
  20539                                        shift_operand.GetType(),
  20540                                        shift_operand.GetAmount()));
  20541                           if (((instr & 0xfff08000) != 0xebd00000)) {
  20542                             UnpredictableT32(instr);
  20543                           }
  20544                           break;
  20545                         }
  20546                       }
  20547                       break;
  20548                     }
  20549                     default:
  20550                       UnallocatedT32(instr);
  20551                       break;
  20552                   }
  20553                   break;
  20554                 }
  20555                 case 0x10000000: {
  20556                   // 0xfa000000
  20557                   switch (instr & 0x0000f080) {
  20558                     case 0x0000f000: {
  20559                       // 0xfa00f000
  20560                       if ((instr & 0x00000070) == 0x00000000) {
  20561                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
  20562                              Uint32(0x2))) {
  20563                           unsigned rd = (instr >> 8) & 0xf;
  20564                           unsigned rm = (instr >> 16) & 0xf;
  20565                           unsigned rs = instr & 0xf;
  20566                           if (InITBlock() &&
  20567                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
  20568                                (rs < kNumberOfT32LowRegisters))) {
  20569                             // ASR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
  20570                             asr(CurrentCond(),
  20571                                 Wide,
  20572                                 Register(rd),
  20573                                 Register(rm),
  20574                                 Register(rs));
  20575                           } else {
  20576                             // ASR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
  20577                             asr(CurrentCond(),
  20578                                 Best,
  20579                                 Register(rd),
  20580                                 Register(rm),
  20581                                 Register(rs));
  20582                           }
  20583                           return;
  20584                         }
  20585                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
  20586                              Uint32(0x0))) {
  20587                           unsigned rd = (instr >> 8) & 0xf;
  20588                           unsigned rm = (instr >> 16) & 0xf;
  20589                           unsigned rs = instr & 0xf;
  20590                           if (InITBlock() &&
  20591                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
  20592                                (rs < kNumberOfT32LowRegisters))) {
  20593                             // LSL<c>.W {<Rd>}, <Rm>, <Rs> ; T2
  20594                             lsl(CurrentCond(),
  20595                                 Wide,
  20596                                 Register(rd),
  20597                                 Register(rm),
  20598                                 Register(rs));
  20599                           } else {
  20600                             // LSL{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
  20601                             lsl(CurrentCond(),
  20602                                 Best,
  20603                                 Register(rd),
  20604                                 Register(rm),
  20605                                 Register(rs));
  20606                           }
  20607                           return;
  20608                         }
  20609                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
  20610                              Uint32(0x1))) {
  20611                           unsigned rd = (instr >> 8) & 0xf;
  20612                           unsigned rm = (instr >> 16) & 0xf;
  20613                           unsigned rs = instr & 0xf;
  20614                           if (InITBlock() &&
  20615                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
  20616                                (rs < kNumberOfT32LowRegisters))) {
  20617                             // LSR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
  20618                             lsr(CurrentCond(),
  20619                                 Wide,
  20620                                 Register(rd),
  20621                                 Register(rm),
  20622                                 Register(rs));
  20623                           } else {
  20624                             // LSR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
  20625                             lsr(CurrentCond(),
  20626                                 Best,
  20627                                 Register(rd),
  20628                                 Register(rm),
  20629                                 Register(rs));
  20630                           }
  20631                           return;
  20632                         }
  20633                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
  20634                              Uint32(0x3))) {
  20635                           unsigned rd = (instr >> 8) & 0xf;
  20636                           unsigned rm = (instr >> 16) & 0xf;
  20637                           unsigned rs = instr & 0xf;
  20638                           if (InITBlock() &&
  20639                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
  20640                                (rs < kNumberOfT32LowRegisters))) {
  20641                             // ROR<c>.W {<Rd>}, <Rm>, <Rs> ; T2
  20642                             ror(CurrentCond(),
  20643                                 Wide,
  20644                                 Register(rd),
  20645                                 Register(rm),
  20646                                 Register(rs));
  20647                           } else {
  20648                             // ROR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
  20649                             ror(CurrentCond(),
  20650                                 Best,
  20651                                 Register(rd),
  20652                                 Register(rm),
  20653                                 Register(rs));
  20654                           }
  20655                           return;
  20656                         }
  20657                         unsigned rd = (instr >> 8) & 0xf;
  20658                         unsigned rm = (instr >> 16) & 0xf;
  20659                         Shift shift((instr >> 21) & 0x3);
  20660                         unsigned rs = instr & 0xf;
  20661                         if (InITBlock() && (instr & 0x00100000) == 0x00000000 &&
  20662                             ((rd < kNumberOfT32LowRegisters) &&
  20663                              (rm < kNumberOfT32LowRegisters) &&
  20664                              (rs < kNumberOfT32LowRegisters))) {
  20665                           // MOV<c>.W <Rd>, <Rm>, <shift> <Rs> ; T2
  20666                           mov(CurrentCond(),
  20667                               Wide,
  20668                               Register(rd),
  20669                               Operand(Register(rm),
  20670                                       shift.GetType(),
  20671                                       Register(rs)));
  20672                         } else if ((instr & 0x00100000) == 0x00000000) {
  20673                           // MOV{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; T2
  20674                           mov(CurrentCond(),
  20675                               Best,
  20676                               Register(rd),
  20677                               Operand(Register(rm),
  20678                                       shift.GetType(),
  20679                                       Register(rs)));
  20680                         } else {
  20681                           UnallocatedT32(instr);
  20682                         }
  20683                       } else {
  20684                         UnallocatedT32(instr);
  20685                       }
  20686                       break;
  20687                     }
  20688                     case 0x0000f080: {
  20689                       // 0xfa00f080
  20690                       switch (instr & 0x00600000) {
  20691                         case 0x00000000: {
  20692                           // 0xfa00f080
  20693                           switch (instr & 0x000f0000) {
  20694                             case 0x000f0000: {
  20695                               // 0xfa0ff080
  20696                               unsigned rd = (instr >> 8) & 0xf;
  20697                               unsigned rm = instr & 0xf;
  20698                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
  20699                               if ((amount == 0) &&
  20700                                   ((rd < kNumberOfT32LowRegisters) &&
  20701                                    (rm < kNumberOfT32LowRegisters))) {
  20702                                 // SXTH{<c>}.W {<Rd>}, <Rm> ; T2
  20703                                 sxth(CurrentCond(),
  20704                                      Wide,
  20705                                      Register(rd),
  20706                                      Register(rm));
  20707                                 if (((instr & 0xfffff0c0) != 0xfa0ff080)) {
  20708                                   UnpredictableT32(instr);
  20709                                 }
  20710                               } else {
  20711                                 // SXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
  20712                                 sxth(CurrentCond(),
  20713                                      Best,
  20714                                      Register(rd),
  20715                                      Operand(Register(rm), ROR, amount));
  20716                                 if (((instr & 0xfffff0c0) != 0xfa0ff080)) {
  20717                                   UnpredictableT32(instr);
  20718                                 }
  20719                               }
  20720                               break;
  20721                             }
  20722                             default: {
  20723                               if (((instr & 0xf0000) == 0xf0000)) {
  20724                                 UnallocatedT32(instr);
  20725                                 return;
  20726                               }
  20727                               unsigned rd = (instr >> 8) & 0xf;
  20728                               unsigned rn = (instr >> 16) & 0xf;
  20729                               unsigned rm = instr & 0xf;
  20730                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
  20731                               // SXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
  20732                               sxtah(CurrentCond(),
  20733                                     Register(rd),
  20734                                     Register(rn),
  20735                                     Operand(Register(rm), ROR, amount));
  20736                               if (((instr & 0xfff0f0c0) != 0xfa00f080)) {
  20737                                 UnpredictableT32(instr);
  20738                               }
  20739                               break;
  20740                             }
  20741                           }
  20742                           break;
  20743                         }
  20744                         case 0x00200000: {
  20745                           // 0xfa20f080
  20746                           switch (instr & 0x000f0000) {
  20747                             case 0x000f0000: {
  20748                               // 0xfa2ff080
  20749                               unsigned rd = (instr >> 8) & 0xf;
  20750                               unsigned rm = instr & 0xf;
  20751                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
  20752                               // SXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
  20753                               sxtb16(CurrentCond(),
  20754                                      Register(rd),
  20755                                      Operand(Register(rm), ROR, amount));
  20756                               if (((instr & 0xfffff0c0) != 0xfa2ff080)) {
  20757                                 UnpredictableT32(instr);
  20758                               }
  20759                               break;
  20760                             }
  20761                             default: {
  20762                               if (((instr & 0xf0000) == 0xf0000)) {
  20763                                 UnallocatedT32(instr);
  20764                                 return;
  20765                               }
  20766                               unsigned rd = (instr >> 8) & 0xf;
  20767                               unsigned rn = (instr >> 16) & 0xf;
  20768                               unsigned rm = instr & 0xf;
  20769                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
  20770                               // SXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
  20771                               sxtab16(CurrentCond(),
  20772                                       Register(rd),
  20773                                       Register(rn),
  20774                                       Operand(Register(rm), ROR, amount));
  20775                               if (((instr & 0xfff0f0c0) != 0xfa20f080)) {
  20776                                 UnpredictableT32(instr);
  20777                               }
  20778                               break;
  20779                             }
  20780                           }
  20781                           break;
  20782                         }
  20783                         case 0x00400000: {
  20784                           // 0xfa40f080
  20785                           switch (instr & 0x000f0000) {
  20786                             case 0x000f0000: {
  20787                               // 0xfa4ff080
  20788                               unsigned rd = (instr >> 8) & 0xf;
  20789                               unsigned rm = instr & 0xf;
  20790                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
  20791                               if ((amount == 0) &&
  20792                                   ((rd < kNumberOfT32LowRegisters) &&
  20793                                    (rm < kNumberOfT32LowRegisters))) {
  20794                                 // SXTB{<c>}.W {<Rd>}, <Rm> ; T2
  20795                                 sxtb(CurrentCond(),
  20796                                      Wide,
  20797                                      Register(rd),
  20798                                      Register(rm));
  20799                                 if (((instr & 0xfffff0c0) != 0xfa4ff080)) {
  20800                                   UnpredictableT32(instr);
  20801                                 }
  20802                               } else {
  20803                                 // SXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
  20804                                 sxtb(CurrentCond(),
  20805                                      Best,
  20806                                      Register(rd),
  20807                                      Operand(Register(rm), ROR, amount));
  20808                                 if (((instr & 0xfffff0c0) != 0xfa4ff080)) {
  20809                                   UnpredictableT32(instr);
  20810                                 }
  20811                               }
  20812                               break;
  20813                             }
  20814                             default: {
  20815                               if (((instr & 0xf0000) == 0xf0000)) {
  20816                                 UnallocatedT32(instr);
  20817                                 return;
  20818                               }
  20819                               unsigned rd = (instr >> 8) & 0xf;
  20820                               unsigned rn = (instr >> 16) & 0xf;
  20821                               unsigned rm = instr & 0xf;
  20822                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
  20823                               // SXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
  20824                               sxtab(CurrentCond(),
  20825                                     Register(rd),
  20826                                     Register(rn),
  20827                                     Operand(Register(rm), ROR, amount));
  20828                               if (((instr & 0xfff0f0c0) != 0xfa40f080)) {
  20829                                 UnpredictableT32(instr);
  20830                               }
  20831                               break;
  20832                             }
  20833                           }
  20834                           break;
  20835                         }
  20836                         default:
  20837                           UnallocatedT32(instr);
  20838                           break;
  20839                       }
  20840                       break;
  20841                     }
  20842                     default:
  20843                       UnallocatedT32(instr);
  20844                       break;
  20845                   }
  20846                   break;
  20847                 }
  20848                 case 0x10100000: {
  20849                   // 0xfa100000
  20850                   switch (instr & 0x0000f080) {
  20851                     case 0x0000f000: {
  20852                       // 0xfa10f000
  20853                       if ((instr & 0x00000070) == 0x00000000) {
  20854                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
  20855                              Uint32(0x2))) {
  20856                           unsigned rd = (instr >> 8) & 0xf;
  20857                           unsigned rm = (instr >> 16) & 0xf;
  20858                           unsigned rs = instr & 0xf;
  20859                           if (OutsideITBlock() &&
  20860                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
  20861                                (rs < kNumberOfT32LowRegisters))) {
  20862                             // ASRS.W {<Rd>}, <Rm>, <Rs> ; T2
  20863                             asrs(Condition::None(),
  20864                                  Wide,
  20865                                  Register(rd),
  20866                                  Register(rm),
  20867                                  Register(rs));
  20868                           } else {
  20869                             // ASRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
  20870                             asrs(CurrentCond(),
  20871                                  Best,
  20872                                  Register(rd),
  20873                                  Register(rm),
  20874                                  Register(rs));
  20875                           }
  20876                           return;
  20877                         }
  20878                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
  20879                              Uint32(0x0))) {
  20880                           unsigned rd = (instr >> 8) & 0xf;
  20881                           unsigned rm = (instr >> 16) & 0xf;
  20882                           unsigned rs = instr & 0xf;
  20883                           if (OutsideITBlock() &&
  20884                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
  20885                                (rs < kNumberOfT32LowRegisters))) {
  20886                             // LSLS.W {<Rd>}, <Rm>, <Rs> ; T2
  20887                             lsls(Condition::None(),
  20888                                  Wide,
  20889                                  Register(rd),
  20890                                  Register(rm),
  20891                                  Register(rs));
  20892                           } else {
  20893                             // LSLS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
  20894                             lsls(CurrentCond(),
  20895                                  Best,
  20896                                  Register(rd),
  20897                                  Register(rm),
  20898                                  Register(rs));
  20899                           }
  20900                           return;
  20901                         }
  20902                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
  20903                              Uint32(0x1))) {
  20904                           unsigned rd = (instr >> 8) & 0xf;
  20905                           unsigned rm = (instr >> 16) & 0xf;
  20906                           unsigned rs = instr & 0xf;
  20907                           if (OutsideITBlock() &&
  20908                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
  20909                                (rs < kNumberOfT32LowRegisters))) {
  20910                             // LSRS.W {<Rd>}, <Rm>, <Rs> ; T2
  20911                             lsrs(Condition::None(),
  20912                                  Wide,
  20913                                  Register(rd),
  20914                                  Register(rm),
  20915                                  Register(rs));
  20916                           } else {
  20917                             // LSRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
  20918                             lsrs(CurrentCond(),
  20919                                  Best,
  20920                                  Register(rd),
  20921                                  Register(rm),
  20922                                  Register(rs));
  20923                           }
  20924                           return;
  20925                         }
  20926                         if (((Uint32((instr >> 21)) & Uint32(0x3)) ==
  20927                              Uint32(0x3))) {
  20928                           unsigned rd = (instr >> 8) & 0xf;
  20929                           unsigned rm = (instr >> 16) & 0xf;
  20930                           unsigned rs = instr & 0xf;
  20931                           if (OutsideITBlock() &&
  20932                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
  20933                                (rs < kNumberOfT32LowRegisters))) {
  20934                             // RORS.W {<Rd>}, <Rm>, <Rs> ; T2
  20935                             rors(Condition::None(),
  20936                                  Wide,
  20937                                  Register(rd),
  20938                                  Register(rm),
  20939                                  Register(rs));
  20940                           } else {
  20941                             // RORS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2
  20942                             rors(CurrentCond(),
  20943                                  Best,
  20944                                  Register(rd),
  20945                                  Register(rm),
  20946                                  Register(rs));
  20947                           }
  20948                           return;
  20949                         }
  20950                         unsigned rd = (instr >> 8) & 0xf;
  20951                         unsigned rm = (instr >> 16) & 0xf;
  20952                         Shift shift((instr >> 21) & 0x3);
  20953                         unsigned rs = instr & 0xf;
  20954                         if (OutsideITBlock() &&
  20955                             (instr & 0x00100000) == 0x00100000 &&
  20956                             ((rd < kNumberOfT32LowRegisters) &&
  20957                              (rm < kNumberOfT32LowRegisters) &&
  20958                              (rs < kNumberOfT32LowRegisters))) {
  20959                           // MOVS.W <Rd>, <Rm>, <shift> <Rs> ; T2
  20960                           movs(Condition::None(),
  20961                                Wide,
  20962                                Register(rd),
  20963                                Operand(Register(rm),
  20964                                        shift.GetType(),
  20965                                        Register(rs)));
  20966                         } else if ((instr & 0x00100000) == 0x00100000) {
  20967                           // MOVS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; T2
  20968                           movs(CurrentCond(),
  20969                                Best,
  20970                                Register(rd),
  20971                                Operand(Register(rm),
  20972                                        shift.GetType(),
  20973                                        Register(rs)));
  20974                         } else {
  20975                           UnallocatedT32(instr);
  20976                         }
  20977                       } else {
  20978                         UnallocatedT32(instr);
  20979                       }
  20980                       break;
  20981                     }
  20982                     case 0x0000f080: {
  20983                       // 0xfa10f080
  20984                       switch (instr & 0x00600000) {
  20985                         case 0x00000000: {
  20986                           // 0xfa10f080
  20987                           switch (instr & 0x000f0000) {
  20988                             case 0x000f0000: {
  20989                               // 0xfa1ff080
  20990                               unsigned rd = (instr >> 8) & 0xf;
  20991                               unsigned rm = instr & 0xf;
  20992                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
  20993                               if ((amount == 0) &&
  20994                                   ((rd < kNumberOfT32LowRegisters) &&
  20995                                    (rm < kNumberOfT32LowRegisters))) {
  20996                                 // UXTH{<c>}.W {<Rd>}, <Rm> ; T2
  20997                                 uxth(CurrentCond(),
  20998                                      Wide,
  20999                                      Register(rd),
  21000                                      Register(rm));
  21001                                 if (((instr & 0xfffff0c0) != 0xfa1ff080)) {
  21002                                   UnpredictableT32(instr);
  21003                                 }
  21004                               } else {
  21005                                 // UXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
  21006                                 uxth(CurrentCond(),
  21007                                      Best,
  21008                                      Register(rd),
  21009                                      Operand(Register(rm), ROR, amount));
  21010                                 if (((instr & 0xfffff0c0) != 0xfa1ff080)) {
  21011                                   UnpredictableT32(instr);
  21012                                 }
  21013                               }
  21014                               break;
  21015                             }
  21016                             default: {
  21017                               if (((instr & 0xf0000) == 0xf0000)) {
  21018                                 UnallocatedT32(instr);
  21019                                 return;
  21020                               }
  21021                               unsigned rd = (instr >> 8) & 0xf;
  21022                               unsigned rn = (instr >> 16) & 0xf;
  21023                               unsigned rm = instr & 0xf;
  21024                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
  21025                               // UXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
  21026                               uxtah(CurrentCond(),
  21027                                     Register(rd),
  21028                                     Register(rn),
  21029                                     Operand(Register(rm), ROR, amount));
  21030                               if (((instr & 0xfff0f0c0) != 0xfa10f080)) {
  21031                                 UnpredictableT32(instr);
  21032                               }
  21033                               break;
  21034                             }
  21035                           }
  21036                           break;
  21037                         }
  21038                         case 0x00200000: {
  21039                           // 0xfa30f080
  21040                           switch (instr & 0x000f0000) {
  21041                             case 0x000f0000: {
  21042                               // 0xfa3ff080
  21043                               unsigned rd = (instr >> 8) & 0xf;
  21044                               unsigned rm = instr & 0xf;
  21045                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
  21046                               // UXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
  21047                               uxtb16(CurrentCond(),
  21048                                      Register(rd),
  21049                                      Operand(Register(rm), ROR, amount));
  21050                               if (((instr & 0xfffff0c0) != 0xfa3ff080)) {
  21051                                 UnpredictableT32(instr);
  21052                               }
  21053                               break;
  21054                             }
  21055                             default: {
  21056                               if (((instr & 0xf0000) == 0xf0000)) {
  21057                                 UnallocatedT32(instr);
  21058                                 return;
  21059                               }
  21060                               unsigned rd = (instr >> 8) & 0xf;
  21061                               unsigned rn = (instr >> 16) & 0xf;
  21062                               unsigned rm = instr & 0xf;
  21063                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
  21064                               // UXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
  21065                               uxtab16(CurrentCond(),
  21066                                       Register(rd),
  21067                                       Register(rn),
  21068                                       Operand(Register(rm), ROR, amount));
  21069                               if (((instr & 0xfff0f0c0) != 0xfa30f080)) {
  21070                                 UnpredictableT32(instr);
  21071                               }
  21072                               break;
  21073                             }
  21074                           }
  21075                           break;
  21076                         }
  21077                         case 0x00400000: {
  21078                           // 0xfa50f080
  21079                           switch (instr & 0x000f0000) {
  21080                             case 0x000f0000: {
  21081                               // 0xfa5ff080
  21082                               unsigned rd = (instr >> 8) & 0xf;
  21083                               unsigned rm = instr & 0xf;
  21084                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
  21085                               if ((amount == 0) &&
  21086                                   ((rd < kNumberOfT32LowRegisters) &&
  21087                                    (rm < kNumberOfT32LowRegisters))) {
  21088                                 // UXTB{<c>}.W {<Rd>}, <Rm> ; T2
  21089                                 uxtb(CurrentCond(),
  21090                                      Wide,
  21091                                      Register(rd),
  21092                                      Register(rm));
  21093                                 if (((instr & 0xfffff0c0) != 0xfa5ff080)) {
  21094                                   UnpredictableT32(instr);
  21095                                 }
  21096                               } else {
  21097                                 // UXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length)
  21098                                 uxtb(CurrentCond(),
  21099                                      Best,
  21100                                      Register(rd),
  21101                                      Operand(Register(rm), ROR, amount));
  21102                                 if (((instr & 0xfffff0c0) != 0xfa5ff080)) {
  21103                                   UnpredictableT32(instr);
  21104                                 }
  21105                               }
  21106                               break;
  21107                             }
  21108                             default: {
  21109                               if (((instr & 0xf0000) == 0xf0000)) {
  21110                                 UnallocatedT32(instr);
  21111                                 return;
  21112                               }
  21113                               unsigned rd = (instr >> 8) & 0xf;
  21114                               unsigned rn = (instr >> 16) & 0xf;
  21115                               unsigned rm = instr & 0xf;
  21116                               uint32_t amount = ((instr >> 4) & 0x3) * 8;
  21117                               // UXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length)
  21118                               uxtab(CurrentCond(),
  21119                                     Register(rd),
  21120                                     Register(rn),
  21121                                     Operand(Register(rm), ROR, amount));
  21122                               if (((instr & 0xfff0f0c0) != 0xfa50f080)) {
  21123                                 UnpredictableT32(instr);
  21124                               }
  21125                               break;
  21126                             }
  21127                           }
  21128                           break;
  21129                         }
  21130                         default:
  21131                           UnallocatedT32(instr);
  21132                           break;
  21133                       }
  21134                       break;
  21135                     }
  21136                     default:
  21137                       UnallocatedT32(instr);
  21138                       break;
  21139                   }
  21140                   break;
  21141                 }
  21142                 case 0x10800000: {
  21143                   // 0xfa800000
  21144                   switch (instr & 0x0060f0f0) {
  21145                     case 0x0000f000: {
  21146                       // 0xfa80f000
  21147                       unsigned rd = (instr >> 8) & 0xf;
  21148                       unsigned rn = (instr >> 16) & 0xf;
  21149                       unsigned rm = instr & 0xf;
  21150                       // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21151                       sadd8(CurrentCond(),
  21152                             Register(rd),
  21153                             Register(rn),
  21154                             Register(rm));
  21155                       break;
  21156                     }
  21157                     case 0x0000f010: {
  21158                       // 0xfa80f010
  21159                       unsigned rd = (instr >> 8) & 0xf;
  21160                       unsigned rn = (instr >> 16) & 0xf;
  21161                       unsigned rm = instr & 0xf;
  21162                       // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21163                       qadd8(CurrentCond(),
  21164                             Register(rd),
  21165                             Register(rn),
  21166                             Register(rm));
  21167                       break;
  21168                     }
  21169                     case 0x0000f020: {
  21170                       // 0xfa80f020
  21171                       unsigned rd = (instr >> 8) & 0xf;
  21172                       unsigned rn = (instr >> 16) & 0xf;
  21173                       unsigned rm = instr & 0xf;
  21174                       // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21175                       shadd8(CurrentCond(),
  21176                              Register(rd),
  21177                              Register(rn),
  21178                              Register(rm));
  21179                       break;
  21180                     }
  21181                     case 0x0000f040: {
  21182                       // 0xfa80f040
  21183                       unsigned rd = (instr >> 8) & 0xf;
  21184                       unsigned rn = (instr >> 16) & 0xf;
  21185                       unsigned rm = instr & 0xf;
  21186                       // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21187                       uadd8(CurrentCond(),
  21188                             Register(rd),
  21189                             Register(rn),
  21190                             Register(rm));
  21191                       break;
  21192                     }
  21193                     case 0x0000f050: {
  21194                       // 0xfa80f050
  21195                       unsigned rd = (instr >> 8) & 0xf;
  21196                       unsigned rn = (instr >> 16) & 0xf;
  21197                       unsigned rm = instr & 0xf;
  21198                       // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21199                       uqadd8(CurrentCond(),
  21200                              Register(rd),
  21201                              Register(rn),
  21202                              Register(rm));
  21203                       break;
  21204                     }
  21205                     case 0x0000f060: {
  21206                       // 0xfa80f060
  21207                       unsigned rd = (instr >> 8) & 0xf;
  21208                       unsigned rn = (instr >> 16) & 0xf;
  21209                       unsigned rm = instr & 0xf;
  21210                       // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21211                       uhadd8(CurrentCond(),
  21212                              Register(rd),
  21213                              Register(rn),
  21214                              Register(rm));
  21215                       break;
  21216                     }
  21217                     case 0x0000f080: {
  21218                       // 0xfa80f080
  21219                       unsigned rd = (instr >> 8) & 0xf;
  21220                       unsigned rm = instr & 0xf;
  21221                       unsigned rn = (instr >> 16) & 0xf;
  21222                       // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
  21223                       qadd(CurrentCond(),
  21224                            Register(rd),
  21225                            Register(rm),
  21226                            Register(rn));
  21227                       break;
  21228                     }
  21229                     case 0x0000f090: {
  21230                       // 0xfa80f090
  21231                       unsigned rd = (instr >> 8) & 0xf;
  21232                       unsigned rm = instr & 0xf;
  21233                       unsigned rn = (instr >> 16) & 0xf;
  21234                       // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
  21235                       qdadd(CurrentCond(),
  21236                             Register(rd),
  21237                             Register(rm),
  21238                             Register(rn));
  21239                       break;
  21240                     }
  21241                     case 0x0000f0a0: {
  21242                       // 0xfa80f0a0
  21243                       unsigned rd = (instr >> 8) & 0xf;
  21244                       unsigned rm = instr & 0xf;
  21245                       unsigned rn = (instr >> 16) & 0xf;
  21246                       // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
  21247                       qsub(CurrentCond(),
  21248                            Register(rd),
  21249                            Register(rm),
  21250                            Register(rn));
  21251                       break;
  21252                     }
  21253                     case 0x0000f0b0: {
  21254                       // 0xfa80f0b0
  21255                       unsigned rd = (instr >> 8) & 0xf;
  21256                       unsigned rm = instr & 0xf;
  21257                       unsigned rn = (instr >> 16) & 0xf;
  21258                       // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1
  21259                       qdsub(CurrentCond(),
  21260                             Register(rd),
  21261                             Register(rm),
  21262                             Register(rn));
  21263                       break;
  21264                     }
  21265                     case 0x0020f000: {
  21266                       // 0xfaa0f000
  21267                       unsigned rd = (instr >> 8) & 0xf;
  21268                       unsigned rn = (instr >> 16) & 0xf;
  21269                       unsigned rm = instr & 0xf;
  21270                       // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21271                       sasx(CurrentCond(),
  21272                            Register(rd),
  21273                            Register(rn),
  21274                            Register(rm));
  21275                       break;
  21276                     }
  21277                     case 0x0020f010: {
  21278                       // 0xfaa0f010
  21279                       unsigned rd = (instr >> 8) & 0xf;
  21280                       unsigned rn = (instr >> 16) & 0xf;
  21281                       unsigned rm = instr & 0xf;
  21282                       // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21283                       qasx(CurrentCond(),
  21284                            Register(rd),
  21285                            Register(rn),
  21286                            Register(rm));
  21287                       break;
  21288                     }
  21289                     case 0x0020f020: {
  21290                       // 0xfaa0f020
  21291                       unsigned rd = (instr >> 8) & 0xf;
  21292                       unsigned rn = (instr >> 16) & 0xf;
  21293                       unsigned rm = instr & 0xf;
  21294                       // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21295                       shasx(CurrentCond(),
  21296                             Register(rd),
  21297                             Register(rn),
  21298                             Register(rm));
  21299                       break;
  21300                     }
  21301                     case 0x0020f040: {
  21302                       // 0xfaa0f040
  21303                       unsigned rd = (instr >> 8) & 0xf;
  21304                       unsigned rn = (instr >> 16) & 0xf;
  21305                       unsigned rm = instr & 0xf;
  21306                       // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21307                       uasx(CurrentCond(),
  21308                            Register(rd),
  21309                            Register(rn),
  21310                            Register(rm));
  21311                       break;
  21312                     }
  21313                     case 0x0020f050: {
  21314                       // 0xfaa0f050
  21315                       unsigned rd = (instr >> 8) & 0xf;
  21316                       unsigned rn = (instr >> 16) & 0xf;
  21317                       unsigned rm = instr & 0xf;
  21318                       // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21319                       uqasx(CurrentCond(),
  21320                             Register(rd),
  21321                             Register(rn),
  21322                             Register(rm));
  21323                       break;
  21324                     }
  21325                     case 0x0020f060: {
  21326                       // 0xfaa0f060
  21327                       unsigned rd = (instr >> 8) & 0xf;
  21328                       unsigned rn = (instr >> 16) & 0xf;
  21329                       unsigned rm = instr & 0xf;
  21330                       // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21331                       uhasx(CurrentCond(),
  21332                             Register(rd),
  21333                             Register(rn),
  21334                             Register(rm));
  21335                       break;
  21336                     }
  21337                     case 0x0020f080: {
  21338                       // 0xfaa0f080
  21339                       unsigned rd = (instr >> 8) & 0xf;
  21340                       unsigned rn = (instr >> 16) & 0xf;
  21341                       unsigned rm = instr & 0xf;
  21342                       // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21343                       sel(CurrentCond(),
  21344                           Register(rd),
  21345                           Register(rn),
  21346                           Register(rm));
  21347                       break;
  21348                     }
  21349                     case 0x0040f000: {
  21350                       // 0xfac0f000
  21351                       unsigned rd = (instr >> 8) & 0xf;
  21352                       unsigned rn = (instr >> 16) & 0xf;
  21353                       unsigned rm = instr & 0xf;
  21354                       // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21355                       ssub8(CurrentCond(),
  21356                             Register(rd),
  21357                             Register(rn),
  21358                             Register(rm));
  21359                       break;
  21360                     }
  21361                     case 0x0040f010: {
  21362                       // 0xfac0f010
  21363                       unsigned rd = (instr >> 8) & 0xf;
  21364                       unsigned rn = (instr >> 16) & 0xf;
  21365                       unsigned rm = instr & 0xf;
  21366                       // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21367                       qsub8(CurrentCond(),
  21368                             Register(rd),
  21369                             Register(rn),
  21370                             Register(rm));
  21371                       break;
  21372                     }
  21373                     case 0x0040f020: {
  21374                       // 0xfac0f020
  21375                       unsigned rd = (instr >> 8) & 0xf;
  21376                       unsigned rn = (instr >> 16) & 0xf;
  21377                       unsigned rm = instr & 0xf;
  21378                       // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21379                       shsub8(CurrentCond(),
  21380                              Register(rd),
  21381                              Register(rn),
  21382                              Register(rm));
  21383                       break;
  21384                     }
  21385                     case 0x0040f040: {
  21386                       // 0xfac0f040
  21387                       unsigned rd = (instr >> 8) & 0xf;
  21388                       unsigned rn = (instr >> 16) & 0xf;
  21389                       unsigned rm = instr & 0xf;
  21390                       // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21391                       usub8(CurrentCond(),
  21392                             Register(rd),
  21393                             Register(rn),
  21394                             Register(rm));
  21395                       break;
  21396                     }
  21397                     case 0x0040f050: {
  21398                       // 0xfac0f050
  21399                       unsigned rd = (instr >> 8) & 0xf;
  21400                       unsigned rn = (instr >> 16) & 0xf;
  21401                       unsigned rm = instr & 0xf;
  21402                       // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21403                       uqsub8(CurrentCond(),
  21404                              Register(rd),
  21405                              Register(rn),
  21406                              Register(rm));
  21407                       break;
  21408                     }
  21409                     case 0x0040f060: {
  21410                       // 0xfac0f060
  21411                       unsigned rd = (instr >> 8) & 0xf;
  21412                       unsigned rn = (instr >> 16) & 0xf;
  21413                       unsigned rm = instr & 0xf;
  21414                       // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21415                       uhsub8(CurrentCond(),
  21416                              Register(rd),
  21417                              Register(rn),
  21418                              Register(rm));
  21419                       break;
  21420                     }
  21421                     case 0x0040f080: {
  21422                       // 0xfac0f080
  21423                       unsigned rd = (instr >> 8) & 0xf;
  21424                       unsigned rn = (instr >> 16) & 0xf;
  21425                       unsigned rm = instr & 0xf;
  21426                       // CRC32B{<q>} <Rd>, <Rn>, <Rm> ; T1
  21427                       crc32b(Condition::None(),
  21428                              Register(rd),
  21429                              Register(rn),
  21430                              Register(rm));
  21431                       break;
  21432                     }
  21433                     case 0x0040f090: {
  21434                       // 0xfac0f090
  21435                       unsigned rd = (instr >> 8) & 0xf;
  21436                       unsigned rn = (instr >> 16) & 0xf;
  21437                       unsigned rm = instr & 0xf;
  21438                       // CRC32H{<q>} <Rd>, <Rn>, <Rm> ; T1
  21439                       crc32h(Condition::None(),
  21440                              Register(rd),
  21441                              Register(rn),
  21442                              Register(rm));
  21443                       break;
  21444                     }
  21445                     case 0x0040f0a0: {
  21446                       // 0xfac0f0a0
  21447                       unsigned rd = (instr >> 8) & 0xf;
  21448                       unsigned rn = (instr >> 16) & 0xf;
  21449                       unsigned rm = instr & 0xf;
  21450                       // CRC32W{<q>} <Rd>, <Rn>, <Rm> ; T1
  21451                       crc32w(Condition::None(),
  21452                              Register(rd),
  21453                              Register(rn),
  21454                              Register(rm));
  21455                       break;
  21456                     }
  21457                     case 0x0060f000: {
  21458                       // 0xfae0f000
  21459                       unsigned rd = (instr >> 8) & 0xf;
  21460                       unsigned rn = (instr >> 16) & 0xf;
  21461                       unsigned rm = instr & 0xf;
  21462                       // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21463                       ssax(CurrentCond(),
  21464                            Register(rd),
  21465                            Register(rn),
  21466                            Register(rm));
  21467                       break;
  21468                     }
  21469                     case 0x0060f010: {
  21470                       // 0xfae0f010
  21471                       unsigned rd = (instr >> 8) & 0xf;
  21472                       unsigned rn = (instr >> 16) & 0xf;
  21473                       unsigned rm = instr & 0xf;
  21474                       // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21475                       qsax(CurrentCond(),
  21476                            Register(rd),
  21477                            Register(rn),
  21478                            Register(rm));
  21479                       break;
  21480                     }
  21481                     case 0x0060f020: {
  21482                       // 0xfae0f020
  21483                       unsigned rd = (instr >> 8) & 0xf;
  21484                       unsigned rn = (instr >> 16) & 0xf;
  21485                       unsigned rm = instr & 0xf;
  21486                       // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21487                       shsax(CurrentCond(),
  21488                             Register(rd),
  21489                             Register(rn),
  21490                             Register(rm));
  21491                       break;
  21492                     }
  21493                     case 0x0060f040: {
  21494                       // 0xfae0f040
  21495                       unsigned rd = (instr >> 8) & 0xf;
  21496                       unsigned rn = (instr >> 16) & 0xf;
  21497                       unsigned rm = instr & 0xf;
  21498                       // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21499                       usax(CurrentCond(),
  21500                            Register(rd),
  21501                            Register(rn),
  21502                            Register(rm));
  21503                       break;
  21504                     }
  21505                     case 0x0060f050: {
  21506                       // 0xfae0f050
  21507                       unsigned rd = (instr >> 8) & 0xf;
  21508                       unsigned rn = (instr >> 16) & 0xf;
  21509                       unsigned rm = instr & 0xf;
  21510                       // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21511                       uqsax(CurrentCond(),
  21512                             Register(rd),
  21513                             Register(rn),
  21514                             Register(rm));
  21515                       break;
  21516                     }
  21517                     case 0x0060f060: {
  21518                       // 0xfae0f060
  21519                       unsigned rd = (instr >> 8) & 0xf;
  21520                       unsigned rn = (instr >> 16) & 0xf;
  21521                       unsigned rm = instr & 0xf;
  21522                       // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21523                       uhsax(CurrentCond(),
  21524                             Register(rd),
  21525                             Register(rn),
  21526                             Register(rm));
  21527                       break;
  21528                     }
  21529                     default:
  21530                       UnallocatedT32(instr);
  21531                       break;
  21532                   }
  21533                   break;
  21534                 }
  21535                 case 0x10900000: {
  21536                   // 0xfa900000
  21537                   switch (instr & 0x0060f0f0) {
  21538                     case 0x0000f000: {
  21539                       // 0xfa90f000
  21540                       unsigned rd = (instr >> 8) & 0xf;
  21541                       unsigned rn = (instr >> 16) & 0xf;
  21542                       unsigned rm = instr & 0xf;
  21543                       // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21544                       sadd16(CurrentCond(),
  21545                              Register(rd),
  21546                              Register(rn),
  21547                              Register(rm));
  21548                       break;
  21549                     }
  21550                     case 0x0000f010: {
  21551                       // 0xfa90f010
  21552                       unsigned rd = (instr >> 8) & 0xf;
  21553                       unsigned rn = (instr >> 16) & 0xf;
  21554                       unsigned rm = instr & 0xf;
  21555                       // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21556                       qadd16(CurrentCond(),
  21557                              Register(rd),
  21558                              Register(rn),
  21559                              Register(rm));
  21560                       break;
  21561                     }
  21562                     case 0x0000f020: {
  21563                       // 0xfa90f020
  21564                       unsigned rd = (instr >> 8) & 0xf;
  21565                       unsigned rn = (instr >> 16) & 0xf;
  21566                       unsigned rm = instr & 0xf;
  21567                       // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21568                       shadd16(CurrentCond(),
  21569                               Register(rd),
  21570                               Register(rn),
  21571                               Register(rm));
  21572                       break;
  21573                     }
  21574                     case 0x0000f040: {
  21575                       // 0xfa90f040
  21576                       unsigned rd = (instr >> 8) & 0xf;
  21577                       unsigned rn = (instr >> 16) & 0xf;
  21578                       unsigned rm = instr & 0xf;
  21579                       // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21580                       uadd16(CurrentCond(),
  21581                              Register(rd),
  21582                              Register(rn),
  21583                              Register(rm));
  21584                       break;
  21585                     }
  21586                     case 0x0000f050: {
  21587                       // 0xfa90f050
  21588                       unsigned rd = (instr >> 8) & 0xf;
  21589                       unsigned rn = (instr >> 16) & 0xf;
  21590                       unsigned rm = instr & 0xf;
  21591                       // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21592                       uqadd16(CurrentCond(),
  21593                               Register(rd),
  21594                               Register(rn),
  21595                               Register(rm));
  21596                       break;
  21597                     }
  21598                     case 0x0000f060: {
  21599                       // 0xfa90f060
  21600                       unsigned rd = (instr >> 8) & 0xf;
  21601                       unsigned rn = (instr >> 16) & 0xf;
  21602                       unsigned rm = instr & 0xf;
  21603                       // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21604                       uhadd16(CurrentCond(),
  21605                               Register(rd),
  21606                               Register(rn),
  21607                               Register(rm));
  21608                       break;
  21609                     }
  21610                     case 0x0000f080: {
  21611                       // 0xfa90f080
  21612                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
  21613                         unsigned rd = (instr >> 8) & 0xf;
  21614                         unsigned rm = instr & 0xf;
  21615                         if ((rd < kNumberOfT32LowRegisters) &&
  21616                             (rm < kNumberOfT32LowRegisters)) {
  21617                           // REV{<c>}.W <Rd>, <Rm> ; T2
  21618                           rev(CurrentCond(), Wide, Register(rd), Register(rm));
  21619                         } else {
  21620                           // REV{<c>}{<q>} <Rd>, <Rm> ; T2
  21621                           rev(CurrentCond(), Best, Register(rd), Register(rm));
  21622                         }
  21623                       } else {
  21624                         UnallocatedT32(instr);
  21625                       }
  21626                       break;
  21627                     }
  21628                     case 0x0000f090: {
  21629                       // 0xfa90f090
  21630                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
  21631                         unsigned rd = (instr >> 8) & 0xf;
  21632                         unsigned rm = instr & 0xf;
  21633                         if ((rd < kNumberOfT32LowRegisters) &&
  21634                             (rm < kNumberOfT32LowRegisters)) {
  21635                           // REV16{<c>}.W <Rd>, <Rm> ; T2
  21636                           rev16(CurrentCond(),
  21637                                 Wide,
  21638                                 Register(rd),
  21639                                 Register(rm));
  21640                         } else {
  21641                           // REV16{<c>}{<q>} <Rd>, <Rm> ; T2
  21642                           rev16(CurrentCond(),
  21643                                 Best,
  21644                                 Register(rd),
  21645                                 Register(rm));
  21646                         }
  21647                       } else {
  21648                         UnallocatedT32(instr);
  21649                       }
  21650                       break;
  21651                     }
  21652                     case 0x0000f0a0: {
  21653                       // 0xfa90f0a0
  21654                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
  21655                         unsigned rd = (instr >> 8) & 0xf;
  21656                         unsigned rm = instr & 0xf;
  21657                         // RBIT{<c>}{<q>} <Rd>, <Rm> ; T1
  21658                         rbit(CurrentCond(), Register(rd), Register(rm));
  21659                       } else {
  21660                         UnallocatedT32(instr);
  21661                       }
  21662                       break;
  21663                     }
  21664                     case 0x0000f0b0: {
  21665                       // 0xfa90f0b0
  21666                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
  21667                         unsigned rd = (instr >> 8) & 0xf;
  21668                         unsigned rm = instr & 0xf;
  21669                         if ((rd < kNumberOfT32LowRegisters) &&
  21670                             (rm < kNumberOfT32LowRegisters)) {
  21671                           // REVSH{<c>}.W <Rd>, <Rm> ; T2
  21672                           revsh(CurrentCond(),
  21673                                 Wide,
  21674                                 Register(rd),
  21675                                 Register(rm));
  21676                         } else {
  21677                           // REVSH{<c>}{<q>} <Rd>, <Rm> ; T2
  21678                           revsh(CurrentCond(),
  21679                                 Best,
  21680                                 Register(rd),
  21681                                 Register(rm));
  21682                         }
  21683                       } else {
  21684                         UnallocatedT32(instr);
  21685                       }
  21686                       break;
  21687                     }
  21688                     case 0x0020f080: {
  21689                       // 0xfab0f080
  21690                       if (((instr >> 16) & 0xf) == (instr & 0xf)) {
  21691                         unsigned rd = (instr >> 8) & 0xf;
  21692                         unsigned rm = instr & 0xf;
  21693                         // CLZ{<c>}{<q>} <Rd>, <Rm> ; T1
  21694                         clz(CurrentCond(), Register(rd), Register(rm));
  21695                       } else {
  21696                         UnallocatedT32(instr);
  21697                       }
  21698                       break;
  21699                     }
  21700                     case 0x0040f000: {
  21701                       // 0xfad0f000
  21702                       unsigned rd = (instr >> 8) & 0xf;
  21703                       unsigned rn = (instr >> 16) & 0xf;
  21704                       unsigned rm = instr & 0xf;
  21705                       // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21706                       ssub16(CurrentCond(),
  21707                              Register(rd),
  21708                              Register(rn),
  21709                              Register(rm));
  21710                       break;
  21711                     }
  21712                     case 0x0040f010: {
  21713                       // 0xfad0f010
  21714                       unsigned rd = (instr >> 8) & 0xf;
  21715                       unsigned rn = (instr >> 16) & 0xf;
  21716                       unsigned rm = instr & 0xf;
  21717                       // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21718                       qsub16(CurrentCond(),
  21719                              Register(rd),
  21720                              Register(rn),
  21721                              Register(rm));
  21722                       break;
  21723                     }
  21724                     case 0x0040f020: {
  21725                       // 0xfad0f020
  21726                       unsigned rd = (instr >> 8) & 0xf;
  21727                       unsigned rn = (instr >> 16) & 0xf;
  21728                       unsigned rm = instr & 0xf;
  21729                       // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21730                       shsub16(CurrentCond(),
  21731                               Register(rd),
  21732                               Register(rn),
  21733                               Register(rm));
  21734                       break;
  21735                     }
  21736                     case 0x0040f040: {
  21737                       // 0xfad0f040
  21738                       unsigned rd = (instr >> 8) & 0xf;
  21739                       unsigned rn = (instr >> 16) & 0xf;
  21740                       unsigned rm = instr & 0xf;
  21741                       // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21742                       usub16(CurrentCond(),
  21743                              Register(rd),
  21744                              Register(rn),
  21745                              Register(rm));
  21746                       break;
  21747                     }
  21748                     case 0x0040f050: {
  21749                       // 0xfad0f050
  21750                       unsigned rd = (instr >> 8) & 0xf;
  21751                       unsigned rn = (instr >> 16) & 0xf;
  21752                       unsigned rm = instr & 0xf;
  21753                       // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21754                       uqsub16(CurrentCond(),
  21755                               Register(rd),
  21756                               Register(rn),
  21757                               Register(rm));
  21758                       break;
  21759                     }
  21760                     case 0x0040f060: {
  21761                       // 0xfad0f060
  21762                       unsigned rd = (instr >> 8) & 0xf;
  21763                       unsigned rn = (instr >> 16) & 0xf;
  21764                       unsigned rm = instr & 0xf;
  21765                       // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21766                       uhsub16(CurrentCond(),
  21767                               Register(rd),
  21768                               Register(rn),
  21769                               Register(rm));
  21770                       break;
  21771                     }
  21772                     case 0x0040f080: {
  21773                       // 0xfad0f080
  21774                       unsigned rd = (instr >> 8) & 0xf;
  21775                       unsigned rn = (instr >> 16) & 0xf;
  21776                       unsigned rm = instr & 0xf;
  21777                       // CRC32CB{<q>} <Rd>, <Rn>, <Rm> ; T1
  21778                       crc32cb(Condition::None(),
  21779                               Register(rd),
  21780                               Register(rn),
  21781                               Register(rm));
  21782                       break;
  21783                     }
  21784                     case 0x0040f090: {
  21785                       // 0xfad0f090
  21786                       unsigned rd = (instr >> 8) & 0xf;
  21787                       unsigned rn = (instr >> 16) & 0xf;
  21788                       unsigned rm = instr & 0xf;
  21789                       // CRC32CH{<q>} <Rd>, <Rn>, <Rm> ; T1
  21790                       crc32ch(Condition::None(),
  21791                               Register(rd),
  21792                               Register(rn),
  21793                               Register(rm));
  21794                       break;
  21795                     }
  21796                     case 0x0040f0a0: {
  21797                       // 0xfad0f0a0
  21798                       unsigned rd = (instr >> 8) & 0xf;
  21799                       unsigned rn = (instr >> 16) & 0xf;
  21800                       unsigned rm = instr & 0xf;
  21801                       // CRC32CW{<q>} <Rd>, <Rn>, <Rm> ; T1
  21802                       crc32cw(Condition::None(),
  21803                               Register(rd),
  21804                               Register(rn),
  21805                               Register(rm));
  21806                       break;
  21807                     }
  21808                     default:
  21809                       UnallocatedT32(instr);
  21810                       break;
  21811                   }
  21812                   break;
  21813                 }
  21814                 case 0x11000000: {
  21815                   // 0xfb000000
  21816                   switch (instr & 0x006000f0) {
  21817                     case 0x00000000: {
  21818                       // 0xfb000000
  21819                       switch (instr & 0x0000f000) {
  21820                         case 0x0000f000: {
  21821                           // 0xfb00f000
  21822                           unsigned rd = (instr >> 8) & 0xf;
  21823                           unsigned rn = (instr >> 16) & 0xf;
  21824                           unsigned rm = instr & 0xf;
  21825                           if (InITBlock() &&
  21826                               ((rd == rm) && (rd < kNumberOfT32LowRegisters) &&
  21827                                (rn < kNumberOfT32LowRegisters))) {
  21828                             // MUL<c>.W <Rd>, <Rn>, {<Rm>} ; T2
  21829                             mul(CurrentCond(),
  21830                                 Wide,
  21831                                 Register(rd),
  21832                                 Register(rn),
  21833                                 Register(rm));
  21834                           } else {
  21835                             // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; T2
  21836                             mul(CurrentCond(),
  21837                                 Best,
  21838                                 Register(rd),
  21839                                 Register(rn),
  21840                                 Register(rm));
  21841                           }
  21842                           break;
  21843                         }
  21844                         default: {
  21845                           if (((instr & 0xf000) == 0xf000)) {
  21846                             UnallocatedT32(instr);
  21847                             return;
  21848                           }
  21849                           unsigned rd = (instr >> 8) & 0xf;
  21850                           unsigned rn = (instr >> 16) & 0xf;
  21851                           unsigned rm = instr & 0xf;
  21852                           unsigned ra = (instr >> 12) & 0xf;
  21853                           // MLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
  21854                           mla(CurrentCond(),
  21855                               Register(rd),
  21856                               Register(rn),
  21857                               Register(rm),
  21858                               Register(ra));
  21859                           break;
  21860                         }
  21861                       }
  21862                       break;
  21863                     }
  21864                     case 0x00000010: {
  21865                       // 0xfb000010
  21866                       unsigned rd = (instr >> 8) & 0xf;
  21867                       unsigned rn = (instr >> 16) & 0xf;
  21868                       unsigned rm = instr & 0xf;
  21869                       unsigned ra = (instr >> 12) & 0xf;
  21870                       // MLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
  21871                       mls(CurrentCond(),
  21872                           Register(rd),
  21873                           Register(rn),
  21874                           Register(rm),
  21875                           Register(ra));
  21876                       break;
  21877                     }
  21878                     case 0x00200000: {
  21879                       // 0xfb200000
  21880                       switch (instr & 0x0000f000) {
  21881                         case 0x0000f000: {
  21882                           // 0xfb20f000
  21883                           unsigned rd = (instr >> 8) & 0xf;
  21884                           unsigned rn = (instr >> 16) & 0xf;
  21885                           unsigned rm = instr & 0xf;
  21886                           // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21887                           smuad(CurrentCond(),
  21888                                 Register(rd),
  21889                                 Register(rn),
  21890                                 Register(rm));
  21891                           break;
  21892                         }
  21893                         default: {
  21894                           if (((instr & 0xf000) == 0xf000)) {
  21895                             UnallocatedT32(instr);
  21896                             return;
  21897                           }
  21898                           unsigned rd = (instr >> 8) & 0xf;
  21899                           unsigned rn = (instr >> 16) & 0xf;
  21900                           unsigned rm = instr & 0xf;
  21901                           unsigned ra = (instr >> 12) & 0xf;
  21902                           // SMLAD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
  21903                           smlad(CurrentCond(),
  21904                                 Register(rd),
  21905                                 Register(rn),
  21906                                 Register(rm),
  21907                                 Register(ra));
  21908                           break;
  21909                         }
  21910                       }
  21911                       break;
  21912                     }
  21913                     case 0x00200010: {
  21914                       // 0xfb200010
  21915                       switch (instr & 0x0000f000) {
  21916                         case 0x0000f000: {
  21917                           // 0xfb20f010
  21918                           unsigned rd = (instr >> 8) & 0xf;
  21919                           unsigned rn = (instr >> 16) & 0xf;
  21920                           unsigned rm = instr & 0xf;
  21921                           // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21922                           smuadx(CurrentCond(),
  21923                                  Register(rd),
  21924                                  Register(rn),
  21925                                  Register(rm));
  21926                           break;
  21927                         }
  21928                         default: {
  21929                           if (((instr & 0xf000) == 0xf000)) {
  21930                             UnallocatedT32(instr);
  21931                             return;
  21932                           }
  21933                           unsigned rd = (instr >> 8) & 0xf;
  21934                           unsigned rn = (instr >> 16) & 0xf;
  21935                           unsigned rm = instr & 0xf;
  21936                           unsigned ra = (instr >> 12) & 0xf;
  21937                           // SMLADX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
  21938                           smladx(CurrentCond(),
  21939                                  Register(rd),
  21940                                  Register(rn),
  21941                                  Register(rm),
  21942                                  Register(ra));
  21943                           break;
  21944                         }
  21945                       }
  21946                       break;
  21947                     }
  21948                     case 0x00400000: {
  21949                       // 0xfb400000
  21950                       switch (instr & 0x0000f000) {
  21951                         case 0x0000f000: {
  21952                           // 0xfb40f000
  21953                           unsigned rd = (instr >> 8) & 0xf;
  21954                           unsigned rn = (instr >> 16) & 0xf;
  21955                           unsigned rm = instr & 0xf;
  21956                           // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21957                           smusd(CurrentCond(),
  21958                                 Register(rd),
  21959                                 Register(rn),
  21960                                 Register(rm));
  21961                           break;
  21962                         }
  21963                         default: {
  21964                           if (((instr & 0xf000) == 0xf000)) {
  21965                             UnallocatedT32(instr);
  21966                             return;
  21967                           }
  21968                           unsigned rd = (instr >> 8) & 0xf;
  21969                           unsigned rn = (instr >> 16) & 0xf;
  21970                           unsigned rm = instr & 0xf;
  21971                           unsigned ra = (instr >> 12) & 0xf;
  21972                           // SMLSD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
  21973                           smlsd(CurrentCond(),
  21974                                 Register(rd),
  21975                                 Register(rn),
  21976                                 Register(rm),
  21977                                 Register(ra));
  21978                           break;
  21979                         }
  21980                       }
  21981                       break;
  21982                     }
  21983                     case 0x00400010: {
  21984                       // 0xfb400010
  21985                       switch (instr & 0x0000f000) {
  21986                         case 0x0000f000: {
  21987                           // 0xfb40f010
  21988                           unsigned rd = (instr >> 8) & 0xf;
  21989                           unsigned rn = (instr >> 16) & 0xf;
  21990                           unsigned rm = instr & 0xf;
  21991                           // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  21992                           smusdx(CurrentCond(),
  21993                                  Register(rd),
  21994                                  Register(rn),
  21995                                  Register(rm));
  21996                           break;
  21997                         }
  21998                         default: {
  21999                           if (((instr & 0xf000) == 0xf000)) {
  22000                             UnallocatedT32(instr);
  22001                             return;
  22002                           }
  22003                           unsigned rd = (instr >> 8) & 0xf;
  22004                           unsigned rn = (instr >> 16) & 0xf;
  22005                           unsigned rm = instr & 0xf;
  22006                           unsigned ra = (instr >> 12) & 0xf;
  22007                           // SMLSDX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
  22008                           smlsdx(CurrentCond(),
  22009                                  Register(rd),
  22010                                  Register(rn),
  22011                                  Register(rm),
  22012                                  Register(ra));
  22013                           break;
  22014                         }
  22015                       }
  22016                       break;
  22017                     }
  22018                     case 0x00600000: {
  22019                       // 0xfb600000
  22020                       unsigned rd = (instr >> 8) & 0xf;
  22021                       unsigned rn = (instr >> 16) & 0xf;
  22022                       unsigned rm = instr & 0xf;
  22023                       unsigned ra = (instr >> 12) & 0xf;
  22024                       // SMMLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
  22025                       smmls(CurrentCond(),
  22026                             Register(rd),
  22027                             Register(rn),
  22028                             Register(rm),
  22029                             Register(ra));
  22030                       break;
  22031                     }
  22032                     case 0x00600010: {
  22033                       // 0xfb600010
  22034                       unsigned rd = (instr >> 8) & 0xf;
  22035                       unsigned rn = (instr >> 16) & 0xf;
  22036                       unsigned rm = instr & 0xf;
  22037                       unsigned ra = (instr >> 12) & 0xf;
  22038                       // SMMLSR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
  22039                       smmlsr(CurrentCond(),
  22040                              Register(rd),
  22041                              Register(rn),
  22042                              Register(rm),
  22043                              Register(ra));
  22044                       break;
  22045                     }
  22046                     default:
  22047                       UnallocatedT32(instr);
  22048                       break;
  22049                   }
  22050                   break;
  22051                 }
  22052                 case 0x11100000: {
  22053                   // 0xfb100000
  22054                   switch (instr & 0x006000f0) {
  22055                     case 0x00000000: {
  22056                       // 0xfb100000
  22057                       switch (instr & 0x0000f000) {
  22058                         case 0x0000f000: {
  22059                           // 0xfb10f000
  22060                           unsigned rd = (instr >> 8) & 0xf;
  22061                           unsigned rn = (instr >> 16) & 0xf;
  22062                           unsigned rm = instr & 0xf;
  22063                           // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  22064                           smulbb(CurrentCond(),
  22065                                  Register(rd),
  22066                                  Register(rn),
  22067                                  Register(rm));
  22068                           break;
  22069                         }
  22070                         default: {
  22071                           if (((instr & 0xf000) == 0xf000)) {
  22072                             UnallocatedT32(instr);
  22073                             return;
  22074                           }
  22075                           unsigned rd = (instr >> 8) & 0xf;
  22076                           unsigned rn = (instr >> 16) & 0xf;
  22077                           unsigned rm = instr & 0xf;
  22078                           unsigned ra = (instr >> 12) & 0xf;
  22079                           // SMLABB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
  22080                           smlabb(CurrentCond(),
  22081                                  Register(rd),
  22082                                  Register(rn),
  22083                                  Register(rm),
  22084                                  Register(ra));
  22085                           break;
  22086                         }
  22087                       }
  22088                       break;
  22089                     }
  22090                     case 0x00000010: {
  22091                       // 0xfb100010
  22092                       switch (instr & 0x0000f000) {
  22093                         case 0x0000f000: {
  22094                           // 0xfb10f010
  22095                           unsigned rd = (instr >> 8) & 0xf;
  22096                           unsigned rn = (instr >> 16) & 0xf;
  22097                           unsigned rm = instr & 0xf;
  22098                           // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  22099                           smulbt(CurrentCond(),
  22100                                  Register(rd),
  22101                                  Register(rn),
  22102                                  Register(rm));
  22103                           break;
  22104                         }
  22105                         default: {
  22106                           if (((instr & 0xf000) == 0xf000)) {
  22107                             UnallocatedT32(instr);
  22108                             return;
  22109                           }
  22110                           unsigned rd = (instr >> 8) & 0xf;
  22111                           unsigned rn = (instr >> 16) & 0xf;
  22112                           unsigned rm = instr & 0xf;
  22113                           unsigned ra = (instr >> 12) & 0xf;
  22114                           // SMLABT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
  22115                           smlabt(CurrentCond(),
  22116                                  Register(rd),
  22117                                  Register(rn),
  22118                                  Register(rm),
  22119                                  Register(ra));
  22120                           break;
  22121                         }
  22122                       }
  22123                       break;
  22124                     }
  22125                     case 0x00000020: {
  22126                       // 0xfb100020
  22127                       switch (instr & 0x0000f000) {
  22128                         case 0x0000f000: {
  22129                           // 0xfb10f020
  22130                           unsigned rd = (instr >> 8) & 0xf;
  22131                           unsigned rn = (instr >> 16) & 0xf;
  22132                           unsigned rm = instr & 0xf;
  22133                           // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  22134                           smultb(CurrentCond(),
  22135                                  Register(rd),
  22136                                  Register(rn),
  22137                                  Register(rm));
  22138                           break;
  22139                         }
  22140                         default: {
  22141                           if (((instr & 0xf000) == 0xf000)) {
  22142                             UnallocatedT32(instr);
  22143                             return;
  22144                           }
  22145                           unsigned rd = (instr >> 8) & 0xf;
  22146                           unsigned rn = (instr >> 16) & 0xf;
  22147                           unsigned rm = instr & 0xf;
  22148                           unsigned ra = (instr >> 12) & 0xf;
  22149                           // SMLATB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
  22150                           smlatb(CurrentCond(),
  22151                                  Register(rd),
  22152                                  Register(rn),
  22153                                  Register(rm),
  22154                                  Register(ra));
  22155                           break;
  22156                         }
  22157                       }
  22158                       break;
  22159                     }
  22160                     case 0x00000030: {
  22161                       // 0xfb100030
  22162                       switch (instr & 0x0000f000) {
  22163                         case 0x0000f000: {
  22164                           // 0xfb10f030
  22165                           unsigned rd = (instr >> 8) & 0xf;
  22166                           unsigned rn = (instr >> 16) & 0xf;
  22167                           unsigned rm = instr & 0xf;
  22168                           // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  22169                           smultt(CurrentCond(),
  22170                                  Register(rd),
  22171                                  Register(rn),
  22172                                  Register(rm));
  22173                           break;
  22174                         }
  22175                         default: {
  22176                           if (((instr & 0xf000) == 0xf000)) {
  22177                             UnallocatedT32(instr);
  22178                             return;
  22179                           }
  22180                           unsigned rd = (instr >> 8) & 0xf;
  22181                           unsigned rn = (instr >> 16) & 0xf;
  22182                           unsigned rm = instr & 0xf;
  22183                           unsigned ra = (instr >> 12) & 0xf;
  22184                           // SMLATT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
  22185                           smlatt(CurrentCond(),
  22186                                  Register(rd),
  22187                                  Register(rn),
  22188                                  Register(rm),
  22189                                  Register(ra));
  22190                           break;
  22191                         }
  22192                       }
  22193                       break;
  22194                     }
  22195                     case 0x00200000: {
  22196                       // 0xfb300000
  22197                       switch (instr & 0x0000f000) {
  22198                         case 0x0000f000: {
  22199                           // 0xfb30f000
  22200                           unsigned rd = (instr >> 8) & 0xf;
  22201                           unsigned rn = (instr >> 16) & 0xf;
  22202                           unsigned rm = instr & 0xf;
  22203                           // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  22204                           smulwb(CurrentCond(),
  22205                                  Register(rd),
  22206                                  Register(rn),
  22207                                  Register(rm));
  22208                           break;
  22209                         }
  22210                         default: {
  22211                           if (((instr & 0xf000) == 0xf000)) {
  22212                             UnallocatedT32(instr);
  22213                             return;
  22214                           }
  22215                           unsigned rd = (instr >> 8) & 0xf;
  22216                           unsigned rn = (instr >> 16) & 0xf;
  22217                           unsigned rm = instr & 0xf;
  22218                           unsigned ra = (instr >> 12) & 0xf;
  22219                           // SMLAWB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
  22220                           smlawb(CurrentCond(),
  22221                                  Register(rd),
  22222                                  Register(rn),
  22223                                  Register(rm),
  22224                                  Register(ra));
  22225                           break;
  22226                         }
  22227                       }
  22228                       break;
  22229                     }
  22230                     case 0x00200010: {
  22231                       // 0xfb300010
  22232                       switch (instr & 0x0000f000) {
  22233                         case 0x0000f000: {
  22234                           // 0xfb30f010
  22235                           unsigned rd = (instr >> 8) & 0xf;
  22236                           unsigned rn = (instr >> 16) & 0xf;
  22237                           unsigned rm = instr & 0xf;
  22238                           // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  22239                           smulwt(CurrentCond(),
  22240                                  Register(rd),
  22241                                  Register(rn),
  22242                                  Register(rm));
  22243                           break;
  22244                         }
  22245                         default: {
  22246                           if (((instr & 0xf000) == 0xf000)) {
  22247                             UnallocatedT32(instr);
  22248                             return;
  22249                           }
  22250                           unsigned rd = (instr >> 8) & 0xf;
  22251                           unsigned rn = (instr >> 16) & 0xf;
  22252                           unsigned rm = instr & 0xf;
  22253                           unsigned ra = (instr >> 12) & 0xf;
  22254                           // SMLAWT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
  22255                           smlawt(CurrentCond(),
  22256                                  Register(rd),
  22257                                  Register(rn),
  22258                                  Register(rm),
  22259                                  Register(ra));
  22260                           break;
  22261                         }
  22262                       }
  22263                       break;
  22264                     }
  22265                     case 0x00400000: {
  22266                       // 0xfb500000
  22267                       switch (instr & 0x0000f000) {
  22268                         case 0x0000f000: {
  22269                           // 0xfb50f000
  22270                           unsigned rd = (instr >> 8) & 0xf;
  22271                           unsigned rn = (instr >> 16) & 0xf;
  22272                           unsigned rm = instr & 0xf;
  22273                           // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  22274                           smmul(CurrentCond(),
  22275                                 Register(rd),
  22276                                 Register(rn),
  22277                                 Register(rm));
  22278                           break;
  22279                         }
  22280                         default: {
  22281                           if (((instr & 0xf000) == 0xf000)) {
  22282                             UnallocatedT32(instr);
  22283                             return;
  22284                           }
  22285                           unsigned rd = (instr >> 8) & 0xf;
  22286                           unsigned rn = (instr >> 16) & 0xf;
  22287                           unsigned rm = instr & 0xf;
  22288                           unsigned ra = (instr >> 12) & 0xf;
  22289                           // SMMLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
  22290                           smmla(CurrentCond(),
  22291                                 Register(rd),
  22292                                 Register(rn),
  22293                                 Register(rm),
  22294                                 Register(ra));
  22295                           break;
  22296                         }
  22297                       }
  22298                       break;
  22299                     }
  22300                     case 0x00400010: {
  22301                       // 0xfb500010
  22302                       switch (instr & 0x0000f000) {
  22303                         case 0x0000f000: {
  22304                           // 0xfb50f010
  22305                           unsigned rd = (instr >> 8) & 0xf;
  22306                           unsigned rn = (instr >> 16) & 0xf;
  22307                           unsigned rm = instr & 0xf;
  22308                           // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  22309                           smmulr(CurrentCond(),
  22310                                  Register(rd),
  22311                                  Register(rn),
  22312                                  Register(rm));
  22313                           break;
  22314                         }
  22315                         default: {
  22316                           if (((instr & 0xf000) == 0xf000)) {
  22317                             UnallocatedT32(instr);
  22318                             return;
  22319                           }
  22320                           unsigned rd = (instr >> 8) & 0xf;
  22321                           unsigned rn = (instr >> 16) & 0xf;
  22322                           unsigned rm = instr & 0xf;
  22323                           unsigned ra = (instr >> 12) & 0xf;
  22324                           // SMMLAR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
  22325                           smmlar(CurrentCond(),
  22326                                  Register(rd),
  22327                                  Register(rn),
  22328                                  Register(rm),
  22329                                  Register(ra));
  22330                           break;
  22331                         }
  22332                       }
  22333                       break;
  22334                     }
  22335                     case 0x00600000: {
  22336                       // 0xfb700000
  22337                       switch (instr & 0x0000f000) {
  22338                         case 0x0000f000: {
  22339                           // 0xfb70f000
  22340                           unsigned rd = (instr >> 8) & 0xf;
  22341                           unsigned rn = (instr >> 16) & 0xf;
  22342                           unsigned rm = instr & 0xf;
  22343                           // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  22344                           usad8(CurrentCond(),
  22345                                 Register(rd),
  22346                                 Register(rn),
  22347                                 Register(rm));
  22348                           break;
  22349                         }
  22350                         default: {
  22351                           if (((instr & 0xf000) == 0xf000)) {
  22352                             UnallocatedT32(instr);
  22353                             return;
  22354                           }
  22355                           unsigned rd = (instr >> 8) & 0xf;
  22356                           unsigned rn = (instr >> 16) & 0xf;
  22357                           unsigned rm = instr & 0xf;
  22358                           unsigned ra = (instr >> 12) & 0xf;
  22359                           // USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1
  22360                           usada8(CurrentCond(),
  22361                                  Register(rd),
  22362                                  Register(rn),
  22363                                  Register(rm),
  22364                                  Register(ra));
  22365                           break;
  22366                         }
  22367                       }
  22368                       break;
  22369                     }
  22370                     default:
  22371                       UnallocatedT32(instr);
  22372                       break;
  22373                   }
  22374                   break;
  22375                 }
  22376                 case 0x11800000: {
  22377                   // 0xfb800000
  22378                   switch (instr & 0x006000f0) {
  22379                     case 0x00000000: {
  22380                       // 0xfb800000
  22381                       unsigned rdlo = (instr >> 12) & 0xf;
  22382                       unsigned rdhi = (instr >> 8) & 0xf;
  22383                       unsigned rn = (instr >> 16) & 0xf;
  22384                       unsigned rm = instr & 0xf;
  22385                       // SMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
  22386                       smull(CurrentCond(),
  22387                             Register(rdlo),
  22388                             Register(rdhi),
  22389                             Register(rn),
  22390                             Register(rm));
  22391                       break;
  22392                     }
  22393                     case 0x00200000: {
  22394                       // 0xfba00000
  22395                       unsigned rdlo = (instr >> 12) & 0xf;
  22396                       unsigned rdhi = (instr >> 8) & 0xf;
  22397                       unsigned rn = (instr >> 16) & 0xf;
  22398                       unsigned rm = instr & 0xf;
  22399                       // UMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
  22400                       umull(CurrentCond(),
  22401                             Register(rdlo),
  22402                             Register(rdhi),
  22403                             Register(rn),
  22404                             Register(rm));
  22405                       break;
  22406                     }
  22407                     case 0x00400000: {
  22408                       // 0xfbc00000
  22409                       unsigned rdlo = (instr >> 12) & 0xf;
  22410                       unsigned rdhi = (instr >> 8) & 0xf;
  22411                       unsigned rn = (instr >> 16) & 0xf;
  22412                       unsigned rm = instr & 0xf;
  22413                       // SMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
  22414                       smlal(CurrentCond(),
  22415                             Register(rdlo),
  22416                             Register(rdhi),
  22417                             Register(rn),
  22418                             Register(rm));
  22419                       break;
  22420                     }
  22421                     case 0x00400080: {
  22422                       // 0xfbc00080
  22423                       unsigned rdlo = (instr >> 12) & 0xf;
  22424                       unsigned rdhi = (instr >> 8) & 0xf;
  22425                       unsigned rn = (instr >> 16) & 0xf;
  22426                       unsigned rm = instr & 0xf;
  22427                       // SMLALBB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
  22428                       smlalbb(CurrentCond(),
  22429                               Register(rdlo),
  22430                               Register(rdhi),
  22431                               Register(rn),
  22432                               Register(rm));
  22433                       break;
  22434                     }
  22435                     case 0x00400090: {
  22436                       // 0xfbc00090
  22437                       unsigned rdlo = (instr >> 12) & 0xf;
  22438                       unsigned rdhi = (instr >> 8) & 0xf;
  22439                       unsigned rn = (instr >> 16) & 0xf;
  22440                       unsigned rm = instr & 0xf;
  22441                       // SMLALBT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
  22442                       smlalbt(CurrentCond(),
  22443                               Register(rdlo),
  22444                               Register(rdhi),
  22445                               Register(rn),
  22446                               Register(rm));
  22447                       break;
  22448                     }
  22449                     case 0x004000a0: {
  22450                       // 0xfbc000a0
  22451                       unsigned rdlo = (instr >> 12) & 0xf;
  22452                       unsigned rdhi = (instr >> 8) & 0xf;
  22453                       unsigned rn = (instr >> 16) & 0xf;
  22454                       unsigned rm = instr & 0xf;
  22455                       // SMLALTB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
  22456                       smlaltb(CurrentCond(),
  22457                               Register(rdlo),
  22458                               Register(rdhi),
  22459                               Register(rn),
  22460                               Register(rm));
  22461                       break;
  22462                     }
  22463                     case 0x004000b0: {
  22464                       // 0xfbc000b0
  22465                       unsigned rdlo = (instr >> 12) & 0xf;
  22466                       unsigned rdhi = (instr >> 8) & 0xf;
  22467                       unsigned rn = (instr >> 16) & 0xf;
  22468                       unsigned rm = instr & 0xf;
  22469                       // SMLALTT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
  22470                       smlaltt(CurrentCond(),
  22471                               Register(rdlo),
  22472                               Register(rdhi),
  22473                               Register(rn),
  22474                               Register(rm));
  22475                       break;
  22476                     }
  22477                     case 0x004000c0: {
  22478                       // 0xfbc000c0
  22479                       unsigned rdlo = (instr >> 12) & 0xf;
  22480                       unsigned rdhi = (instr >> 8) & 0xf;
  22481                       unsigned rn = (instr >> 16) & 0xf;
  22482                       unsigned rm = instr & 0xf;
  22483                       // SMLALD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
  22484                       smlald(CurrentCond(),
  22485                              Register(rdlo),
  22486                              Register(rdhi),
  22487                              Register(rn),
  22488                              Register(rm));
  22489                       break;
  22490                     }
  22491                     case 0x004000d0: {
  22492                       // 0xfbc000d0
  22493                       unsigned rdlo = (instr >> 12) & 0xf;
  22494                       unsigned rdhi = (instr >> 8) & 0xf;
  22495                       unsigned rn = (instr >> 16) & 0xf;
  22496                       unsigned rm = instr & 0xf;
  22497                       // SMLALDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
  22498                       smlaldx(CurrentCond(),
  22499                               Register(rdlo),
  22500                               Register(rdhi),
  22501                               Register(rn),
  22502                               Register(rm));
  22503                       break;
  22504                     }
  22505                     case 0x00600000: {
  22506                       // 0xfbe00000
  22507                       unsigned rdlo = (instr >> 12) & 0xf;
  22508                       unsigned rdhi = (instr >> 8) & 0xf;
  22509                       unsigned rn = (instr >> 16) & 0xf;
  22510                       unsigned rm = instr & 0xf;
  22511                       // UMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
  22512                       umlal(CurrentCond(),
  22513                             Register(rdlo),
  22514                             Register(rdhi),
  22515                             Register(rn),
  22516                             Register(rm));
  22517                       break;
  22518                     }
  22519                     case 0x00600060: {
  22520                       // 0xfbe00060
  22521                       unsigned rdlo = (instr >> 12) & 0xf;
  22522                       unsigned rdhi = (instr >> 8) & 0xf;
  22523                       unsigned rn = (instr >> 16) & 0xf;
  22524                       unsigned rm = instr & 0xf;
  22525                       // UMAAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
  22526                       umaal(CurrentCond(),
  22527                             Register(rdlo),
  22528                             Register(rdhi),
  22529                             Register(rn),
  22530                             Register(rm));
  22531                       break;
  22532                     }
  22533                     default:
  22534                       UnallocatedT32(instr);
  22535                       break;
  22536                   }
  22537                   break;
  22538                 }
  22539                 case 0x11900000: {
  22540                   // 0xfb900000
  22541                   switch (instr & 0x006000f0) {
  22542                     case 0x000000f0: {
  22543                       // 0xfb9000f0
  22544                       unsigned rd = (instr >> 8) & 0xf;
  22545                       unsigned rn = (instr >> 16) & 0xf;
  22546                       unsigned rm = instr & 0xf;
  22547                       // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  22548                       sdiv(CurrentCond(),
  22549                            Register(rd),
  22550                            Register(rn),
  22551                            Register(rm));
  22552                       if (((instr & 0xfff0f0f0) != 0xfb90f0f0)) {
  22553                         UnpredictableT32(instr);
  22554                       }
  22555                       break;
  22556                     }
  22557                     case 0x002000f0: {
  22558                       // 0xfbb000f0
  22559                       unsigned rd = (instr >> 8) & 0xf;
  22560                       unsigned rn = (instr >> 16) & 0xf;
  22561                       unsigned rm = instr & 0xf;
  22562                       // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1
  22563                       udiv(CurrentCond(),
  22564                            Register(rd),
  22565                            Register(rn),
  22566                            Register(rm));
  22567                       if (((instr & 0xfff0f0f0) != 0xfbb0f0f0)) {
  22568                         UnpredictableT32(instr);
  22569                       }
  22570                       break;
  22571                     }
  22572                     case 0x004000c0: {
  22573                       // 0xfbd000c0
  22574                       unsigned rdlo = (instr >> 12) & 0xf;
  22575                       unsigned rdhi = (instr >> 8) & 0xf;
  22576                       unsigned rn = (instr >> 16) & 0xf;
  22577                       unsigned rm = instr & 0xf;
  22578                       // SMLSLD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
  22579                       smlsld(CurrentCond(),
  22580                              Register(rdlo),
  22581                              Register(rdhi),
  22582                              Register(rn),
  22583                              Register(rm));
  22584                       break;
  22585                     }
  22586                     case 0x004000d0: {
  22587                       // 0xfbd000d0
  22588                       unsigned rdlo = (instr >> 12) & 0xf;
  22589                       unsigned rdhi = (instr >> 8) & 0xf;
  22590                       unsigned rn = (instr >> 16) & 0xf;
  22591                       unsigned rm = instr & 0xf;
  22592                       // SMLSLDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1
  22593                       smlsldx(CurrentCond(),
  22594                               Register(rdlo),
  22595                               Register(rdhi),
  22596                               Register(rn),
  22597                               Register(rm));
  22598                       break;
  22599                     }
  22600                     default:
  22601                       UnallocatedT32(instr);
  22602                       break;
  22603                   }
  22604                   break;
  22605                 }
  22606               }
  22607               break;
  22608             }
  22609             case 0x04000000: {
  22610               // 0xec000000
  22611               switch (instr & 0x11100e00) {
  22612                 case 0x00000a00: {
  22613                   // 0xec000a00
  22614                   switch (instr & 0x00800100) {
  22615                     case 0x00000000: {
  22616                       // 0xec000a00
  22617                       if ((instr & 0x006000d0) == 0x00400010) {
  22618                         unsigned rm = ExtractSRegister(instr, 5, 0);
  22619                         unsigned rt = (instr >> 12) & 0xf;
  22620                         unsigned rt2 = (instr >> 16) & 0xf;
  22621                         // VMOV{<c>}{<q>} <Sm>, <Sm1>, <Rt>, <Rt2> ; T1
  22622                         vmov(CurrentCond(),
  22623                              SRegister(rm),
  22624                              SRegister(rm + 1),
  22625                              Register(rt),
  22626                              Register(rt2));
  22627                       } else {
  22628                         UnallocatedT32(instr);
  22629                       }
  22630                       break;
  22631                     }
  22632                     case 0x00000100: {
  22633                       // 0xec000b00
  22634                       if ((instr & 0x006000d0) == 0x00400010) {
  22635                         unsigned rm = ExtractDRegister(instr, 5, 0);
  22636                         unsigned rt = (instr >> 12) & 0xf;
  22637                         unsigned rt2 = (instr >> 16) & 0xf;
  22638                         // VMOV{<c>}{<q>} <Dm>, <Rt>, <Rt2> ; T1
  22639                         vmov(CurrentCond(),
  22640                              DRegister(rm),
  22641                              Register(rt),
  22642                              Register(rt2));
  22643                       } else {
  22644                         UnallocatedT32(instr);
  22645                       }
  22646                       break;
  22647                     }
  22648                     case 0x00800000: {
  22649                       // 0xec800a00
  22650                       unsigned rn = (instr >> 16) & 0xf;
  22651                       WriteBack write_back((instr >> 21) & 0x1);
  22652                       unsigned first = ExtractSRegister(instr, 22, 12);
  22653                       unsigned len = instr & 0xff;
  22654                       // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; T2
  22655                       vstm(CurrentCond(),
  22656                            kDataTypeValueNone,
  22657                            Register(rn),
  22658                            write_back,
  22659                            SRegisterList(SRegister(first), len));
  22660                       if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
  22661                         UnpredictableT32(instr);
  22662                       }
  22663                       break;
  22664                     }
  22665                     case 0x00800100: {
  22666                       // 0xec800b00
  22667                       switch (instr & 0x00000001) {
  22668                         case 0x00000000: {
  22669                           // 0xec800b00
  22670                           unsigned rn = (instr >> 16) & 0xf;
  22671                           WriteBack write_back((instr >> 21) & 0x1);
  22672                           unsigned first = ExtractDRegister(instr, 22, 12);
  22673                           unsigned imm8 = (instr & 0xff);
  22674                           unsigned len = imm8 / 2;
  22675                           unsigned end = first + len;
  22676                           // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; T1
  22677                           vstm(CurrentCond(),
  22678                                kDataTypeValueNone,
  22679                                Register(rn),
  22680                                write_back,
  22681                                DRegisterList(DRegister(first), len));
  22682                           if ((len == 0) || (len > 16) ||
  22683                               (end > kMaxNumberOfDRegisters)) {
  22684                             UnpredictableT32(instr);
  22685                           }
  22686                           break;
  22687                         }
  22688                         case 0x00000001: {
  22689                           // 0xec800b01
  22690                           unsigned rn = (instr >> 16) & 0xf;
  22691                           WriteBack write_back((instr >> 21) & 0x1);
  22692                           unsigned first = ExtractDRegister(instr, 22, 12);
  22693                           unsigned imm8 = (instr & 0xff);
  22694                           unsigned len = imm8 / 2;
  22695                           unsigned end = first + len;
  22696                           // FSTMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; T1
  22697                           fstmiax(CurrentCond(),
  22698                                   Register(rn),
  22699                                   write_back,
  22700                                   DRegisterList(DRegister(first), len));
  22701                           if ((len == 0) || (len > 16) || (end > 16)) {
  22702                             UnpredictableT32(instr);
  22703                           }
  22704                           break;
  22705                         }
  22706                       }
  22707                       break;
  22708                     }
  22709                   }
  22710                   break;
  22711                 }
  22712                 case 0x00000e00: {
  22713                   // 0xec000e00
  22714                   switch (instr & 0x00600000) {
  22715                     case 0x00000000: {
  22716                       // 0xec000e00
  22717                       if ((instr & 0x0080f100) == 0x00805000) {
  22718                         UnimplementedT32_32("STC", instr);
  22719                       } else {
  22720                         UnallocatedT32(instr);
  22721                       }
  22722                       break;
  22723                     }
  22724                     case 0x00200000: {
  22725                       // 0xec200e00
  22726                       if ((instr & 0x0000f100) == 0x00005000) {
  22727                         UnimplementedT32_32("STC", instr);
  22728                       } else {
  22729                         UnallocatedT32(instr);
  22730                       }
  22731                       break;
  22732                     }
  22733                     case 0x00400000: {
  22734                       // 0xec400e00
  22735                       if ((instr & 0x00800000) == 0x00000000) {
  22736                         UnimplementedT32_32("MCRR", instr);
  22737                       } else {
  22738                         UnallocatedT32(instr);
  22739                       }
  22740                       break;
  22741                     }
  22742                     default:
  22743                       UnallocatedT32(instr);
  22744                       break;
  22745                   }
  22746                   break;
  22747                 }
  22748                 case 0x00100a00: {
  22749                   // 0xec100a00
  22750                   switch (instr & 0x00800100) {
  22751                     case 0x00000000: {
  22752                       // 0xec100a00
  22753                       if ((instr & 0x006000d0) == 0x00400010) {
  22754                         unsigned rt = (instr >> 12) & 0xf;
  22755                         unsigned rt2 = (instr >> 16) & 0xf;
  22756                         unsigned rm = ExtractSRegister(instr, 5, 0);
  22757                         // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Sm>, <Sm1> ; T1
  22758                         vmov(CurrentCond(),
  22759                              Register(rt),
  22760                              Register(rt2),
  22761                              SRegister(rm),
  22762                              SRegister(rm + 1));
  22763                       } else {
  22764                         UnallocatedT32(instr);
  22765                       }
  22766                       break;
  22767                     }
  22768                     case 0x00000100: {
  22769                       // 0xec100b00
  22770                       if ((instr & 0x006000d0) == 0x00400010) {
  22771                         unsigned rt = (instr >> 12) & 0xf;
  22772                         unsigned rt2 = (instr >> 16) & 0xf;
  22773                         unsigned rm = ExtractDRegister(instr, 5, 0);
  22774                         // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Dm> ; T1
  22775                         vmov(CurrentCond(),
  22776                              Register(rt),
  22777                              Register(rt2),
  22778                              DRegister(rm));
  22779                       } else {
  22780                         UnallocatedT32(instr);
  22781                       }
  22782                       break;
  22783                     }
  22784                     case 0x00800000: {
  22785                       // 0xec900a00
  22786                       if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
  22787                            Uint32(0x1)) &&
  22788                           ((Uint32((instr >> 16)) & Uint32(0xf)) ==
  22789                            Uint32(0xd))) {
  22790                         unsigned first = ExtractSRegister(instr, 22, 12);
  22791                         unsigned len = instr & 0xff;
  22792                         // VPOP{<c>}{<q>}{.<size>} <sreglist> ; T2
  22793                         vpop(CurrentCond(),
  22794                              kDataTypeValueNone,
  22795                              SRegisterList(SRegister(first), len));
  22796                         if ((len == 0) ||
  22797                             ((first + len) > kNumberOfSRegisters)) {
  22798                           UnpredictableT32(instr);
  22799                         }
  22800                         return;
  22801                       }
  22802                       unsigned rn = (instr >> 16) & 0xf;
  22803                       WriteBack write_back((instr >> 21) & 0x1);
  22804                       unsigned first = ExtractSRegister(instr, 22, 12);
  22805                       unsigned len = instr & 0xff;
  22806                       // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; T2
  22807                       vldm(CurrentCond(),
  22808                            kDataTypeValueNone,
  22809                            Register(rn),
  22810                            write_back,
  22811                            SRegisterList(SRegister(first), len));
  22812                       if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
  22813                         UnpredictableT32(instr);
  22814                       }
  22815                       break;
  22816                     }
  22817                     case 0x00800100: {
  22818                       // 0xec900b00
  22819                       switch (instr & 0x00000001) {
  22820                         case 0x00000000: {
  22821                           // 0xec900b00
  22822                           if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
  22823                                Uint32(0x1)) &&
  22824                               ((Uint32((instr >> 16)) & Uint32(0xf)) ==
  22825                                Uint32(0xd))) {
  22826                             unsigned first = ExtractDRegister(instr, 22, 12);
  22827                             unsigned imm8 = (instr & 0xff);
  22828                             unsigned len = imm8 / 2;
  22829                             unsigned end = first + len;
  22830                             // VPOP{<c>}{<q>}{.<size>} <dreglist> ; T1
  22831                             vpop(CurrentCond(),
  22832                                  kDataTypeValueNone,
  22833                                  DRegisterList(DRegister(first), len));
  22834                             if ((len == 0) || (len > 16) ||
  22835                                 (end > kMaxNumberOfDRegisters)) {
  22836                               UnpredictableT32(instr);
  22837                             }
  22838                             return;
  22839                           }
  22840                           unsigned rn = (instr >> 16) & 0xf;
  22841                           WriteBack write_back((instr >> 21) & 0x1);
  22842                           unsigned first = ExtractDRegister(instr, 22, 12);
  22843                           unsigned imm8 = (instr & 0xff);
  22844                           unsigned len = imm8 / 2;
  22845                           unsigned end = first + len;
  22846                           // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; T1
  22847                           vldm(CurrentCond(),
  22848                                kDataTypeValueNone,
  22849                                Register(rn),
  22850                                write_back,
  22851                                DRegisterList(DRegister(first), len));
  22852                           if ((len == 0) || (len > 16) ||
  22853                               (end > kMaxNumberOfDRegisters)) {
  22854                             UnpredictableT32(instr);
  22855                           }
  22856                           break;
  22857                         }
  22858                         case 0x00000001: {
  22859                           // 0xec900b01
  22860                           unsigned rn = (instr >> 16) & 0xf;
  22861                           WriteBack write_back((instr >> 21) & 0x1);
  22862                           unsigned first = ExtractDRegister(instr, 22, 12);
  22863                           unsigned imm8 = (instr & 0xff);
  22864                           unsigned len = imm8 / 2;
  22865                           unsigned end = first + len;
  22866                           // FLDMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; T1
  22867                           fldmiax(CurrentCond(),
  22868                                   Register(rn),
  22869                                   write_back,
  22870                                   DRegisterList(DRegister(first), len));
  22871                           if ((len == 0) || (len > 16) || (end > 16)) {
  22872                             UnpredictableT32(instr);
  22873                           }
  22874                           break;
  22875                         }
  22876                       }
  22877                       break;
  22878                     }
  22879                   }
  22880                   break;
  22881                 }
  22882                 case 0x00100e00: {
  22883                   // 0xec100e00
  22884                   switch (instr & 0x00600000) {
  22885                     case 0x00000000: {
  22886                       // 0xec100e00
  22887                       if ((instr & 0x0080f100) == 0x00805000) {
  22888                         if (((instr & 0xf0000) == 0xf0000)) {
  22889                           UnallocatedT32(instr);
  22890                           return;
  22891                         }
  22892                         UnimplementedT32_32("LDC", instr);
  22893                       } else {
  22894                         UnallocatedT32(instr);
  22895                       }
  22896                       break;
  22897                     }
  22898                     case 0x00200000: {
  22899                       // 0xec300e00
  22900                       if ((instr & 0x0000f100) == 0x00005000) {
  22901                         if (((instr & 0xf0000) == 0xf0000)) {
  22902                           UnallocatedT32(instr);
  22903                           return;
  22904                         }
  22905                         UnimplementedT32_32("LDC", instr);
  22906                       } else {
  22907                         UnallocatedT32(instr);
  22908                       }
  22909                       break;
  22910                     }
  22911                     case 0x00400000: {
  22912                       // 0xec500e00
  22913                       if ((instr & 0x00800000) == 0x00000000) {
  22914                         UnimplementedT32_32("MRRC", instr);
  22915                       } else {
  22916                         UnallocatedT32(instr);
  22917                       }
  22918                       break;
  22919                     }
  22920                     default:
  22921                       UnallocatedT32(instr);
  22922                       break;
  22923                   }
  22924                   break;
  22925                 }
  22926                 case 0x01000a00: {
  22927                   // 0xed000a00
  22928                   switch (instr & 0x00200100) {
  22929                     case 0x00000000: {
  22930                       // 0xed000a00
  22931                       unsigned rd = ExtractSRegister(instr, 22, 12);
  22932                       unsigned rn = (instr >> 16) & 0xf;
  22933                       Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  22934                       int32_t offset = (instr & 0xff) << 2;
  22935                       // VSTR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; T2
  22936                       vstr(CurrentCond(),
  22937                            Untyped32,
  22938                            SRegister(rd),
  22939                            MemOperand(Register(rn), sign, offset, Offset));
  22940                       break;
  22941                     }
  22942                     case 0x00000100: {
  22943                       // 0xed000b00
  22944                       unsigned rd = ExtractDRegister(instr, 22, 12);
  22945                       unsigned rn = (instr >> 16) & 0xf;
  22946                       Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  22947                       int32_t offset = (instr & 0xff) << 2;
  22948                       // VSTR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; T1
  22949                       vstr(CurrentCond(),
  22950                            Untyped64,
  22951                            DRegister(rd),
  22952                            MemOperand(Register(rn), sign, offset, Offset));
  22953                       break;
  22954                     }
  22955                     case 0x00200000: {
  22956                       // 0xed200a00
  22957                       if ((instr & 0x00800000) == 0x00000000) {
  22958                         if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
  22959                              Uint32(0xd))) {
  22960                           unsigned first = ExtractSRegister(instr, 22, 12);
  22961                           unsigned len = instr & 0xff;
  22962                           // VPUSH{<c>}{<q>}{.<size>} <sreglist> ; T2
  22963                           vpush(CurrentCond(),
  22964                                 kDataTypeValueNone,
  22965                                 SRegisterList(SRegister(first), len));
  22966                           if ((len == 0) ||
  22967                               ((first + len) > kNumberOfSRegisters)) {
  22968                             UnpredictableT32(instr);
  22969                           }
  22970                           return;
  22971                         }
  22972                         unsigned rn = (instr >> 16) & 0xf;
  22973                         unsigned first = ExtractSRegister(instr, 22, 12);
  22974                         unsigned len = instr & 0xff;
  22975                         // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; T2
  22976                         vstmdb(CurrentCond(),
  22977                                kDataTypeValueNone,
  22978                                Register(rn),
  22979                                WriteBack(WRITE_BACK),
  22980                                SRegisterList(SRegister(first), len));
  22981                         if ((len == 0) ||
  22982                             ((first + len) > kNumberOfSRegisters)) {
  22983                           UnpredictableT32(instr);
  22984                         }
  22985                       } else {
  22986                         UnallocatedT32(instr);
  22987                       }
  22988                       break;
  22989                     }
  22990                     case 0x00200100: {
  22991                       // 0xed200b00
  22992                       switch (instr & 0x00800001) {
  22993                         case 0x00000000: {
  22994                           // 0xed200b00
  22995                           if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
  22996                                Uint32(0xd))) {
  22997                             unsigned first = ExtractDRegister(instr, 22, 12);
  22998                             unsigned imm8 = (instr & 0xff);
  22999                             unsigned len = imm8 / 2;
  23000                             unsigned end = first + len;
  23001                             // VPUSH{<c>}{<q>}{.<size>} <dreglist> ; T1
  23002                             vpush(CurrentCond(),
  23003                                   kDataTypeValueNone,
  23004                                   DRegisterList(DRegister(first), len));
  23005                             if ((len == 0) || (len > 16) ||
  23006                                 (end > kMaxNumberOfDRegisters)) {
  23007                               UnpredictableT32(instr);
  23008                             }
  23009                             return;
  23010                           }
  23011                           unsigned rn = (instr >> 16) & 0xf;
  23012                           unsigned first = ExtractDRegister(instr, 22, 12);
  23013                           unsigned imm8 = (instr & 0xff);
  23014                           unsigned len = imm8 / 2;
  23015                           unsigned end = first + len;
  23016                           // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; T1
  23017                           vstmdb(CurrentCond(),
  23018                                  kDataTypeValueNone,
  23019                                  Register(rn),
  23020                                  WriteBack(WRITE_BACK),
  23021                                  DRegisterList(DRegister(first), len));
  23022                           if ((len == 0) || (len > 16) ||
  23023                               (end > kMaxNumberOfDRegisters)) {
  23024                             UnpredictableT32(instr);
  23025                           }
  23026                           break;
  23027                         }
  23028                         case 0x00000001: {
  23029                           // 0xed200b01
  23030                           unsigned rn = (instr >> 16) & 0xf;
  23031                           unsigned first = ExtractDRegister(instr, 22, 12);
  23032                           unsigned imm8 = (instr & 0xff);
  23033                           unsigned len = imm8 / 2;
  23034                           unsigned end = first + len;
  23035                           // FSTMDBX{<c>}{<q>} <Rn>!, <dreglist> ; T1
  23036                           fstmdbx(CurrentCond(),
  23037                                   Register(rn),
  23038                                   WriteBack(WRITE_BACK),
  23039                                   DRegisterList(DRegister(first), len));
  23040                           if ((len == 0) || (len > 16) || (end > 16)) {
  23041                             UnpredictableT32(instr);
  23042                           }
  23043                           break;
  23044                         }
  23045                         default:
  23046                           UnallocatedT32(instr);
  23047                           break;
  23048                       }
  23049                       break;
  23050                     }
  23051                   }
  23052                   break;
  23053                 }
  23054                 case 0x01000e00: {
  23055                   // 0xed000e00
  23056                   switch (instr & 0x0060f100) {
  23057                     case 0x00005000: {
  23058                       // 0xed005e00
  23059                       UnimplementedT32_32("STC", instr);
  23060                       break;
  23061                     }
  23062                     case 0x00205000: {
  23063                       // 0xed205e00
  23064                       UnimplementedT32_32("STC", instr);
  23065                       break;
  23066                     }
  23067                     default:
  23068                       UnallocatedT32(instr);
  23069                       break;
  23070                   }
  23071                   break;
  23072                 }
  23073                 case 0x01100a00: {
  23074                   // 0xed100a00
  23075                   switch (instr & 0x00200100) {
  23076                     case 0x00000000: {
  23077                       // 0xed100a00
  23078                       switch (instr & 0x000f0000) {
  23079                         case 0x000f0000: {
  23080                           // 0xed1f0a00
  23081                           unsigned rd = ExtractSRegister(instr, 22, 12);
  23082                           uint32_t U = (instr >> 23) & 0x1;
  23083                           int32_t imm = instr & 0xff;
  23084                           imm <<= 2;
  23085                           if (U == 0) imm = -imm;
  23086                           bool minus_zero = (imm == 0) && (U == 0);
  23087                           Location location(imm, kT32PcDelta);
  23088                           // VLDR{<c>}{<q>}{.32} <Sd>, <label> ; T2
  23089                           if (minus_zero) {
  23090                             vldr(CurrentCond(),
  23091                                  Untyped32,
  23092                                  SRegister(rd),
  23093                                  MemOperand(pc, minus, 0));
  23094                           } else {
  23095                             vldr(CurrentCond(),
  23096                                  Untyped32,
  23097                                  SRegister(rd),
  23098                                  &location);
  23099                           }
  23100                           break;
  23101                         }
  23102                         default: {
  23103                           if (((instr & 0xf0000) == 0xf0000)) {
  23104                             UnallocatedT32(instr);
  23105                             return;
  23106                           }
  23107                           unsigned rd = ExtractSRegister(instr, 22, 12);
  23108                           unsigned rn = (instr >> 16) & 0xf;
  23109                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  23110                                                                  : plus);
  23111                           int32_t offset = (instr & 0xff) << 2;
  23112                           // VLDR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; T2 NOLINT(whitespace/line_length)
  23113                           vldr(CurrentCond(),
  23114                                Untyped32,
  23115                                SRegister(rd),
  23116                                MemOperand(Register(rn), sign, offset, Offset));
  23117                           break;
  23118                         }
  23119                       }
  23120                       break;
  23121                     }
  23122                     case 0x00000100: {
  23123                       // 0xed100b00
  23124                       switch (instr & 0x000f0000) {
  23125                         case 0x000f0000: {
  23126                           // 0xed1f0b00
  23127                           unsigned rd = ExtractDRegister(instr, 22, 12);
  23128                           uint32_t U = (instr >> 23) & 0x1;
  23129                           int32_t imm = instr & 0xff;
  23130                           imm <<= 2;
  23131                           if (U == 0) imm = -imm;
  23132                           bool minus_zero = (imm == 0) && (U == 0);
  23133                           Location location(imm, kT32PcDelta);
  23134                           // VLDR{<c>}{<q>}{.64} <Dd>, <label> ; T1
  23135                           if (minus_zero) {
  23136                             vldr(CurrentCond(),
  23137                                  Untyped64,
  23138                                  DRegister(rd),
  23139                                  MemOperand(pc, minus, 0));
  23140                           } else {
  23141                             vldr(CurrentCond(),
  23142                                  Untyped64,
  23143                                  DRegister(rd),
  23144                                  &location);
  23145                           }
  23146                           break;
  23147                         }
  23148                         default: {
  23149                           if (((instr & 0xf0000) == 0xf0000)) {
  23150                             UnallocatedT32(instr);
  23151                             return;
  23152                           }
  23153                           unsigned rd = ExtractDRegister(instr, 22, 12);
  23154                           unsigned rn = (instr >> 16) & 0xf;
  23155                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  23156                                                                  : plus);
  23157                           int32_t offset = (instr & 0xff) << 2;
  23158                           // VLDR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
  23159                           vldr(CurrentCond(),
  23160                                Untyped64,
  23161                                DRegister(rd),
  23162                                MemOperand(Register(rn), sign, offset, Offset));
  23163                           break;
  23164                         }
  23165                       }
  23166                       break;
  23167                     }
  23168                     case 0x00200000: {
  23169                       // 0xed300a00
  23170                       if ((instr & 0x00800000) == 0x00000000) {
  23171                         unsigned rn = (instr >> 16) & 0xf;
  23172                         unsigned first = ExtractSRegister(instr, 22, 12);
  23173                         unsigned len = instr & 0xff;
  23174                         // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; T2
  23175                         vldmdb(CurrentCond(),
  23176                                kDataTypeValueNone,
  23177                                Register(rn),
  23178                                WriteBack(WRITE_BACK),
  23179                                SRegisterList(SRegister(first), len));
  23180                         if ((len == 0) ||
  23181                             ((first + len) > kNumberOfSRegisters)) {
  23182                           UnpredictableT32(instr);
  23183                         }
  23184                       } else {
  23185                         UnallocatedT32(instr);
  23186                       }
  23187                       break;
  23188                     }
  23189                     case 0x00200100: {
  23190                       // 0xed300b00
  23191                       switch (instr & 0x00800001) {
  23192                         case 0x00000000: {
  23193                           // 0xed300b00
  23194                           unsigned rn = (instr >> 16) & 0xf;
  23195                           unsigned first = ExtractDRegister(instr, 22, 12);
  23196                           unsigned imm8 = (instr & 0xff);
  23197                           unsigned len = imm8 / 2;
  23198                           unsigned end = first + len;
  23199                           // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; T1
  23200                           vldmdb(CurrentCond(),
  23201                                  kDataTypeValueNone,
  23202                                  Register(rn),
  23203                                  WriteBack(WRITE_BACK),
  23204                                  DRegisterList(DRegister(first), len));
  23205                           if ((len == 0) || (len > 16) ||
  23206                               (end > kMaxNumberOfDRegisters)) {
  23207                             UnpredictableT32(instr);
  23208                           }
  23209                           break;
  23210                         }
  23211                         case 0x00000001: {
  23212                           // 0xed300b01
  23213                           unsigned rn = (instr >> 16) & 0xf;
  23214                           unsigned first = ExtractDRegister(instr, 22, 12);
  23215                           unsigned imm8 = (instr & 0xff);
  23216                           unsigned len = imm8 / 2;
  23217                           unsigned end = first + len;
  23218                           // FLDMDBX{<c>}{<q>} <Rn>!, <dreglist> ; T1
  23219                           fldmdbx(CurrentCond(),
  23220                                   Register(rn),
  23221                                   WriteBack(WRITE_BACK),
  23222                                   DRegisterList(DRegister(first), len));
  23223                           if ((len == 0) || (len > 16) || (end > 16)) {
  23224                             UnpredictableT32(instr);
  23225                           }
  23226                           break;
  23227                         }
  23228                         default:
  23229                           UnallocatedT32(instr);
  23230                           break;
  23231                       }
  23232                       break;
  23233                     }
  23234                   }
  23235                   break;
  23236                 }
  23237                 case 0x01100e00: {
  23238                   // 0xed100e00
  23239                   switch (instr & 0x0060f100) {
  23240                     case 0x00005000: {
  23241                       // 0xed105e00
  23242                       switch (instr & 0x000f0000) {
  23243                         case 0x000f0000: {
  23244                           // 0xed1f5e00
  23245                           UnimplementedT32_32("LDC", instr);
  23246                           break;
  23247                         }
  23248                         default: {
  23249                           if (((instr & 0xf0000) == 0xf0000)) {
  23250                             UnallocatedT32(instr);
  23251                             return;
  23252                           }
  23253                           UnimplementedT32_32("LDC", instr);
  23254                           break;
  23255                         }
  23256                       }
  23257                       break;
  23258                     }
  23259                     case 0x00205000: {
  23260                       // 0xed305e00
  23261                       if (((instr & 0xf0000) == 0xf0000)) {
  23262                         UnallocatedT32(instr);
  23263                         return;
  23264                       }
  23265                       UnimplementedT32_32("LDC", instr);
  23266                       break;
  23267                     }
  23268                     default:
  23269                       UnallocatedT32(instr);
  23270                       break;
  23271                   }
  23272                   break;
  23273                 }
  23274                 default:
  23275                   UnallocatedT32(instr);
  23276                   break;
  23277               }
  23278               break;
  23279             }
  23280             case 0x06000000: {
  23281               // 0xee000000
  23282               switch (instr & 0x01000010) {
  23283                 case 0x00000000: {
  23284                   // 0xee000000
  23285                   switch (instr & 0x10b00f40) {
  23286                     case 0x00000a00: {
  23287                       // 0xee000a00
  23288                       unsigned rd = ExtractSRegister(instr, 22, 12);
  23289                       unsigned rn = ExtractSRegister(instr, 7, 16);
  23290                       unsigned rm = ExtractSRegister(instr, 5, 0);
  23291                       // VMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
  23292                       vmla(CurrentCond(),
  23293                            F32,
  23294                            SRegister(rd),
  23295                            SRegister(rn),
  23296                            SRegister(rm));
  23297                       break;
  23298                     }
  23299                     case 0x00000a40: {
  23300                       // 0xee000a40
  23301                       unsigned rd = ExtractSRegister(instr, 22, 12);
  23302                       unsigned rn = ExtractSRegister(instr, 7, 16);
  23303                       unsigned rm = ExtractSRegister(instr, 5, 0);
  23304                       // VMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
  23305                       vmls(CurrentCond(),
  23306                            F32,
  23307                            SRegister(rd),
  23308                            SRegister(rn),
  23309                            SRegister(rm));
  23310                       break;
  23311                     }
  23312                     case 0x00000b00: {
  23313                       // 0xee000b00
  23314                       unsigned rd = ExtractDRegister(instr, 22, 12);
  23315                       unsigned rn = ExtractDRegister(instr, 7, 16);
  23316                       unsigned rm = ExtractDRegister(instr, 5, 0);
  23317                       // VMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
  23318                       vmla(CurrentCond(),
  23319                            F64,
  23320                            DRegister(rd),
  23321                            DRegister(rn),
  23322                            DRegister(rm));
  23323                       break;
  23324                     }
  23325                     case 0x00000b40: {
  23326                       // 0xee000b40
  23327                       unsigned rd = ExtractDRegister(instr, 22, 12);
  23328                       unsigned rn = ExtractDRegister(instr, 7, 16);
  23329                       unsigned rm = ExtractDRegister(instr, 5, 0);
  23330                       // VMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
  23331                       vmls(CurrentCond(),
  23332                            F64,
  23333                            DRegister(rd),
  23334                            DRegister(rn),
  23335                            DRegister(rm));
  23336                       break;
  23337                     }
  23338                     case 0x00100a00: {
  23339                       // 0xee100a00
  23340                       unsigned rd = ExtractSRegister(instr, 22, 12);
  23341                       unsigned rn = ExtractSRegister(instr, 7, 16);
  23342                       unsigned rm = ExtractSRegister(instr, 5, 0);
  23343                       // VNMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
  23344                       vnmls(CurrentCond(),
  23345                             F32,
  23346                             SRegister(rd),
  23347                             SRegister(rn),
  23348                             SRegister(rm));
  23349                       break;
  23350                     }
  23351                     case 0x00100a40: {
  23352                       // 0xee100a40
  23353                       unsigned rd = ExtractSRegister(instr, 22, 12);
  23354                       unsigned rn = ExtractSRegister(instr, 7, 16);
  23355                       unsigned rm = ExtractSRegister(instr, 5, 0);
  23356                       // VNMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
  23357                       vnmla(CurrentCond(),
  23358                             F32,
  23359                             SRegister(rd),
  23360                             SRegister(rn),
  23361                             SRegister(rm));
  23362                       break;
  23363                     }
  23364                     case 0x00100b00: {
  23365                       // 0xee100b00
  23366                       unsigned rd = ExtractDRegister(instr, 22, 12);
  23367                       unsigned rn = ExtractDRegister(instr, 7, 16);
  23368                       unsigned rm = ExtractDRegister(instr, 5, 0);
  23369                       // VNMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
  23370                       vnmls(CurrentCond(),
  23371                             F64,
  23372                             DRegister(rd),
  23373                             DRegister(rn),
  23374                             DRegister(rm));
  23375                       break;
  23376                     }
  23377                     case 0x00100b40: {
  23378                       // 0xee100b40
  23379                       unsigned rd = ExtractDRegister(instr, 22, 12);
  23380                       unsigned rn = ExtractDRegister(instr, 7, 16);
  23381                       unsigned rm = ExtractDRegister(instr, 5, 0);
  23382                       // VNMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
  23383                       vnmla(CurrentCond(),
  23384                             F64,
  23385                             DRegister(rd),
  23386                             DRegister(rn),
  23387                             DRegister(rm));
  23388                       break;
  23389                     }
  23390                     case 0x00200a00: {
  23391                       // 0xee200a00
  23392                       unsigned rd = ExtractSRegister(instr, 22, 12);
  23393                       unsigned rn = ExtractSRegister(instr, 7, 16);
  23394                       unsigned rm = ExtractSRegister(instr, 5, 0);
  23395                       // VMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
  23396                       vmul(CurrentCond(),
  23397                            F32,
  23398                            SRegister(rd),
  23399                            SRegister(rn),
  23400                            SRegister(rm));
  23401                       break;
  23402                     }
  23403                     case 0x00200a40: {
  23404                       // 0xee200a40
  23405                       unsigned rd = ExtractSRegister(instr, 22, 12);
  23406                       unsigned rn = ExtractSRegister(instr, 7, 16);
  23407                       unsigned rm = ExtractSRegister(instr, 5, 0);
  23408                       // VNMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T1
  23409                       vnmul(CurrentCond(),
  23410                             F32,
  23411                             SRegister(rd),
  23412                             SRegister(rn),
  23413                             SRegister(rm));
  23414                       break;
  23415                     }
  23416                     case 0x00200b00: {
  23417                       // 0xee200b00
  23418                       unsigned rd = ExtractDRegister(instr, 22, 12);
  23419                       unsigned rn = ExtractDRegister(instr, 7, 16);
  23420                       unsigned rm = ExtractDRegister(instr, 5, 0);
  23421                       // VMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
  23422                       vmul(CurrentCond(),
  23423                            F64,
  23424                            DRegister(rd),
  23425                            DRegister(rn),
  23426                            DRegister(rm));
  23427                       break;
  23428                     }
  23429                     case 0x00200b40: {
  23430                       // 0xee200b40
  23431                       unsigned rd = ExtractDRegister(instr, 22, 12);
  23432                       unsigned rn = ExtractDRegister(instr, 7, 16);
  23433                       unsigned rm = ExtractDRegister(instr, 5, 0);
  23434                       // VNMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T1
  23435                       vnmul(CurrentCond(),
  23436                             F64,
  23437                             DRegister(rd),
  23438                             DRegister(rn),
  23439                             DRegister(rm));
  23440                       break;
  23441                     }
  23442                     case 0x00300a00: {
  23443                       // 0xee300a00
  23444                       unsigned rd = ExtractSRegister(instr, 22, 12);
  23445                       unsigned rn = ExtractSRegister(instr, 7, 16);
  23446                       unsigned rm = ExtractSRegister(instr, 5, 0);
  23447                       // VADD{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
  23448                       vadd(CurrentCond(),
  23449                            F32,
  23450                            SRegister(rd),
  23451                            SRegister(rn),
  23452                            SRegister(rm));
  23453                       break;
  23454                     }
  23455                     case 0x00300a40: {
  23456                       // 0xee300a40
  23457                       unsigned rd = ExtractSRegister(instr, 22, 12);
  23458                       unsigned rn = ExtractSRegister(instr, 7, 16);
  23459                       unsigned rm = ExtractSRegister(instr, 5, 0);
  23460                       // VSUB{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2
  23461                       vsub(CurrentCond(),
  23462                            F32,
  23463                            SRegister(rd),
  23464                            SRegister(rn),
  23465                            SRegister(rm));
  23466                       break;
  23467                     }
  23468                     case 0x00300b00: {
  23469                       // 0xee300b00
  23470                       unsigned rd = ExtractDRegister(instr, 22, 12);
  23471                       unsigned rn = ExtractDRegister(instr, 7, 16);
  23472                       unsigned rm = ExtractDRegister(instr, 5, 0);
  23473                       // VADD{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
  23474                       vadd(CurrentCond(),
  23475                            F64,
  23476                            DRegister(rd),
  23477                            DRegister(rn),
  23478                            DRegister(rm));
  23479                       break;
  23480                     }
  23481                     case 0x00300b40: {
  23482                       // 0xee300b40
  23483                       unsigned rd = ExtractDRegister(instr, 22, 12);
  23484                       unsigned rn = ExtractDRegister(instr, 7, 16);
  23485                       unsigned rm = ExtractDRegister(instr, 5, 0);
  23486                       // VSUB{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2
  23487                       vsub(CurrentCond(),
  23488                            F64,
  23489                            DRegister(rd),
  23490                            DRegister(rn),
  23491                            DRegister(rm));
  23492                       break;
  23493                     }
  23494                     case 0x00800a00: {
  23495                       // 0xee800a00
  23496                       unsigned rd = ExtractSRegister(instr, 22, 12);
  23497                       unsigned rn = ExtractSRegister(instr, 7, 16);
  23498                       unsigned rm = ExtractSRegister(instr, 5, 0);
  23499                       // VDIV{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T1
  23500                       vdiv(CurrentCond(),
  23501                            F32,
  23502                            SRegister(rd),
  23503                            SRegister(rn),
  23504                            SRegister(rm));
  23505                       break;
  23506                     }
  23507                     case 0x00800b00: {
  23508                       // 0xee800b00
  23509                       unsigned rd = ExtractDRegister(instr, 22, 12);
  23510                       unsigned rn = ExtractDRegister(instr, 7, 16);
  23511                       unsigned rm = ExtractDRegister(instr, 5, 0);
  23512                       // VDIV{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T1
  23513                       vdiv(CurrentCond(),
  23514                            F64,
  23515                            DRegister(rd),
  23516                            DRegister(rn),
  23517                            DRegister(rm));
  23518                       break;
  23519                     }
  23520                     case 0x00900a00: {
  23521                       // 0xee900a00
  23522                       unsigned rd = ExtractSRegister(instr, 22, 12);
  23523                       unsigned rn = ExtractSRegister(instr, 7, 16);
  23524                       unsigned rm = ExtractSRegister(instr, 5, 0);
  23525                       // VFNMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
  23526                       vfnms(CurrentCond(),
  23527                             F32,
  23528                             SRegister(rd),
  23529                             SRegister(rn),
  23530                             SRegister(rm));
  23531                       break;
  23532                     }
  23533                     case 0x00900a40: {
  23534                       // 0xee900a40
  23535                       unsigned rd = ExtractSRegister(instr, 22, 12);
  23536                       unsigned rn = ExtractSRegister(instr, 7, 16);
  23537                       unsigned rm = ExtractSRegister(instr, 5, 0);
  23538                       // VFNMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1
  23539                       vfnma(CurrentCond(),
  23540                             F32,
  23541                             SRegister(rd),
  23542                             SRegister(rn),
  23543                             SRegister(rm));
  23544                       break;
  23545                     }
  23546                     case 0x00900b00: {
  23547                       // 0xee900b00
  23548                       unsigned rd = ExtractDRegister(instr, 22, 12);
  23549                       unsigned rn = ExtractDRegister(instr, 7, 16);
  23550                       unsigned rm = ExtractDRegister(instr, 5, 0);
  23551                       // VFNMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
  23552                       vfnms(CurrentCond(),
  23553                             F64,
  23554                             DRegister(rd),
  23555                             DRegister(rn),
  23556                             DRegister(rm));
  23557                       break;
  23558                     }
  23559                     case 0x00900b40: {
  23560                       // 0xee900b40
  23561                       unsigned rd = ExtractDRegister(instr, 22, 12);
  23562                       unsigned rn = ExtractDRegister(instr, 7, 16);
  23563                       unsigned rm = ExtractDRegister(instr, 5, 0);
  23564                       // VFNMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1
  23565                       vfnma(CurrentCond(),
  23566                             F64,
  23567                             DRegister(rd),
  23568                             DRegister(rn),
  23569                             DRegister(rm));
  23570                       break;
  23571                     }
  23572                     case 0x00a00a00: {
  23573                       // 0xeea00a00
  23574                       unsigned rd = ExtractSRegister(instr, 22, 12);
  23575                       unsigned rn = ExtractSRegister(instr, 7, 16);
  23576                       unsigned rm = ExtractSRegister(instr, 5, 0);
  23577                       // VFMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
  23578                       vfma(CurrentCond(),
  23579                            F32,
  23580                            SRegister(rd),
  23581                            SRegister(rn),
  23582                            SRegister(rm));
  23583                       break;
  23584                     }
  23585                     case 0x00a00a40: {
  23586                       // 0xeea00a40
  23587                       unsigned rd = ExtractSRegister(instr, 22, 12);
  23588                       unsigned rn = ExtractSRegister(instr, 7, 16);
  23589                       unsigned rm = ExtractSRegister(instr, 5, 0);
  23590                       // VFMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
  23591                       vfms(CurrentCond(),
  23592                            F32,
  23593                            SRegister(rd),
  23594                            SRegister(rn),
  23595                            SRegister(rm));
  23596                       break;
  23597                     }
  23598                     case 0x00a00b00: {
  23599                       // 0xeea00b00
  23600                       unsigned rd = ExtractDRegister(instr, 22, 12);
  23601                       unsigned rn = ExtractDRegister(instr, 7, 16);
  23602                       unsigned rm = ExtractDRegister(instr, 5, 0);
  23603                       // VFMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
  23604                       vfma(CurrentCond(),
  23605                            F64,
  23606                            DRegister(rd),
  23607                            DRegister(rn),
  23608                            DRegister(rm));
  23609                       break;
  23610                     }
  23611                     case 0x00a00b40: {
  23612                       // 0xeea00b40
  23613                       unsigned rd = ExtractDRegister(instr, 22, 12);
  23614                       unsigned rn = ExtractDRegister(instr, 7, 16);
  23615                       unsigned rm = ExtractDRegister(instr, 5, 0);
  23616                       // VFMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
  23617                       vfms(CurrentCond(),
  23618                            F64,
  23619                            DRegister(rd),
  23620                            DRegister(rn),
  23621                            DRegister(rm));
  23622                       break;
  23623                     }
  23624                     case 0x00b00a00: {
  23625                       // 0xeeb00a00
  23626                       unsigned rd = ExtractSRegister(instr, 22, 12);
  23627                       uint32_t encoded_imm =
  23628                           (instr & 0xf) | ((instr >> 12) & 0xf0);
  23629                       NeonImmediate imm =
  23630                           ImmediateVFP::Decode<float>(encoded_imm);
  23631                       // VMOV{<c>}{<q>}.F32 <Sd>, #<imm> ; T2
  23632                       vmov(CurrentCond(), F32, SRegister(rd), imm);
  23633                       if (((instr & 0xffb00ff0) != 0xeeb00a00)) {
  23634                         UnpredictableT32(instr);
  23635                       }
  23636                       break;
  23637                     }
  23638                     case 0x00b00a40: {
  23639                       // 0xeeb00a40
  23640                       switch (instr & 0x000e0000) {
  23641                         case 0x00000000: {
  23642                           // 0xeeb00a40
  23643                           switch (instr & 0x00010080) {
  23644                             case 0x00000000: {
  23645                               // 0xeeb00a40
  23646                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23647                               unsigned rm = ExtractSRegister(instr, 5, 0);
  23648                               // VMOV{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
  23649                               vmov(CurrentCond(),
  23650                                    F32,
  23651                                    SRegister(rd),
  23652                                    SRegister(rm));
  23653                               break;
  23654                             }
  23655                             case 0x00000080: {
  23656                               // 0xeeb00ac0
  23657                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23658                               unsigned rm = ExtractSRegister(instr, 5, 0);
  23659                               // VABS{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
  23660                               vabs(CurrentCond(),
  23661                                    F32,
  23662                                    SRegister(rd),
  23663                                    SRegister(rm));
  23664                               break;
  23665                             }
  23666                             case 0x00010000: {
  23667                               // 0xeeb10a40
  23668                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23669                               unsigned rm = ExtractSRegister(instr, 5, 0);
  23670                               // VNEG{<c>}{<q>}.F32 <Sd>, <Sm> ; T2
  23671                               vneg(CurrentCond(),
  23672                                    F32,
  23673                                    SRegister(rd),
  23674                                    SRegister(rm));
  23675                               break;
  23676                             }
  23677                             case 0x00010080: {
  23678                               // 0xeeb10ac0
  23679                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23680                               unsigned rm = ExtractSRegister(instr, 5, 0);
  23681                               // VSQRT{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
  23682                               vsqrt(CurrentCond(),
  23683                                     F32,
  23684                                     SRegister(rd),
  23685                                     SRegister(rm));
  23686                               break;
  23687                             }
  23688                           }
  23689                           break;
  23690                         }
  23691                         case 0x00020000: {
  23692                           // 0xeeb20a40
  23693                           switch (instr & 0x00010080) {
  23694                             case 0x00000000: {
  23695                               // 0xeeb20a40
  23696                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23697                               unsigned rm = ExtractSRegister(instr, 5, 0);
  23698                               // VCVTB{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; T1
  23699                               vcvtb(CurrentCond(),
  23700                                     F32,
  23701                                     F16,
  23702                                     SRegister(rd),
  23703                                     SRegister(rm));
  23704                               break;
  23705                             }
  23706                             case 0x00000080: {
  23707                               // 0xeeb20ac0
  23708                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23709                               unsigned rm = ExtractSRegister(instr, 5, 0);
  23710                               // VCVTT{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; T1
  23711                               vcvtt(CurrentCond(),
  23712                                     F32,
  23713                                     F16,
  23714                                     SRegister(rd),
  23715                                     SRegister(rm));
  23716                               break;
  23717                             }
  23718                             case 0x00010000: {
  23719                               // 0xeeb30a40
  23720                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23721                               unsigned rm = ExtractSRegister(instr, 5, 0);
  23722                               // VCVTB{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; T1
  23723                               vcvtb(CurrentCond(),
  23724                                     F16,
  23725                                     F32,
  23726                                     SRegister(rd),
  23727                                     SRegister(rm));
  23728                               break;
  23729                             }
  23730                             case 0x00010080: {
  23731                               // 0xeeb30ac0
  23732                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23733                               unsigned rm = ExtractSRegister(instr, 5, 0);
  23734                               // VCVTT{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; T1
  23735                               vcvtt(CurrentCond(),
  23736                                     F16,
  23737                                     F32,
  23738                                     SRegister(rd),
  23739                                     SRegister(rm));
  23740                               break;
  23741                             }
  23742                           }
  23743                           break;
  23744                         }
  23745                         case 0x00040000: {
  23746                           // 0xeeb40a40
  23747                           switch (instr & 0x00010080) {
  23748                             case 0x00000000: {
  23749                               // 0xeeb40a40
  23750                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23751                               unsigned rm = ExtractSRegister(instr, 5, 0);
  23752                               // VCMP{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
  23753                               vcmp(CurrentCond(),
  23754                                    F32,
  23755                                    SRegister(rd),
  23756                                    SRegister(rm));
  23757                               break;
  23758                             }
  23759                             case 0x00000080: {
  23760                               // 0xeeb40ac0
  23761                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23762                               unsigned rm = ExtractSRegister(instr, 5, 0);
  23763                               // VCMPE{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
  23764                               vcmpe(CurrentCond(),
  23765                                     F32,
  23766                                     SRegister(rd),
  23767                                     SRegister(rm));
  23768                               break;
  23769                             }
  23770                             case 0x00010000: {
  23771                               // 0xeeb50a40
  23772                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23773                               // VCMP{<c>}{<q>}.F32 <Sd>, #0.0 ; T2
  23774                               vcmp(CurrentCond(), F32, SRegister(rd), 0.0);
  23775                               if (((instr & 0xffbf0fff) != 0xeeb50a40)) {
  23776                                 UnpredictableT32(instr);
  23777                               }
  23778                               break;
  23779                             }
  23780                             case 0x00010080: {
  23781                               // 0xeeb50ac0
  23782                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23783                               // VCMPE{<c>}{<q>}.F32 <Sd>, #0.0 ; T2
  23784                               vcmpe(CurrentCond(), F32, SRegister(rd), 0.0);
  23785                               if (((instr & 0xffbf0fff) != 0xeeb50ac0)) {
  23786                                 UnpredictableT32(instr);
  23787                               }
  23788                               break;
  23789                             }
  23790                           }
  23791                           break;
  23792                         }
  23793                         case 0x00060000: {
  23794                           // 0xeeb60a40
  23795                           switch (instr & 0x00010080) {
  23796                             case 0x00000000: {
  23797                               // 0xeeb60a40
  23798                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23799                               unsigned rm = ExtractSRegister(instr, 5, 0);
  23800                               // VRINTR{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
  23801                               vrintr(CurrentCond(),
  23802                                      F32,
  23803                                      SRegister(rd),
  23804                                      SRegister(rm));
  23805                               break;
  23806                             }
  23807                             case 0x00000080: {
  23808                               // 0xeeb60ac0
  23809                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23810                               unsigned rm = ExtractSRegister(instr, 5, 0);
  23811                               // VRINTZ{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
  23812                               vrintz(CurrentCond(),
  23813                                      F32,
  23814                                      SRegister(rd),
  23815                                      SRegister(rm));
  23816                               break;
  23817                             }
  23818                             case 0x00010000: {
  23819                               // 0xeeb70a40
  23820                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23821                               unsigned rm = ExtractSRegister(instr, 5, 0);
  23822                               // VRINTX{<c>}{<q>}.F32 <Sd>, <Sm> ; T1
  23823                               vrintx(CurrentCond(),
  23824                                      F32,
  23825                                      SRegister(rd),
  23826                                      SRegister(rm));
  23827                               break;
  23828                             }
  23829                             case 0x00010080: {
  23830                               // 0xeeb70ac0
  23831                               unsigned rd = ExtractDRegister(instr, 22, 12);
  23832                               unsigned rm = ExtractSRegister(instr, 5, 0);
  23833                               // VCVT{<c>}{<q>}.F64.F32 <Dd>, <Sm> ; T1
  23834                               vcvt(CurrentCond(),
  23835                                    F64,
  23836                                    F32,
  23837                                    DRegister(rd),
  23838                                    SRegister(rm));
  23839                               break;
  23840                             }
  23841                           }
  23842                           break;
  23843                         }
  23844                         case 0x00080000: {
  23845                           // 0xeeb80a40
  23846                           if ((instr & 0x00010000) == 0x00000000) {
  23847                             DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  23848                             if (dt.Is(kDataTypeValueInvalid)) {
  23849                               UnallocatedT32(instr);
  23850                               return;
  23851                             }
  23852                             unsigned rd = ExtractSRegister(instr, 22, 12);
  23853                             unsigned rm = ExtractSRegister(instr, 5, 0);
  23854                             // VCVT{<c>}{<q>}.F32.<dt> <Sd>, <Sm> ; T1
  23855                             vcvt(CurrentCond(),
  23856                                  F32,
  23857                                  dt,
  23858                                  SRegister(rd),
  23859                                  SRegister(rm));
  23860                           } else {
  23861                             UnallocatedT32(instr);
  23862                           }
  23863                           break;
  23864                         }
  23865                         case 0x000a0000: {
  23866                           // 0xeeba0a40
  23867                           DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
  23868                                                          ((instr >> 15) & 0x2));
  23869                           if (dt.Is(kDataTypeValueInvalid)) {
  23870                             UnallocatedT32(instr);
  23871                             return;
  23872                           }
  23873                           unsigned rd = ExtractSRegister(instr, 22, 12);
  23874                           unsigned offset = 32;
  23875                           if (dt.Is(S16) || dt.Is(U16)) {
  23876                             offset = 16;
  23877                           }
  23878                           uint32_t fbits = offset - (((instr >> 5) & 0x1) |
  23879                                                      ((instr << 1) & 0x1e));
  23880                           // VCVT{<c>}{<q>}.F32.<dt> <Sdm>, <Sdm>, #<fbits> ; T1
  23881                           vcvt(CurrentCond(),
  23882                                F32,
  23883                                dt,
  23884                                SRegister(rd),
  23885                                SRegister(rd),
  23886                                fbits);
  23887                           break;
  23888                         }
  23889                         case 0x000c0000: {
  23890                           // 0xeebc0a40
  23891                           switch (instr & 0x00010080) {
  23892                             case 0x00000000: {
  23893                               // 0xeebc0a40
  23894                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23895                               unsigned rm = ExtractSRegister(instr, 5, 0);
  23896                               // VCVTR{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; T1
  23897                               vcvtr(CurrentCond(),
  23898                                     U32,
  23899                                     F32,
  23900                                     SRegister(rd),
  23901                                     SRegister(rm));
  23902                               break;
  23903                             }
  23904                             case 0x00000080: {
  23905                               // 0xeebc0ac0
  23906                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23907                               unsigned rm = ExtractSRegister(instr, 5, 0);
  23908                               // VCVT{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; T1
  23909                               vcvt(CurrentCond(),
  23910                                    U32,
  23911                                    F32,
  23912                                    SRegister(rd),
  23913                                    SRegister(rm));
  23914                               break;
  23915                             }
  23916                             case 0x00010000: {
  23917                               // 0xeebd0a40
  23918                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23919                               unsigned rm = ExtractSRegister(instr, 5, 0);
  23920                               // VCVTR{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; T1
  23921                               vcvtr(CurrentCond(),
  23922                                     S32,
  23923                                     F32,
  23924                                     SRegister(rd),
  23925                                     SRegister(rm));
  23926                               break;
  23927                             }
  23928                             case 0x00010080: {
  23929                               // 0xeebd0ac0
  23930                               unsigned rd = ExtractSRegister(instr, 22, 12);
  23931                               unsigned rm = ExtractSRegister(instr, 5, 0);
  23932                               // VCVT{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; T1
  23933                               vcvt(CurrentCond(),
  23934                                    S32,
  23935                                    F32,
  23936                                    SRegister(rd),
  23937                                    SRegister(rm));
  23938                               break;
  23939                             }
  23940                           }
  23941                           break;
  23942                         }
  23943                         case 0x000e0000: {
  23944                           // 0xeebe0a40
  23945                           DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
  23946                                                          ((instr >> 15) & 0x2));
  23947                           if (dt.Is(kDataTypeValueInvalid)) {
  23948                             UnallocatedT32(instr);
  23949                             return;
  23950                           }
  23951                           unsigned rd = ExtractSRegister(instr, 22, 12);
  23952                           unsigned offset = 32;
  23953                           if (dt.Is(S16) || dt.Is(U16)) {
  23954                             offset = 16;
  23955                           }
  23956                           uint32_t fbits = offset - (((instr >> 5) & 0x1) |
  23957                                                      ((instr << 1) & 0x1e));
  23958                           // VCVT{<c>}{<q>}.<dt>.F32 <Sdm>, <Sdm>, #<fbits> ; T1
  23959                           vcvt(CurrentCond(),
  23960                                dt,
  23961                                F32,
  23962                                SRegister(rd),
  23963                                SRegister(rd),
  23964                                fbits);
  23965                           break;
  23966                         }
  23967                       }
  23968                       break;
  23969                     }
  23970                     case 0x00b00b00: {
  23971                       // 0xeeb00b00
  23972                       unsigned rd = ExtractDRegister(instr, 22, 12);
  23973                       uint32_t encoded_imm =
  23974                           (instr & 0xf) | ((instr >> 12) & 0xf0);
  23975                       NeonImmediate imm =
  23976                           ImmediateVFP::Decode<double>(encoded_imm);
  23977                       // VMOV{<c>}{<q>}.F64 <Dd>, #<imm> ; T2
  23978                       vmov(CurrentCond(), F64, DRegister(rd), imm);
  23979                       if (((instr & 0xffb00ff0) != 0xeeb00b00)) {
  23980                         UnpredictableT32(instr);
  23981                       }
  23982                       break;
  23983                     }
  23984                     case 0x00b00b40: {
  23985                       // 0xeeb00b40
  23986                       switch (instr & 0x000e0000) {
  23987                         case 0x00000000: {
  23988                           // 0xeeb00b40
  23989                           switch (instr & 0x00010080) {
  23990                             case 0x00000000: {
  23991                               // 0xeeb00b40
  23992                               unsigned rd = ExtractDRegister(instr, 22, 12);
  23993                               unsigned rm = ExtractDRegister(instr, 5, 0);
  23994                               // VMOV{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
  23995                               vmov(CurrentCond(),
  23996                                    F64,
  23997                                    DRegister(rd),
  23998                                    DRegister(rm));
  23999                               break;
  24000                             }
  24001                             case 0x00000080: {
  24002                               // 0xeeb00bc0
  24003                               unsigned rd = ExtractDRegister(instr, 22, 12);
  24004                               unsigned rm = ExtractDRegister(instr, 5, 0);
  24005                               // VABS{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
  24006                               vabs(CurrentCond(),
  24007                                    F64,
  24008                                    DRegister(rd),
  24009                                    DRegister(rm));
  24010                               break;
  24011                             }
  24012                             case 0x00010000: {
  24013                               // 0xeeb10b40
  24014                               unsigned rd = ExtractDRegister(instr, 22, 12);
  24015                               unsigned rm = ExtractDRegister(instr, 5, 0);
  24016                               // VNEG{<c>}{<q>}.F64 <Dd>, <Dm> ; T2
  24017                               vneg(CurrentCond(),
  24018                                    F64,
  24019                                    DRegister(rd),
  24020                                    DRegister(rm));
  24021                               break;
  24022                             }
  24023                             case 0x00010080: {
  24024                               // 0xeeb10bc0
  24025                               unsigned rd = ExtractDRegister(instr, 22, 12);
  24026                               unsigned rm = ExtractDRegister(instr, 5, 0);
  24027                               // VSQRT{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
  24028                               vsqrt(CurrentCond(),
  24029                                     F64,
  24030                                     DRegister(rd),
  24031                                     DRegister(rm));
  24032                               break;
  24033                             }
  24034                           }
  24035                           break;
  24036                         }
  24037                         case 0x00020000: {
  24038                           // 0xeeb20b40
  24039                           switch (instr & 0x00010080) {
  24040                             case 0x00000000: {
  24041                               // 0xeeb20b40
  24042                               unsigned rd = ExtractDRegister(instr, 22, 12);
  24043                               unsigned rm = ExtractSRegister(instr, 5, 0);
  24044                               // VCVTB{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; T1
  24045                               vcvtb(CurrentCond(),
  24046                                     F64,
  24047                                     F16,
  24048                                     DRegister(rd),
  24049                                     SRegister(rm));
  24050                               break;
  24051                             }
  24052                             case 0x00000080: {
  24053                               // 0xeeb20bc0
  24054                               unsigned rd = ExtractDRegister(instr, 22, 12);
  24055                               unsigned rm = ExtractSRegister(instr, 5, 0);
  24056                               // VCVTT{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; T1
  24057                               vcvtt(CurrentCond(),
  24058                                     F64,
  24059                                     F16,
  24060                                     DRegister(rd),
  24061                                     SRegister(rm));
  24062                               break;
  24063                             }
  24064                             case 0x00010000: {
  24065                               // 0xeeb30b40
  24066                               unsigned rd = ExtractSRegister(instr, 22, 12);
  24067                               unsigned rm = ExtractDRegister(instr, 5, 0);
  24068                               // VCVTB{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; T1
  24069                               vcvtb(CurrentCond(),
  24070                                     F16,
  24071                                     F64,
  24072                                     SRegister(rd),
  24073                                     DRegister(rm));
  24074                               break;
  24075                             }
  24076                             case 0x00010080: {
  24077                               // 0xeeb30bc0
  24078                               unsigned rd = ExtractSRegister(instr, 22, 12);
  24079                               unsigned rm = ExtractDRegister(instr, 5, 0);
  24080                               // VCVTT{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; T1
  24081                               vcvtt(CurrentCond(),
  24082                                     F16,
  24083                                     F64,
  24084                                     SRegister(rd),
  24085                                     DRegister(rm));
  24086                               break;
  24087                             }
  24088                           }
  24089                           break;
  24090                         }
  24091                         case 0x00040000: {
  24092                           // 0xeeb40b40
  24093                           switch (instr & 0x00010080) {
  24094                             case 0x00000000: {
  24095                               // 0xeeb40b40
  24096                               unsigned rd = ExtractDRegister(instr, 22, 12);
  24097                               unsigned rm = ExtractDRegister(instr, 5, 0);
  24098                               // VCMP{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
  24099                               vcmp(CurrentCond(),
  24100                                    F64,
  24101                                    DRegister(rd),
  24102                                    DRegister(rm));
  24103                               break;
  24104                             }
  24105                             case 0x00000080: {
  24106                               // 0xeeb40bc0
  24107                               unsigned rd = ExtractDRegister(instr, 22, 12);
  24108                               unsigned rm = ExtractDRegister(instr, 5, 0);
  24109                               // VCMPE{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
  24110                               vcmpe(CurrentCond(),
  24111                                     F64,
  24112                                     DRegister(rd),
  24113                                     DRegister(rm));
  24114                               break;
  24115                             }
  24116                             case 0x00010000: {
  24117                               // 0xeeb50b40
  24118                               unsigned rd = ExtractDRegister(instr, 22, 12);
  24119                               // VCMP{<c>}{<q>}.F64 <Dd>, #0.0 ; T2
  24120                               vcmp(CurrentCond(), F64, DRegister(rd), 0.0);
  24121                               if (((instr & 0xffbf0fff) != 0xeeb50b40)) {
  24122                                 UnpredictableT32(instr);
  24123                               }
  24124                               break;
  24125                             }
  24126                             case 0x00010080: {
  24127                               // 0xeeb50bc0
  24128                               unsigned rd = ExtractDRegister(instr, 22, 12);
  24129                               // VCMPE{<c>}{<q>}.F64 <Dd>, #0.0 ; T2
  24130                               vcmpe(CurrentCond(), F64, DRegister(rd), 0.0);
  24131                               if (((instr & 0xffbf0fff) != 0xeeb50bc0)) {
  24132                                 UnpredictableT32(instr);
  24133                               }
  24134                               break;
  24135                             }
  24136                           }
  24137                           break;
  24138                         }
  24139                         case 0x00060000: {
  24140                           // 0xeeb60b40
  24141                           switch (instr & 0x00010080) {
  24142                             case 0x00000000: {
  24143                               // 0xeeb60b40
  24144                               unsigned rd = ExtractDRegister(instr, 22, 12);
  24145                               unsigned rm = ExtractDRegister(instr, 5, 0);
  24146                               // VRINTR{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
  24147                               vrintr(CurrentCond(),
  24148                                      F64,
  24149                                      DRegister(rd),
  24150                                      DRegister(rm));
  24151                               break;
  24152                             }
  24153                             case 0x00000080: {
  24154                               // 0xeeb60bc0
  24155                               unsigned rd = ExtractDRegister(instr, 22, 12);
  24156                               unsigned rm = ExtractDRegister(instr, 5, 0);
  24157                               // VRINTZ{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
  24158                               vrintz(CurrentCond(),
  24159                                      F64,
  24160                                      DRegister(rd),
  24161                                      DRegister(rm));
  24162                               break;
  24163                             }
  24164                             case 0x00010000: {
  24165                               // 0xeeb70b40
  24166                               unsigned rd = ExtractDRegister(instr, 22, 12);
  24167                               unsigned rm = ExtractDRegister(instr, 5, 0);
  24168                               // VRINTX{<c>}{<q>}.F64 <Dd>, <Dm> ; T1
  24169                               vrintx(CurrentCond(),
  24170                                      F64,
  24171                                      DRegister(rd),
  24172                                      DRegister(rm));
  24173                               break;
  24174                             }
  24175                             case 0x00010080: {
  24176                               // 0xeeb70bc0
  24177                               unsigned rd = ExtractSRegister(instr, 22, 12);
  24178                               unsigned rm = ExtractDRegister(instr, 5, 0);
  24179                               // VCVT{<c>}{<q>}.F32.F64 <Sd>, <Dm> ; T1
  24180                               vcvt(CurrentCond(),
  24181                                    F32,
  24182                                    F64,
  24183                                    SRegister(rd),
  24184                                    DRegister(rm));
  24185                               break;
  24186                             }
  24187                           }
  24188                           break;
  24189                         }
  24190                         case 0x00080000: {
  24191                           // 0xeeb80b40
  24192                           if ((instr & 0x00010000) == 0x00000000) {
  24193                             DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  24194                             if (dt.Is(kDataTypeValueInvalid)) {
  24195                               UnallocatedT32(instr);
  24196                               return;
  24197                             }
  24198                             unsigned rd = ExtractDRegister(instr, 22, 12);
  24199                             unsigned rm = ExtractSRegister(instr, 5, 0);
  24200                             // VCVT{<c>}{<q>}.F64.<dt> <Dd>, <Sm> ; T1
  24201                             vcvt(CurrentCond(),
  24202                                  F64,
  24203                                  dt,
  24204                                  DRegister(rd),
  24205                                  SRegister(rm));
  24206                           } else {
  24207                             UnallocatedT32(instr);
  24208                           }
  24209                           break;
  24210                         }
  24211                         case 0x000a0000: {
  24212                           // 0xeeba0b40
  24213                           DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
  24214                                                          ((instr >> 15) & 0x2));
  24215                           if (dt.Is(kDataTypeValueInvalid)) {
  24216                             UnallocatedT32(instr);
  24217                             return;
  24218                           }
  24219                           unsigned rd = ExtractDRegister(instr, 22, 12);
  24220                           unsigned offset = 32;
  24221                           if (dt.Is(S16) || dt.Is(U16)) {
  24222                             offset = 16;
  24223                           }
  24224                           uint32_t fbits = offset - (((instr >> 5) & 0x1) |
  24225                                                      ((instr << 1) & 0x1e));
  24226                           // VCVT{<c>}{<q>}.F64.<dt> <Ddm>, <Ddm>, #<fbits> ; T1
  24227                           vcvt(CurrentCond(),
  24228                                F64,
  24229                                dt,
  24230                                DRegister(rd),
  24231                                DRegister(rd),
  24232                                fbits);
  24233                           break;
  24234                         }
  24235                         case 0x000c0000: {
  24236                           // 0xeebc0b40
  24237                           switch (instr & 0x00010080) {
  24238                             case 0x00000000: {
  24239                               // 0xeebc0b40
  24240                               unsigned rd = ExtractSRegister(instr, 22, 12);
  24241                               unsigned rm = ExtractDRegister(instr, 5, 0);
  24242                               // VCVTR{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; T1
  24243                               vcvtr(CurrentCond(),
  24244                                     U32,
  24245                                     F64,
  24246                                     SRegister(rd),
  24247                                     DRegister(rm));
  24248                               break;
  24249                             }
  24250                             case 0x00000080: {
  24251                               // 0xeebc0bc0
  24252                               unsigned rd = ExtractSRegister(instr, 22, 12);
  24253                               unsigned rm = ExtractDRegister(instr, 5, 0);
  24254                               // VCVT{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; T1
  24255                               vcvt(CurrentCond(),
  24256                                    U32,
  24257                                    F64,
  24258                                    SRegister(rd),
  24259                                    DRegister(rm));
  24260                               break;
  24261                             }
  24262                             case 0x00010000: {
  24263                               // 0xeebd0b40
  24264                               unsigned rd = ExtractSRegister(instr, 22, 12);
  24265                               unsigned rm = ExtractDRegister(instr, 5, 0);
  24266                               // VCVTR{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; T1
  24267                               vcvtr(CurrentCond(),
  24268                                     S32,
  24269                                     F64,
  24270                                     SRegister(rd),
  24271                                     DRegister(rm));
  24272                               break;
  24273                             }
  24274                             case 0x00010080: {
  24275                               // 0xeebd0bc0
  24276                               unsigned rd = ExtractSRegister(instr, 22, 12);
  24277                               unsigned rm = ExtractDRegister(instr, 5, 0);
  24278                               // VCVT{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; T1
  24279                               vcvt(CurrentCond(),
  24280                                    S32,
  24281                                    F64,
  24282                                    SRegister(rd),
  24283                                    DRegister(rm));
  24284                               break;
  24285                             }
  24286                           }
  24287                           break;
  24288                         }
  24289                         case 0x000e0000: {
  24290                           // 0xeebe0b40
  24291                           DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
  24292                                                          ((instr >> 15) & 0x2));
  24293                           if (dt.Is(kDataTypeValueInvalid)) {
  24294                             UnallocatedT32(instr);
  24295                             return;
  24296                           }
  24297                           unsigned rd = ExtractDRegister(instr, 22, 12);
  24298                           unsigned offset = 32;
  24299                           if (dt.Is(S16) || dt.Is(U16)) {
  24300                             offset = 16;
  24301                           }
  24302                           uint32_t fbits = offset - (((instr >> 5) & 0x1) |
  24303                                                      ((instr << 1) & 0x1e));
  24304                           // VCVT{<c>}{<q>}.<dt>.F64 <Ddm>, <Ddm>, #<fbits> ; T1
  24305                           vcvt(CurrentCond(),
  24306                                dt,
  24307                                F64,
  24308                                DRegister(rd),
  24309                                DRegister(rd),
  24310                                fbits);
  24311                           break;
  24312                         }
  24313                       }
  24314                       break;
  24315                     }
  24316                     case 0x10000a00: {
  24317                       // 0xfe000a00
  24318                       unsigned rd = ExtractSRegister(instr, 22, 12);
  24319                       unsigned rn = ExtractSRegister(instr, 7, 16);
  24320                       unsigned rm = ExtractSRegister(instr, 5, 0);
  24321                       // VSELEQ.F32 <Sd>, <Sn>, <Sm> ; T1
  24322                       vseleq(F32, SRegister(rd), SRegister(rn), SRegister(rm));
  24323                       if (InITBlock()) {
  24324                         UnpredictableT32(instr);
  24325                       }
  24326                       break;
  24327                     }
  24328                     case 0x10000b00: {
  24329                       // 0xfe000b00
  24330                       unsigned rd = ExtractDRegister(instr, 22, 12);
  24331                       unsigned rn = ExtractDRegister(instr, 7, 16);
  24332                       unsigned rm = ExtractDRegister(instr, 5, 0);
  24333                       // VSELEQ.F64 <Dd>, <Dn>, <Dm> ; T1
  24334                       vseleq(F64, DRegister(rd), DRegister(rn), DRegister(rm));
  24335                       if (InITBlock()) {
  24336                         UnpredictableT32(instr);
  24337                       }
  24338                       break;
  24339                     }
  24340                     case 0x10100a00: {
  24341                       // 0xfe100a00
  24342                       unsigned rd = ExtractSRegister(instr, 22, 12);
  24343                       unsigned rn = ExtractSRegister(instr, 7, 16);
  24344                       unsigned rm = ExtractSRegister(instr, 5, 0);
  24345                       // VSELVS.F32 <Sd>, <Sn>, <Sm> ; T1
  24346                       vselvs(F32, SRegister(rd), SRegister(rn), SRegister(rm));
  24347                       if (InITBlock()) {
  24348                         UnpredictableT32(instr);
  24349                       }
  24350                       break;
  24351                     }
  24352                     case 0x10100b00: {
  24353                       // 0xfe100b00
  24354                       unsigned rd = ExtractDRegister(instr, 22, 12);
  24355                       unsigned rn = ExtractDRegister(instr, 7, 16);
  24356                       unsigned rm = ExtractDRegister(instr, 5, 0);
  24357                       // VSELVS.F64 <Dd>, <Dn>, <Dm> ; T1
  24358                       vselvs(F64, DRegister(rd), DRegister(rn), DRegister(rm));
  24359                       if (InITBlock()) {
  24360                         UnpredictableT32(instr);
  24361                       }
  24362                       break;
  24363                     }
  24364                     case 0x10200a00: {
  24365                       // 0xfe200a00
  24366                       unsigned rd = ExtractSRegister(instr, 22, 12);
  24367                       unsigned rn = ExtractSRegister(instr, 7, 16);
  24368                       unsigned rm = ExtractSRegister(instr, 5, 0);
  24369                       // VSELGE.F32 <Sd>, <Sn>, <Sm> ; T1
  24370                       vselge(F32, SRegister(rd), SRegister(rn), SRegister(rm));
  24371                       if (InITBlock()) {
  24372                         UnpredictableT32(instr);
  24373                       }
  24374                       break;
  24375                     }
  24376                     case 0x10200b00: {
  24377                       // 0xfe200b00
  24378                       unsigned rd = ExtractDRegister(instr, 22, 12);
  24379                       unsigned rn = ExtractDRegister(instr, 7, 16);
  24380                       unsigned rm = ExtractDRegister(instr, 5, 0);
  24381                       // VSELGE.F64 <Dd>, <Dn>, <Dm> ; T1
  24382                       vselge(F64, DRegister(rd), DRegister(rn), DRegister(rm));
  24383                       if (InITBlock()) {
  24384                         UnpredictableT32(instr);
  24385                       }
  24386                       break;
  24387                     }
  24388                     case 0x10300a00: {
  24389                       // 0xfe300a00
  24390                       unsigned rd = ExtractSRegister(instr, 22, 12);
  24391                       unsigned rn = ExtractSRegister(instr, 7, 16);
  24392                       unsigned rm = ExtractSRegister(instr, 5, 0);
  24393                       // VSELGT.F32 <Sd>, <Sn>, <Sm> ; T1
  24394                       vselgt(F32, SRegister(rd), SRegister(rn), SRegister(rm));
  24395                       if (InITBlock()) {
  24396                         UnpredictableT32(instr);
  24397                       }
  24398                       break;
  24399                     }
  24400                     case 0x10300b00: {
  24401                       // 0xfe300b00
  24402                       unsigned rd = ExtractDRegister(instr, 22, 12);
  24403                       unsigned rn = ExtractDRegister(instr, 7, 16);
  24404                       unsigned rm = ExtractDRegister(instr, 5, 0);
  24405                       // VSELGT.F64 <Dd>, <Dn>, <Dm> ; T1
  24406                       vselgt(F64, DRegister(rd), DRegister(rn), DRegister(rm));
  24407                       if (InITBlock()) {
  24408                         UnpredictableT32(instr);
  24409                       }
  24410                       break;
  24411                     }
  24412                     case 0x10800a00: {
  24413                       // 0xfe800a00
  24414                       unsigned rd = ExtractSRegister(instr, 22, 12);
  24415                       unsigned rn = ExtractSRegister(instr, 7, 16);
  24416                       unsigned rm = ExtractSRegister(instr, 5, 0);
  24417                       // VMAXNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
  24418                       vmaxnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
  24419                       if (InITBlock()) {
  24420                         UnpredictableT32(instr);
  24421                       }
  24422                       break;
  24423                     }
  24424                     case 0x10800a40: {
  24425                       // 0xfe800a40
  24426                       unsigned rd = ExtractSRegister(instr, 22, 12);
  24427                       unsigned rn = ExtractSRegister(instr, 7, 16);
  24428                       unsigned rm = ExtractSRegister(instr, 5, 0);
  24429                       // VMINNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2
  24430                       vminnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
  24431                       if (InITBlock()) {
  24432                         UnpredictableT32(instr);
  24433                       }
  24434                       break;
  24435                     }
  24436                     case 0x10800b00: {
  24437                       // 0xfe800b00
  24438                       unsigned rd = ExtractDRegister(instr, 22, 12);
  24439                       unsigned rn = ExtractDRegister(instr, 7, 16);
  24440                       unsigned rm = ExtractDRegister(instr, 5, 0);
  24441                       // VMAXNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
  24442                       vmaxnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
  24443                       if (InITBlock()) {
  24444                         UnpredictableT32(instr);
  24445                       }
  24446                       break;
  24447                     }
  24448                     case 0x10800b40: {
  24449                       // 0xfe800b40
  24450                       unsigned rd = ExtractDRegister(instr, 22, 12);
  24451                       unsigned rn = ExtractDRegister(instr, 7, 16);
  24452                       unsigned rm = ExtractDRegister(instr, 5, 0);
  24453                       // VMINNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2
  24454                       vminnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
  24455                       if (InITBlock()) {
  24456                         UnpredictableT32(instr);
  24457                       }
  24458                       break;
  24459                     }
  24460                     case 0x10b00a40: {
  24461                       // 0xfeb00a40
  24462                       switch (instr & 0x000f0000) {
  24463                         case 0x00080000: {
  24464                           // 0xfeb80a40
  24465                           if ((instr & 0x00000080) == 0x00000000) {
  24466                             unsigned rd = ExtractSRegister(instr, 22, 12);
  24467                             unsigned rm = ExtractSRegister(instr, 5, 0);
  24468                             // VRINTA{<q>}.F32 <Sd>, <Sm> ; T1
  24469                             vrinta(F32, SRegister(rd), SRegister(rm));
  24470                           } else {
  24471                             UnallocatedT32(instr);
  24472                           }
  24473                           break;
  24474                         }
  24475                         case 0x00090000: {
  24476                           // 0xfeb90a40
  24477                           if ((instr & 0x00000080) == 0x00000000) {
  24478                             unsigned rd = ExtractSRegister(instr, 22, 12);
  24479                             unsigned rm = ExtractSRegister(instr, 5, 0);
  24480                             // VRINTN{<q>}.F32 <Sd>, <Sm> ; T1
  24481                             vrintn(F32, SRegister(rd), SRegister(rm));
  24482                           } else {
  24483                             UnallocatedT32(instr);
  24484                           }
  24485                           break;
  24486                         }
  24487                         case 0x000a0000: {
  24488                           // 0xfeba0a40
  24489                           if ((instr & 0x00000080) == 0x00000000) {
  24490                             unsigned rd = ExtractSRegister(instr, 22, 12);
  24491                             unsigned rm = ExtractSRegister(instr, 5, 0);
  24492                             // VRINTP{<q>}.F32 <Sd>, <Sm> ; T1
  24493                             vrintp(F32, SRegister(rd), SRegister(rm));
  24494                           } else {
  24495                             UnallocatedT32(instr);
  24496                           }
  24497                           break;
  24498                         }
  24499                         case 0x000b0000: {
  24500                           // 0xfebb0a40
  24501                           if ((instr & 0x00000080) == 0x00000000) {
  24502                             unsigned rd = ExtractSRegister(instr, 22, 12);
  24503                             unsigned rm = ExtractSRegister(instr, 5, 0);
  24504                             // VRINTM{<q>}.F32 <Sd>, <Sm> ; T1
  24505                             vrintm(F32, SRegister(rd), SRegister(rm));
  24506                           } else {
  24507                             UnallocatedT32(instr);
  24508                           }
  24509                           break;
  24510                         }
  24511                         case 0x000c0000: {
  24512                           // 0xfebc0a40
  24513                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  24514                           if (dt.Is(kDataTypeValueInvalid)) {
  24515                             UnallocatedT32(instr);
  24516                             return;
  24517                           }
  24518                           unsigned rd = ExtractSRegister(instr, 22, 12);
  24519                           unsigned rm = ExtractSRegister(instr, 5, 0);
  24520                           // VCVTA{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
  24521                           vcvta(dt, F32, SRegister(rd), SRegister(rm));
  24522                           break;
  24523                         }
  24524                         case 0x000d0000: {
  24525                           // 0xfebd0a40
  24526                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  24527                           if (dt.Is(kDataTypeValueInvalid)) {
  24528                             UnallocatedT32(instr);
  24529                             return;
  24530                           }
  24531                           unsigned rd = ExtractSRegister(instr, 22, 12);
  24532                           unsigned rm = ExtractSRegister(instr, 5, 0);
  24533                           // VCVTN{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
  24534                           vcvtn(dt, F32, SRegister(rd), SRegister(rm));
  24535                           break;
  24536                         }
  24537                         case 0x000e0000: {
  24538                           // 0xfebe0a40
  24539                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  24540                           if (dt.Is(kDataTypeValueInvalid)) {
  24541                             UnallocatedT32(instr);
  24542                             return;
  24543                           }
  24544                           unsigned rd = ExtractSRegister(instr, 22, 12);
  24545                           unsigned rm = ExtractSRegister(instr, 5, 0);
  24546                           // VCVTP{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
  24547                           vcvtp(dt, F32, SRegister(rd), SRegister(rm));
  24548                           break;
  24549                         }
  24550                         case 0x000f0000: {
  24551                           // 0xfebf0a40
  24552                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  24553                           if (dt.Is(kDataTypeValueInvalid)) {
  24554                             UnallocatedT32(instr);
  24555                             return;
  24556                           }
  24557                           unsigned rd = ExtractSRegister(instr, 22, 12);
  24558                           unsigned rm = ExtractSRegister(instr, 5, 0);
  24559                           // VCVTM{<q>}.<dt>.F32 <Sd>, <Sm> ; T1
  24560                           vcvtm(dt, F32, SRegister(rd), SRegister(rm));
  24561                           break;
  24562                         }
  24563                         default:
  24564                           UnallocatedT32(instr);
  24565                           break;
  24566                       }
  24567                       break;
  24568                     }
  24569                     case 0x10b00b40: {
  24570                       // 0xfeb00b40
  24571                       switch (instr & 0x000f0000) {
  24572                         case 0x00080000: {
  24573                           // 0xfeb80b40
  24574                           if ((instr & 0x00000080) == 0x00000000) {
  24575                             unsigned rd = ExtractDRegister(instr, 22, 12);
  24576                             unsigned rm = ExtractDRegister(instr, 5, 0);
  24577                             // VRINTA{<q>}.F64 <Dd>, <Dm> ; T1
  24578                             vrinta(F64, DRegister(rd), DRegister(rm));
  24579                           } else {
  24580                             UnallocatedT32(instr);
  24581                           }
  24582                           break;
  24583                         }
  24584                         case 0x00090000: {
  24585                           // 0xfeb90b40
  24586                           if ((instr & 0x00000080) == 0x00000000) {
  24587                             unsigned rd = ExtractDRegister(instr, 22, 12);
  24588                             unsigned rm = ExtractDRegister(instr, 5, 0);
  24589                             // VRINTN{<q>}.F64 <Dd>, <Dm> ; T1
  24590                             vrintn(F64, DRegister(rd), DRegister(rm));
  24591                           } else {
  24592                             UnallocatedT32(instr);
  24593                           }
  24594                           break;
  24595                         }
  24596                         case 0x000a0000: {
  24597                           // 0xfeba0b40
  24598                           if ((instr & 0x00000080) == 0x00000000) {
  24599                             unsigned rd = ExtractDRegister(instr, 22, 12);
  24600                             unsigned rm = ExtractDRegister(instr, 5, 0);
  24601                             // VRINTP{<q>}.F64 <Dd>, <Dm> ; T1
  24602                             vrintp(F64, DRegister(rd), DRegister(rm));
  24603                           } else {
  24604                             UnallocatedT32(instr);
  24605                           }
  24606                           break;
  24607                         }
  24608                         case 0x000b0000: {
  24609                           // 0xfebb0b40
  24610                           if ((instr & 0x00000080) == 0x00000000) {
  24611                             unsigned rd = ExtractDRegister(instr, 22, 12);
  24612                             unsigned rm = ExtractDRegister(instr, 5, 0);
  24613                             // VRINTM{<q>}.F64 <Dd>, <Dm> ; T1
  24614                             vrintm(F64, DRegister(rd), DRegister(rm));
  24615                           } else {
  24616                             UnallocatedT32(instr);
  24617                           }
  24618                           break;
  24619                         }
  24620                         case 0x000c0000: {
  24621                           // 0xfebc0b40
  24622                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  24623                           if (dt.Is(kDataTypeValueInvalid)) {
  24624                             UnallocatedT32(instr);
  24625                             return;
  24626                           }
  24627                           unsigned rd = ExtractSRegister(instr, 22, 12);
  24628                           unsigned rm = ExtractDRegister(instr, 5, 0);
  24629                           // VCVTA{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
  24630                           vcvta(dt, F64, SRegister(rd), DRegister(rm));
  24631                           break;
  24632                         }
  24633                         case 0x000d0000: {
  24634                           // 0xfebd0b40
  24635                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  24636                           if (dt.Is(kDataTypeValueInvalid)) {
  24637                             UnallocatedT32(instr);
  24638                             return;
  24639                           }
  24640                           unsigned rd = ExtractSRegister(instr, 22, 12);
  24641                           unsigned rm = ExtractDRegister(instr, 5, 0);
  24642                           // VCVTN{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
  24643                           vcvtn(dt, F64, SRegister(rd), DRegister(rm));
  24644                           break;
  24645                         }
  24646                         case 0x000e0000: {
  24647                           // 0xfebe0b40
  24648                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  24649                           if (dt.Is(kDataTypeValueInvalid)) {
  24650                             UnallocatedT32(instr);
  24651                             return;
  24652                           }
  24653                           unsigned rd = ExtractSRegister(instr, 22, 12);
  24654                           unsigned rm = ExtractDRegister(instr, 5, 0);
  24655                           // VCVTP{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
  24656                           vcvtp(dt, F64, SRegister(rd), DRegister(rm));
  24657                           break;
  24658                         }
  24659                         case 0x000f0000: {
  24660                           // 0xfebf0b40
  24661                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  24662                           if (dt.Is(kDataTypeValueInvalid)) {
  24663                             UnallocatedT32(instr);
  24664                             return;
  24665                           }
  24666                           unsigned rd = ExtractSRegister(instr, 22, 12);
  24667                           unsigned rm = ExtractDRegister(instr, 5, 0);
  24668                           // VCVTM{<q>}.<dt>.F64 <Sd>, <Dm> ; T1
  24669                           vcvtm(dt, F64, SRegister(rd), DRegister(rm));
  24670                           break;
  24671                         }
  24672                         default:
  24673                           UnallocatedT32(instr);
  24674                           break;
  24675                       }
  24676                       break;
  24677                     }
  24678                     default:
  24679                       UnallocatedT32(instr);
  24680                       break;
  24681                   }
  24682                   break;
  24683                 }
  24684                 case 0x00000010: {
  24685                   // 0xee000010
  24686                   switch (instr & 0x10100e00) {
  24687                     case 0x00000a00: {
  24688                       // 0xee000a10
  24689                       switch (instr & 0x00800100) {
  24690                         case 0x00000000: {
  24691                           // 0xee000a10
  24692                           if ((instr & 0x00600000) == 0x00000000) {
  24693                             unsigned rn = ExtractSRegister(instr, 7, 16);
  24694                             unsigned rt = (instr >> 12) & 0xf;
  24695                             // VMOV{<c>}{<q>} <Sn>, <Rt> ; T1
  24696                             vmov(CurrentCond(), SRegister(rn), Register(rt));
  24697                             if (((instr & 0xfff00f7f) != 0xee000a10)) {
  24698                               UnpredictableT32(instr);
  24699                             }
  24700                           } else {
  24701                             UnallocatedT32(instr);
  24702                           }
  24703                           break;
  24704                         }
  24705                         case 0x00000100: {
  24706                           // 0xee000b10
  24707                           unsigned lane;
  24708                           DataType dt =
  24709                               Dt_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
  24710                                                         ((instr >> 19) & 0xc),
  24711                                                     &lane);
  24712                           if (dt.Is(kDataTypeValueInvalid)) {
  24713                             UnallocatedT32(instr);
  24714                             return;
  24715                           }
  24716                           unsigned rd = ExtractDRegister(instr, 7, 16);
  24717                           unsigned rt = (instr >> 12) & 0xf;
  24718                           // VMOV{<c>}{<q>}{.<size>} <Dd[x]>, <Rt> ; T1
  24719                           vmov(CurrentCond(),
  24720                                dt,
  24721                                DRegisterLane(rd, lane),
  24722                                Register(rt));
  24723                           if (((instr & 0xff900f1f) != 0xee000b10)) {
  24724                             UnpredictableT32(instr);
  24725                           }
  24726                           break;
  24727                         }
  24728                         case 0x00800000: {
  24729                           // 0xee800a10
  24730                           if ((instr & 0x00600000) == 0x00600000) {
  24731                             unsigned spec_reg = (instr >> 16) & 0xf;
  24732                             unsigned rt = (instr >> 12) & 0xf;
  24733                             switch (spec_reg) {
  24734                               case 0x0:
  24735                               case 0x1:
  24736                               case 0x8: {
  24737                                 // VMSR{<c>}{<q>} <spec_reg>, <Rt> ; T1
  24738                                 vmsr(CurrentCond(),
  24739                                      SpecialFPRegister(spec_reg),
  24740                                      Register(rt));
  24741                                 if (((instr & 0xfff00fff) != 0xeee00a10)) {
  24742                                   UnpredictableT32(instr);
  24743                                 }
  24744                                 break;
  24745                               }
  24746                               default:
  24747                                 UnallocatedT32(instr);
  24748                                 break;
  24749                             }
  24750                           } else {
  24751                             UnallocatedT32(instr);
  24752                           }
  24753                           break;
  24754                         }
  24755                         case 0x00800100: {
  24756                           // 0xee800b10
  24757                           switch (instr & 0x00200040) {
  24758                             case 0x00000000: {
  24759                               // 0xee800b10
  24760                               DataType dt = Dt_B_E_1_Decode(
  24761                                   ((instr >> 5) & 0x1) | ((instr >> 21) & 0x2));
  24762                               if (dt.Is(kDataTypeValueInvalid)) {
  24763                                 UnallocatedT32(instr);
  24764                                 return;
  24765                               }
  24766                               unsigned rd = ExtractDRegister(instr, 7, 16);
  24767                               unsigned rt = (instr >> 12) & 0xf;
  24768                               // VDUP{<c>}{<q>}.<dt> <Dd>, <Rt> ; T1
  24769                               vdup(CurrentCond(),
  24770                                    dt,
  24771                                    DRegister(rd),
  24772                                    Register(rt));
  24773                               if (((instr & 0xffb00f5f) != 0xee800b10)) {
  24774                                 UnpredictableT32(instr);
  24775                               }
  24776                               break;
  24777                             }
  24778                             case 0x00200000: {
  24779                               // 0xeea00b10
  24780                               DataType dt = Dt_B_E_1_Decode(
  24781                                   ((instr >> 5) & 0x1) | ((instr >> 21) & 0x2));
  24782                               if (dt.Is(kDataTypeValueInvalid)) {
  24783                                 UnallocatedT32(instr);
  24784                                 return;
  24785                               }
  24786                               if (((instr >> 16) & 1) != 0) {
  24787                                 UnallocatedT32(instr);
  24788                                 return;
  24789                               }
  24790                               unsigned rd = ExtractQRegister(instr, 7, 16);
  24791                               unsigned rt = (instr >> 12) & 0xf;
  24792                               // VDUP{<c>}{<q>}.<dt> <Qd>, <Rt> ; T1
  24793                               vdup(CurrentCond(),
  24794                                    dt,
  24795                                    QRegister(rd),
  24796                                    Register(rt));
  24797                               if (((instr & 0xffb00f5f) != 0xeea00b10)) {
  24798                                 UnpredictableT32(instr);
  24799                               }
  24800                               break;
  24801                             }
  24802                             default:
  24803                               UnallocatedT32(instr);
  24804                               break;
  24805                           }
  24806                           break;
  24807                         }
  24808                       }
  24809                       break;
  24810                     }
  24811                     case 0x00000e00: {
  24812                       // 0xee000e10
  24813                       UnimplementedT32_32("MCR", instr);
  24814                       break;
  24815                     }
  24816                     case 0x00100a00: {
  24817                       // 0xee100a10
  24818                       switch (instr & 0x00000100) {
  24819                         case 0x00000000: {
  24820                           // 0xee100a10
  24821                           switch (instr & 0x00e00000) {
  24822                             case 0x00000000: {
  24823                               // 0xee100a10
  24824                               unsigned rt = (instr >> 12) & 0xf;
  24825                               unsigned rn = ExtractSRegister(instr, 7, 16);
  24826                               // VMOV{<c>}{<q>} <Rt>, <Sn> ; T1
  24827                               vmov(CurrentCond(), Register(rt), SRegister(rn));
  24828                               if (((instr & 0xfff00f7f) != 0xee100a10)) {
  24829                                 UnpredictableT32(instr);
  24830                               }
  24831                               break;
  24832                             }
  24833                             case 0x00e00000: {
  24834                               // 0xeef00a10
  24835                               unsigned rt = (instr >> 12) & 0xf;
  24836                               unsigned spec_reg = (instr >> 16) & 0xf;
  24837                               switch (spec_reg) {
  24838                                 case 0x0:
  24839                                 case 0x1:
  24840                                 case 0x5:
  24841                                 case 0x6:
  24842                                 case 0x7:
  24843                                 case 0x8: {
  24844                                   // VMRS{<c>}{<q>} <Rt>, <spec_reg> ; T1
  24845                                   vmrs(CurrentCond(),
  24846                                        RegisterOrAPSR_nzcv(rt),
  24847                                        SpecialFPRegister(spec_reg));
  24848                                   if (((instr & 0xfff00fff) != 0xeef00a10)) {
  24849                                     UnpredictableT32(instr);
  24850                                   }
  24851                                   break;
  24852                                 }
  24853                                 default:
  24854                                   UnallocatedT32(instr);
  24855                                   break;
  24856                               }
  24857                               break;
  24858                             }
  24859                             default:
  24860                               UnallocatedT32(instr);
  24861                               break;
  24862                           }
  24863                           break;
  24864                         }
  24865                         case 0x00000100: {
  24866                           // 0xee100b10
  24867                           unsigned lane;
  24868                           DataType dt =
  24869                               Dt_U_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
  24870                                                           ((instr >> 19) &
  24871                                                            0xc) |
  24872                                                           ((instr >> 19) &
  24873                                                            0x10),
  24874                                                       &lane);
  24875                           if (dt.Is(kDataTypeValueInvalid)) {
  24876                             UnallocatedT32(instr);
  24877                             return;
  24878                           }
  24879                           unsigned rt = (instr >> 12) & 0xf;
  24880                           unsigned rn = ExtractDRegister(instr, 7, 16);
  24881                           // VMOV{<c>}{<q>}{.<dt>} <Rt>, <Dn[x]> ; T1
  24882                           vmov(CurrentCond(),
  24883                                dt,
  24884                                Register(rt),
  24885                                DRegisterLane(rn, lane));
  24886                           if (((instr & 0xff100f1f) != 0xee100b10)) {
  24887                             UnpredictableT32(instr);
  24888                           }
  24889                           break;
  24890                         }
  24891                       }
  24892                       break;
  24893                     }
  24894                     case 0x00100e00: {
  24895                       // 0xee100e10
  24896                       UnimplementedT32_32("MRC", instr);
  24897                       break;
  24898                     }
  24899                     default:
  24900                       UnallocatedT32(instr);
  24901                       break;
  24902                   }
  24903                   break;
  24904                 }
  24905                 case 0x01000000: {
  24906                   // 0xef000000
  24907                   switch (instr & 0x00800000) {
  24908                     case 0x00000000: {
  24909                       // 0xef000000
  24910                       switch (instr & 0x00000f40) {
  24911                         case 0x00000000: {
  24912                           // 0xef000000
  24913                           DataType dt = Dt_U_size_1_Decode(
  24914                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  24915                           if (dt.Is(kDataTypeValueInvalid)) {
  24916                             UnallocatedT32(instr);
  24917                             return;
  24918                           }
  24919                           unsigned rd = ExtractDRegister(instr, 22, 12);
  24920                           unsigned rn = ExtractDRegister(instr, 7, 16);
  24921                           unsigned rm = ExtractDRegister(instr, 5, 0);
  24922                           // VHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  24923                           vhadd(CurrentCond(),
  24924                                 dt,
  24925                                 DRegister(rd),
  24926                                 DRegister(rn),
  24927                                 DRegister(rm));
  24928                           break;
  24929                         }
  24930                         case 0x00000040: {
  24931                           // 0xef000040
  24932                           DataType dt = Dt_U_size_1_Decode(
  24933                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  24934                           if (dt.Is(kDataTypeValueInvalid)) {
  24935                             UnallocatedT32(instr);
  24936                             return;
  24937                           }
  24938                           if (((instr >> 12) & 1) != 0) {
  24939                             UnallocatedT32(instr);
  24940                             return;
  24941                           }
  24942                           unsigned rd = ExtractQRegister(instr, 22, 12);
  24943                           if (((instr >> 16) & 1) != 0) {
  24944                             UnallocatedT32(instr);
  24945                             return;
  24946                           }
  24947                           unsigned rn = ExtractQRegister(instr, 7, 16);
  24948                           if ((instr & 1) != 0) {
  24949                             UnallocatedT32(instr);
  24950                             return;
  24951                           }
  24952                           unsigned rm = ExtractQRegister(instr, 5, 0);
  24953                           // VHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
  24954                           vhadd(CurrentCond(),
  24955                                 dt,
  24956                                 QRegister(rd),
  24957                                 QRegister(rn),
  24958                                 QRegister(rm));
  24959                           break;
  24960                         }
  24961                         case 0x00000100: {
  24962                           // 0xef000100
  24963                           DataType dt = Dt_U_size_1_Decode(
  24964                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  24965                           if (dt.Is(kDataTypeValueInvalid)) {
  24966                             UnallocatedT32(instr);
  24967                             return;
  24968                           }
  24969                           unsigned rd = ExtractDRegister(instr, 22, 12);
  24970                           unsigned rn = ExtractDRegister(instr, 7, 16);
  24971                           unsigned rm = ExtractDRegister(instr, 5, 0);
  24972                           // VRHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  24973                           vrhadd(CurrentCond(),
  24974                                  dt,
  24975                                  DRegister(rd),
  24976                                  DRegister(rn),
  24977                                  DRegister(rm));
  24978                           break;
  24979                         }
  24980                         case 0x00000140: {
  24981                           // 0xef000140
  24982                           DataType dt = Dt_U_size_1_Decode(
  24983                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  24984                           if (dt.Is(kDataTypeValueInvalid)) {
  24985                             UnallocatedT32(instr);
  24986                             return;
  24987                           }
  24988                           if (((instr >> 12) & 1) != 0) {
  24989                             UnallocatedT32(instr);
  24990                             return;
  24991                           }
  24992                           unsigned rd = ExtractQRegister(instr, 22, 12);
  24993                           if (((instr >> 16) & 1) != 0) {
  24994                             UnallocatedT32(instr);
  24995                             return;
  24996                           }
  24997                           unsigned rn = ExtractQRegister(instr, 7, 16);
  24998                           if ((instr & 1) != 0) {
  24999                             UnallocatedT32(instr);
  25000                             return;
  25001                           }
  25002                           unsigned rm = ExtractQRegister(instr, 5, 0);
  25003                           // VRHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
  25004                           vrhadd(CurrentCond(),
  25005                                  dt,
  25006                                  QRegister(rd),
  25007                                  QRegister(rn),
  25008                                  QRegister(rm));
  25009                           break;
  25010                         }
  25011                         case 0x00000200: {
  25012                           // 0xef000200
  25013                           DataType dt = Dt_U_size_1_Decode(
  25014                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  25015                           if (dt.Is(kDataTypeValueInvalid)) {
  25016                             UnallocatedT32(instr);
  25017                             return;
  25018                           }
  25019                           unsigned rd = ExtractDRegister(instr, 22, 12);
  25020                           unsigned rn = ExtractDRegister(instr, 7, 16);
  25021                           unsigned rm = ExtractDRegister(instr, 5, 0);
  25022                           // VHSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  25023                           vhsub(CurrentCond(),
  25024                                 dt,
  25025                                 DRegister(rd),
  25026                                 DRegister(rn),
  25027                                 DRegister(rm));
  25028                           break;
  25029                         }
  25030                         case 0x00000240: {
  25031                           // 0xef000240
  25032                           DataType dt = Dt_U_size_1_Decode(
  25033                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  25034                           if (dt.Is(kDataTypeValueInvalid)) {
  25035                             UnallocatedT32(instr);
  25036                             return;
  25037                           }
  25038                           if (((instr >> 12) & 1) != 0) {
  25039                             UnallocatedT32(instr);
  25040                             return;
  25041                           }
  25042                           unsigned rd = ExtractQRegister(instr, 22, 12);
  25043                           if (((instr >> 16) & 1) != 0) {
  25044                             UnallocatedT32(instr);
  25045                             return;
  25046                           }
  25047                           unsigned rn = ExtractQRegister(instr, 7, 16);
  25048                           if ((instr & 1) != 0) {
  25049                             UnallocatedT32(instr);
  25050                             return;
  25051                           }
  25052                           unsigned rm = ExtractQRegister(instr, 5, 0);
  25053                           // VHSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
  25054                           vhsub(CurrentCond(),
  25055                                 dt,
  25056                                 QRegister(rd),
  25057                                 QRegister(rn),
  25058                                 QRegister(rm));
  25059                           break;
  25060                         }
  25061                         case 0x00000300: {
  25062                           // 0xef000300
  25063                           DataType dt = Dt_U_size_1_Decode(
  25064                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  25065                           if (dt.Is(kDataTypeValueInvalid)) {
  25066                             UnallocatedT32(instr);
  25067                             return;
  25068                           }
  25069                           unsigned rd = ExtractDRegister(instr, 22, 12);
  25070                           unsigned rn = ExtractDRegister(instr, 7, 16);
  25071                           unsigned rm = ExtractDRegister(instr, 5, 0);
  25072                           // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  25073                           vcgt(CurrentCond(),
  25074                                dt,
  25075                                DRegister(rd),
  25076                                DRegister(rn),
  25077                                DRegister(rm));
  25078                           break;
  25079                         }
  25080                         case 0x00000340: {
  25081                           // 0xef000340
  25082                           DataType dt = Dt_U_size_1_Decode(
  25083                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  25084                           if (dt.Is(kDataTypeValueInvalid)) {
  25085                             UnallocatedT32(instr);
  25086                             return;
  25087                           }
  25088                           if (((instr >> 12) & 1) != 0) {
  25089                             UnallocatedT32(instr);
  25090                             return;
  25091                           }
  25092                           unsigned rd = ExtractQRegister(instr, 22, 12);
  25093                           if (((instr >> 16) & 1) != 0) {
  25094                             UnallocatedT32(instr);
  25095                             return;
  25096                           }
  25097                           unsigned rn = ExtractQRegister(instr, 7, 16);
  25098                           if ((instr & 1) != 0) {
  25099                             UnallocatedT32(instr);
  25100                             return;
  25101                           }
  25102                           unsigned rm = ExtractQRegister(instr, 5, 0);
  25103                           // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
  25104                           vcgt(CurrentCond(),
  25105                                dt,
  25106                                QRegister(rd),
  25107                                QRegister(rn),
  25108                                QRegister(rm));
  25109                           break;
  25110                         }
  25111                         case 0x00000400: {
  25112                           // 0xef000400
  25113                           DataType dt = Dt_U_size_3_Decode(
  25114                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  25115                           if (dt.Is(kDataTypeValueInvalid)) {
  25116                             UnallocatedT32(instr);
  25117                             return;
  25118                           }
  25119                           unsigned rd = ExtractDRegister(instr, 22, 12);
  25120                           unsigned rm = ExtractDRegister(instr, 5, 0);
  25121                           unsigned rn = ExtractDRegister(instr, 7, 16);
  25122                           // VSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
  25123                           vshl(CurrentCond(),
  25124                                dt,
  25125                                DRegister(rd),
  25126                                DRegister(rm),
  25127                                DRegister(rn));
  25128                           break;
  25129                         }
  25130                         case 0x00000440: {
  25131                           // 0xef000440
  25132                           DataType dt = Dt_U_size_3_Decode(
  25133                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  25134                           if (dt.Is(kDataTypeValueInvalid)) {
  25135                             UnallocatedT32(instr);
  25136                             return;
  25137                           }
  25138                           if (((instr >> 12) & 1) != 0) {
  25139                             UnallocatedT32(instr);
  25140                             return;
  25141                           }
  25142                           unsigned rd = ExtractQRegister(instr, 22, 12);
  25143                           if ((instr & 1) != 0) {
  25144                             UnallocatedT32(instr);
  25145                             return;
  25146                           }
  25147                           unsigned rm = ExtractQRegister(instr, 5, 0);
  25148                           if (((instr >> 16) & 1) != 0) {
  25149                             UnallocatedT32(instr);
  25150                             return;
  25151                           }
  25152                           unsigned rn = ExtractQRegister(instr, 7, 16);
  25153                           // VSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
  25154                           vshl(CurrentCond(),
  25155                                dt,
  25156                                QRegister(rd),
  25157                                QRegister(rm),
  25158                                QRegister(rn));
  25159                           break;
  25160                         }
  25161                         case 0x00000500: {
  25162                           // 0xef000500
  25163                           DataType dt = Dt_U_size_3_Decode(
  25164                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  25165                           if (dt.Is(kDataTypeValueInvalid)) {
  25166                             UnallocatedT32(instr);
  25167                             return;
  25168                           }
  25169                           unsigned rd = ExtractDRegister(instr, 22, 12);
  25170                           unsigned rm = ExtractDRegister(instr, 5, 0);
  25171                           unsigned rn = ExtractDRegister(instr, 7, 16);
  25172                           // VRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
  25173                           vrshl(CurrentCond(),
  25174                                 dt,
  25175                                 DRegister(rd),
  25176                                 DRegister(rm),
  25177                                 DRegister(rn));
  25178                           break;
  25179                         }
  25180                         case 0x00000540: {
  25181                           // 0xef000540
  25182                           DataType dt = Dt_U_size_3_Decode(
  25183                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  25184                           if (dt.Is(kDataTypeValueInvalid)) {
  25185                             UnallocatedT32(instr);
  25186                             return;
  25187                           }
  25188                           if (((instr >> 12) & 1) != 0) {
  25189                             UnallocatedT32(instr);
  25190                             return;
  25191                           }
  25192                           unsigned rd = ExtractQRegister(instr, 22, 12);
  25193                           if ((instr & 1) != 0) {
  25194                             UnallocatedT32(instr);
  25195                             return;
  25196                           }
  25197                           unsigned rm = ExtractQRegister(instr, 5, 0);
  25198                           if (((instr >> 16) & 1) != 0) {
  25199                             UnallocatedT32(instr);
  25200                             return;
  25201                           }
  25202                           unsigned rn = ExtractQRegister(instr, 7, 16);
  25203                           // VRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
  25204                           vrshl(CurrentCond(),
  25205                                 dt,
  25206                                 QRegister(rd),
  25207                                 QRegister(rm),
  25208                                 QRegister(rn));
  25209                           break;
  25210                         }
  25211                         case 0x00000600: {
  25212                           // 0xef000600
  25213                           DataType dt = Dt_U_size_1_Decode(
  25214                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  25215                           if (dt.Is(kDataTypeValueInvalid)) {
  25216                             UnallocatedT32(instr);
  25217                             return;
  25218                           }
  25219                           unsigned rd = ExtractDRegister(instr, 22, 12);
  25220                           unsigned rn = ExtractDRegister(instr, 7, 16);
  25221                           unsigned rm = ExtractDRegister(instr, 5, 0);
  25222                           // VMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  25223                           vmax(CurrentCond(),
  25224                                dt,
  25225                                DRegister(rd),
  25226                                DRegister(rn),
  25227                                DRegister(rm));
  25228                           break;
  25229                         }
  25230                         case 0x00000640: {
  25231                           // 0xef000640
  25232                           DataType dt = Dt_U_size_1_Decode(
  25233                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  25234                           if (dt.Is(kDataTypeValueInvalid)) {
  25235                             UnallocatedT32(instr);
  25236                             return;
  25237                           }
  25238                           if (((instr >> 12) & 1) != 0) {
  25239                             UnallocatedT32(instr);
  25240                             return;
  25241                           }
  25242                           unsigned rd = ExtractQRegister(instr, 22, 12);
  25243                           if (((instr >> 16) & 1) != 0) {
  25244                             UnallocatedT32(instr);
  25245                             return;
  25246                           }
  25247                           unsigned rn = ExtractQRegister(instr, 7, 16);
  25248                           if ((instr & 1) != 0) {
  25249                             UnallocatedT32(instr);
  25250                             return;
  25251                           }
  25252                           unsigned rm = ExtractQRegister(instr, 5, 0);
  25253                           // VMAX{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
  25254                           vmax(CurrentCond(),
  25255                                dt,
  25256                                QRegister(rd),
  25257                                QRegister(rn),
  25258                                QRegister(rm));
  25259                           break;
  25260                         }
  25261                         case 0x00000700: {
  25262                           // 0xef000700
  25263                           DataType dt = Dt_U_size_1_Decode(
  25264                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  25265                           if (dt.Is(kDataTypeValueInvalid)) {
  25266                             UnallocatedT32(instr);
  25267                             return;
  25268                           }
  25269                           unsigned rd = ExtractDRegister(instr, 22, 12);
  25270                           unsigned rn = ExtractDRegister(instr, 7, 16);
  25271                           unsigned rm = ExtractDRegister(instr, 5, 0);
  25272                           // VABD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  25273                           vabd(CurrentCond(),
  25274                                dt,
  25275                                DRegister(rd),
  25276                                DRegister(rn),
  25277                                DRegister(rm));
  25278                           break;
  25279                         }
  25280                         case 0x00000740: {
  25281                           // 0xef000740
  25282                           DataType dt = Dt_U_size_1_Decode(
  25283                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  25284                           if (dt.Is(kDataTypeValueInvalid)) {
  25285                             UnallocatedT32(instr);
  25286                             return;
  25287                           }
  25288                           if (((instr >> 12) & 1) != 0) {
  25289                             UnallocatedT32(instr);
  25290                             return;
  25291                           }
  25292                           unsigned rd = ExtractQRegister(instr, 22, 12);
  25293                           if (((instr >> 16) & 1) != 0) {
  25294                             UnallocatedT32(instr);
  25295                             return;
  25296                           }
  25297                           unsigned rn = ExtractQRegister(instr, 7, 16);
  25298                           if ((instr & 1) != 0) {
  25299                             UnallocatedT32(instr);
  25300                             return;
  25301                           }
  25302                           unsigned rm = ExtractQRegister(instr, 5, 0);
  25303                           // VABD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
  25304                           vabd(CurrentCond(),
  25305                                dt,
  25306                                QRegister(rd),
  25307                                QRegister(rn),
  25308                                QRegister(rm));
  25309                           break;
  25310                         }
  25311                         case 0x00000800: {
  25312                           // 0xef000800
  25313                           switch (instr & 0x10000000) {
  25314                             case 0x00000000: {
  25315                               // 0xef000800
  25316                               DataType dt =
  25317                                   Dt_size_2_Decode((instr >> 20) & 0x3);
  25318                               if (dt.Is(kDataTypeValueInvalid)) {
  25319                                 UnallocatedT32(instr);
  25320                                 return;
  25321                               }
  25322                               unsigned rd = ExtractDRegister(instr, 22, 12);
  25323                               unsigned rn = ExtractDRegister(instr, 7, 16);
  25324                               unsigned rm = ExtractDRegister(instr, 5, 0);
  25325                               // VADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  25326                               vadd(CurrentCond(),
  25327                                    dt,
  25328                                    DRegister(rd),
  25329                                    DRegister(rn),
  25330                                    DRegister(rm));
  25331                               break;
  25332                             }
  25333                             case 0x10000000: {
  25334                               // 0xff000800
  25335                               DataType dt =
  25336                                   Dt_size_2_Decode((instr >> 20) & 0x3);
  25337                               if (dt.Is(kDataTypeValueInvalid)) {
  25338                                 UnallocatedT32(instr);
  25339                                 return;
  25340                               }
  25341                               unsigned rd = ExtractDRegister(instr, 22, 12);
  25342                               unsigned rn = ExtractDRegister(instr, 7, 16);
  25343                               unsigned rm = ExtractDRegister(instr, 5, 0);
  25344                               // VSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  25345                               vsub(CurrentCond(),
  25346                                    dt,
  25347                                    DRegister(rd),
  25348                                    DRegister(rn),
  25349                                    DRegister(rm));
  25350                               break;
  25351                             }
  25352                           }
  25353                           break;
  25354                         }
  25355                         case 0x00000840: {
  25356                           // 0xef000840
  25357                           switch (instr & 0x10000000) {
  25358                             case 0x00000000: {
  25359                               // 0xef000840
  25360                               DataType dt =
  25361                                   Dt_size_2_Decode((instr >> 20) & 0x3);
  25362                               if (dt.Is(kDataTypeValueInvalid)) {
  25363                                 UnallocatedT32(instr);
  25364                                 return;
  25365                               }
  25366                               if (((instr >> 12) & 1) != 0) {
  25367                                 UnallocatedT32(instr);
  25368                                 return;
  25369                               }
  25370                               unsigned rd = ExtractQRegister(instr, 22, 12);
  25371                               if (((instr >> 16) & 1) != 0) {
  25372                                 UnallocatedT32(instr);
  25373                                 return;
  25374                               }
  25375                               unsigned rn = ExtractQRegister(instr, 7, 16);
  25376                               if ((instr & 1) != 0) {
  25377                                 UnallocatedT32(instr);
  25378                                 return;
  25379                               }
  25380                               unsigned rm = ExtractQRegister(instr, 5, 0);
  25381                               // VADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
  25382                               vadd(CurrentCond(),
  25383                                    dt,
  25384                                    QRegister(rd),
  25385                                    QRegister(rn),
  25386                                    QRegister(rm));
  25387                               break;
  25388                             }
  25389                             case 0x10000000: {
  25390                               // 0xff000840
  25391                               DataType dt =
  25392                                   Dt_size_2_Decode((instr >> 20) & 0x3);
  25393                               if (dt.Is(kDataTypeValueInvalid)) {
  25394                                 UnallocatedT32(instr);
  25395                                 return;
  25396                               }
  25397                               if (((instr >> 12) & 1) != 0) {
  25398                                 UnallocatedT32(instr);
  25399                                 return;
  25400                               }
  25401                               unsigned rd = ExtractQRegister(instr, 22, 12);
  25402                               if (((instr >> 16) & 1) != 0) {
  25403                                 UnallocatedT32(instr);
  25404                                 return;
  25405                               }
  25406                               unsigned rn = ExtractQRegister(instr, 7, 16);
  25407                               if ((instr & 1) != 0) {
  25408                                 UnallocatedT32(instr);
  25409                                 return;
  25410                               }
  25411                               unsigned rm = ExtractQRegister(instr, 5, 0);
  25412                               // VSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
  25413                               vsub(CurrentCond(),
  25414                                    dt,
  25415                                    QRegister(rd),
  25416                                    QRegister(rn),
  25417                                    QRegister(rm));
  25418                               break;
  25419                             }
  25420                           }
  25421                           break;
  25422                         }
  25423                         case 0x00000900: {
  25424                           // 0xef000900
  25425                           switch (instr & 0x10000000) {
  25426                             case 0x00000000: {
  25427                               // 0xef000900
  25428                               DataType dt =
  25429                                   Dt_size_10_Decode((instr >> 20) & 0x3);
  25430                               if (dt.Is(kDataTypeValueInvalid)) {
  25431                                 UnallocatedT32(instr);
  25432                                 return;
  25433                               }
  25434                               unsigned rd = ExtractDRegister(instr, 22, 12);
  25435                               unsigned rn = ExtractDRegister(instr, 7, 16);
  25436                               unsigned rm = ExtractDRegister(instr, 5, 0);
  25437                               // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
  25438                               vmla(CurrentCond(),
  25439                                    dt,
  25440                                    DRegister(rd),
  25441                                    DRegister(rn),
  25442                                    DRegister(rm));
  25443                               break;
  25444                             }
  25445                             case 0x10000000: {
  25446                               // 0xff000900
  25447                               DataType dt =
  25448                                   Dt_size_10_Decode((instr >> 20) & 0x3);
  25449                               if (dt.Is(kDataTypeValueInvalid)) {
  25450                                 UnallocatedT32(instr);
  25451                                 return;
  25452                               }
  25453                               unsigned rd = ExtractDRegister(instr, 22, 12);
  25454                               unsigned rn = ExtractDRegister(instr, 7, 16);
  25455                               unsigned rm = ExtractDRegister(instr, 5, 0);
  25456                               // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
  25457                               vmls(CurrentCond(),
  25458                                    dt,
  25459                                    DRegister(rd),
  25460                                    DRegister(rn),
  25461                                    DRegister(rm));
  25462                               break;
  25463                             }
  25464                           }
  25465                           break;
  25466                         }
  25467                         case 0x00000940: {
  25468                           // 0xef000940
  25469                           switch (instr & 0x10000000) {
  25470                             case 0x00000000: {
  25471                               // 0xef000940
  25472                               DataType dt =
  25473                                   Dt_size_10_Decode((instr >> 20) & 0x3);
  25474                               if (dt.Is(kDataTypeValueInvalid)) {
  25475                                 UnallocatedT32(instr);
  25476                                 return;
  25477                               }
  25478                               if (((instr >> 12) & 1) != 0) {
  25479                                 UnallocatedT32(instr);
  25480                                 return;
  25481                               }
  25482                               unsigned rd = ExtractQRegister(instr, 22, 12);
  25483                               if (((instr >> 16) & 1) != 0) {
  25484                                 UnallocatedT32(instr);
  25485                                 return;
  25486                               }
  25487                               unsigned rn = ExtractQRegister(instr, 7, 16);
  25488                               if ((instr & 1) != 0) {
  25489                                 UnallocatedT32(instr);
  25490                                 return;
  25491                               }
  25492                               unsigned rm = ExtractQRegister(instr, 5, 0);
  25493                               // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
  25494                               vmla(CurrentCond(),
  25495                                    dt,
  25496                                    QRegister(rd),
  25497                                    QRegister(rn),
  25498                                    QRegister(rm));
  25499                               break;
  25500                             }
  25501                             case 0x10000000: {
  25502                               // 0xff000940
  25503                               DataType dt =
  25504                                   Dt_size_10_Decode((instr >> 20) & 0x3);
  25505                               if (dt.Is(kDataTypeValueInvalid)) {
  25506                                 UnallocatedT32(instr);
  25507                                 return;
  25508                               }
  25509                               if (((instr >> 12) & 1) != 0) {
  25510                                 UnallocatedT32(instr);
  25511                                 return;
  25512                               }
  25513                               unsigned rd = ExtractQRegister(instr, 22, 12);
  25514                               if (((instr >> 16) & 1) != 0) {
  25515                                 UnallocatedT32(instr);
  25516                                 return;
  25517                               }
  25518                               unsigned rn = ExtractQRegister(instr, 7, 16);
  25519                               if ((instr & 1) != 0) {
  25520                                 UnallocatedT32(instr);
  25521                                 return;
  25522                               }
  25523                               unsigned rm = ExtractQRegister(instr, 5, 0);
  25524                               // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
  25525                               vmls(CurrentCond(),
  25526                                    dt,
  25527                                    QRegister(rd),
  25528                                    QRegister(rn),
  25529                                    QRegister(rm));
  25530                               break;
  25531                             }
  25532                           }
  25533                           break;
  25534                         }
  25535                         case 0x00000a00: {
  25536                           // 0xef000a00
  25537                           DataType dt = Dt_U_size_1_Decode(
  25538                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  25539                           if (dt.Is(kDataTypeValueInvalid)) {
  25540                             UnallocatedT32(instr);
  25541                             return;
  25542                           }
  25543                           unsigned rd = ExtractDRegister(instr, 22, 12);
  25544                           unsigned rn = ExtractDRegister(instr, 7, 16);
  25545                           unsigned rm = ExtractDRegister(instr, 5, 0);
  25546                           // VPMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  25547                           vpmax(CurrentCond(),
  25548                                 dt,
  25549                                 DRegister(rd),
  25550                                 DRegister(rn),
  25551                                 DRegister(rm));
  25552                           break;
  25553                         }
  25554                         case 0x00000b00: {
  25555                           // 0xef000b00
  25556                           switch (instr & 0x10000000) {
  25557                             case 0x00000000: {
  25558                               // 0xef000b00
  25559                               DataType dt =
  25560                                   Dt_size_13_Decode((instr >> 20) & 0x3);
  25561                               if (dt.Is(kDataTypeValueInvalid)) {
  25562                                 UnallocatedT32(instr);
  25563                                 return;
  25564                               }
  25565                               unsigned rd = ExtractDRegister(instr, 22, 12);
  25566                               unsigned rn = ExtractDRegister(instr, 7, 16);
  25567                               unsigned rm = ExtractDRegister(instr, 5, 0);
  25568                               // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  25569                               vqdmulh(CurrentCond(),
  25570                                       dt,
  25571                                       DRegister(rd),
  25572                                       DRegister(rn),
  25573                                       DRegister(rm));
  25574                               break;
  25575                             }
  25576                             case 0x10000000: {
  25577                               // 0xff000b00
  25578                               DataType dt =
  25579                                   Dt_size_13_Decode((instr >> 20) & 0x3);
  25580                               if (dt.Is(kDataTypeValueInvalid)) {
  25581                                 UnallocatedT32(instr);
  25582                                 return;
  25583                               }
  25584                               unsigned rd = ExtractDRegister(instr, 22, 12);
  25585                               unsigned rn = ExtractDRegister(instr, 7, 16);
  25586                               unsigned rm = ExtractDRegister(instr, 5, 0);
  25587                               // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  25588                               vqrdmulh(CurrentCond(),
  25589                                        dt,
  25590                                        DRegister(rd),
  25591                                        DRegister(rn),
  25592                                        DRegister(rm));
  25593                               break;
  25594                             }
  25595                           }
  25596                           break;
  25597                         }
  25598                         case 0x00000b40: {
  25599                           // 0xef000b40
  25600                           switch (instr & 0x10000000) {
  25601                             case 0x00000000: {
  25602                               // 0xef000b40
  25603                               DataType dt =
  25604                                   Dt_size_13_Decode((instr >> 20) & 0x3);
  25605                               if (dt.Is(kDataTypeValueInvalid)) {
  25606                                 UnallocatedT32(instr);
  25607                                 return;
  25608                               }
  25609                               if (((instr >> 12) & 1) != 0) {
  25610                                 UnallocatedT32(instr);
  25611                                 return;
  25612                               }
  25613                               unsigned rd = ExtractQRegister(instr, 22, 12);
  25614                               if (((instr >> 16) & 1) != 0) {
  25615                                 UnallocatedT32(instr);
  25616                                 return;
  25617                               }
  25618                               unsigned rn = ExtractQRegister(instr, 7, 16);
  25619                               if ((instr & 1) != 0) {
  25620                                 UnallocatedT32(instr);
  25621                                 return;
  25622                               }
  25623                               unsigned rm = ExtractQRegister(instr, 5, 0);
  25624                               // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
  25625                               vqdmulh(CurrentCond(),
  25626                                       dt,
  25627                                       QRegister(rd),
  25628                                       QRegister(rn),
  25629                                       QRegister(rm));
  25630                               break;
  25631                             }
  25632                             case 0x10000000: {
  25633                               // 0xff000b40
  25634                               DataType dt =
  25635                                   Dt_size_13_Decode((instr >> 20) & 0x3);
  25636                               if (dt.Is(kDataTypeValueInvalid)) {
  25637                                 UnallocatedT32(instr);
  25638                                 return;
  25639                               }
  25640                               if (((instr >> 12) & 1) != 0) {
  25641                                 UnallocatedT32(instr);
  25642                                 return;
  25643                               }
  25644                               unsigned rd = ExtractQRegister(instr, 22, 12);
  25645                               if (((instr >> 16) & 1) != 0) {
  25646                                 UnallocatedT32(instr);
  25647                                 return;
  25648                               }
  25649                               unsigned rn = ExtractQRegister(instr, 7, 16);
  25650                               if ((instr & 1) != 0) {
  25651                                 UnallocatedT32(instr);
  25652                                 return;
  25653                               }
  25654                               unsigned rm = ExtractQRegister(instr, 5, 0);
  25655                               // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
  25656                               vqrdmulh(CurrentCond(),
  25657                                        dt,
  25658                                        QRegister(rd),
  25659                                        QRegister(rn),
  25660                                        QRegister(rm));
  25661                               break;
  25662                             }
  25663                           }
  25664                           break;
  25665                         }
  25666                         case 0x00000c40: {
  25667                           // 0xef000c40
  25668                           switch (instr & 0x10300000) {
  25669                             case 0x00000000: {
  25670                               // 0xef000c40
  25671                               UnimplementedT32_32("SHA1C", instr);
  25672                               break;
  25673                             }
  25674                             case 0x00100000: {
  25675                               // 0xef100c40
  25676                               UnimplementedT32_32("SHA1P", instr);
  25677                               break;
  25678                             }
  25679                             case 0x00200000: {
  25680                               // 0xef200c40
  25681                               UnimplementedT32_32("SHA1M", instr);
  25682                               break;
  25683                             }
  25684                             case 0x00300000: {
  25685                               // 0xef300c40
  25686                               UnimplementedT32_32("SHA1SU0", instr);
  25687                               break;
  25688                             }
  25689                             case 0x10000000: {
  25690                               // 0xff000c40
  25691                               UnimplementedT32_32("SHA256H", instr);
  25692                               break;
  25693                             }
  25694                             case 0x10100000: {
  25695                               // 0xff100c40
  25696                               UnimplementedT32_32("SHA256H2", instr);
  25697                               break;
  25698                             }
  25699                             case 0x10200000: {
  25700                               // 0xff200c40
  25701                               UnimplementedT32_32("SHA256SU1", instr);
  25702                               break;
  25703                             }
  25704                             default:
  25705                               UnallocatedT32(instr);
  25706                               break;
  25707                           }
  25708                           break;
  25709                         }
  25710                         case 0x00000d00: {
  25711                           // 0xef000d00
  25712                           switch (instr & 0x10300000) {
  25713                             case 0x00000000: {
  25714                               // 0xef000d00
  25715                               unsigned rd = ExtractDRegister(instr, 22, 12);
  25716                               unsigned rn = ExtractDRegister(instr, 7, 16);
  25717                               unsigned rm = ExtractDRegister(instr, 5, 0);
  25718                               // VADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
  25719                               vadd(CurrentCond(),
  25720                                    F32,
  25721                                    DRegister(rd),
  25722                                    DRegister(rn),
  25723                                    DRegister(rm));
  25724                               break;
  25725                             }
  25726                             case 0x00200000: {
  25727                               // 0xef200d00
  25728                               unsigned rd = ExtractDRegister(instr, 22, 12);
  25729                               unsigned rn = ExtractDRegister(instr, 7, 16);
  25730                               unsigned rm = ExtractDRegister(instr, 5, 0);
  25731                               // VSUB{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
  25732                               vsub(CurrentCond(),
  25733                                    F32,
  25734                                    DRegister(rd),
  25735                                    DRegister(rn),
  25736                                    DRegister(rm));
  25737                               break;
  25738                             }
  25739                             case 0x10000000: {
  25740                               // 0xff000d00
  25741                               unsigned rd = ExtractDRegister(instr, 22, 12);
  25742                               unsigned rn = ExtractDRegister(instr, 7, 16);
  25743                               unsigned rm = ExtractDRegister(instr, 5, 0);
  25744                               // VPADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
  25745                               vpadd(CurrentCond(),
  25746                                     F32,
  25747                                     DRegister(rd),
  25748                                     DRegister(rn),
  25749                                     DRegister(rm));
  25750                               break;
  25751                             }
  25752                             case 0x10200000: {
  25753                               // 0xff200d00
  25754                               unsigned rd = ExtractDRegister(instr, 22, 12);
  25755                               unsigned rn = ExtractDRegister(instr, 7, 16);
  25756                               unsigned rm = ExtractDRegister(instr, 5, 0);
  25757                               // VABD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
  25758                               vabd(CurrentCond(),
  25759                                    F32,
  25760                                    DRegister(rd),
  25761                                    DRegister(rn),
  25762                                    DRegister(rm));
  25763                               break;
  25764                             }
  25765                             default:
  25766                               UnallocatedT32(instr);
  25767                               break;
  25768                           }
  25769                           break;
  25770                         }
  25771                         case 0x00000d40: {
  25772                           // 0xef000d40
  25773                           switch (instr & 0x10300000) {
  25774                             case 0x00000000: {
  25775                               // 0xef000d40
  25776                               if (((instr >> 12) & 1) != 0) {
  25777                                 UnallocatedT32(instr);
  25778                                 return;
  25779                               }
  25780                               unsigned rd = ExtractQRegister(instr, 22, 12);
  25781                               if (((instr >> 16) & 1) != 0) {
  25782                                 UnallocatedT32(instr);
  25783                                 return;
  25784                               }
  25785                               unsigned rn = ExtractQRegister(instr, 7, 16);
  25786                               if ((instr & 1) != 0) {
  25787                                 UnallocatedT32(instr);
  25788                                 return;
  25789                               }
  25790                               unsigned rm = ExtractQRegister(instr, 5, 0);
  25791                               // VADD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
  25792                               vadd(CurrentCond(),
  25793                                    F32,
  25794                                    QRegister(rd),
  25795                                    QRegister(rn),
  25796                                    QRegister(rm));
  25797                               break;
  25798                             }
  25799                             case 0x00200000: {
  25800                               // 0xef200d40
  25801                               if (((instr >> 12) & 1) != 0) {
  25802                                 UnallocatedT32(instr);
  25803                                 return;
  25804                               }
  25805                               unsigned rd = ExtractQRegister(instr, 22, 12);
  25806                               if (((instr >> 16) & 1) != 0) {
  25807                                 UnallocatedT32(instr);
  25808                                 return;
  25809                               }
  25810                               unsigned rn = ExtractQRegister(instr, 7, 16);
  25811                               if ((instr & 1) != 0) {
  25812                                 UnallocatedT32(instr);
  25813                                 return;
  25814                               }
  25815                               unsigned rm = ExtractQRegister(instr, 5, 0);
  25816                               // VSUB{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
  25817                               vsub(CurrentCond(),
  25818                                    F32,
  25819                                    QRegister(rd),
  25820                                    QRegister(rn),
  25821                                    QRegister(rm));
  25822                               break;
  25823                             }
  25824                             case 0x10200000: {
  25825                               // 0xff200d40
  25826                               if (((instr >> 12) & 1) != 0) {
  25827                                 UnallocatedT32(instr);
  25828                                 return;
  25829                               }
  25830                               unsigned rd = ExtractQRegister(instr, 22, 12);
  25831                               if (((instr >> 16) & 1) != 0) {
  25832                                 UnallocatedT32(instr);
  25833                                 return;
  25834                               }
  25835                               unsigned rn = ExtractQRegister(instr, 7, 16);
  25836                               if ((instr & 1) != 0) {
  25837                                 UnallocatedT32(instr);
  25838                                 return;
  25839                               }
  25840                               unsigned rm = ExtractQRegister(instr, 5, 0);
  25841                               // VABD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
  25842                               vabd(CurrentCond(),
  25843                                    F32,
  25844                                    QRegister(rd),
  25845                                    QRegister(rn),
  25846                                    QRegister(rm));
  25847                               break;
  25848                             }
  25849                             default:
  25850                               UnallocatedT32(instr);
  25851                               break;
  25852                           }
  25853                           break;
  25854                         }
  25855                         case 0x00000e00: {
  25856                           // 0xef000e00
  25857                           switch (instr & 0x10200000) {
  25858                             case 0x00000000: {
  25859                               // 0xef000e00
  25860                               DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
  25861                               if (dt.Is(kDataTypeValueInvalid)) {
  25862                                 UnallocatedT32(instr);
  25863                                 return;
  25864                               }
  25865                               unsigned rd = ExtractDRegister(instr, 22, 12);
  25866                               unsigned rn = ExtractDRegister(instr, 7, 16);
  25867                               unsigned rm = ExtractDRegister(instr, 5, 0);
  25868                               // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T2
  25869                               vceq(CurrentCond(),
  25870                                    dt,
  25871                                    DRegister(rd),
  25872                                    DRegister(rn),
  25873                                    DRegister(rm));
  25874                               break;
  25875                             }
  25876                             case 0x10000000: {
  25877                               // 0xff000e00
  25878                               if ((instr & 0x00100000) == 0x00000000) {
  25879                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  25880                                 unsigned rn = ExtractDRegister(instr, 7, 16);
  25881                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  25882                                 // VCGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T2
  25883                                 vcge(CurrentCond(),
  25884                                      F32,
  25885                                      DRegister(rd),
  25886                                      DRegister(rn),
  25887                                      DRegister(rm));
  25888                               } else {
  25889                                 UnallocatedT32(instr);
  25890                               }
  25891                               break;
  25892                             }
  25893                             case 0x10200000: {
  25894                               // 0xff200e00
  25895                               if ((instr & 0x00100000) == 0x00000000) {
  25896                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  25897                                 unsigned rn = ExtractDRegister(instr, 7, 16);
  25898                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  25899                                 // VCGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T2
  25900                                 vcgt(CurrentCond(),
  25901                                      F32,
  25902                                      DRegister(rd),
  25903                                      DRegister(rn),
  25904                                      DRegister(rm));
  25905                               } else {
  25906                                 UnallocatedT32(instr);
  25907                               }
  25908                               break;
  25909                             }
  25910                             default:
  25911                               UnallocatedT32(instr);
  25912                               break;
  25913                           }
  25914                           break;
  25915                         }
  25916                         case 0x00000e40: {
  25917                           // 0xef000e40
  25918                           switch (instr & 0x10200000) {
  25919                             case 0x00000000: {
  25920                               // 0xef000e40
  25921                               DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
  25922                               if (dt.Is(kDataTypeValueInvalid)) {
  25923                                 UnallocatedT32(instr);
  25924                                 return;
  25925                               }
  25926                               if (((instr >> 12) & 1) != 0) {
  25927                                 UnallocatedT32(instr);
  25928                                 return;
  25929                               }
  25930                               unsigned rd = ExtractQRegister(instr, 22, 12);
  25931                               if (((instr >> 16) & 1) != 0) {
  25932                                 UnallocatedT32(instr);
  25933                                 return;
  25934                               }
  25935                               unsigned rn = ExtractQRegister(instr, 7, 16);
  25936                               if ((instr & 1) != 0) {
  25937                                 UnallocatedT32(instr);
  25938                                 return;
  25939                               }
  25940                               unsigned rm = ExtractQRegister(instr, 5, 0);
  25941                               // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T2
  25942                               vceq(CurrentCond(),
  25943                                    dt,
  25944                                    QRegister(rd),
  25945                                    QRegister(rn),
  25946                                    QRegister(rm));
  25947                               break;
  25948                             }
  25949                             case 0x10000000: {
  25950                               // 0xff000e40
  25951                               if ((instr & 0x00100000) == 0x00000000) {
  25952                                 if (((instr >> 12) & 1) != 0) {
  25953                                   UnallocatedT32(instr);
  25954                                   return;
  25955                                 }
  25956                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  25957                                 if (((instr >> 16) & 1) != 0) {
  25958                                   UnallocatedT32(instr);
  25959                                   return;
  25960                                 }
  25961                                 unsigned rn = ExtractQRegister(instr, 7, 16);
  25962                                 if ((instr & 1) != 0) {
  25963                                   UnallocatedT32(instr);
  25964                                   return;
  25965                                 }
  25966                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  25967                                 // VCGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T2
  25968                                 vcge(CurrentCond(),
  25969                                      F32,
  25970                                      QRegister(rd),
  25971                                      QRegister(rn),
  25972                                      QRegister(rm));
  25973                               } else {
  25974                                 UnallocatedT32(instr);
  25975                               }
  25976                               break;
  25977                             }
  25978                             case 0x10200000: {
  25979                               // 0xff200e40
  25980                               if ((instr & 0x00100000) == 0x00000000) {
  25981                                 if (((instr >> 12) & 1) != 0) {
  25982                                   UnallocatedT32(instr);
  25983                                   return;
  25984                                 }
  25985                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  25986                                 if (((instr >> 16) & 1) != 0) {
  25987                                   UnallocatedT32(instr);
  25988                                   return;
  25989                                 }
  25990                                 unsigned rn = ExtractQRegister(instr, 7, 16);
  25991                                 if ((instr & 1) != 0) {
  25992                                   UnallocatedT32(instr);
  25993                                   return;
  25994                                 }
  25995                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  25996                                 // VCGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T2
  25997                                 vcgt(CurrentCond(),
  25998                                      F32,
  25999                                      QRegister(rd),
  26000                                      QRegister(rn),
  26001                                      QRegister(rm));
  26002                               } else {
  26003                                 UnallocatedT32(instr);
  26004                               }
  26005                               break;
  26006                             }
  26007                             default:
  26008                               UnallocatedT32(instr);
  26009                               break;
  26010                           }
  26011                           break;
  26012                         }
  26013                         case 0x00000f00: {
  26014                           // 0xef000f00
  26015                           switch (instr & 0x10300000) {
  26016                             case 0x00000000: {
  26017                               // 0xef000f00
  26018                               unsigned rd = ExtractDRegister(instr, 22, 12);
  26019                               unsigned rn = ExtractDRegister(instr, 7, 16);
  26020                               unsigned rm = ExtractDRegister(instr, 5, 0);
  26021                               // VMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
  26022                               vmax(CurrentCond(),
  26023                                    F32,
  26024                                    DRegister(rd),
  26025                                    DRegister(rn),
  26026                                    DRegister(rm));
  26027                               break;
  26028                             }
  26029                             case 0x00200000: {
  26030                               // 0xef200f00
  26031                               unsigned rd = ExtractDRegister(instr, 22, 12);
  26032                               unsigned rn = ExtractDRegister(instr, 7, 16);
  26033                               unsigned rm = ExtractDRegister(instr, 5, 0);
  26034                               // VMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
  26035                               vmin(CurrentCond(),
  26036                                    F32,
  26037                                    DRegister(rd),
  26038                                    DRegister(rn),
  26039                                    DRegister(rm));
  26040                               break;
  26041                             }
  26042                             case 0x10000000: {
  26043                               // 0xff000f00
  26044                               unsigned rd = ExtractDRegister(instr, 22, 12);
  26045                               unsigned rn = ExtractDRegister(instr, 7, 16);
  26046                               unsigned rm = ExtractDRegister(instr, 5, 0);
  26047                               // VPMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
  26048                               vpmax(CurrentCond(),
  26049                                     F32,
  26050                                     DRegister(rd),
  26051                                     DRegister(rn),
  26052                                     DRegister(rm));
  26053                               break;
  26054                             }
  26055                             case 0x10200000: {
  26056                               // 0xff200f00
  26057                               unsigned rd = ExtractDRegister(instr, 22, 12);
  26058                               unsigned rn = ExtractDRegister(instr, 7, 16);
  26059                               unsigned rm = ExtractDRegister(instr, 5, 0);
  26060                               // VPMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
  26061                               vpmin(CurrentCond(),
  26062                                     F32,
  26063                                     DRegister(rd),
  26064                                     DRegister(rn),
  26065                                     DRegister(rm));
  26066                               break;
  26067                             }
  26068                             default:
  26069                               UnallocatedT32(instr);
  26070                               break;
  26071                           }
  26072                           break;
  26073                         }
  26074                         case 0x00000f40: {
  26075                           // 0xef000f40
  26076                           switch (instr & 0x10300000) {
  26077                             case 0x00000000: {
  26078                               // 0xef000f40
  26079                               if (((instr >> 12) & 1) != 0) {
  26080                                 UnallocatedT32(instr);
  26081                                 return;
  26082                               }
  26083                               unsigned rd = ExtractQRegister(instr, 22, 12);
  26084                               if (((instr >> 16) & 1) != 0) {
  26085                                 UnallocatedT32(instr);
  26086                                 return;
  26087                               }
  26088                               unsigned rn = ExtractQRegister(instr, 7, 16);
  26089                               if ((instr & 1) != 0) {
  26090                                 UnallocatedT32(instr);
  26091                                 return;
  26092                               }
  26093                               unsigned rm = ExtractQRegister(instr, 5, 0);
  26094                               // VMAX{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
  26095                               vmax(CurrentCond(),
  26096                                    F32,
  26097                                    QRegister(rd),
  26098                                    QRegister(rn),
  26099                                    QRegister(rm));
  26100                               break;
  26101                             }
  26102                             case 0x00200000: {
  26103                               // 0xef200f40
  26104                               if (((instr >> 12) & 1) != 0) {
  26105                                 UnallocatedT32(instr);
  26106                                 return;
  26107                               }
  26108                               unsigned rd = ExtractQRegister(instr, 22, 12);
  26109                               if (((instr >> 16) & 1) != 0) {
  26110                                 UnallocatedT32(instr);
  26111                                 return;
  26112                               }
  26113                               unsigned rn = ExtractQRegister(instr, 7, 16);
  26114                               if ((instr & 1) != 0) {
  26115                                 UnallocatedT32(instr);
  26116                                 return;
  26117                               }
  26118                               unsigned rm = ExtractQRegister(instr, 5, 0);
  26119                               // VMIN{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
  26120                               vmin(CurrentCond(),
  26121                                    F32,
  26122                                    QRegister(rd),
  26123                                    QRegister(rn),
  26124                                    QRegister(rm));
  26125                               break;
  26126                             }
  26127                             default:
  26128                               UnallocatedT32(instr);
  26129                               break;
  26130                           }
  26131                           break;
  26132                         }
  26133                         default:
  26134                           UnallocatedT32(instr);
  26135                           break;
  26136                       }
  26137                       break;
  26138                     }
  26139                     case 0x00800000: {
  26140                       // 0xef800000
  26141                       switch (instr & 0x00300000) {
  26142                         case 0x00300000: {
  26143                           // 0xefb00000
  26144                           switch (instr & 0x10000000) {
  26145                             case 0x00000000: {
  26146                               // 0xefb00000
  26147                               switch (instr & 0x00000040) {
  26148                                 case 0x00000000: {
  26149                                   // 0xefb00000
  26150                                   if (((instr & 0x800) == 0x800)) {
  26151                                     UnallocatedT32(instr);
  26152                                     return;
  26153                                   }
  26154                                   unsigned rd = ExtractDRegister(instr, 22, 12);
  26155                                   unsigned rn = ExtractDRegister(instr, 7, 16);
  26156                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  26157                                   uint32_t imm = (instr >> 8) & 0xf;
  26158                                   // VEXT{<c>}{<q>}.8 {<Dd>}, <Dn>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  26159                                   vext(CurrentCond(),
  26160                                        Untyped8,
  26161                                        DRegister(rd),
  26162                                        DRegister(rn),
  26163                                        DRegister(rm),
  26164                                        imm);
  26165                                   break;
  26166                                 }
  26167                                 case 0x00000040: {
  26168                                   // 0xefb00040
  26169                                   if (((instr >> 12) & 1) != 0) {
  26170                                     UnallocatedT32(instr);
  26171                                     return;
  26172                                   }
  26173                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  26174                                   if (((instr >> 16) & 1) != 0) {
  26175                                     UnallocatedT32(instr);
  26176                                     return;
  26177                                   }
  26178                                   unsigned rn = ExtractQRegister(instr, 7, 16);
  26179                                   if ((instr & 1) != 0) {
  26180                                     UnallocatedT32(instr);
  26181                                     return;
  26182                                   }
  26183                                   unsigned rm = ExtractQRegister(instr, 5, 0);
  26184                                   uint32_t imm = (instr >> 8) & 0xf;
  26185                                   // VEXT{<c>}{<q>}.8 {<Qd>}, <Qn>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  26186                                   vext(CurrentCond(),
  26187                                        Untyped8,
  26188                                        QRegister(rd),
  26189                                        QRegister(rn),
  26190                                        QRegister(rm),
  26191                                        imm);
  26192                                   break;
  26193                                 }
  26194                               }
  26195                               break;
  26196                             }
  26197                             case 0x10000000: {
  26198                               // 0xffb00000
  26199                               switch (instr & 0x00000800) {
  26200                                 case 0x00000000: {
  26201                                   // 0xffb00000
  26202                                   switch (instr & 0x00030200) {
  26203                                     case 0x00000000: {
  26204                                       // 0xffb00000
  26205                                       switch (instr & 0x000005c0) {
  26206                                         case 0x00000000: {
  26207                                           // 0xffb00000
  26208                                           DataType dt = Dt_size_7_Decode(
  26209                                               (instr >> 18) & 0x3);
  26210                                           if (dt.Is(kDataTypeValueInvalid)) {
  26211                                             UnallocatedT32(instr);
  26212                                             return;
  26213                                           }
  26214                                           unsigned rd =
  26215                                               ExtractDRegister(instr, 22, 12);
  26216                                           unsigned rm =
  26217                                               ExtractDRegister(instr, 5, 0);
  26218                                           // VREV64{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  26219                                           vrev64(CurrentCond(),
  26220                                                  dt,
  26221                                                  DRegister(rd),
  26222                                                  DRegister(rm));
  26223                                           break;
  26224                                         }
  26225                                         case 0x00000040: {
  26226                                           // 0xffb00040
  26227                                           DataType dt = Dt_size_7_Decode(
  26228                                               (instr >> 18) & 0x3);
  26229                                           if (dt.Is(kDataTypeValueInvalid)) {
  26230                                             UnallocatedT32(instr);
  26231                                             return;
  26232                                           }
  26233                                           if (((instr >> 12) & 1) != 0) {
  26234                                             UnallocatedT32(instr);
  26235                                             return;
  26236                                           }
  26237                                           unsigned rd =
  26238                                               ExtractQRegister(instr, 22, 12);
  26239                                           if ((instr & 1) != 0) {
  26240                                             UnallocatedT32(instr);
  26241                                             return;
  26242                                           }
  26243                                           unsigned rm =
  26244                                               ExtractQRegister(instr, 5, 0);
  26245                                           // VREV64{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  26246                                           vrev64(CurrentCond(),
  26247                                                  dt,
  26248                                                  QRegister(rd),
  26249                                                  QRegister(rm));
  26250                                           break;
  26251                                         }
  26252                                         case 0x00000080: {
  26253                                           // 0xffb00080
  26254                                           DataType dt = Dt_size_15_Decode(
  26255                                               (instr >> 18) & 0x3);
  26256                                           if (dt.Is(kDataTypeValueInvalid)) {
  26257                                             UnallocatedT32(instr);
  26258                                             return;
  26259                                           }
  26260                                           unsigned rd =
  26261                                               ExtractDRegister(instr, 22, 12);
  26262                                           unsigned rm =
  26263                                               ExtractDRegister(instr, 5, 0);
  26264                                           // VREV32{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  26265                                           vrev32(CurrentCond(),
  26266                                                  dt,
  26267                                                  DRegister(rd),
  26268                                                  DRegister(rm));
  26269                                           break;
  26270                                         }
  26271                                         case 0x000000c0: {
  26272                                           // 0xffb000c0
  26273                                           DataType dt = Dt_size_15_Decode(
  26274                                               (instr >> 18) & 0x3);
  26275                                           if (dt.Is(kDataTypeValueInvalid)) {
  26276                                             UnallocatedT32(instr);
  26277                                             return;
  26278                                           }
  26279                                           if (((instr >> 12) & 1) != 0) {
  26280                                             UnallocatedT32(instr);
  26281                                             return;
  26282                                           }
  26283                                           unsigned rd =
  26284                                               ExtractQRegister(instr, 22, 12);
  26285                                           if ((instr & 1) != 0) {
  26286                                             UnallocatedT32(instr);
  26287                                             return;
  26288                                           }
  26289                                           unsigned rm =
  26290                                               ExtractQRegister(instr, 5, 0);
  26291                                           // VREV32{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  26292                                           vrev32(CurrentCond(),
  26293                                                  dt,
  26294                                                  QRegister(rd),
  26295                                                  QRegister(rm));
  26296                                           break;
  26297                                         }
  26298                                         case 0x00000100: {
  26299                                           // 0xffb00100
  26300                                           DataType dt = Dt_size_1_Decode(
  26301                                               (instr >> 18) & 0x3);
  26302                                           if (dt.Is(kDataTypeValueInvalid)) {
  26303                                             UnallocatedT32(instr);
  26304                                             return;
  26305                                           }
  26306                                           unsigned rd =
  26307                                               ExtractDRegister(instr, 22, 12);
  26308                                           unsigned rm =
  26309                                               ExtractDRegister(instr, 5, 0);
  26310                                           // VREV16{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  26311                                           vrev16(CurrentCond(),
  26312                                                  dt,
  26313                                                  DRegister(rd),
  26314                                                  DRegister(rm));
  26315                                           break;
  26316                                         }
  26317                                         case 0x00000140: {
  26318                                           // 0xffb00140
  26319                                           DataType dt = Dt_size_1_Decode(
  26320                                               (instr >> 18) & 0x3);
  26321                                           if (dt.Is(kDataTypeValueInvalid)) {
  26322                                             UnallocatedT32(instr);
  26323                                             return;
  26324                                           }
  26325                                           if (((instr >> 12) & 1) != 0) {
  26326                                             UnallocatedT32(instr);
  26327                                             return;
  26328                                           }
  26329                                           unsigned rd =
  26330                                               ExtractQRegister(instr, 22, 12);
  26331                                           if ((instr & 1) != 0) {
  26332                                             UnallocatedT32(instr);
  26333                                             return;
  26334                                           }
  26335                                           unsigned rm =
  26336                                               ExtractQRegister(instr, 5, 0);
  26337                                           // VREV16{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  26338                                           vrev16(CurrentCond(),
  26339                                                  dt,
  26340                                                  QRegister(rd),
  26341                                                  QRegister(rm));
  26342                                           break;
  26343                                         }
  26344                                         case 0x00000400: {
  26345                                           // 0xffb00400
  26346                                           DataType dt = Dt_size_5_Decode(
  26347                                               (instr >> 18) & 0x3);
  26348                                           if (dt.Is(kDataTypeValueInvalid)) {
  26349                                             UnallocatedT32(instr);
  26350                                             return;
  26351                                           }
  26352                                           unsigned rd =
  26353                                               ExtractDRegister(instr, 22, 12);
  26354                                           unsigned rm =
  26355                                               ExtractDRegister(instr, 5, 0);
  26356                                           // VCLS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
  26357                                           vcls(CurrentCond(),
  26358                                                dt,
  26359                                                DRegister(rd),
  26360                                                DRegister(rm));
  26361                                           break;
  26362                                         }
  26363                                         case 0x00000440: {
  26364                                           // 0xffb00440
  26365                                           DataType dt = Dt_size_5_Decode(
  26366                                               (instr >> 18) & 0x3);
  26367                                           if (dt.Is(kDataTypeValueInvalid)) {
  26368                                             UnallocatedT32(instr);
  26369                                             return;
  26370                                           }
  26371                                           if (((instr >> 12) & 1) != 0) {
  26372                                             UnallocatedT32(instr);
  26373                                             return;
  26374                                           }
  26375                                           unsigned rd =
  26376                                               ExtractQRegister(instr, 22, 12);
  26377                                           if ((instr & 1) != 0) {
  26378                                             UnallocatedT32(instr);
  26379                                             return;
  26380                                           }
  26381                                           unsigned rm =
  26382                                               ExtractQRegister(instr, 5, 0);
  26383                                           // VCLS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
  26384                                           vcls(CurrentCond(),
  26385                                                dt,
  26386                                                QRegister(rd),
  26387                                                QRegister(rm));
  26388                                           break;
  26389                                         }
  26390                                         case 0x00000480: {
  26391                                           // 0xffb00480
  26392                                           DataType dt = Dt_size_4_Decode(
  26393                                               (instr >> 18) & 0x3);
  26394                                           if (dt.Is(kDataTypeValueInvalid)) {
  26395                                             UnallocatedT32(instr);
  26396                                             return;
  26397                                           }
  26398                                           unsigned rd =
  26399                                               ExtractDRegister(instr, 22, 12);
  26400                                           unsigned rm =
  26401                                               ExtractDRegister(instr, 5, 0);
  26402                                           // VCLZ{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
  26403                                           vclz(CurrentCond(),
  26404                                                dt,
  26405                                                DRegister(rd),
  26406                                                DRegister(rm));
  26407                                           break;
  26408                                         }
  26409                                         case 0x000004c0: {
  26410                                           // 0xffb004c0
  26411                                           DataType dt = Dt_size_4_Decode(
  26412                                               (instr >> 18) & 0x3);
  26413                                           if (dt.Is(kDataTypeValueInvalid)) {
  26414                                             UnallocatedT32(instr);
  26415                                             return;
  26416                                           }
  26417                                           if (((instr >> 12) & 1) != 0) {
  26418                                             UnallocatedT32(instr);
  26419                                             return;
  26420                                           }
  26421                                           unsigned rd =
  26422                                               ExtractQRegister(instr, 22, 12);
  26423                                           if ((instr & 1) != 0) {
  26424                                             UnallocatedT32(instr);
  26425                                             return;
  26426                                           }
  26427                                           unsigned rm =
  26428                                               ExtractQRegister(instr, 5, 0);
  26429                                           // VCLZ{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
  26430                                           vclz(CurrentCond(),
  26431                                                dt,
  26432                                                QRegister(rd),
  26433                                                QRegister(rm));
  26434                                           break;
  26435                                         }
  26436                                         case 0x00000500: {
  26437                                           // 0xffb00500
  26438                                           if ((instr & 0x000c0000) ==
  26439                                               0x00000000) {
  26440                                             unsigned rd =
  26441                                                 ExtractDRegister(instr, 22, 12);
  26442                                             unsigned rm =
  26443                                                 ExtractDRegister(instr, 5, 0);
  26444                                             // VCNT{<c>}{<q>}.8 <Dd>, <Dm> ; T1
  26445                                             vcnt(CurrentCond(),
  26446                                                  Untyped8,
  26447                                                  DRegister(rd),
  26448                                                  DRegister(rm));
  26449                                           } else {
  26450                                             UnallocatedT32(instr);
  26451                                           }
  26452                                           break;
  26453                                         }
  26454                                         case 0x00000540: {
  26455                                           // 0xffb00540
  26456                                           if ((instr & 0x000c0000) ==
  26457                                               0x00000000) {
  26458                                             if (((instr >> 12) & 1) != 0) {
  26459                                               UnallocatedT32(instr);
  26460                                               return;
  26461                                             }
  26462                                             unsigned rd =
  26463                                                 ExtractQRegister(instr, 22, 12);
  26464                                             if ((instr & 1) != 0) {
  26465                                               UnallocatedT32(instr);
  26466                                               return;
  26467                                             }
  26468                                             unsigned rm =
  26469                                                 ExtractQRegister(instr, 5, 0);
  26470                                             // VCNT{<c>}{<q>}.8 <Qd>, <Qm> ; T1
  26471                                             vcnt(CurrentCond(),
  26472                                                  Untyped8,
  26473                                                  QRegister(rd),
  26474                                                  QRegister(rm));
  26475                                           } else {
  26476                                             UnallocatedT32(instr);
  26477                                           }
  26478                                           break;
  26479                                         }
  26480                                         case 0x00000580: {
  26481                                           // 0xffb00580
  26482                                           if ((instr & 0x000c0000) ==
  26483                                               0x00000000) {
  26484                                             unsigned rd =
  26485                                                 ExtractDRegister(instr, 22, 12);
  26486                                             unsigned rm =
  26487                                                 ExtractDRegister(instr, 5, 0);
  26488                                             // VMVN{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  26489                                             vmvn(CurrentCond(),
  26490                                                  kDataTypeValueNone,
  26491                                                  DRegister(rd),
  26492                                                  DRegister(rm));
  26493                                           } else {
  26494                                             UnallocatedT32(instr);
  26495                                           }
  26496                                           break;
  26497                                         }
  26498                                         case 0x000005c0: {
  26499                                           // 0xffb005c0
  26500                                           if ((instr & 0x000c0000) ==
  26501                                               0x00000000) {
  26502                                             if (((instr >> 12) & 1) != 0) {
  26503                                               UnallocatedT32(instr);
  26504                                               return;
  26505                                             }
  26506                                             unsigned rd =
  26507                                                 ExtractQRegister(instr, 22, 12);
  26508                                             if ((instr & 1) != 0) {
  26509                                               UnallocatedT32(instr);
  26510                                               return;
  26511                                             }
  26512                                             unsigned rm =
  26513                                                 ExtractQRegister(instr, 5, 0);
  26514                                             // VMVN{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  26515                                             vmvn(CurrentCond(),
  26516                                                  kDataTypeValueNone,
  26517                                                  QRegister(rd),
  26518                                                  QRegister(rm));
  26519                                           } else {
  26520                                             UnallocatedT32(instr);
  26521                                           }
  26522                                           break;
  26523                                         }
  26524                                         default:
  26525                                           UnallocatedT32(instr);
  26526                                           break;
  26527                                       }
  26528                                       break;
  26529                                     }
  26530                                     case 0x00000200: {
  26531                                       // 0xffb00200
  26532                                       switch (instr & 0x00000540) {
  26533                                         case 0x00000000: {
  26534                                           // 0xffb00200
  26535                                           DataType dt = Dt_op_size_2_Decode(
  26536                                               ((instr >> 18) & 0x3) |
  26537                                               ((instr >> 5) & 0x4));
  26538                                           if (dt.Is(kDataTypeValueInvalid)) {
  26539                                             UnallocatedT32(instr);
  26540                                             return;
  26541                                           }
  26542                                           unsigned rd =
  26543                                               ExtractDRegister(instr, 22, 12);
  26544                                           unsigned rm =
  26545                                               ExtractDRegister(instr, 5, 0);
  26546                                           // VPADDL{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  26547                                           vpaddl(CurrentCond(),
  26548                                                  dt,
  26549                                                  DRegister(rd),
  26550                                                  DRegister(rm));
  26551                                           break;
  26552                                         }
  26553                                         case 0x00000040: {
  26554                                           // 0xffb00240
  26555                                           DataType dt = Dt_op_size_2_Decode(
  26556                                               ((instr >> 18) & 0x3) |
  26557                                               ((instr >> 5) & 0x4));
  26558                                           if (dt.Is(kDataTypeValueInvalid)) {
  26559                                             UnallocatedT32(instr);
  26560                                             return;
  26561                                           }
  26562                                           if (((instr >> 12) & 1) != 0) {
  26563                                             UnallocatedT32(instr);
  26564                                             return;
  26565                                           }
  26566                                           unsigned rd =
  26567                                               ExtractQRegister(instr, 22, 12);
  26568                                           if ((instr & 1) != 0) {
  26569                                             UnallocatedT32(instr);
  26570                                             return;
  26571                                           }
  26572                                           unsigned rm =
  26573                                               ExtractQRegister(instr, 5, 0);
  26574                                           // VPADDL{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  26575                                           vpaddl(CurrentCond(),
  26576                                                  dt,
  26577                                                  QRegister(rd),
  26578                                                  QRegister(rm));
  26579                                           break;
  26580                                         }
  26581                                         case 0x00000100: {
  26582                                           // 0xffb00300
  26583                                           switch (instr & 0x00000080) {
  26584                                             case 0x00000000: {
  26585                                               // 0xffb00300
  26586                                               UnimplementedT32_32("AESE",
  26587                                                                   instr);
  26588                                               break;
  26589                                             }
  26590                                             case 0x00000080: {
  26591                                               // 0xffb00380
  26592                                               UnimplementedT32_32("AESMC",
  26593                                                                   instr);
  26594                                               break;
  26595                                             }
  26596                                           }
  26597                                           break;
  26598                                         }
  26599                                         case 0x00000140: {
  26600                                           // 0xffb00340
  26601                                           switch (instr & 0x00000080) {
  26602                                             case 0x00000000: {
  26603                                               // 0xffb00340
  26604                                               UnimplementedT32_32("AESD",
  26605                                                                   instr);
  26606                                               break;
  26607                                             }
  26608                                             case 0x00000080: {
  26609                                               // 0xffb003c0
  26610                                               UnimplementedT32_32("AESIMC",
  26611                                                                   instr);
  26612                                               break;
  26613                                             }
  26614                                           }
  26615                                           break;
  26616                                         }
  26617                                         case 0x00000400: {
  26618                                           // 0xffb00600
  26619                                           DataType dt = Dt_op_size_2_Decode(
  26620                                               ((instr >> 18) & 0x3) |
  26621                                               ((instr >> 5) & 0x4));
  26622                                           if (dt.Is(kDataTypeValueInvalid)) {
  26623                                             UnallocatedT32(instr);
  26624                                             return;
  26625                                           }
  26626                                           unsigned rd =
  26627                                               ExtractDRegister(instr, 22, 12);
  26628                                           unsigned rm =
  26629                                               ExtractDRegister(instr, 5, 0);
  26630                                           // VPADAL{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  26631                                           vpadal(CurrentCond(),
  26632                                                  dt,
  26633                                                  DRegister(rd),
  26634                                                  DRegister(rm));
  26635                                           break;
  26636                                         }
  26637                                         case 0x00000440: {
  26638                                           // 0xffb00640
  26639                                           DataType dt = Dt_op_size_2_Decode(
  26640                                               ((instr >> 18) & 0x3) |
  26641                                               ((instr >> 5) & 0x4));
  26642                                           if (dt.Is(kDataTypeValueInvalid)) {
  26643                                             UnallocatedT32(instr);
  26644                                             return;
  26645                                           }
  26646                                           if (((instr >> 12) & 1) != 0) {
  26647                                             UnallocatedT32(instr);
  26648                                             return;
  26649                                           }
  26650                                           unsigned rd =
  26651                                               ExtractQRegister(instr, 22, 12);
  26652                                           if ((instr & 1) != 0) {
  26653                                             UnallocatedT32(instr);
  26654                                             return;
  26655                                           }
  26656                                           unsigned rm =
  26657                                               ExtractQRegister(instr, 5, 0);
  26658                                           // VPADAL{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  26659                                           vpadal(CurrentCond(),
  26660                                                  dt,
  26661                                                  QRegister(rd),
  26662                                                  QRegister(rm));
  26663                                           break;
  26664                                         }
  26665                                         case 0x00000500: {
  26666                                           // 0xffb00700
  26667                                           switch (instr & 0x00000080) {
  26668                                             case 0x00000000: {
  26669                                               // 0xffb00700
  26670                                               DataType dt = Dt_size_5_Decode(
  26671                                                   (instr >> 18) & 0x3);
  26672                                               if (dt.Is(
  26673                                                       kDataTypeValueInvalid)) {
  26674                                                 UnallocatedT32(instr);
  26675                                                 return;
  26676                                               }
  26677                                               unsigned rd =
  26678                                                   ExtractDRegister(instr,
  26679                                                                    22,
  26680                                                                    12);
  26681                                               unsigned rm =
  26682                                                   ExtractDRegister(instr, 5, 0);
  26683                                               // VQABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  26684                                               vqabs(CurrentCond(),
  26685                                                     dt,
  26686                                                     DRegister(rd),
  26687                                                     DRegister(rm));
  26688                                               break;
  26689                                             }
  26690                                             case 0x00000080: {
  26691                                               // 0xffb00780
  26692                                               DataType dt = Dt_size_5_Decode(
  26693                                                   (instr >> 18) & 0x3);
  26694                                               if (dt.Is(
  26695                                                       kDataTypeValueInvalid)) {
  26696                                                 UnallocatedT32(instr);
  26697                                                 return;
  26698                                               }
  26699                                               unsigned rd =
  26700                                                   ExtractDRegister(instr,
  26701                                                                    22,
  26702                                                                    12);
  26703                                               unsigned rm =
  26704                                                   ExtractDRegister(instr, 5, 0);
  26705                                               // VQNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  26706                                               vqneg(CurrentCond(),
  26707                                                     dt,
  26708                                                     DRegister(rd),
  26709                                                     DRegister(rm));
  26710                                               break;
  26711                                             }
  26712                                           }
  26713                                           break;
  26714                                         }
  26715                                         case 0x00000540: {
  26716                                           // 0xffb00740
  26717                                           switch (instr & 0x00000080) {
  26718                                             case 0x00000000: {
  26719                                               // 0xffb00740
  26720                                               DataType dt = Dt_size_5_Decode(
  26721                                                   (instr >> 18) & 0x3);
  26722                                               if (dt.Is(
  26723                                                       kDataTypeValueInvalid)) {
  26724                                                 UnallocatedT32(instr);
  26725                                                 return;
  26726                                               }
  26727                                               if (((instr >> 12) & 1) != 0) {
  26728                                                 UnallocatedT32(instr);
  26729                                                 return;
  26730                                               }
  26731                                               unsigned rd =
  26732                                                   ExtractQRegister(instr,
  26733                                                                    22,
  26734                                                                    12);
  26735                                               if ((instr & 1) != 0) {
  26736                                                 UnallocatedT32(instr);
  26737                                                 return;
  26738                                               }
  26739                                               unsigned rm =
  26740                                                   ExtractQRegister(instr, 5, 0);
  26741                                               // VQABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  26742                                               vqabs(CurrentCond(),
  26743                                                     dt,
  26744                                                     QRegister(rd),
  26745                                                     QRegister(rm));
  26746                                               break;
  26747                                             }
  26748                                             case 0x00000080: {
  26749                                               // 0xffb007c0
  26750                                               DataType dt = Dt_size_5_Decode(
  26751                                                   (instr >> 18) & 0x3);
  26752                                               if (dt.Is(
  26753                                                       kDataTypeValueInvalid)) {
  26754                                                 UnallocatedT32(instr);
  26755                                                 return;
  26756                                               }
  26757                                               if (((instr >> 12) & 1) != 0) {
  26758                                                 UnallocatedT32(instr);
  26759                                                 return;
  26760                                               }
  26761                                               unsigned rd =
  26762                                                   ExtractQRegister(instr,
  26763                                                                    22,
  26764                                                                    12);
  26765                                               if ((instr & 1) != 0) {
  26766                                                 UnallocatedT32(instr);
  26767                                                 return;
  26768                                               }
  26769                                               unsigned rm =
  26770                                                   ExtractQRegister(instr, 5, 0);
  26771                                               // VQNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  26772                                               vqneg(CurrentCond(),
  26773                                                     dt,
  26774                                                     QRegister(rd),
  26775                                                     QRegister(rm));
  26776                                               break;
  26777                                             }
  26778                                           }
  26779                                           break;
  26780                                         }
  26781                                       }
  26782                                       break;
  26783                                     }
  26784                                     case 0x00010000: {
  26785                                       // 0xffb10000
  26786                                       switch (instr & 0x000001c0) {
  26787                                         case 0x00000000: {
  26788                                           // 0xffb10000
  26789                                           DataType dt = Dt_F_size_1_Decode(
  26790                                               ((instr >> 18) & 0x3) |
  26791                                               ((instr >> 8) & 0x4));
  26792                                           if (dt.Is(kDataTypeValueInvalid)) {
  26793                                             UnallocatedT32(instr);
  26794                                             return;
  26795                                           }
  26796                                           unsigned rd =
  26797                                               ExtractDRegister(instr, 22, 12);
  26798                                           unsigned rm =
  26799                                               ExtractDRegister(instr, 5, 0);
  26800                                           // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
  26801                                           vcgt(CurrentCond(),
  26802                                                dt,
  26803                                                DRegister(rd),
  26804                                                DRegister(rm),
  26805                                                UINT32_C(0));
  26806                                           break;
  26807                                         }
  26808                                         case 0x00000040: {
  26809                                           // 0xffb10040
  26810                                           DataType dt = Dt_F_size_1_Decode(
  26811                                               ((instr >> 18) & 0x3) |
  26812                                               ((instr >> 8) & 0x4));
  26813                                           if (dt.Is(kDataTypeValueInvalid)) {
  26814                                             UnallocatedT32(instr);
  26815                                             return;
  26816                                           }
  26817                                           if (((instr >> 12) & 1) != 0) {
  26818                                             UnallocatedT32(instr);
  26819                                             return;
  26820                                           }
  26821                                           unsigned rd =
  26822                                               ExtractQRegister(instr, 22, 12);
  26823                                           if ((instr & 1) != 0) {
  26824                                             UnallocatedT32(instr);
  26825                                             return;
  26826                                           }
  26827                                           unsigned rm =
  26828                                               ExtractQRegister(instr, 5, 0);
  26829                                           // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
  26830                                           vcgt(CurrentCond(),
  26831                                                dt,
  26832                                                QRegister(rd),
  26833                                                QRegister(rm),
  26834                                                UINT32_C(0));
  26835                                           break;
  26836                                         }
  26837                                         case 0x00000080: {
  26838                                           // 0xffb10080
  26839                                           DataType dt = Dt_F_size_1_Decode(
  26840                                               ((instr >> 18) & 0x3) |
  26841                                               ((instr >> 8) & 0x4));
  26842                                           if (dt.Is(kDataTypeValueInvalid)) {
  26843                                             UnallocatedT32(instr);
  26844                                             return;
  26845                                           }
  26846                                           unsigned rd =
  26847                                               ExtractDRegister(instr, 22, 12);
  26848                                           unsigned rm =
  26849                                               ExtractDRegister(instr, 5, 0);
  26850                                           // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
  26851                                           vcge(CurrentCond(),
  26852                                                dt,
  26853                                                DRegister(rd),
  26854                                                DRegister(rm),
  26855                                                UINT32_C(0));
  26856                                           break;
  26857                                         }
  26858                                         case 0x000000c0: {
  26859                                           // 0xffb100c0
  26860                                           DataType dt = Dt_F_size_1_Decode(
  26861                                               ((instr >> 18) & 0x3) |
  26862                                               ((instr >> 8) & 0x4));
  26863                                           if (dt.Is(kDataTypeValueInvalid)) {
  26864                                             UnallocatedT32(instr);
  26865                                             return;
  26866                                           }
  26867                                           if (((instr >> 12) & 1) != 0) {
  26868                                             UnallocatedT32(instr);
  26869                                             return;
  26870                                           }
  26871                                           unsigned rd =
  26872                                               ExtractQRegister(instr, 22, 12);
  26873                                           if ((instr & 1) != 0) {
  26874                                             UnallocatedT32(instr);
  26875                                             return;
  26876                                           }
  26877                                           unsigned rm =
  26878                                               ExtractQRegister(instr, 5, 0);
  26879                                           // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
  26880                                           vcge(CurrentCond(),
  26881                                                dt,
  26882                                                QRegister(rd),
  26883                                                QRegister(rm),
  26884                                                UINT32_C(0));
  26885                                           break;
  26886                                         }
  26887                                         case 0x00000100: {
  26888                                           // 0xffb10100
  26889                                           DataType dt = Dt_F_size_2_Decode(
  26890                                               ((instr >> 18) & 0x3) |
  26891                                               ((instr >> 8) & 0x4));
  26892                                           if (dt.Is(kDataTypeValueInvalid)) {
  26893                                             UnallocatedT32(instr);
  26894                                             return;
  26895                                           }
  26896                                           unsigned rd =
  26897                                               ExtractDRegister(instr, 22, 12);
  26898                                           unsigned rm =
  26899                                               ExtractDRegister(instr, 5, 0);
  26900                                           // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
  26901                                           vceq(CurrentCond(),
  26902                                                dt,
  26903                                                DRegister(rd),
  26904                                                DRegister(rm),
  26905                                                UINT32_C(0));
  26906                                           break;
  26907                                         }
  26908                                         case 0x00000140: {
  26909                                           // 0xffb10140
  26910                                           DataType dt = Dt_F_size_2_Decode(
  26911                                               ((instr >> 18) & 0x3) |
  26912                                               ((instr >> 8) & 0x4));
  26913                                           if (dt.Is(kDataTypeValueInvalid)) {
  26914                                             UnallocatedT32(instr);
  26915                                             return;
  26916                                           }
  26917                                           if (((instr >> 12) & 1) != 0) {
  26918                                             UnallocatedT32(instr);
  26919                                             return;
  26920                                           }
  26921                                           unsigned rd =
  26922                                               ExtractQRegister(instr, 22, 12);
  26923                                           if ((instr & 1) != 0) {
  26924                                             UnallocatedT32(instr);
  26925                                             return;
  26926                                           }
  26927                                           unsigned rm =
  26928                                               ExtractQRegister(instr, 5, 0);
  26929                                           // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
  26930                                           vceq(CurrentCond(),
  26931                                                dt,
  26932                                                QRegister(rd),
  26933                                                QRegister(rm),
  26934                                                UINT32_C(0));
  26935                                           break;
  26936                                         }
  26937                                         case 0x00000180: {
  26938                                           // 0xffb10180
  26939                                           DataType dt = Dt_F_size_1_Decode(
  26940                                               ((instr >> 18) & 0x3) |
  26941                                               ((instr >> 8) & 0x4));
  26942                                           if (dt.Is(kDataTypeValueInvalid)) {
  26943                                             UnallocatedT32(instr);
  26944                                             return;
  26945                                           }
  26946                                           unsigned rd =
  26947                                               ExtractDRegister(instr, 22, 12);
  26948                                           unsigned rm =
  26949                                               ExtractDRegister(instr, 5, 0);
  26950                                           // VCLE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
  26951                                           vcle(CurrentCond(),
  26952                                                dt,
  26953                                                DRegister(rd),
  26954                                                DRegister(rm),
  26955                                                UINT32_C(0));
  26956                                           break;
  26957                                         }
  26958                                         case 0x000001c0: {
  26959                                           // 0xffb101c0
  26960                                           DataType dt = Dt_F_size_1_Decode(
  26961                                               ((instr >> 18) & 0x3) |
  26962                                               ((instr >> 8) & 0x4));
  26963                                           if (dt.Is(kDataTypeValueInvalid)) {
  26964                                             UnallocatedT32(instr);
  26965                                             return;
  26966                                           }
  26967                                           if (((instr >> 12) & 1) != 0) {
  26968                                             UnallocatedT32(instr);
  26969                                             return;
  26970                                           }
  26971                                           unsigned rd =
  26972                                               ExtractQRegister(instr, 22, 12);
  26973                                           if ((instr & 1) != 0) {
  26974                                             UnallocatedT32(instr);
  26975                                             return;
  26976                                           }
  26977                                           unsigned rm =
  26978                                               ExtractQRegister(instr, 5, 0);
  26979                                           // VCLE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
  26980                                           vcle(CurrentCond(),
  26981                                                dt,
  26982                                                QRegister(rd),
  26983                                                QRegister(rm),
  26984                                                UINT32_C(0));
  26985                                           break;
  26986                                         }
  26987                                       }
  26988                                       break;
  26989                                     }
  26990                                     case 0x00010200: {
  26991                                       // 0xffb10200
  26992                                       switch (instr & 0x000001c0) {
  26993                                         case 0x00000000: {
  26994                                           // 0xffb10200
  26995                                           DataType dt = Dt_F_size_1_Decode(
  26996                                               ((instr >> 18) & 0x3) |
  26997                                               ((instr >> 8) & 0x4));
  26998                                           if (dt.Is(kDataTypeValueInvalid)) {
  26999                                             UnallocatedT32(instr);
  27000                                             return;
  27001                                           }
  27002                                           unsigned rd =
  27003                                               ExtractDRegister(instr, 22, 12);
  27004                                           unsigned rm =
  27005                                               ExtractDRegister(instr, 5, 0);
  27006                                           // VCLT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length)
  27007                                           vclt(CurrentCond(),
  27008                                                dt,
  27009                                                DRegister(rd),
  27010                                                DRegister(rm),
  27011                                                UINT32_C(0));
  27012                                           break;
  27013                                         }
  27014                                         case 0x00000040: {
  27015                                           // 0xffb10240
  27016                                           DataType dt = Dt_F_size_1_Decode(
  27017                                               ((instr >> 18) & 0x3) |
  27018                                               ((instr >> 8) & 0x4));
  27019                                           if (dt.Is(kDataTypeValueInvalid)) {
  27020                                             UnallocatedT32(instr);
  27021                                             return;
  27022                                           }
  27023                                           if (((instr >> 12) & 1) != 0) {
  27024                                             UnallocatedT32(instr);
  27025                                             return;
  27026                                           }
  27027                                           unsigned rd =
  27028                                               ExtractQRegister(instr, 22, 12);
  27029                                           if ((instr & 1) != 0) {
  27030                                             UnallocatedT32(instr);
  27031                                             return;
  27032                                           }
  27033                                           unsigned rm =
  27034                                               ExtractQRegister(instr, 5, 0);
  27035                                           // VCLT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length)
  27036                                           vclt(CurrentCond(),
  27037                                                dt,
  27038                                                QRegister(rd),
  27039                                                QRegister(rm),
  27040                                                UINT32_C(0));
  27041                                           break;
  27042                                         }
  27043                                         case 0x000000c0: {
  27044                                           // 0xffb102c0
  27045                                           if ((instr & 0x000c0400) ==
  27046                                               0x00080000) {
  27047                                             UnimplementedT32_32("SHA1H", instr);
  27048                                           } else {
  27049                                             UnallocatedT32(instr);
  27050                                           }
  27051                                           break;
  27052                                         }
  27053                                         case 0x00000100: {
  27054                                           // 0xffb10300
  27055                                           DataType dt = Dt_F_size_1_Decode(
  27056                                               ((instr >> 18) & 0x3) |
  27057                                               ((instr >> 8) & 0x4));
  27058                                           if (dt.Is(kDataTypeValueInvalid)) {
  27059                                             UnallocatedT32(instr);
  27060                                             return;
  27061                                           }
  27062                                           unsigned rd =
  27063                                               ExtractDRegister(instr, 22, 12);
  27064                                           unsigned rm =
  27065                                               ExtractDRegister(instr, 5, 0);
  27066                                           // VABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
  27067                                           vabs(CurrentCond(),
  27068                                                dt,
  27069                                                DRegister(rd),
  27070                                                DRegister(rm));
  27071                                           break;
  27072                                         }
  27073                                         case 0x00000140: {
  27074                                           // 0xffb10340
  27075                                           DataType dt = Dt_F_size_1_Decode(
  27076                                               ((instr >> 18) & 0x3) |
  27077                                               ((instr >> 8) & 0x4));
  27078                                           if (dt.Is(kDataTypeValueInvalid)) {
  27079                                             UnallocatedT32(instr);
  27080                                             return;
  27081                                           }
  27082                                           if (((instr >> 12) & 1) != 0) {
  27083                                             UnallocatedT32(instr);
  27084                                             return;
  27085                                           }
  27086                                           unsigned rd =
  27087                                               ExtractQRegister(instr, 22, 12);
  27088                                           if ((instr & 1) != 0) {
  27089                                             UnallocatedT32(instr);
  27090                                             return;
  27091                                           }
  27092                                           unsigned rm =
  27093                                               ExtractQRegister(instr, 5, 0);
  27094                                           // VABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
  27095                                           vabs(CurrentCond(),
  27096                                                dt,
  27097                                                QRegister(rd),
  27098                                                QRegister(rm));
  27099                                           break;
  27100                                         }
  27101                                         case 0x00000180: {
  27102                                           // 0xffb10380
  27103                                           DataType dt = Dt_F_size_1_Decode(
  27104                                               ((instr >> 18) & 0x3) |
  27105                                               ((instr >> 8) & 0x4));
  27106                                           if (dt.Is(kDataTypeValueInvalid)) {
  27107                                             UnallocatedT32(instr);
  27108                                             return;
  27109                                           }
  27110                                           unsigned rd =
  27111                                               ExtractDRegister(instr, 22, 12);
  27112                                           unsigned rm =
  27113                                               ExtractDRegister(instr, 5, 0);
  27114                                           // VNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
  27115                                           vneg(CurrentCond(),
  27116                                                dt,
  27117                                                DRegister(rd),
  27118                                                DRegister(rm));
  27119                                           break;
  27120                                         }
  27121                                         case 0x000001c0: {
  27122                                           // 0xffb103c0
  27123                                           DataType dt = Dt_F_size_1_Decode(
  27124                                               ((instr >> 18) & 0x3) |
  27125                                               ((instr >> 8) & 0x4));
  27126                                           if (dt.Is(kDataTypeValueInvalid)) {
  27127                                             UnallocatedT32(instr);
  27128                                             return;
  27129                                           }
  27130                                           if (((instr >> 12) & 1) != 0) {
  27131                                             UnallocatedT32(instr);
  27132                                             return;
  27133                                           }
  27134                                           unsigned rd =
  27135                                               ExtractQRegister(instr, 22, 12);
  27136                                           if ((instr & 1) != 0) {
  27137                                             UnallocatedT32(instr);
  27138                                             return;
  27139                                           }
  27140                                           unsigned rm =
  27141                                               ExtractQRegister(instr, 5, 0);
  27142                                           // VNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
  27143                                           vneg(CurrentCond(),
  27144                                                dt,
  27145                                                QRegister(rd),
  27146                                                QRegister(rm));
  27147                                           break;
  27148                                         }
  27149                                         default:
  27150                                           UnallocatedT32(instr);
  27151                                           break;
  27152                                       }
  27153                                       break;
  27154                                     }
  27155                                     case 0x00020000: {
  27156                                       // 0xffb20000
  27157                                       switch (instr & 0x000005c0) {
  27158                                         case 0x00000000: {
  27159                                           // 0xffb20000
  27160                                           if ((instr & 0x000c0000) ==
  27161                                               0x00000000) {
  27162                                             unsigned rd =
  27163                                                 ExtractDRegister(instr, 22, 12);
  27164                                             unsigned rm =
  27165                                                 ExtractDRegister(instr, 5, 0);
  27166                                             // VSWP{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  27167                                             vswp(CurrentCond(),
  27168                                                  kDataTypeValueNone,
  27169                                                  DRegister(rd),
  27170                                                  DRegister(rm));
  27171                                           } else {
  27172                                             UnallocatedT32(instr);
  27173                                           }
  27174                                           break;
  27175                                         }
  27176                                         case 0x00000040: {
  27177                                           // 0xffb20040
  27178                                           if ((instr & 0x000c0000) ==
  27179                                               0x00000000) {
  27180                                             if (((instr >> 12) & 1) != 0) {
  27181                                               UnallocatedT32(instr);
  27182                                               return;
  27183                                             }
  27184                                             unsigned rd =
  27185                                                 ExtractQRegister(instr, 22, 12);
  27186                                             if ((instr & 1) != 0) {
  27187                                               UnallocatedT32(instr);
  27188                                               return;
  27189                                             }
  27190                                             unsigned rm =
  27191                                                 ExtractQRegister(instr, 5, 0);
  27192                                             // VSWP{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  27193                                             vswp(CurrentCond(),
  27194                                                  kDataTypeValueNone,
  27195                                                  QRegister(rd),
  27196                                                  QRegister(rm));
  27197                                           } else {
  27198                                             UnallocatedT32(instr);
  27199                                           }
  27200                                           break;
  27201                                         }
  27202                                         case 0x00000080: {
  27203                                           // 0xffb20080
  27204                                           DataType dt = Dt_size_7_Decode(
  27205                                               (instr >> 18) & 0x3);
  27206                                           if (dt.Is(kDataTypeValueInvalid)) {
  27207                                             UnallocatedT32(instr);
  27208                                             return;
  27209                                           }
  27210                                           unsigned rd =
  27211                                               ExtractDRegister(instr, 22, 12);
  27212                                           unsigned rm =
  27213                                               ExtractDRegister(instr, 5, 0);
  27214                                           // VTRN{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
  27215                                           vtrn(CurrentCond(),
  27216                                                dt,
  27217                                                DRegister(rd),
  27218                                                DRegister(rm));
  27219                                           break;
  27220                                         }
  27221                                         case 0x000000c0: {
  27222                                           // 0xffb200c0
  27223                                           DataType dt = Dt_size_7_Decode(
  27224                                               (instr >> 18) & 0x3);
  27225                                           if (dt.Is(kDataTypeValueInvalid)) {
  27226                                             UnallocatedT32(instr);
  27227                                             return;
  27228                                           }
  27229                                           if (((instr >> 12) & 1) != 0) {
  27230                                             UnallocatedT32(instr);
  27231                                             return;
  27232                                           }
  27233                                           unsigned rd =
  27234                                               ExtractQRegister(instr, 22, 12);
  27235                                           if ((instr & 1) != 0) {
  27236                                             UnallocatedT32(instr);
  27237                                             return;
  27238                                           }
  27239                                           unsigned rm =
  27240                                               ExtractQRegister(instr, 5, 0);
  27241                                           // VTRN{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
  27242                                           vtrn(CurrentCond(),
  27243                                                dt,
  27244                                                QRegister(rd),
  27245                                                QRegister(rm));
  27246                                           break;
  27247                                         }
  27248                                         case 0x00000100: {
  27249                                           // 0xffb20100
  27250                                           DataType dt = Dt_size_15_Decode(
  27251                                               (instr >> 18) & 0x3);
  27252                                           if (dt.Is(kDataTypeValueInvalid)) {
  27253                                             UnallocatedT32(instr);
  27254                                             return;
  27255                                           }
  27256                                           unsigned rd =
  27257                                               ExtractDRegister(instr, 22, 12);
  27258                                           unsigned rm =
  27259                                               ExtractDRegister(instr, 5, 0);
  27260                                           // VUZP{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
  27261                                           vuzp(CurrentCond(),
  27262                                                dt,
  27263                                                DRegister(rd),
  27264                                                DRegister(rm));
  27265                                           break;
  27266                                         }
  27267                                         case 0x00000140: {
  27268                                           // 0xffb20140
  27269                                           DataType dt = Dt_size_7_Decode(
  27270                                               (instr >> 18) & 0x3);
  27271                                           if (dt.Is(kDataTypeValueInvalid)) {
  27272                                             UnallocatedT32(instr);
  27273                                             return;
  27274                                           }
  27275                                           if (((instr >> 12) & 1) != 0) {
  27276                                             UnallocatedT32(instr);
  27277                                             return;
  27278                                           }
  27279                                           unsigned rd =
  27280                                               ExtractQRegister(instr, 22, 12);
  27281                                           if ((instr & 1) != 0) {
  27282                                             UnallocatedT32(instr);
  27283                                             return;
  27284                                           }
  27285                                           unsigned rm =
  27286                                               ExtractQRegister(instr, 5, 0);
  27287                                           // VUZP{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
  27288                                           vuzp(CurrentCond(),
  27289                                                dt,
  27290                                                QRegister(rd),
  27291                                                QRegister(rm));
  27292                                           break;
  27293                                         }
  27294                                         case 0x00000180: {
  27295                                           // 0xffb20180
  27296                                           DataType dt = Dt_size_15_Decode(
  27297                                               (instr >> 18) & 0x3);
  27298                                           if (dt.Is(kDataTypeValueInvalid)) {
  27299                                             UnallocatedT32(instr);
  27300                                             return;
  27301                                           }
  27302                                           unsigned rd =
  27303                                               ExtractDRegister(instr, 22, 12);
  27304                                           unsigned rm =
  27305                                               ExtractDRegister(instr, 5, 0);
  27306                                           // VZIP{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1
  27307                                           vzip(CurrentCond(),
  27308                                                dt,
  27309                                                DRegister(rd),
  27310                                                DRegister(rm));
  27311                                           break;
  27312                                         }
  27313                                         case 0x000001c0: {
  27314                                           // 0xffb201c0
  27315                                           DataType dt = Dt_size_7_Decode(
  27316                                               (instr >> 18) & 0x3);
  27317                                           if (dt.Is(kDataTypeValueInvalid)) {
  27318                                             UnallocatedT32(instr);
  27319                                             return;
  27320                                           }
  27321                                           if (((instr >> 12) & 1) != 0) {
  27322                                             UnallocatedT32(instr);
  27323                                             return;
  27324                                           }
  27325                                           unsigned rd =
  27326                                               ExtractQRegister(instr, 22, 12);
  27327                                           if ((instr & 1) != 0) {
  27328                                             UnallocatedT32(instr);
  27329                                             return;
  27330                                           }
  27331                                           unsigned rm =
  27332                                               ExtractQRegister(instr, 5, 0);
  27333                                           // VZIP{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1
  27334                                           vzip(CurrentCond(),
  27335                                                dt,
  27336                                                QRegister(rd),
  27337                                                QRegister(rm));
  27338                                           break;
  27339                                         }
  27340                                         case 0x00000400: {
  27341                                           // 0xffb20400
  27342                                           DataType dt = Dt_size_16_Decode(
  27343                                               (instr >> 18) & 0x3);
  27344                                           if (dt.Is(kDataTypeValueInvalid)) {
  27345                                             UnallocatedT32(instr);
  27346                                             return;
  27347                                           }
  27348                                           unsigned rd =
  27349                                               ExtractDRegister(instr, 22, 12);
  27350                                           unsigned rm =
  27351                                               ExtractDRegister(instr, 5, 0);
  27352                                           // VRINTN{<q>}.<dt> <Dd>, <Dm> ; T1
  27353                                           vrintn(dt,
  27354                                                  DRegister(rd),
  27355                                                  DRegister(rm));
  27356                                           break;
  27357                                         }
  27358                                         case 0x00000440: {
  27359                                           // 0xffb20440
  27360                                           DataType dt = Dt_size_16_Decode(
  27361                                               (instr >> 18) & 0x3);
  27362                                           if (dt.Is(kDataTypeValueInvalid)) {
  27363                                             UnallocatedT32(instr);
  27364                                             return;
  27365                                           }
  27366                                           if (((instr >> 12) & 1) != 0) {
  27367                                             UnallocatedT32(instr);
  27368                                             return;
  27369                                           }
  27370                                           unsigned rd =
  27371                                               ExtractQRegister(instr, 22, 12);
  27372                                           if ((instr & 1) != 0) {
  27373                                             UnallocatedT32(instr);
  27374                                             return;
  27375                                           }
  27376                                           unsigned rm =
  27377                                               ExtractQRegister(instr, 5, 0);
  27378                                           // VRINTN{<q>}.<dt> <Qd>, <Qm> ; T1
  27379                                           vrintn(dt,
  27380                                                  QRegister(rd),
  27381                                                  QRegister(rm));
  27382                                           break;
  27383                                         }
  27384                                         case 0x00000480: {
  27385                                           // 0xffb20480
  27386                                           DataType dt = Dt_size_16_Decode(
  27387                                               (instr >> 18) & 0x3);
  27388                                           if (dt.Is(kDataTypeValueInvalid)) {
  27389                                             UnallocatedT32(instr);
  27390                                             return;
  27391                                           }
  27392                                           unsigned rd =
  27393                                               ExtractDRegister(instr, 22, 12);
  27394                                           unsigned rm =
  27395                                               ExtractDRegister(instr, 5, 0);
  27396                                           // VRINTX{<q>}.<dt> <Dd>, <Dm> ; T1
  27397                                           vrintx(Condition::None(),
  27398                                                  dt,
  27399                                                  DRegister(rd),
  27400                                                  DRegister(rm));
  27401                                           break;
  27402                                         }
  27403                                         case 0x000004c0: {
  27404                                           // 0xffb204c0
  27405                                           DataType dt = Dt_size_16_Decode(
  27406                                               (instr >> 18) & 0x3);
  27407                                           if (dt.Is(kDataTypeValueInvalid)) {
  27408                                             UnallocatedT32(instr);
  27409                                             return;
  27410                                           }
  27411                                           if (((instr >> 12) & 1) != 0) {
  27412                                             UnallocatedT32(instr);
  27413                                             return;
  27414                                           }
  27415                                           unsigned rd =
  27416                                               ExtractQRegister(instr, 22, 12);
  27417                                           if ((instr & 1) != 0) {
  27418                                             UnallocatedT32(instr);
  27419                                             return;
  27420                                           }
  27421                                           unsigned rm =
  27422                                               ExtractQRegister(instr, 5, 0);
  27423                                           // VRINTX{<q>}.<dt> <Qd>, <Qm> ; T1
  27424                                           vrintx(dt,
  27425                                                  QRegister(rd),
  27426                                                  QRegister(rm));
  27427                                           break;
  27428                                         }
  27429                                         case 0x00000500: {
  27430                                           // 0xffb20500
  27431                                           DataType dt = Dt_size_16_Decode(
  27432                                               (instr >> 18) & 0x3);
  27433                                           if (dt.Is(kDataTypeValueInvalid)) {
  27434                                             UnallocatedT32(instr);
  27435                                             return;
  27436                                           }
  27437                                           unsigned rd =
  27438                                               ExtractDRegister(instr, 22, 12);
  27439                                           unsigned rm =
  27440                                               ExtractDRegister(instr, 5, 0);
  27441                                           // VRINTA{<q>}.<dt> <Dd>, <Dm> ; T1
  27442                                           vrinta(dt,
  27443                                                  DRegister(rd),
  27444                                                  DRegister(rm));
  27445                                           break;
  27446                                         }
  27447                                         case 0x00000540: {
  27448                                           // 0xffb20540
  27449                                           DataType dt = Dt_size_16_Decode(
  27450                                               (instr >> 18) & 0x3);
  27451                                           if (dt.Is(kDataTypeValueInvalid)) {
  27452                                             UnallocatedT32(instr);
  27453                                             return;
  27454                                           }
  27455                                           if (((instr >> 12) & 1) != 0) {
  27456                                             UnallocatedT32(instr);
  27457                                             return;
  27458                                           }
  27459                                           unsigned rd =
  27460                                               ExtractQRegister(instr, 22, 12);
  27461                                           if ((instr & 1) != 0) {
  27462                                             UnallocatedT32(instr);
  27463                                             return;
  27464                                           }
  27465                                           unsigned rm =
  27466                                               ExtractQRegister(instr, 5, 0);
  27467                                           // VRINTA{<q>}.<dt> <Qd>, <Qm> ; T1
  27468                                           vrinta(dt,
  27469                                                  QRegister(rd),
  27470                                                  QRegister(rm));
  27471                                           break;
  27472                                         }
  27473                                         case 0x00000580: {
  27474                                           // 0xffb20580
  27475                                           DataType dt = Dt_size_16_Decode(
  27476                                               (instr >> 18) & 0x3);
  27477                                           if (dt.Is(kDataTypeValueInvalid)) {
  27478                                             UnallocatedT32(instr);
  27479                                             return;
  27480                                           }
  27481                                           unsigned rd =
  27482                                               ExtractDRegister(instr, 22, 12);
  27483                                           unsigned rm =
  27484                                               ExtractDRegister(instr, 5, 0);
  27485                                           // VRINTZ{<q>}.<dt> <Dd>, <Dm> ; T1
  27486                                           vrintz(Condition::None(),
  27487                                                  dt,
  27488                                                  DRegister(rd),
  27489                                                  DRegister(rm));
  27490                                           break;
  27491                                         }
  27492                                         case 0x000005c0: {
  27493                                           // 0xffb205c0
  27494                                           DataType dt = Dt_size_16_Decode(
  27495                                               (instr >> 18) & 0x3);
  27496                                           if (dt.Is(kDataTypeValueInvalid)) {
  27497                                             UnallocatedT32(instr);
  27498                                             return;
  27499                                           }
  27500                                           if (((instr >> 12) & 1) != 0) {
  27501                                             UnallocatedT32(instr);
  27502                                             return;
  27503                                           }
  27504                                           unsigned rd =
  27505                                               ExtractQRegister(instr, 22, 12);
  27506                                           if ((instr & 1) != 0) {
  27507                                             UnallocatedT32(instr);
  27508                                             return;
  27509                                           }
  27510                                           unsigned rm =
  27511                                               ExtractQRegister(instr, 5, 0);
  27512                                           // VRINTZ{<q>}.<dt> <Qd>, <Qm> ; T1
  27513                                           vrintz(dt,
  27514                                                  QRegister(rd),
  27515                                                  QRegister(rm));
  27516                                           break;
  27517                                         }
  27518                                       }
  27519                                       break;
  27520                                     }
  27521                                     case 0x00020200: {
  27522                                       // 0xffb20200
  27523                                       switch (instr & 0x00000580) {
  27524                                         case 0x00000000: {
  27525                                           // 0xffb20200
  27526                                           switch (instr & 0x00000040) {
  27527                                             case 0x00000000: {
  27528                                               // 0xffb20200
  27529                                               DataType dt = Dt_size_3_Decode(
  27530                                                   (instr >> 18) & 0x3);
  27531                                               if (dt.Is(
  27532                                                       kDataTypeValueInvalid)) {
  27533                                                 UnallocatedT32(instr);
  27534                                                 return;
  27535                                               }
  27536                                               unsigned rd =
  27537                                                   ExtractDRegister(instr,
  27538                                                                    22,
  27539                                                                    12);
  27540                                               if ((instr & 1) != 0) {
  27541                                                 UnallocatedT32(instr);
  27542                                                 return;
  27543                                               }
  27544                                               unsigned rm =
  27545                                                   ExtractQRegister(instr, 5, 0);
  27546                                               // VMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  27547                                               vmovn(CurrentCond(),
  27548                                                     dt,
  27549                                                     DRegister(rd),
  27550                                                     QRegister(rm));
  27551                                               break;
  27552                                             }
  27553                                             case 0x00000040: {
  27554                                               // 0xffb20240
  27555                                               DataType dt = Dt_size_14_Decode(
  27556                                                   (instr >> 18) & 0x3);
  27557                                               if (dt.Is(
  27558                                                       kDataTypeValueInvalid)) {
  27559                                                 UnallocatedT32(instr);
  27560                                                 return;
  27561                                               }
  27562                                               unsigned rd =
  27563                                                   ExtractDRegister(instr,
  27564                                                                    22,
  27565                                                                    12);
  27566                                               if ((instr & 1) != 0) {
  27567                                                 UnallocatedT32(instr);
  27568                                                 return;
  27569                                               }
  27570                                               unsigned rm =
  27571                                                   ExtractQRegister(instr, 5, 0);
  27572                                               // VQMOVUN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  27573                                               vqmovun(CurrentCond(),
  27574                                                       dt,
  27575                                                       DRegister(rd),
  27576                                                       QRegister(rm));
  27577                                               break;
  27578                                             }
  27579                                           }
  27580                                           break;
  27581                                         }
  27582                                         case 0x00000080: {
  27583                                           // 0xffb20280
  27584                                           DataType dt = Dt_op_size_3_Decode(
  27585                                               ((instr >> 18) & 0x3) |
  27586                                               ((instr >> 4) & 0x4));
  27587                                           if (dt.Is(kDataTypeValueInvalid)) {
  27588                                             UnallocatedT32(instr);
  27589                                             return;
  27590                                           }
  27591                                           unsigned rd =
  27592                                               ExtractDRegister(instr, 22, 12);
  27593                                           if ((instr & 1) != 0) {
  27594                                             UnallocatedT32(instr);
  27595                                             return;
  27596                                           }
  27597                                           unsigned rm =
  27598                                               ExtractQRegister(instr, 5, 0);
  27599                                           // VQMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  27600                                           vqmovn(CurrentCond(),
  27601                                                  dt,
  27602                                                  DRegister(rd),
  27603                                                  QRegister(rm));
  27604                                           break;
  27605                                         }
  27606                                         case 0x00000100: {
  27607                                           // 0xffb20300
  27608                                           if ((instr & 0x00000040) ==
  27609                                               0x00000000) {
  27610                                             DataType dt = Dt_size_17_Decode(
  27611                                                 (instr >> 18) & 0x3);
  27612                                             if (dt.Is(kDataTypeValueInvalid)) {
  27613                                               UnallocatedT32(instr);
  27614                                               return;
  27615                                             }
  27616                                             if (((instr >> 12) & 1) != 0) {
  27617                                               UnallocatedT32(instr);
  27618                                               return;
  27619                                             }
  27620                                             unsigned rd =
  27621                                                 ExtractQRegister(instr, 22, 12);
  27622                                             unsigned rm =
  27623                                                 ExtractDRegister(instr, 5, 0);
  27624                                             uint32_t imm = dt.GetSize();
  27625                                             // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T2 NOLINT(whitespace/line_length)
  27626                                             vshll(CurrentCond(),
  27627                                                   dt,
  27628                                                   QRegister(rd),
  27629                                                   DRegister(rm),
  27630                                                   imm);
  27631                                           } else {
  27632                                             UnallocatedT32(instr);
  27633                                           }
  27634                                           break;
  27635                                         }
  27636                                         case 0x00000180: {
  27637                                           // 0xffb20380
  27638                                           switch (instr & 0x000c0040) {
  27639                                             case 0x00080000: {
  27640                                               // 0xffba0380
  27641                                               UnimplementedT32_32("SHA1SU1",
  27642                                                                   instr);
  27643                                               break;
  27644                                             }
  27645                                             case 0x00080040: {
  27646                                               // 0xffba03c0
  27647                                               UnimplementedT32_32("SHA256SU0",
  27648                                                                   instr);
  27649                                               break;
  27650                                             }
  27651                                             default:
  27652                                               UnallocatedT32(instr);
  27653                                               break;
  27654                                           }
  27655                                           break;
  27656                                         }
  27657                                         case 0x00000400: {
  27658                                           // 0xffb20600
  27659                                           if ((instr & 0x000c0040) ==
  27660                                               0x00040000) {
  27661                                             unsigned rd =
  27662                                                 ExtractDRegister(instr, 22, 12);
  27663                                             if ((instr & 1) != 0) {
  27664                                               UnallocatedT32(instr);
  27665                                               return;
  27666                                             }
  27667                                             unsigned rm =
  27668                                                 ExtractQRegister(instr, 5, 0);
  27669                                             // VCVT{<c>}{<q>}.F16.F32 <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  27670                                             vcvt(CurrentCond(),
  27671                                                  F16,
  27672                                                  F32,
  27673                                                  DRegister(rd),
  27674                                                  QRegister(rm));
  27675                                           } else {
  27676                                             UnallocatedT32(instr);
  27677                                           }
  27678                                           break;
  27679                                         }
  27680                                         case 0x00000480: {
  27681                                           // 0xffb20680
  27682                                           switch (instr & 0x00000040) {
  27683                                             case 0x00000000: {
  27684                                               // 0xffb20680
  27685                                               DataType dt = Dt_size_16_Decode(
  27686                                                   (instr >> 18) & 0x3);
  27687                                               if (dt.Is(
  27688                                                       kDataTypeValueInvalid)) {
  27689                                                 UnallocatedT32(instr);
  27690                                                 return;
  27691                                               }
  27692                                               unsigned rd =
  27693                                                   ExtractDRegister(instr,
  27694                                                                    22,
  27695                                                                    12);
  27696                                               unsigned rm =
  27697                                                   ExtractDRegister(instr, 5, 0);
  27698                                               // VRINTM{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  27699                                               vrintm(dt,
  27700                                                      DRegister(rd),
  27701                                                      DRegister(rm));
  27702                                               break;
  27703                                             }
  27704                                             case 0x00000040: {
  27705                                               // 0xffb206c0
  27706                                               DataType dt = Dt_size_16_Decode(
  27707                                                   (instr >> 18) & 0x3);
  27708                                               if (dt.Is(
  27709                                                       kDataTypeValueInvalid)) {
  27710                                                 UnallocatedT32(instr);
  27711                                                 return;
  27712                                               }
  27713                                               if (((instr >> 12) & 1) != 0) {
  27714                                                 UnallocatedT32(instr);
  27715                                                 return;
  27716                                               }
  27717                                               unsigned rd =
  27718                                                   ExtractQRegister(instr,
  27719                                                                    22,
  27720                                                                    12);
  27721                                               if ((instr & 1) != 0) {
  27722                                                 UnallocatedT32(instr);
  27723                                                 return;
  27724                                               }
  27725                                               unsigned rm =
  27726                                                   ExtractQRegister(instr, 5, 0);
  27727                                               // VRINTM{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  27728                                               vrintm(dt,
  27729                                                      QRegister(rd),
  27730                                                      QRegister(rm));
  27731                                               break;
  27732                                             }
  27733                                           }
  27734                                           break;
  27735                                         }
  27736                                         case 0x00000500: {
  27737                                           // 0xffb20700
  27738                                           if ((instr & 0x000c0040) ==
  27739                                               0x00040000) {
  27740                                             if (((instr >> 12) & 1) != 0) {
  27741                                               UnallocatedT32(instr);
  27742                                               return;
  27743                                             }
  27744                                             unsigned rd =
  27745                                                 ExtractQRegister(instr, 22, 12);
  27746                                             unsigned rm =
  27747                                                 ExtractDRegister(instr, 5, 0);
  27748                                             // VCVT{<c>}{<q>}.F32.F16 <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  27749                                             vcvt(CurrentCond(),
  27750                                                  F32,
  27751                                                  F16,
  27752                                                  QRegister(rd),
  27753                                                  DRegister(rm));
  27754                                           } else {
  27755                                             UnallocatedT32(instr);
  27756                                           }
  27757                                           break;
  27758                                         }
  27759                                         case 0x00000580: {
  27760                                           // 0xffb20780
  27761                                           switch (instr & 0x00000040) {
  27762                                             case 0x00000000: {
  27763                                               // 0xffb20780
  27764                                               DataType dt = Dt_size_16_Decode(
  27765                                                   (instr >> 18) & 0x3);
  27766                                               if (dt.Is(
  27767                                                       kDataTypeValueInvalid)) {
  27768                                                 UnallocatedT32(instr);
  27769                                                 return;
  27770                                               }
  27771                                               unsigned rd =
  27772                                                   ExtractDRegister(instr,
  27773                                                                    22,
  27774                                                                    12);
  27775                                               unsigned rm =
  27776                                                   ExtractDRegister(instr, 5, 0);
  27777                                               // VRINTP{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  27778                                               vrintp(dt,
  27779                                                      DRegister(rd),
  27780                                                      DRegister(rm));
  27781                                               break;
  27782                                             }
  27783                                             case 0x00000040: {
  27784                                               // 0xffb207c0
  27785                                               DataType dt = Dt_size_16_Decode(
  27786                                                   (instr >> 18) & 0x3);
  27787                                               if (dt.Is(
  27788                                                       kDataTypeValueInvalid)) {
  27789                                                 UnallocatedT32(instr);
  27790                                                 return;
  27791                                               }
  27792                                               if (((instr >> 12) & 1) != 0) {
  27793                                                 UnallocatedT32(instr);
  27794                                                 return;
  27795                                               }
  27796                                               unsigned rd =
  27797                                                   ExtractQRegister(instr,
  27798                                                                    22,
  27799                                                                    12);
  27800                                               if ((instr & 1) != 0) {
  27801                                                 UnallocatedT32(instr);
  27802                                                 return;
  27803                                               }
  27804                                               unsigned rm =
  27805                                                   ExtractQRegister(instr, 5, 0);
  27806                                               // VRINTP{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  27807                                               vrintp(dt,
  27808                                                      QRegister(rd),
  27809                                                      QRegister(rm));
  27810                                               break;
  27811                                             }
  27812                                           }
  27813                                           break;
  27814                                         }
  27815                                       }
  27816                                       break;
  27817                                     }
  27818                                     case 0x00030000: {
  27819                                       // 0xffb30000
  27820                                       switch (instr & 0x00000440) {
  27821                                         case 0x00000000: {
  27822                                           // 0xffb30000
  27823                                           switch (instr & 0x000c0100) {
  27824                                             case 0x00080000: {
  27825                                               // 0xffbb0000
  27826                                               DataType dt = Dt_op_3_Decode(
  27827                                                   (instr >> 7) & 0x1);
  27828                                               if (dt.Is(
  27829                                                       kDataTypeValueInvalid)) {
  27830                                                 UnallocatedT32(instr);
  27831                                                 return;
  27832                                               }
  27833                                               unsigned rd =
  27834                                                   ExtractDRegister(instr,
  27835                                                                    22,
  27836                                                                    12);
  27837                                               unsigned rm =
  27838                                                   ExtractDRegister(instr, 5, 0);
  27839                                               // VCVTA{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  27840                                               vcvta(dt,
  27841                                                     F32,
  27842                                                     DRegister(rd),
  27843                                                     DRegister(rm));
  27844                                               break;
  27845                                             }
  27846                                             case 0x00080100: {
  27847                                               // 0xffbb0100
  27848                                               DataType dt = Dt_op_3_Decode(
  27849                                                   (instr >> 7) & 0x1);
  27850                                               if (dt.Is(
  27851                                                       kDataTypeValueInvalid)) {
  27852                                                 UnallocatedT32(instr);
  27853                                                 return;
  27854                                               }
  27855                                               unsigned rd =
  27856                                                   ExtractDRegister(instr,
  27857                                                                    22,
  27858                                                                    12);
  27859                                               unsigned rm =
  27860                                                   ExtractDRegister(instr, 5, 0);
  27861                                               // VCVTN{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  27862                                               vcvtn(dt,
  27863                                                     F32,
  27864                                                     DRegister(rd),
  27865                                                     DRegister(rm));
  27866                                               break;
  27867                                             }
  27868                                             default:
  27869                                               UnallocatedT32(instr);
  27870                                               break;
  27871                                           }
  27872                                           break;
  27873                                         }
  27874                                         case 0x00000040: {
  27875                                           // 0xffb30040
  27876                                           switch (instr & 0x000c0100) {
  27877                                             case 0x00080000: {
  27878                                               // 0xffbb0040
  27879                                               DataType dt = Dt_op_3_Decode(
  27880                                                   (instr >> 7) & 0x1);
  27881                                               if (dt.Is(
  27882                                                       kDataTypeValueInvalid)) {
  27883                                                 UnallocatedT32(instr);
  27884                                                 return;
  27885                                               }
  27886                                               if (((instr >> 12) & 1) != 0) {
  27887                                                 UnallocatedT32(instr);
  27888                                                 return;
  27889                                               }
  27890                                               unsigned rd =
  27891                                                   ExtractQRegister(instr,
  27892                                                                    22,
  27893                                                                    12);
  27894                                               if ((instr & 1) != 0) {
  27895                                                 UnallocatedT32(instr);
  27896                                                 return;
  27897                                               }
  27898                                               unsigned rm =
  27899                                                   ExtractQRegister(instr, 5, 0);
  27900                                               // VCVTA{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  27901                                               vcvta(dt,
  27902                                                     F32,
  27903                                                     QRegister(rd),
  27904                                                     QRegister(rm));
  27905                                               break;
  27906                                             }
  27907                                             case 0x00080100: {
  27908                                               // 0xffbb0140
  27909                                               DataType dt = Dt_op_3_Decode(
  27910                                                   (instr >> 7) & 0x1);
  27911                                               if (dt.Is(
  27912                                                       kDataTypeValueInvalid)) {
  27913                                                 UnallocatedT32(instr);
  27914                                                 return;
  27915                                               }
  27916                                               if (((instr >> 12) & 1) != 0) {
  27917                                                 UnallocatedT32(instr);
  27918                                                 return;
  27919                                               }
  27920                                               unsigned rd =
  27921                                                   ExtractQRegister(instr,
  27922                                                                    22,
  27923                                                                    12);
  27924                                               if ((instr & 1) != 0) {
  27925                                                 UnallocatedT32(instr);
  27926                                                 return;
  27927                                               }
  27928                                               unsigned rm =
  27929                                                   ExtractQRegister(instr, 5, 0);
  27930                                               // VCVTN{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  27931                                               vcvtn(dt,
  27932                                                     F32,
  27933                                                     QRegister(rd),
  27934                                                     QRegister(rm));
  27935                                               break;
  27936                                             }
  27937                                             default:
  27938                                               UnallocatedT32(instr);
  27939                                               break;
  27940                                           }
  27941                                           break;
  27942                                         }
  27943                                         case 0x00000400: {
  27944                                           // 0xffb30400
  27945                                           switch (instr & 0x00000080) {
  27946                                             case 0x00000000: {
  27947                                               // 0xffb30400
  27948                                               DataType dt = Dt_F_size_4_Decode(
  27949                                                   ((instr >> 18) & 0x3) |
  27950                                                   ((instr >> 6) & 0x4));
  27951                                               if (dt.Is(
  27952                                                       kDataTypeValueInvalid)) {
  27953                                                 UnallocatedT32(instr);
  27954                                                 return;
  27955                                               }
  27956                                               unsigned rd =
  27957                                                   ExtractDRegister(instr,
  27958                                                                    22,
  27959                                                                    12);
  27960                                               unsigned rm =
  27961                                                   ExtractDRegister(instr, 5, 0);
  27962                                               // VRECPE{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  27963                                               vrecpe(CurrentCond(),
  27964                                                      dt,
  27965                                                      DRegister(rd),
  27966                                                      DRegister(rm));
  27967                                               break;
  27968                                             }
  27969                                             case 0x00000080: {
  27970                                               // 0xffb30480
  27971                                               DataType dt = Dt_F_size_4_Decode(
  27972                                                   ((instr >> 18) & 0x3) |
  27973                                                   ((instr >> 6) & 0x4));
  27974                                               if (dt.Is(
  27975                                                       kDataTypeValueInvalid)) {
  27976                                                 UnallocatedT32(instr);
  27977                                                 return;
  27978                                               }
  27979                                               unsigned rd =
  27980                                                   ExtractDRegister(instr,
  27981                                                                    22,
  27982                                                                    12);
  27983                                               unsigned rm =
  27984                                                   ExtractDRegister(instr, 5, 0);
  27985                                               // VRSQRTE{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  27986                                               vrsqrte(CurrentCond(),
  27987                                                       dt,
  27988                                                       DRegister(rd),
  27989                                                       DRegister(rm));
  27990                                               break;
  27991                                             }
  27992                                           }
  27993                                           break;
  27994                                         }
  27995                                         case 0x00000440: {
  27996                                           // 0xffb30440
  27997                                           switch (instr & 0x00000080) {
  27998                                             case 0x00000000: {
  27999                                               // 0xffb30440
  28000                                               DataType dt = Dt_F_size_4_Decode(
  28001                                                   ((instr >> 18) & 0x3) |
  28002                                                   ((instr >> 6) & 0x4));
  28003                                               if (dt.Is(
  28004                                                       kDataTypeValueInvalid)) {
  28005                                                 UnallocatedT32(instr);
  28006                                                 return;
  28007                                               }
  28008                                               if (((instr >> 12) & 1) != 0) {
  28009                                                 UnallocatedT32(instr);
  28010                                                 return;
  28011                                               }
  28012                                               unsigned rd =
  28013                                                   ExtractQRegister(instr,
  28014                                                                    22,
  28015                                                                    12);
  28016                                               if ((instr & 1) != 0) {
  28017                                                 UnallocatedT32(instr);
  28018                                                 return;
  28019                                               }
  28020                                               unsigned rm =
  28021                                                   ExtractQRegister(instr, 5, 0);
  28022                                               // VRECPE{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  28023                                               vrecpe(CurrentCond(),
  28024                                                      dt,
  28025                                                      QRegister(rd),
  28026                                                      QRegister(rm));
  28027                                               break;
  28028                                             }
  28029                                             case 0x00000080: {
  28030                                               // 0xffb304c0
  28031                                               DataType dt = Dt_F_size_4_Decode(
  28032                                                   ((instr >> 18) & 0x3) |
  28033                                                   ((instr >> 6) & 0x4));
  28034                                               if (dt.Is(
  28035                                                       kDataTypeValueInvalid)) {
  28036                                                 UnallocatedT32(instr);
  28037                                                 return;
  28038                                               }
  28039                                               if (((instr >> 12) & 1) != 0) {
  28040                                                 UnallocatedT32(instr);
  28041                                                 return;
  28042                                               }
  28043                                               unsigned rd =
  28044                                                   ExtractQRegister(instr,
  28045                                                                    22,
  28046                                                                    12);
  28047                                               if ((instr & 1) != 0) {
  28048                                                 UnallocatedT32(instr);
  28049                                                 return;
  28050                                               }
  28051                                               unsigned rm =
  28052                                                   ExtractQRegister(instr, 5, 0);
  28053                                               // VRSQRTE{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  28054                                               vrsqrte(CurrentCond(),
  28055                                                       dt,
  28056                                                       QRegister(rd),
  28057                                                       QRegister(rm));
  28058                                               break;
  28059                                             }
  28060                                           }
  28061                                           break;
  28062                                         }
  28063                                       }
  28064                                       break;
  28065                                     }
  28066                                     case 0x00030200: {
  28067                                       // 0xffb30200
  28068                                       switch (instr & 0x000c0440) {
  28069                                         case 0x00080000: {
  28070                                           // 0xffbb0200
  28071                                           switch (instr & 0x00000100) {
  28072                                             case 0x00000000: {
  28073                                               // 0xffbb0200
  28074                                               DataType dt = Dt_op_3_Decode(
  28075                                                   (instr >> 7) & 0x1);
  28076                                               if (dt.Is(
  28077                                                       kDataTypeValueInvalid)) {
  28078                                                 UnallocatedT32(instr);
  28079                                                 return;
  28080                                               }
  28081                                               unsigned rd =
  28082                                                   ExtractDRegister(instr,
  28083                                                                    22,
  28084                                                                    12);
  28085                                               unsigned rm =
  28086                                                   ExtractDRegister(instr, 5, 0);
  28087                                               // VCVTP{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  28088                                               vcvtp(dt,
  28089                                                     F32,
  28090                                                     DRegister(rd),
  28091                                                     DRegister(rm));
  28092                                               break;
  28093                                             }
  28094                                             case 0x00000100: {
  28095                                               // 0xffbb0300
  28096                                               DataType dt = Dt_op_3_Decode(
  28097                                                   (instr >> 7) & 0x1);
  28098                                               if (dt.Is(
  28099                                                       kDataTypeValueInvalid)) {
  28100                                                 UnallocatedT32(instr);
  28101                                                 return;
  28102                                               }
  28103                                               unsigned rd =
  28104                                                   ExtractDRegister(instr,
  28105                                                                    22,
  28106                                                                    12);
  28107                                               unsigned rm =
  28108                                                   ExtractDRegister(instr, 5, 0);
  28109                                               // VCVTM{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  28110                                               vcvtm(dt,
  28111                                                     F32,
  28112                                                     DRegister(rd),
  28113                                                     DRegister(rm));
  28114                                               break;
  28115                                             }
  28116                                           }
  28117                                           break;
  28118                                         }
  28119                                         case 0x00080040: {
  28120                                           // 0xffbb0240
  28121                                           switch (instr & 0x00000100) {
  28122                                             case 0x00000000: {
  28123                                               // 0xffbb0240
  28124                                               DataType dt = Dt_op_3_Decode(
  28125                                                   (instr >> 7) & 0x1);
  28126                                               if (dt.Is(
  28127                                                       kDataTypeValueInvalid)) {
  28128                                                 UnallocatedT32(instr);
  28129                                                 return;
  28130                                               }
  28131                                               if (((instr >> 12) & 1) != 0) {
  28132                                                 UnallocatedT32(instr);
  28133                                                 return;
  28134                                               }
  28135                                               unsigned rd =
  28136                                                   ExtractQRegister(instr,
  28137                                                                    22,
  28138                                                                    12);
  28139                                               if ((instr & 1) != 0) {
  28140                                                 UnallocatedT32(instr);
  28141                                                 return;
  28142                                               }
  28143                                               unsigned rm =
  28144                                                   ExtractQRegister(instr, 5, 0);
  28145                                               // VCVTP{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  28146                                               vcvtp(dt,
  28147                                                     F32,
  28148                                                     QRegister(rd),
  28149                                                     QRegister(rm));
  28150                                               break;
  28151                                             }
  28152                                             case 0x00000100: {
  28153                                               // 0xffbb0340
  28154                                               DataType dt = Dt_op_3_Decode(
  28155                                                   (instr >> 7) & 0x1);
  28156                                               if (dt.Is(
  28157                                                       kDataTypeValueInvalid)) {
  28158                                                 UnallocatedT32(instr);
  28159                                                 return;
  28160                                               }
  28161                                               if (((instr >> 12) & 1) != 0) {
  28162                                                 UnallocatedT32(instr);
  28163                                                 return;
  28164                                               }
  28165                                               unsigned rd =
  28166                                                   ExtractQRegister(instr,
  28167                                                                    22,
  28168                                                                    12);
  28169                                               if ((instr & 1) != 0) {
  28170                                                 UnallocatedT32(instr);
  28171                                                 return;
  28172                                               }
  28173                                               unsigned rm =
  28174                                                   ExtractQRegister(instr, 5, 0);
  28175                                               // VCVTM{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  28176                                               vcvtm(dt,
  28177                                                     F32,
  28178                                                     QRegister(rd),
  28179                                                     QRegister(rm));
  28180                                               break;
  28181                                             }
  28182                                           }
  28183                                           break;
  28184                                         }
  28185                                         case 0x00080400: {
  28186                                           // 0xffbb0600
  28187                                           DataType dt1 = Dt_op_1_Decode1(
  28188                                               (instr >> 7) & 0x3);
  28189                                           if (dt1.Is(kDataTypeValueInvalid)) {
  28190                                             UnallocatedT32(instr);
  28191                                             return;
  28192                                           }
  28193                                           DataType dt2 = Dt_op_1_Decode2(
  28194                                               (instr >> 7) & 0x3);
  28195                                           if (dt2.Is(kDataTypeValueInvalid)) {
  28196                                             UnallocatedT32(instr);
  28197                                             return;
  28198                                           }
  28199                                           unsigned rd =
  28200                                               ExtractDRegister(instr, 22, 12);
  28201                                           unsigned rm =
  28202                                               ExtractDRegister(instr, 5, 0);
  28203                                           // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  28204                                           vcvt(CurrentCond(),
  28205                                                dt1,
  28206                                                dt2,
  28207                                                DRegister(rd),
  28208                                                DRegister(rm));
  28209                                           break;
  28210                                         }
  28211                                         case 0x00080440: {
  28212                                           // 0xffbb0640
  28213                                           DataType dt1 = Dt_op_1_Decode1(
  28214                                               (instr >> 7) & 0x3);
  28215                                           if (dt1.Is(kDataTypeValueInvalid)) {
  28216                                             UnallocatedT32(instr);
  28217                                             return;
  28218                                           }
  28219                                           DataType dt2 = Dt_op_1_Decode2(
  28220                                               (instr >> 7) & 0x3);
  28221                                           if (dt2.Is(kDataTypeValueInvalid)) {
  28222                                             UnallocatedT32(instr);
  28223                                             return;
  28224                                           }
  28225                                           if (((instr >> 12) & 1) != 0) {
  28226                                             UnallocatedT32(instr);
  28227                                             return;
  28228                                           }
  28229                                           unsigned rd =
  28230                                               ExtractQRegister(instr, 22, 12);
  28231                                           if ((instr & 1) != 0) {
  28232                                             UnallocatedT32(instr);
  28233                                             return;
  28234                                           }
  28235                                           unsigned rm =
  28236                                               ExtractQRegister(instr, 5, 0);
  28237                                           // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length)
  28238                                           vcvt(CurrentCond(),
  28239                                                dt1,
  28240                                                dt2,
  28241                                                QRegister(rd),
  28242                                                QRegister(rm));
  28243                                           break;
  28244                                         }
  28245                                         default:
  28246                                           UnallocatedT32(instr);
  28247                                           break;
  28248                                       }
  28249                                       break;
  28250                                     }
  28251                                   }
  28252                                   break;
  28253                                 }
  28254                                 case 0x00000800: {
  28255                                   // 0xffb00800
  28256                                   switch (instr & 0x00000440) {
  28257                                     case 0x00000000: {
  28258                                       // 0xffb00800
  28259                                       unsigned rd =
  28260                                           ExtractDRegister(instr, 22, 12);
  28261                                       unsigned first =
  28262                                           ExtractDRegister(instr, 7, 16);
  28263                                       unsigned length;
  28264                                       SpacingType spacing = kSingle;
  28265                                       switch ((instr >> 8) & 0x3) {
  28266                                         default:
  28267                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
  28268                                         case 0x0:
  28269                                           length = 1;
  28270                                           break;
  28271                                         case 0x1:
  28272                                           length = 2;
  28273                                           break;
  28274                                         case 0x2:
  28275                                           length = 3;
  28276                                           break;
  28277                                         case 0x3:
  28278                                           length = 4;
  28279                                           break;
  28280                                       }
  28281                                       unsigned last = first + length - 1;
  28282                                       TransferType transfer = kMultipleLanes;
  28283                                       unsigned rm =
  28284                                           ExtractDRegister(instr, 5, 0);
  28285                                       // VTBL{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; T1 NOLINT(whitespace/line_length)
  28286                                       vtbl(CurrentCond(),
  28287                                            Untyped8,
  28288                                            DRegister(rd),
  28289                                            NeonRegisterList(DRegister(first),
  28290                                                             DRegister(last),
  28291                                                             spacing,
  28292                                                             transfer),
  28293                                            DRegister(rm));
  28294                                       break;
  28295                                     }
  28296                                     case 0x00000040: {
  28297                                       // 0xffb00840
  28298                                       unsigned rd =
  28299                                           ExtractDRegister(instr, 22, 12);
  28300                                       unsigned first =
  28301                                           ExtractDRegister(instr, 7, 16);
  28302                                       unsigned length;
  28303                                       SpacingType spacing = kSingle;
  28304                                       switch ((instr >> 8) & 0x3) {
  28305                                         default:
  28306                                           VIXL_UNREACHABLE_OR_FALLTHROUGH();
  28307                                         case 0x0:
  28308                                           length = 1;
  28309                                           break;
  28310                                         case 0x1:
  28311                                           length = 2;
  28312                                           break;
  28313                                         case 0x2:
  28314                                           length = 3;
  28315                                           break;
  28316                                         case 0x3:
  28317                                           length = 4;
  28318                                           break;
  28319                                       }
  28320                                       unsigned last = first + length - 1;
  28321                                       TransferType transfer = kMultipleLanes;
  28322                                       unsigned rm =
  28323                                           ExtractDRegister(instr, 5, 0);
  28324                                       // VTBX{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; T1 NOLINT(whitespace/line_length)
  28325                                       vtbx(CurrentCond(),
  28326                                            Untyped8,
  28327                                            DRegister(rd),
  28328                                            NeonRegisterList(DRegister(first),
  28329                                                             DRegister(last),
  28330                                                             spacing,
  28331                                                             transfer),
  28332                                            DRegister(rm));
  28333                                       break;
  28334                                     }
  28335                                     case 0x00000400: {
  28336                                       // 0xffb00c00
  28337                                       if ((instr & 0x00000380) == 0x00000000) {
  28338                                         unsigned lane;
  28339                                         DataType dt =
  28340                                             Dt_imm4_1_Decode((instr >> 16) &
  28341                                                                  0xf,
  28342                                                              &lane);
  28343                                         if (dt.Is(kDataTypeValueInvalid)) {
  28344                                           UnallocatedT32(instr);
  28345                                           return;
  28346                                         }
  28347                                         unsigned rd =
  28348                                             ExtractDRegister(instr, 22, 12);
  28349                                         unsigned rm =
  28350                                             ExtractDRegister(instr, 5, 0);
  28351                                         // VDUP{<c>}{<q>}.<dt> <Dd>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
  28352                                         vdup(CurrentCond(),
  28353                                              dt,
  28354                                              DRegister(rd),
  28355                                              DRegisterLane(rm, lane));
  28356                                       } else {
  28357                                         UnallocatedT32(instr);
  28358                                       }
  28359                                       break;
  28360                                     }
  28361                                     case 0x00000440: {
  28362                                       // 0xffb00c40
  28363                                       if ((instr & 0x00000380) == 0x00000000) {
  28364                                         unsigned lane;
  28365                                         DataType dt =
  28366                                             Dt_imm4_1_Decode((instr >> 16) &
  28367                                                                  0xf,
  28368                                                              &lane);
  28369                                         if (dt.Is(kDataTypeValueInvalid)) {
  28370                                           UnallocatedT32(instr);
  28371                                           return;
  28372                                         }
  28373                                         if (((instr >> 12) & 1) != 0) {
  28374                                           UnallocatedT32(instr);
  28375                                           return;
  28376                                         }
  28377                                         unsigned rd =
  28378                                             ExtractQRegister(instr, 22, 12);
  28379                                         unsigned rm =
  28380                                             ExtractDRegister(instr, 5, 0);
  28381                                         // VDUP{<c>}{<q>}.<dt> <Qd>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
  28382                                         vdup(CurrentCond(),
  28383                                              dt,
  28384                                              QRegister(rd),
  28385                                              DRegisterLane(rm, lane));
  28386                                       } else {
  28387                                         UnallocatedT32(instr);
  28388                                       }
  28389                                       break;
  28390                                     }
  28391                                   }
  28392                                   break;
  28393                                 }
  28394                               }
  28395                               break;
  28396                             }
  28397                           }
  28398                           break;
  28399                         }
  28400                         default: {
  28401                           switch (instr & 0x00000c40) {
  28402                             case 0x00000000: {
  28403                               // 0xef800000
  28404                               switch (instr & 0x00000300) {
  28405                                 case 0x00000000: {
  28406                                   // 0xef800000
  28407                                   if (((instr & 0x300000) == 0x300000)) {
  28408                                     UnallocatedT32(instr);
  28409                                     return;
  28410                                   }
  28411                                   DataType dt =
  28412                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  28413                                                          ((instr >> 26) & 0x4));
  28414                                   if (dt.Is(kDataTypeValueInvalid)) {
  28415                                     UnallocatedT32(instr);
  28416                                     return;
  28417                                   }
  28418                                   if (((instr >> 12) & 1) != 0) {
  28419                                     UnallocatedT32(instr);
  28420                                     return;
  28421                                   }
  28422                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  28423                                   unsigned rn = ExtractDRegister(instr, 7, 16);
  28424                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  28425                                   // VADDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
  28426                                   vaddl(CurrentCond(),
  28427                                         dt,
  28428                                         QRegister(rd),
  28429                                         DRegister(rn),
  28430                                         DRegister(rm));
  28431                                   break;
  28432                                 }
  28433                                 case 0x00000100: {
  28434                                   // 0xef800100
  28435                                   if (((instr & 0x300000) == 0x300000)) {
  28436                                     UnallocatedT32(instr);
  28437                                     return;
  28438                                   }
  28439                                   DataType dt =
  28440                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  28441                                                          ((instr >> 26) & 0x4));
  28442                                   if (dt.Is(kDataTypeValueInvalid)) {
  28443                                     UnallocatedT32(instr);
  28444                                     return;
  28445                                   }
  28446                                   if (((instr >> 12) & 1) != 0) {
  28447                                     UnallocatedT32(instr);
  28448                                     return;
  28449                                   }
  28450                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  28451                                   if (((instr >> 16) & 1) != 0) {
  28452                                     UnallocatedT32(instr);
  28453                                     return;
  28454                                   }
  28455                                   unsigned rn = ExtractQRegister(instr, 7, 16);
  28456                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  28457                                   // VADDW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; T1 NOLINT(whitespace/line_length)
  28458                                   vaddw(CurrentCond(),
  28459                                         dt,
  28460                                         QRegister(rd),
  28461                                         QRegister(rn),
  28462                                         DRegister(rm));
  28463                                   break;
  28464                                 }
  28465                                 case 0x00000200: {
  28466                                   // 0xef800200
  28467                                   if (((instr & 0x300000) == 0x300000)) {
  28468                                     UnallocatedT32(instr);
  28469                                     return;
  28470                                   }
  28471                                   DataType dt =
  28472                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  28473                                                          ((instr >> 26) & 0x4));
  28474                                   if (dt.Is(kDataTypeValueInvalid)) {
  28475                                     UnallocatedT32(instr);
  28476                                     return;
  28477                                   }
  28478                                   if (((instr >> 12) & 1) != 0) {
  28479                                     UnallocatedT32(instr);
  28480                                     return;
  28481                                   }
  28482                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  28483                                   unsigned rn = ExtractDRegister(instr, 7, 16);
  28484                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  28485                                   // VSUBL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
  28486                                   vsubl(CurrentCond(),
  28487                                         dt,
  28488                                         QRegister(rd),
  28489                                         DRegister(rn),
  28490                                         DRegister(rm));
  28491                                   break;
  28492                                 }
  28493                                 case 0x00000300: {
  28494                                   // 0xef800300
  28495                                   if (((instr & 0x300000) == 0x300000)) {
  28496                                     UnallocatedT32(instr);
  28497                                     return;
  28498                                   }
  28499                                   DataType dt =
  28500                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  28501                                                          ((instr >> 26) & 0x4));
  28502                                   if (dt.Is(kDataTypeValueInvalid)) {
  28503                                     UnallocatedT32(instr);
  28504                                     return;
  28505                                   }
  28506                                   if (((instr >> 12) & 1) != 0) {
  28507                                     UnallocatedT32(instr);
  28508                                     return;
  28509                                   }
  28510                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  28511                                   if (((instr >> 16) & 1) != 0) {
  28512                                     UnallocatedT32(instr);
  28513                                     return;
  28514                                   }
  28515                                   unsigned rn = ExtractQRegister(instr, 7, 16);
  28516                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  28517                                   // VSUBW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; T1 NOLINT(whitespace/line_length)
  28518                                   vsubw(CurrentCond(),
  28519                                         dt,
  28520                                         QRegister(rd),
  28521                                         QRegister(rn),
  28522                                         DRegister(rm));
  28523                                   break;
  28524                                 }
  28525                               }
  28526                               break;
  28527                             }
  28528                             case 0x00000040: {
  28529                               // 0xef800040
  28530                               switch (instr & 0x00000200) {
  28531                                 case 0x00000000: {
  28532                                   // 0xef800040
  28533                                   switch (instr & 0x10000000) {
  28534                                     case 0x00000000: {
  28535                                       // 0xef800040
  28536                                       if (((instr & 0x300000) == 0x300000)) {
  28537                                         UnallocatedT32(instr);
  28538                                         return;
  28539                                       }
  28540                                       DataType dt =
  28541                                           Dt_size_9_Decode((instr >> 20) & 0x3,
  28542                                                            (instr >> 8) & 0x1);
  28543                                       if (dt.Is(kDataTypeValueInvalid)) {
  28544                                         UnallocatedT32(instr);
  28545                                         return;
  28546                                       }
  28547                                       unsigned rd =
  28548                                           ExtractDRegister(instr, 22, 12);
  28549                                       unsigned rn =
  28550                                           ExtractDRegister(instr, 7, 16);
  28551                                       int lane;
  28552                                       unsigned rm =
  28553                                           ExtractDRegisterAndLane(instr,
  28554                                                                   dt,
  28555                                                                   5,
  28556                                                                   0,
  28557                                                                   &lane);
  28558                                       // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
  28559                                       vmla(CurrentCond(),
  28560                                            dt,
  28561                                            DRegister(rd),
  28562                                            DRegister(rn),
  28563                                            DRegisterLane(rm, lane));
  28564                                       break;
  28565                                     }
  28566                                     case 0x10000000: {
  28567                                       // 0xff800040
  28568                                       if (((instr & 0x300000) == 0x300000)) {
  28569                                         UnallocatedT32(instr);
  28570                                         return;
  28571                                       }
  28572                                       DataType dt =
  28573                                           Dt_size_9_Decode((instr >> 20) & 0x3,
  28574                                                            (instr >> 8) & 0x1);
  28575                                       if (dt.Is(kDataTypeValueInvalid)) {
  28576                                         UnallocatedT32(instr);
  28577                                         return;
  28578                                       }
  28579                                       if (((instr >> 12) & 1) != 0) {
  28580                                         UnallocatedT32(instr);
  28581                                         return;
  28582                                       }
  28583                                       unsigned rd =
  28584                                           ExtractQRegister(instr, 22, 12);
  28585                                       if (((instr >> 16) & 1) != 0) {
  28586                                         UnallocatedT32(instr);
  28587                                         return;
  28588                                       }
  28589                                       unsigned rn =
  28590                                           ExtractQRegister(instr, 7, 16);
  28591                                       int lane;
  28592                                       unsigned rm =
  28593                                           ExtractDRegisterAndLane(instr,
  28594                                                                   dt,
  28595                                                                   5,
  28596                                                                   0,
  28597                                                                   &lane);
  28598                                       // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
  28599                                       vmla(CurrentCond(),
  28600                                            dt,
  28601                                            QRegister(rd),
  28602                                            QRegister(rn),
  28603                                            DRegisterLane(rm, lane));
  28604                                       break;
  28605                                     }
  28606                                   }
  28607                                   break;
  28608                                 }
  28609                                 case 0x00000200: {
  28610                                   // 0xef800240
  28611                                   switch (instr & 0x00000100) {
  28612                                     case 0x00000000: {
  28613                                       // 0xef800240
  28614                                       if (((instr & 0x300000) == 0x300000)) {
  28615                                         UnallocatedT32(instr);
  28616                                         return;
  28617                                       }
  28618                                       DataType dt =
  28619                                           Dt_size_11_Decode((instr >> 20) & 0x3,
  28620                                                             (instr >> 28) &
  28621                                                                 0x1);
  28622                                       if (dt.Is(kDataTypeValueInvalid)) {
  28623                                         UnallocatedT32(instr);
  28624                                         return;
  28625                                       }
  28626                                       if (((instr >> 12) & 1) != 0) {
  28627                                         UnallocatedT32(instr);
  28628                                         return;
  28629                                       }
  28630                                       unsigned rd =
  28631                                           ExtractQRegister(instr, 22, 12);
  28632                                       unsigned rn =
  28633                                           ExtractDRegister(instr, 7, 16);
  28634                                       int lane;
  28635                                       unsigned rm =
  28636                                           ExtractDRegisterAndLane(instr,
  28637                                                                   dt,
  28638                                                                   5,
  28639                                                                   0,
  28640                                                                   &lane);
  28641                                       // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
  28642                                       vmlal(CurrentCond(),
  28643                                             dt,
  28644                                             QRegister(rd),
  28645                                             DRegister(rn),
  28646                                             DRegisterLane(rm, lane));
  28647                                       break;
  28648                                     }
  28649                                     case 0x00000100: {
  28650                                       // 0xef800340
  28651                                       if ((instr & 0x10000000) == 0x00000000) {
  28652                                         if (((instr & 0x300000) == 0x300000)) {
  28653                                           UnallocatedT32(instr);
  28654                                           return;
  28655                                         }
  28656                                         DataType dt = Dt_size_13_Decode(
  28657                                             (instr >> 20) & 0x3);
  28658                                         if (dt.Is(kDataTypeValueInvalid)) {
  28659                                           UnallocatedT32(instr);
  28660                                           return;
  28661                                         }
  28662                                         if (((instr >> 12) & 1) != 0) {
  28663                                           UnallocatedT32(instr);
  28664                                           return;
  28665                                         }
  28666                                         unsigned rd =
  28667                                             ExtractQRegister(instr, 22, 12);
  28668                                         unsigned rn =
  28669                                             ExtractDRegister(instr, 7, 16);
  28670                                         uint32_t mvm = (instr & 0xf) |
  28671                                                        ((instr >> 1) & 0x10);
  28672                                         uint32_t shift = 4;
  28673                                         if (dt.Is(S16)) {
  28674                                           shift = 3;
  28675                                         }
  28676                                         uint32_t vm = mvm & ((1 << shift) - 1);
  28677                                         uint32_t index = mvm >> shift;
  28678                                         // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T2 NOLINT(whitespace/line_length)
  28679                                         vqdmlal(CurrentCond(),
  28680                                                 dt,
  28681                                                 QRegister(rd),
  28682                                                 DRegister(rn),
  28683                                                 DRegister(vm),
  28684                                                 index);
  28685                                       } else {
  28686                                         UnallocatedT32(instr);
  28687                                       }
  28688                                       break;
  28689                                     }
  28690                                   }
  28691                                   break;
  28692                                 }
  28693                               }
  28694                               break;
  28695                             }
  28696                             case 0x00000400: {
  28697                               // 0xef800400
  28698                               switch (instr & 0x00000300) {
  28699                                 case 0x00000000: {
  28700                                   // 0xef800400
  28701                                   switch (instr & 0x10000000) {
  28702                                     case 0x00000000: {
  28703                                       // 0xef800400
  28704                                       if (((instr & 0x300000) == 0x300000)) {
  28705                                         UnallocatedT32(instr);
  28706                                         return;
  28707                                       }
  28708                                       DataType dt =
  28709                                           Dt_size_3_Decode((instr >> 20) & 0x3);
  28710                                       if (dt.Is(kDataTypeValueInvalid)) {
  28711                                         UnallocatedT32(instr);
  28712                                         return;
  28713                                       }
  28714                                       unsigned rd =
  28715                                           ExtractDRegister(instr, 22, 12);
  28716                                       if (((instr >> 16) & 1) != 0) {
  28717                                         UnallocatedT32(instr);
  28718                                         return;
  28719                                       }
  28720                                       unsigned rn =
  28721                                           ExtractQRegister(instr, 7, 16);
  28722                                       if ((instr & 1) != 0) {
  28723                                         UnallocatedT32(instr);
  28724                                         return;
  28725                                       }
  28726                                       unsigned rm =
  28727                                           ExtractQRegister(instr, 5, 0);
  28728                                       // VADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
  28729                                       vaddhn(CurrentCond(),
  28730                                              dt,
  28731                                              DRegister(rd),
  28732                                              QRegister(rn),
  28733                                              QRegister(rm));
  28734                                       break;
  28735                                     }
  28736                                     case 0x10000000: {
  28737                                       // 0xff800400
  28738                                       if (((instr & 0x300000) == 0x300000)) {
  28739                                         UnallocatedT32(instr);
  28740                                         return;
  28741                                       }
  28742                                       DataType dt =
  28743                                           Dt_size_3_Decode((instr >> 20) & 0x3);
  28744                                       if (dt.Is(kDataTypeValueInvalid)) {
  28745                                         UnallocatedT32(instr);
  28746                                         return;
  28747                                       }
  28748                                       unsigned rd =
  28749                                           ExtractDRegister(instr, 22, 12);
  28750                                       if (((instr >> 16) & 1) != 0) {
  28751                                         UnallocatedT32(instr);
  28752                                         return;
  28753                                       }
  28754                                       unsigned rn =
  28755                                           ExtractQRegister(instr, 7, 16);
  28756                                       if ((instr & 1) != 0) {
  28757                                         UnallocatedT32(instr);
  28758                                         return;
  28759                                       }
  28760                                       unsigned rm =
  28761                                           ExtractQRegister(instr, 5, 0);
  28762                                       // VRADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
  28763                                       vraddhn(CurrentCond(),
  28764                                               dt,
  28765                                               DRegister(rd),
  28766                                               QRegister(rn),
  28767                                               QRegister(rm));
  28768                                       break;
  28769                                     }
  28770                                   }
  28771                                   break;
  28772                                 }
  28773                                 case 0x00000100: {
  28774                                   // 0xef800500
  28775                                   if (((instr & 0x300000) == 0x300000)) {
  28776                                     UnallocatedT32(instr);
  28777                                     return;
  28778                                   }
  28779                                   DataType dt =
  28780                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  28781                                                          ((instr >> 26) & 0x4));
  28782                                   if (dt.Is(kDataTypeValueInvalid)) {
  28783                                     UnallocatedT32(instr);
  28784                                     return;
  28785                                   }
  28786                                   if (((instr >> 12) & 1) != 0) {
  28787                                     UnallocatedT32(instr);
  28788                                     return;
  28789                                   }
  28790                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  28791                                   unsigned rn = ExtractDRegister(instr, 7, 16);
  28792                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  28793                                   // VABAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
  28794                                   vabal(CurrentCond(),
  28795                                         dt,
  28796                                         QRegister(rd),
  28797                                         DRegister(rn),
  28798                                         DRegister(rm));
  28799                                   break;
  28800                                 }
  28801                                 case 0x00000200: {
  28802                                   // 0xef800600
  28803                                   switch (instr & 0x10000000) {
  28804                                     case 0x00000000: {
  28805                                       // 0xef800600
  28806                                       if (((instr & 0x300000) == 0x300000)) {
  28807                                         UnallocatedT32(instr);
  28808                                         return;
  28809                                       }
  28810                                       DataType dt =
  28811                                           Dt_size_3_Decode((instr >> 20) & 0x3);
  28812                                       if (dt.Is(kDataTypeValueInvalid)) {
  28813                                         UnallocatedT32(instr);
  28814                                         return;
  28815                                       }
  28816                                       unsigned rd =
  28817                                           ExtractDRegister(instr, 22, 12);
  28818                                       if (((instr >> 16) & 1) != 0) {
  28819                                         UnallocatedT32(instr);
  28820                                         return;
  28821                                       }
  28822                                       unsigned rn =
  28823                                           ExtractQRegister(instr, 7, 16);
  28824                                       if ((instr & 1) != 0) {
  28825                                         UnallocatedT32(instr);
  28826                                         return;
  28827                                       }
  28828                                       unsigned rm =
  28829                                           ExtractQRegister(instr, 5, 0);
  28830                                       // VSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
  28831                                       vsubhn(CurrentCond(),
  28832                                              dt,
  28833                                              DRegister(rd),
  28834                                              QRegister(rn),
  28835                                              QRegister(rm));
  28836                                       break;
  28837                                     }
  28838                                     case 0x10000000: {
  28839                                       // 0xff800600
  28840                                       if (((instr & 0x300000) == 0x300000)) {
  28841                                         UnallocatedT32(instr);
  28842                                         return;
  28843                                       }
  28844                                       DataType dt =
  28845                                           Dt_size_3_Decode((instr >> 20) & 0x3);
  28846                                       if (dt.Is(kDataTypeValueInvalid)) {
  28847                                         UnallocatedT32(instr);
  28848                                         return;
  28849                                       }
  28850                                       unsigned rd =
  28851                                           ExtractDRegister(instr, 22, 12);
  28852                                       if (((instr >> 16) & 1) != 0) {
  28853                                         UnallocatedT32(instr);
  28854                                         return;
  28855                                       }
  28856                                       unsigned rn =
  28857                                           ExtractQRegister(instr, 7, 16);
  28858                                       if ((instr & 1) != 0) {
  28859                                         UnallocatedT32(instr);
  28860                                         return;
  28861                                       }
  28862                                       unsigned rm =
  28863                                           ExtractQRegister(instr, 5, 0);
  28864                                       // VRSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length)
  28865                                       vrsubhn(CurrentCond(),
  28866                                               dt,
  28867                                               DRegister(rd),
  28868                                               QRegister(rn),
  28869                                               QRegister(rm));
  28870                                       break;
  28871                                     }
  28872                                   }
  28873                                   break;
  28874                                 }
  28875                                 case 0x00000300: {
  28876                                   // 0xef800700
  28877                                   if (((instr & 0x300000) == 0x300000)) {
  28878                                     UnallocatedT32(instr);
  28879                                     return;
  28880                                   }
  28881                                   DataType dt =
  28882                                       Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  28883                                                          ((instr >> 26) & 0x4));
  28884                                   if (dt.Is(kDataTypeValueInvalid)) {
  28885                                     UnallocatedT32(instr);
  28886                                     return;
  28887                                   }
  28888                                   if (((instr >> 12) & 1) != 0) {
  28889                                     UnallocatedT32(instr);
  28890                                     return;
  28891                                   }
  28892                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  28893                                   unsigned rn = ExtractDRegister(instr, 7, 16);
  28894                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  28895                                   // VABDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
  28896                                   vabdl(CurrentCond(),
  28897                                         dt,
  28898                                         QRegister(rd),
  28899                                         DRegister(rn),
  28900                                         DRegister(rm));
  28901                                   break;
  28902                                 }
  28903                               }
  28904                               break;
  28905                             }
  28906                             case 0x00000440: {
  28907                               // 0xef800440
  28908                               switch (instr & 0x00000200) {
  28909                                 case 0x00000000: {
  28910                                   // 0xef800440
  28911                                   switch (instr & 0x10000000) {
  28912                                     case 0x00000000: {
  28913                                       // 0xef800440
  28914                                       if (((instr & 0x300000) == 0x300000)) {
  28915                                         UnallocatedT32(instr);
  28916                                         return;
  28917                                       }
  28918                                       DataType dt =
  28919                                           Dt_size_9_Decode((instr >> 20) & 0x3,
  28920                                                            (instr >> 8) & 0x1);
  28921                                       if (dt.Is(kDataTypeValueInvalid)) {
  28922                                         UnallocatedT32(instr);
  28923                                         return;
  28924                                       }
  28925                                       unsigned rd =
  28926                                           ExtractDRegister(instr, 22, 12);
  28927                                       unsigned rn =
  28928                                           ExtractDRegister(instr, 7, 16);
  28929                                       int lane;
  28930                                       unsigned rm =
  28931                                           ExtractDRegisterAndLane(instr,
  28932                                                                   dt,
  28933                                                                   5,
  28934                                                                   0,
  28935                                                                   &lane);
  28936                                       // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
  28937                                       vmls(CurrentCond(),
  28938                                            dt,
  28939                                            DRegister(rd),
  28940                                            DRegister(rn),
  28941                                            DRegisterLane(rm, lane));
  28942                                       break;
  28943                                     }
  28944                                     case 0x10000000: {
  28945                                       // 0xff800440
  28946                                       if (((instr & 0x300000) == 0x300000)) {
  28947                                         UnallocatedT32(instr);
  28948                                         return;
  28949                                       }
  28950                                       DataType dt =
  28951                                           Dt_size_9_Decode((instr >> 20) & 0x3,
  28952                                                            (instr >> 8) & 0x1);
  28953                                       if (dt.Is(kDataTypeValueInvalid)) {
  28954                                         UnallocatedT32(instr);
  28955                                         return;
  28956                                       }
  28957                                       if (((instr >> 12) & 1) != 0) {
  28958                                         UnallocatedT32(instr);
  28959                                         return;
  28960                                       }
  28961                                       unsigned rd =
  28962                                           ExtractQRegister(instr, 22, 12);
  28963                                       if (((instr >> 16) & 1) != 0) {
  28964                                         UnallocatedT32(instr);
  28965                                         return;
  28966                                       }
  28967                                       unsigned rn =
  28968                                           ExtractQRegister(instr, 7, 16);
  28969                                       int lane;
  28970                                       unsigned rm =
  28971                                           ExtractDRegisterAndLane(instr,
  28972                                                                   dt,
  28973                                                                   5,
  28974                                                                   0,
  28975                                                                   &lane);
  28976                                       // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
  28977                                       vmls(CurrentCond(),
  28978                                            dt,
  28979                                            QRegister(rd),
  28980                                            QRegister(rn),
  28981                                            DRegisterLane(rm, lane));
  28982                                       break;
  28983                                     }
  28984                                   }
  28985                                   break;
  28986                                 }
  28987                                 case 0x00000200: {
  28988                                   // 0xef800640
  28989                                   switch (instr & 0x00000100) {
  28990                                     case 0x00000000: {
  28991                                       // 0xef800640
  28992                                       if (((instr & 0x300000) == 0x300000)) {
  28993                                         UnallocatedT32(instr);
  28994                                         return;
  28995                                       }
  28996                                       DataType dt =
  28997                                           Dt_size_11_Decode((instr >> 20) & 0x3,
  28998                                                             (instr >> 28) &
  28999                                                                 0x1);
  29000                                       if (dt.Is(kDataTypeValueInvalid)) {
  29001                                         UnallocatedT32(instr);
  29002                                         return;
  29003                                       }
  29004                                       if (((instr >> 12) & 1) != 0) {
  29005                                         UnallocatedT32(instr);
  29006                                         return;
  29007                                       }
  29008                                       unsigned rd =
  29009                                           ExtractQRegister(instr, 22, 12);
  29010                                       unsigned rn =
  29011                                           ExtractDRegister(instr, 7, 16);
  29012                                       int lane;
  29013                                       unsigned rm =
  29014                                           ExtractDRegisterAndLane(instr,
  29015                                                                   dt,
  29016                                                                   5,
  29017                                                                   0,
  29018                                                                   &lane);
  29019                                       // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length)
  29020                                       vmlsl(CurrentCond(),
  29021                                             dt,
  29022                                             QRegister(rd),
  29023                                             DRegister(rn),
  29024                                             DRegisterLane(rm, lane));
  29025                                       break;
  29026                                     }
  29027                                     case 0x00000100: {
  29028                                       // 0xef800740
  29029                                       if ((instr & 0x10000000) == 0x00000000) {
  29030                                         if (((instr & 0x300000) == 0x300000)) {
  29031                                           UnallocatedT32(instr);
  29032                                           return;
  29033                                         }
  29034                                         DataType dt = Dt_size_13_Decode(
  29035                                             (instr >> 20) & 0x3);
  29036                                         if (dt.Is(kDataTypeValueInvalid)) {
  29037                                           UnallocatedT32(instr);
  29038                                           return;
  29039                                         }
  29040                                         if (((instr >> 12) & 1) != 0) {
  29041                                           UnallocatedT32(instr);
  29042                                           return;
  29043                                         }
  29044                                         unsigned rd =
  29045                                             ExtractQRegister(instr, 22, 12);
  29046                                         unsigned rn =
  29047                                             ExtractDRegister(instr, 7, 16);
  29048                                         uint32_t mvm = (instr & 0xf) |
  29049                                                        ((instr >> 1) & 0x10);
  29050                                         uint32_t shift = 4;
  29051                                         if (dt.Is(S16)) {
  29052                                           shift = 3;
  29053                                         }
  29054                                         uint32_t vm = mvm & ((1 << shift) - 1);
  29055                                         uint32_t index = mvm >> shift;
  29056                                         // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T2 NOLINT(whitespace/line_length)
  29057                                         vqdmlsl(CurrentCond(),
  29058                                                 dt,
  29059                                                 QRegister(rd),
  29060                                                 DRegister(rn),
  29061                                                 DRegister(vm),
  29062                                                 index);
  29063                                       } else {
  29064                                         UnallocatedT32(instr);
  29065                                       }
  29066                                       break;
  29067                                     }
  29068                                   }
  29069                                   break;
  29070                                 }
  29071                               }
  29072                               break;
  29073                             }
  29074                             case 0x00000800: {
  29075                               // 0xef800800
  29076                               switch (instr & 0x00000300) {
  29077                                 case 0x00000000: {
  29078                                   // 0xef800800
  29079                                   if (((instr & 0x300000) == 0x300000)) {
  29080                                     UnallocatedT32(instr);
  29081                                     return;
  29082                                   }
  29083                                   DataType dt =
  29084                                       Dt_size_12_Decode((instr >> 20) & 0x3,
  29085                                                         (instr >> 28) & 0x1);
  29086                                   if (dt.Is(kDataTypeValueInvalid)) {
  29087                                     UnallocatedT32(instr);
  29088                                     return;
  29089                                   }
  29090                                   if (((instr >> 12) & 1) != 0) {
  29091                                     UnallocatedT32(instr);
  29092                                     return;
  29093                                   }
  29094                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  29095                                   unsigned rn = ExtractDRegister(instr, 7, 16);
  29096                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  29097                                   // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
  29098                                   vmlal(CurrentCond(),
  29099                                         dt,
  29100                                         QRegister(rd),
  29101                                         DRegister(rn),
  29102                                         DRegister(rm));
  29103                                   break;
  29104                                 }
  29105                                 case 0x00000100: {
  29106                                   // 0xef800900
  29107                                   if ((instr & 0x10000000) == 0x00000000) {
  29108                                     if (((instr & 0x300000) == 0x300000)) {
  29109                                       UnallocatedT32(instr);
  29110                                       return;
  29111                                     }
  29112                                     DataType dt =
  29113                                         Dt_size_13_Decode((instr >> 20) & 0x3);
  29114                                     if (dt.Is(kDataTypeValueInvalid)) {
  29115                                       UnallocatedT32(instr);
  29116                                       return;
  29117                                     }
  29118                                     if (((instr >> 12) & 1) != 0) {
  29119                                       UnallocatedT32(instr);
  29120                                       return;
  29121                                     }
  29122                                     unsigned rd =
  29123                                         ExtractQRegister(instr, 22, 12);
  29124                                     unsigned rn =
  29125                                         ExtractDRegister(instr, 7, 16);
  29126                                     unsigned rm = ExtractDRegister(instr, 5, 0);
  29127                                     // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
  29128                                     vqdmlal(CurrentCond(),
  29129                                             dt,
  29130                                             QRegister(rd),
  29131                                             DRegister(rn),
  29132                                             DRegister(rm));
  29133                                   } else {
  29134                                     UnallocatedT32(instr);
  29135                                   }
  29136                                   break;
  29137                                 }
  29138                                 case 0x00000200: {
  29139                                   // 0xef800a00
  29140                                   if (((instr & 0x300000) == 0x300000)) {
  29141                                     UnallocatedT32(instr);
  29142                                     return;
  29143                                   }
  29144                                   DataType dt =
  29145                                       Dt_size_12_Decode((instr >> 20) & 0x3,
  29146                                                         (instr >> 28) & 0x1);
  29147                                   if (dt.Is(kDataTypeValueInvalid)) {
  29148                                     UnallocatedT32(instr);
  29149                                     return;
  29150                                   }
  29151                                   if (((instr >> 12) & 1) != 0) {
  29152                                     UnallocatedT32(instr);
  29153                                     return;
  29154                                   }
  29155                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  29156                                   unsigned rn = ExtractDRegister(instr, 7, 16);
  29157                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  29158                                   // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
  29159                                   vmlsl(CurrentCond(),
  29160                                         dt,
  29161                                         QRegister(rd),
  29162                                         DRegister(rn),
  29163                                         DRegister(rm));
  29164                                   break;
  29165                                 }
  29166                                 case 0x00000300: {
  29167                                   // 0xef800b00
  29168                                   if ((instr & 0x10000000) == 0x00000000) {
  29169                                     if (((instr & 0x300000) == 0x300000)) {
  29170                                       UnallocatedT32(instr);
  29171                                       return;
  29172                                     }
  29173                                     DataType dt =
  29174                                         Dt_size_13_Decode((instr >> 20) & 0x3);
  29175                                     if (dt.Is(kDataTypeValueInvalid)) {
  29176                                       UnallocatedT32(instr);
  29177                                       return;
  29178                                     }
  29179                                     if (((instr >> 12) & 1) != 0) {
  29180                                       UnallocatedT32(instr);
  29181                                       return;
  29182                                     }
  29183                                     unsigned rd =
  29184                                         ExtractQRegister(instr, 22, 12);
  29185                                     unsigned rn =
  29186                                         ExtractDRegister(instr, 7, 16);
  29187                                     unsigned rm = ExtractDRegister(instr, 5, 0);
  29188                                     // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
  29189                                     vqdmlsl(CurrentCond(),
  29190                                             dt,
  29191                                             QRegister(rd),
  29192                                             DRegister(rn),
  29193                                             DRegister(rm));
  29194                                   } else {
  29195                                     UnallocatedT32(instr);
  29196                                   }
  29197                                   break;
  29198                                 }
  29199                               }
  29200                               break;
  29201                             }
  29202                             case 0x00000840: {
  29203                               // 0xef800840
  29204                               switch (instr & 0x00000200) {
  29205                                 case 0x00000000: {
  29206                                   // 0xef800840
  29207                                   switch (instr & 0x10000000) {
  29208                                     case 0x00000000: {
  29209                                       // 0xef800840
  29210                                       if (((instr & 0x300000) == 0x300000)) {
  29211                                         UnallocatedT32(instr);
  29212                                         return;
  29213                                       }
  29214                                       DataType dt = Dt_F_size_3_Decode(
  29215                                           ((instr >> 20) & 0x3) |
  29216                                           ((instr >> 6) & 0x4));
  29217                                       if (dt.Is(kDataTypeValueInvalid)) {
  29218                                         UnallocatedT32(instr);
  29219                                         return;
  29220                                       }
  29221                                       unsigned rd =
  29222                                           ExtractDRegister(instr, 22, 12);
  29223                                       unsigned rn =
  29224                                           ExtractDRegister(instr, 7, 16);
  29225                                       uint32_t mvm =
  29226                                           (instr & 0xf) | ((instr >> 1) & 0x10);
  29227                                       uint32_t shift = 4;
  29228                                       if (dt.Is(I16)) {
  29229                                         shift = 3;
  29230                                       }
  29231                                       uint32_t vm = mvm & ((1 << shift) - 1);
  29232                                       uint32_t index = mvm >> shift;
  29233                                       // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
  29234                                       vmul(CurrentCond(),
  29235                                            dt,
  29236                                            DRegister(rd),
  29237                                            DRegister(rn),
  29238                                            DRegister(vm),
  29239                                            index);
  29240                                       break;
  29241                                     }
  29242                                     case 0x10000000: {
  29243                                       // 0xff800840
  29244                                       if (((instr & 0x300000) == 0x300000)) {
  29245                                         UnallocatedT32(instr);
  29246                                         return;
  29247                                       }
  29248                                       DataType dt = Dt_F_size_3_Decode(
  29249                                           ((instr >> 20) & 0x3) |
  29250                                           ((instr >> 6) & 0x4));
  29251                                       if (dt.Is(kDataTypeValueInvalid)) {
  29252                                         UnallocatedT32(instr);
  29253                                         return;
  29254                                       }
  29255                                       if (((instr >> 12) & 1) != 0) {
  29256                                         UnallocatedT32(instr);
  29257                                         return;
  29258                                       }
  29259                                       unsigned rd =
  29260                                           ExtractQRegister(instr, 22, 12);
  29261                                       if (((instr >> 16) & 1) != 0) {
  29262                                         UnallocatedT32(instr);
  29263                                         return;
  29264                                       }
  29265                                       unsigned rn =
  29266                                           ExtractQRegister(instr, 7, 16);
  29267                                       uint32_t mvm =
  29268                                           (instr & 0xf) | ((instr >> 1) & 0x10);
  29269                                       uint32_t shift = 4;
  29270                                       if (dt.Is(I16)) {
  29271                                         shift = 3;
  29272                                       }
  29273                                       uint32_t vm = mvm & ((1 << shift) - 1);
  29274                                       uint32_t index = mvm >> shift;
  29275                                       // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
  29276                                       vmul(CurrentCond(),
  29277                                            dt,
  29278                                            QRegister(rd),
  29279                                            QRegister(rn),
  29280                                            DRegister(vm),
  29281                                            index);
  29282                                       break;
  29283                                     }
  29284                                   }
  29285                                   break;
  29286                                 }
  29287                                 case 0x00000200: {
  29288                                   // 0xef800a40
  29289                                   switch (instr & 0x00000100) {
  29290                                     case 0x00000000: {
  29291                                       // 0xef800a40
  29292                                       if (((instr & 0x300000) == 0x300000)) {
  29293                                         UnallocatedT32(instr);
  29294                                         return;
  29295                                       }
  29296                                       DataType dt = Dt_U_size_2_Decode(
  29297                                           ((instr >> 20) & 0x3) |
  29298                                           ((instr >> 26) & 0x4));
  29299                                       if (dt.Is(kDataTypeValueInvalid)) {
  29300                                         UnallocatedT32(instr);
  29301                                         return;
  29302                                       }
  29303                                       if (((instr >> 12) & 1) != 0) {
  29304                                         UnallocatedT32(instr);
  29305                                         return;
  29306                                       }
  29307                                       unsigned rd =
  29308                                           ExtractQRegister(instr, 22, 12);
  29309                                       unsigned rn =
  29310                                           ExtractDRegister(instr, 7, 16);
  29311                                       uint32_t mvm =
  29312                                           (instr & 0xf) | ((instr >> 1) & 0x10);
  29313                                       uint32_t shift = 4;
  29314                                       if (dt.Is(S16) || dt.Is(U16)) {
  29315                                         shift = 3;
  29316                                       }
  29317                                       uint32_t vm = mvm & ((1 << shift) - 1);
  29318                                       uint32_t index = mvm >> shift;
  29319                                       // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length)
  29320                                       vmull(CurrentCond(),
  29321                                             dt,
  29322                                             QRegister(rd),
  29323                                             DRegister(rn),
  29324                                             DRegister(vm),
  29325                                             index);
  29326                                       break;
  29327                                     }
  29328                                     case 0x00000100: {
  29329                                       // 0xef800b40
  29330                                       if ((instr & 0x10000000) == 0x00000000) {
  29331                                         if (((instr & 0x300000) == 0x300000)) {
  29332                                           UnallocatedT32(instr);
  29333                                           return;
  29334                                         }
  29335                                         DataType dt = Dt_size_13_Decode(
  29336                                             (instr >> 20) & 0x3);
  29337                                         if (dt.Is(kDataTypeValueInvalid)) {
  29338                                           UnallocatedT32(instr);
  29339                                           return;
  29340                                         }
  29341                                         if (((instr >> 12) & 1) != 0) {
  29342                                           UnallocatedT32(instr);
  29343                                           return;
  29344                                         }
  29345                                         unsigned rd =
  29346                                             ExtractQRegister(instr, 22, 12);
  29347                                         unsigned rn =
  29348                                             ExtractDRegister(instr, 7, 16);
  29349                                         int lane;
  29350                                         unsigned rm =
  29351                                             ExtractDRegisterAndLane(instr,
  29352                                                                     dt,
  29353                                                                     5,
  29354                                                                     0,
  29355                                                                     &lane);
  29356                                         // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
  29357                                         vqdmull(CurrentCond(),
  29358                                                 dt,
  29359                                                 QRegister(rd),
  29360                                                 DRegister(rn),
  29361                                                 DRegisterLane(rm, lane));
  29362                                       } else {
  29363                                         UnallocatedT32(instr);
  29364                                       }
  29365                                       break;
  29366                                     }
  29367                                   }
  29368                                   break;
  29369                                 }
  29370                               }
  29371                               break;
  29372                             }
  29373                             case 0x00000c00: {
  29374                               // 0xef800c00
  29375                               switch (instr & 0x00000100) {
  29376                                 case 0x00000000: {
  29377                                   // 0xef800c00
  29378                                   if (((instr & 0x300000) == 0x300000)) {
  29379                                     UnallocatedT32(instr);
  29380                                     return;
  29381                                   }
  29382                                   DataType dt = Dt_op_U_size_1_Decode(
  29383                                       ((instr >> 20) & 0x3) |
  29384                                       ((instr >> 26) & 0x4) |
  29385                                       ((instr >> 6) & 0x8));
  29386                                   if (dt.Is(kDataTypeValueInvalid)) {
  29387                                     UnallocatedT32(instr);
  29388                                     return;
  29389                                   }
  29390                                   if (((instr >> 12) & 1) != 0) {
  29391                                     UnallocatedT32(instr);
  29392                                     return;
  29393                                   }
  29394                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  29395                                   unsigned rn = ExtractDRegister(instr, 7, 16);
  29396                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  29397                                   // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1
  29398                                   vmull(CurrentCond(),
  29399                                         dt,
  29400                                         QRegister(rd),
  29401                                         DRegister(rn),
  29402                                         DRegister(rm));
  29403                                   break;
  29404                                 }
  29405                                 case 0x00000100: {
  29406                                   // 0xef800d00
  29407                                   if ((instr & 0x10000200) == 0x00000000) {
  29408                                     if (((instr & 0x300000) == 0x300000)) {
  29409                                       UnallocatedT32(instr);
  29410                                       return;
  29411                                     }
  29412                                     DataType dt =
  29413                                         Dt_size_13_Decode((instr >> 20) & 0x3);
  29414                                     if (dt.Is(kDataTypeValueInvalid)) {
  29415                                       UnallocatedT32(instr);
  29416                                       return;
  29417                                     }
  29418                                     if (((instr >> 12) & 1) != 0) {
  29419                                       UnallocatedT32(instr);
  29420                                       return;
  29421                                     }
  29422                                     unsigned rd =
  29423                                         ExtractQRegister(instr, 22, 12);
  29424                                     unsigned rn =
  29425                                         ExtractDRegister(instr, 7, 16);
  29426                                     unsigned rm = ExtractDRegister(instr, 5, 0);
  29427                                     // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length)
  29428                                     vqdmull(CurrentCond(),
  29429                                             dt,
  29430                                             QRegister(rd),
  29431                                             DRegister(rn),
  29432                                             DRegister(rm));
  29433                                   } else {
  29434                                     UnallocatedT32(instr);
  29435                                   }
  29436                                   break;
  29437                                 }
  29438                               }
  29439                               break;
  29440                             }
  29441                             case 0x00000c40: {
  29442                               // 0xef800c40
  29443                               switch (instr & 0x10000300) {
  29444                                 case 0x00000000: {
  29445                                   // 0xef800c40
  29446                                   if (((instr & 0x300000) == 0x300000)) {
  29447                                     UnallocatedT32(instr);
  29448                                     return;
  29449                                   }
  29450                                   DataType dt =
  29451                                       Dt_size_13_Decode((instr >> 20) & 0x3);
  29452                                   if (dt.Is(kDataTypeValueInvalid)) {
  29453                                     UnallocatedT32(instr);
  29454                                     return;
  29455                                   }
  29456                                   unsigned rd = ExtractDRegister(instr, 22, 12);
  29457                                   unsigned rn = ExtractDRegister(instr, 7, 16);
  29458                                   int lane;
  29459                                   unsigned rm = ExtractDRegisterAndLane(instr,
  29460                                                                         dt,
  29461                                                                         5,
  29462                                                                         0,
  29463                                                                         &lane);
  29464                                   // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
  29465                                   vqdmulh(CurrentCond(),
  29466                                           dt,
  29467                                           DRegister(rd),
  29468                                           DRegister(rn),
  29469                                           DRegisterLane(rm, lane));
  29470                                   break;
  29471                                 }
  29472                                 case 0x00000100: {
  29473                                   // 0xef800d40
  29474                                   if (((instr & 0x300000) == 0x300000)) {
  29475                                     UnallocatedT32(instr);
  29476                                     return;
  29477                                   }
  29478                                   DataType dt =
  29479                                       Dt_size_13_Decode((instr >> 20) & 0x3);
  29480                                   if (dt.Is(kDataTypeValueInvalid)) {
  29481                                     UnallocatedT32(instr);
  29482                                     return;
  29483                                   }
  29484                                   unsigned rd = ExtractDRegister(instr, 22, 12);
  29485                                   unsigned rn = ExtractDRegister(instr, 7, 16);
  29486                                   int lane;
  29487                                   unsigned rm = ExtractDRegisterAndLane(instr,
  29488                                                                         dt,
  29489                                                                         5,
  29490                                                                         0,
  29491                                                                         &lane);
  29492                                   // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
  29493                                   vqrdmulh(CurrentCond(),
  29494                                            dt,
  29495                                            DRegister(rd),
  29496                                            DRegister(rn),
  29497                                            DRegisterLane(rm, lane));
  29498                                   break;
  29499                                 }
  29500                                 case 0x10000000: {
  29501                                   // 0xff800c40
  29502                                   if (((instr & 0x300000) == 0x300000)) {
  29503                                     UnallocatedT32(instr);
  29504                                     return;
  29505                                   }
  29506                                   DataType dt =
  29507                                       Dt_size_13_Decode((instr >> 20) & 0x3);
  29508                                   if (dt.Is(kDataTypeValueInvalid)) {
  29509                                     UnallocatedT32(instr);
  29510                                     return;
  29511                                   }
  29512                                   if (((instr >> 12) & 1) != 0) {
  29513                                     UnallocatedT32(instr);
  29514                                     return;
  29515                                   }
  29516                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  29517                                   if (((instr >> 16) & 1) != 0) {
  29518                                     UnallocatedT32(instr);
  29519                                     return;
  29520                                   }
  29521                                   unsigned rn = ExtractQRegister(instr, 7, 16);
  29522                                   int lane;
  29523                                   unsigned rm = ExtractDRegisterAndLane(instr,
  29524                                                                         dt,
  29525                                                                         5,
  29526                                                                         0,
  29527                                                                         &lane);
  29528                                   // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
  29529                                   vqdmulh(CurrentCond(),
  29530                                           dt,
  29531                                           QRegister(rd),
  29532                                           QRegister(rn),
  29533                                           DRegisterLane(rm, lane));
  29534                                   break;
  29535                                 }
  29536                                 case 0x10000100: {
  29537                                   // 0xff800d40
  29538                                   if (((instr & 0x300000) == 0x300000)) {
  29539                                     UnallocatedT32(instr);
  29540                                     return;
  29541                                   }
  29542                                   DataType dt =
  29543                                       Dt_size_13_Decode((instr >> 20) & 0x3);
  29544                                   if (dt.Is(kDataTypeValueInvalid)) {
  29545                                     UnallocatedT32(instr);
  29546                                     return;
  29547                                   }
  29548                                   if (((instr >> 12) & 1) != 0) {
  29549                                     UnallocatedT32(instr);
  29550                                     return;
  29551                                   }
  29552                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  29553                                   if (((instr >> 16) & 1) != 0) {
  29554                                     UnallocatedT32(instr);
  29555                                     return;
  29556                                   }
  29557                                   unsigned rn = ExtractQRegister(instr, 7, 16);
  29558                                   int lane;
  29559                                   unsigned rm = ExtractDRegisterAndLane(instr,
  29560                                                                         dt,
  29561                                                                         5,
  29562                                                                         0,
  29563                                                                         &lane);
  29564                                   // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length)
  29565                                   vqrdmulh(CurrentCond(),
  29566                                            dt,
  29567                                            QRegister(rd),
  29568                                            QRegister(rn),
  29569                                            DRegisterLane(rm, lane));
  29570                                   break;
  29571                                 }
  29572                                 default:
  29573                                   UnallocatedT32(instr);
  29574                                   break;
  29575                               }
  29576                               break;
  29577                             }
  29578                           }
  29579                           break;
  29580                         }
  29581                       }
  29582                       break;
  29583                     }
  29584                   }
  29585                   break;
  29586                 }
  29587                 case 0x01000010: {
  29588                   // 0xef000010
  29589                   switch (instr & 0x00800040) {
  29590                     case 0x00000000: {
  29591                       // 0xef000010
  29592                       switch (instr & 0x00000f00) {
  29593                         case 0x00000000: {
  29594                           // 0xef000010
  29595                           DataType dt = Dt_U_size_3_Decode(
  29596                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  29597                           if (dt.Is(kDataTypeValueInvalid)) {
  29598                             UnallocatedT32(instr);
  29599                             return;
  29600                           }
  29601                           unsigned rd = ExtractDRegister(instr, 22, 12);
  29602                           unsigned rn = ExtractDRegister(instr, 7, 16);
  29603                           unsigned rm = ExtractDRegister(instr, 5, 0);
  29604                           // VQADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  29605                           vqadd(CurrentCond(),
  29606                                 dt,
  29607                                 DRegister(rd),
  29608                                 DRegister(rn),
  29609                                 DRegister(rm));
  29610                           break;
  29611                         }
  29612                         case 0x00000100: {
  29613                           // 0xef000110
  29614                           switch (instr & 0x10300000) {
  29615                             case 0x00000000: {
  29616                               // 0xef000110
  29617                               unsigned rd = ExtractDRegister(instr, 22, 12);
  29618                               unsigned rn = ExtractDRegister(instr, 7, 16);
  29619                               unsigned rm = ExtractDRegister(instr, 5, 0);
  29620                               // VAND{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
  29621                               vand(CurrentCond(),
  29622                                    kDataTypeValueNone,
  29623                                    DRegister(rd),
  29624                                    DRegister(rn),
  29625                                    DRegister(rm));
  29626                               break;
  29627                             }
  29628                             case 0x00100000: {
  29629                               // 0xef100110
  29630                               unsigned rd = ExtractDRegister(instr, 22, 12);
  29631                               unsigned rn = ExtractDRegister(instr, 7, 16);
  29632                               unsigned rm = ExtractDRegister(instr, 5, 0);
  29633                               // VBIC{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
  29634                               vbic(CurrentCond(),
  29635                                    kDataTypeValueNone,
  29636                                    DRegister(rd),
  29637                                    DRegister(rn),
  29638                                    DRegister(rm));
  29639                               break;
  29640                             }
  29641                             case 0x00200000: {
  29642                               // 0xef200110
  29643                               if (((instr & 0x00000040) == 0x00000000) &&
  29644                                   ((((Uint32((instr >> 7)) & Uint32(0x1))
  29645                                      << 4) |
  29646                                     (Uint32((instr >> 16)) & Uint32(0xf))) ==
  29647                                    (((Uint32((instr >> 5)) & Uint32(0x1))
  29648                                      << 4) |
  29649                                     (Uint32(instr) & Uint32(0xf))))) {
  29650                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  29651                                 unsigned rm = ExtractDRegister(instr, 7, 16);
  29652                                 // VMOV{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1
  29653                                 vmov(CurrentCond(),
  29654                                      kDataTypeValueNone,
  29655                                      DRegister(rd),
  29656                                      DRegister(rm));
  29657                                 return;
  29658                               }
  29659                               unsigned rd = ExtractDRegister(instr, 22, 12);
  29660                               unsigned rn = ExtractDRegister(instr, 7, 16);
  29661                               unsigned rm = ExtractDRegister(instr, 5, 0);
  29662                               // VORR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
  29663                               vorr(CurrentCond(),
  29664                                    kDataTypeValueNone,
  29665                                    DRegister(rd),
  29666                                    DRegister(rn),
  29667                                    DRegister(rm));
  29668                               break;
  29669                             }
  29670                             case 0x00300000: {
  29671                               // 0xef300110
  29672                               unsigned rd = ExtractDRegister(instr, 22, 12);
  29673                               unsigned rn = ExtractDRegister(instr, 7, 16);
  29674                               unsigned rm = ExtractDRegister(instr, 5, 0);
  29675                               // VORN{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
  29676                               vorn(CurrentCond(),
  29677                                    kDataTypeValueNone,
  29678                                    DRegister(rd),
  29679                                    DRegister(rn),
  29680                                    DRegister(rm));
  29681                               break;
  29682                             }
  29683                             case 0x10000000: {
  29684                               // 0xff000110
  29685                               unsigned rd = ExtractDRegister(instr, 22, 12);
  29686                               unsigned rn = ExtractDRegister(instr, 7, 16);
  29687                               unsigned rm = ExtractDRegister(instr, 5, 0);
  29688                               // VEOR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
  29689                               veor(CurrentCond(),
  29690                                    kDataTypeValueNone,
  29691                                    DRegister(rd),
  29692                                    DRegister(rn),
  29693                                    DRegister(rm));
  29694                               break;
  29695                             }
  29696                             case 0x10100000: {
  29697                               // 0xff100110
  29698                               unsigned rd = ExtractDRegister(instr, 22, 12);
  29699                               unsigned rn = ExtractDRegister(instr, 7, 16);
  29700                               unsigned rm = ExtractDRegister(instr, 5, 0);
  29701                               // VBSL{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
  29702                               vbsl(CurrentCond(),
  29703                                    kDataTypeValueNone,
  29704                                    DRegister(rd),
  29705                                    DRegister(rn),
  29706                                    DRegister(rm));
  29707                               break;
  29708                             }
  29709                             case 0x10200000: {
  29710                               // 0xff200110
  29711                               unsigned rd = ExtractDRegister(instr, 22, 12);
  29712                               unsigned rn = ExtractDRegister(instr, 7, 16);
  29713                               unsigned rm = ExtractDRegister(instr, 5, 0);
  29714                               // VBIT{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
  29715                               vbit(CurrentCond(),
  29716                                    kDataTypeValueNone,
  29717                                    DRegister(rd),
  29718                                    DRegister(rn),
  29719                                    DRegister(rm));
  29720                               break;
  29721                             }
  29722                             case 0x10300000: {
  29723                               // 0xff300110
  29724                               unsigned rd = ExtractDRegister(instr, 22, 12);
  29725                               unsigned rn = ExtractDRegister(instr, 7, 16);
  29726                               unsigned rm = ExtractDRegister(instr, 5, 0);
  29727                               // VBIF{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1
  29728                               vbif(CurrentCond(),
  29729                                    kDataTypeValueNone,
  29730                                    DRegister(rd),
  29731                                    DRegister(rn),
  29732                                    DRegister(rm));
  29733                               break;
  29734                             }
  29735                           }
  29736                           break;
  29737                         }
  29738                         case 0x00000200: {
  29739                           // 0xef000210
  29740                           DataType dt = Dt_U_size_3_Decode(
  29741                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  29742                           if (dt.Is(kDataTypeValueInvalid)) {
  29743                             UnallocatedT32(instr);
  29744                             return;
  29745                           }
  29746                           unsigned rd = ExtractDRegister(instr, 22, 12);
  29747                           unsigned rn = ExtractDRegister(instr, 7, 16);
  29748                           unsigned rm = ExtractDRegister(instr, 5, 0);
  29749                           // VQSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  29750                           vqsub(CurrentCond(),
  29751                                 dt,
  29752                                 DRegister(rd),
  29753                                 DRegister(rn),
  29754                                 DRegister(rm));
  29755                           break;
  29756                         }
  29757                         case 0x00000300: {
  29758                           // 0xef000310
  29759                           DataType dt = Dt_U_size_1_Decode(
  29760                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  29761                           if (dt.Is(kDataTypeValueInvalid)) {
  29762                             UnallocatedT32(instr);
  29763                             return;
  29764                           }
  29765                           unsigned rd = ExtractDRegister(instr, 22, 12);
  29766                           unsigned rn = ExtractDRegister(instr, 7, 16);
  29767                           unsigned rm = ExtractDRegister(instr, 5, 0);
  29768                           // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  29769                           vcge(CurrentCond(),
  29770                                dt,
  29771                                DRegister(rd),
  29772                                DRegister(rn),
  29773                                DRegister(rm));
  29774                           break;
  29775                         }
  29776                         case 0x00000400: {
  29777                           // 0xef000410
  29778                           DataType dt = Dt_U_size_3_Decode(
  29779                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  29780                           if (dt.Is(kDataTypeValueInvalid)) {
  29781                             UnallocatedT32(instr);
  29782                             return;
  29783                           }
  29784                           unsigned rd = ExtractDRegister(instr, 22, 12);
  29785                           unsigned rm = ExtractDRegister(instr, 5, 0);
  29786                           unsigned rn = ExtractDRegister(instr, 7, 16);
  29787                           // VQSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
  29788                           vqshl(CurrentCond(),
  29789                                 dt,
  29790                                 DRegister(rd),
  29791                                 DRegister(rm),
  29792                                 DRegister(rn));
  29793                           break;
  29794                         }
  29795                         case 0x00000500: {
  29796                           // 0xef000510
  29797                           DataType dt = Dt_U_size_3_Decode(
  29798                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  29799                           if (dt.Is(kDataTypeValueInvalid)) {
  29800                             UnallocatedT32(instr);
  29801                             return;
  29802                           }
  29803                           unsigned rd = ExtractDRegister(instr, 22, 12);
  29804                           unsigned rm = ExtractDRegister(instr, 5, 0);
  29805                           unsigned rn = ExtractDRegister(instr, 7, 16);
  29806                           // VQRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1
  29807                           vqrshl(CurrentCond(),
  29808                                  dt,
  29809                                  DRegister(rd),
  29810                                  DRegister(rm),
  29811                                  DRegister(rn));
  29812                           break;
  29813                         }
  29814                         case 0x00000600: {
  29815                           // 0xef000610
  29816                           DataType dt = Dt_U_size_1_Decode(
  29817                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  29818                           if (dt.Is(kDataTypeValueInvalid)) {
  29819                             UnallocatedT32(instr);
  29820                             return;
  29821                           }
  29822                           unsigned rd = ExtractDRegister(instr, 22, 12);
  29823                           unsigned rn = ExtractDRegister(instr, 7, 16);
  29824                           unsigned rm = ExtractDRegister(instr, 5, 0);
  29825                           // VMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  29826                           vmin(CurrentCond(),
  29827                                dt,
  29828                                DRegister(rd),
  29829                                DRegister(rn),
  29830                                DRegister(rm));
  29831                           break;
  29832                         }
  29833                         case 0x00000700: {
  29834                           // 0xef000710
  29835                           DataType dt = Dt_U_size_1_Decode(
  29836                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  29837                           if (dt.Is(kDataTypeValueInvalid)) {
  29838                             UnallocatedT32(instr);
  29839                             return;
  29840                           }
  29841                           unsigned rd = ExtractDRegister(instr, 22, 12);
  29842                           unsigned rn = ExtractDRegister(instr, 7, 16);
  29843                           unsigned rm = ExtractDRegister(instr, 5, 0);
  29844                           // VABA{<c>}{<q>}.<dt> <Dd>, <Dn>, <Dm> ; T1
  29845                           vaba(CurrentCond(),
  29846                                dt,
  29847                                DRegister(rd),
  29848                                DRegister(rn),
  29849                                DRegister(rm));
  29850                           break;
  29851                         }
  29852                         case 0x00000800: {
  29853                           // 0xef000810
  29854                           switch (instr & 0x10000000) {
  29855                             case 0x00000000: {
  29856                               // 0xef000810
  29857                               DataType dt =
  29858                                   Dt_size_7_Decode((instr >> 20) & 0x3);
  29859                               if (dt.Is(kDataTypeValueInvalid)) {
  29860                                 UnallocatedT32(instr);
  29861                                 return;
  29862                               }
  29863                               unsigned rd = ExtractDRegister(instr, 22, 12);
  29864                               unsigned rn = ExtractDRegister(instr, 7, 16);
  29865                               unsigned rm = ExtractDRegister(instr, 5, 0);
  29866                               // VTST{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  29867                               vtst(CurrentCond(),
  29868                                    dt,
  29869                                    DRegister(rd),
  29870                                    DRegister(rn),
  29871                                    DRegister(rm));
  29872                               break;
  29873                             }
  29874                             case 0x10000000: {
  29875                               // 0xff000810
  29876                               DataType dt =
  29877                                   Dt_size_4_Decode((instr >> 20) & 0x3);
  29878                               if (dt.Is(kDataTypeValueInvalid)) {
  29879                                 UnallocatedT32(instr);
  29880                                 return;
  29881                               }
  29882                               unsigned rd = ExtractDRegister(instr, 22, 12);
  29883                               unsigned rn = ExtractDRegister(instr, 7, 16);
  29884                               unsigned rm = ExtractDRegister(instr, 5, 0);
  29885                               // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  29886                               vceq(CurrentCond(),
  29887                                    dt,
  29888                                    DRegister(rd),
  29889                                    DRegister(rn),
  29890                                    DRegister(rm));
  29891                               break;
  29892                             }
  29893                           }
  29894                           break;
  29895                         }
  29896                         case 0x00000900: {
  29897                           // 0xef000910
  29898                           DataType dt = Dt_op_size_1_Decode(
  29899                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  29900                           if (dt.Is(kDataTypeValueInvalid)) {
  29901                             UnallocatedT32(instr);
  29902                             return;
  29903                           }
  29904                           unsigned rd = ExtractDRegister(instr, 22, 12);
  29905                           unsigned rn = ExtractDRegister(instr, 7, 16);
  29906                           unsigned rm = ExtractDRegister(instr, 5, 0);
  29907                           // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  29908                           vmul(CurrentCond(),
  29909                                dt,
  29910                                DRegister(rd),
  29911                                DRegister(rn),
  29912                                DRegister(rm));
  29913                           break;
  29914                         }
  29915                         case 0x00000a00: {
  29916                           // 0xef000a10
  29917                           DataType dt = Dt_U_size_1_Decode(
  29918                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  29919                           if (dt.Is(kDataTypeValueInvalid)) {
  29920                             UnallocatedT32(instr);
  29921                             return;
  29922                           }
  29923                           unsigned rd = ExtractDRegister(instr, 22, 12);
  29924                           unsigned rn = ExtractDRegister(instr, 7, 16);
  29925                           unsigned rm = ExtractDRegister(instr, 5, 0);
  29926                           // VPMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  29927                           vpmin(CurrentCond(),
  29928                                 dt,
  29929                                 DRegister(rd),
  29930                                 DRegister(rn),
  29931                                 DRegister(rm));
  29932                           break;
  29933                         }
  29934                         case 0x00000b00: {
  29935                           // 0xef000b10
  29936                           if ((instr & 0x10000000) == 0x00000000) {
  29937                             DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
  29938                             if (dt.Is(kDataTypeValueInvalid)) {
  29939                               UnallocatedT32(instr);
  29940                               return;
  29941                             }
  29942                             unsigned rd = ExtractDRegister(instr, 22, 12);
  29943                             unsigned rn = ExtractDRegister(instr, 7, 16);
  29944                             unsigned rm = ExtractDRegister(instr, 5, 0);
  29945                             // VPADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1
  29946                             vpadd(CurrentCond(),
  29947                                   dt,
  29948                                   DRegister(rd),
  29949                                   DRegister(rn),
  29950                                   DRegister(rm));
  29951                           } else {
  29952                             UnallocatedT32(instr);
  29953                           }
  29954                           break;
  29955                         }
  29956                         case 0x00000c00: {
  29957                           // 0xef000c10
  29958                           switch (instr & 0x10300000) {
  29959                             case 0x00000000: {
  29960                               // 0xef000c10
  29961                               unsigned rd = ExtractDRegister(instr, 22, 12);
  29962                               unsigned rn = ExtractDRegister(instr, 7, 16);
  29963                               unsigned rm = ExtractDRegister(instr, 5, 0);
  29964                               // VFMA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
  29965                               vfma(CurrentCond(),
  29966                                    F32,
  29967                                    DRegister(rd),
  29968                                    DRegister(rn),
  29969                                    DRegister(rm));
  29970                               break;
  29971                             }
  29972                             case 0x00200000: {
  29973                               // 0xef200c10
  29974                               unsigned rd = ExtractDRegister(instr, 22, 12);
  29975                               unsigned rn = ExtractDRegister(instr, 7, 16);
  29976                               unsigned rm = ExtractDRegister(instr, 5, 0);
  29977                               // VFMS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
  29978                               vfms(CurrentCond(),
  29979                                    F32,
  29980                                    DRegister(rd),
  29981                                    DRegister(rn),
  29982                                    DRegister(rm));
  29983                               break;
  29984                             }
  29985                             default:
  29986                               UnallocatedT32(instr);
  29987                               break;
  29988                           }
  29989                           break;
  29990                         }
  29991                         case 0x00000d00: {
  29992                           // 0xef000d10
  29993                           switch (instr & 0x10300000) {
  29994                             case 0x00000000: {
  29995                               // 0xef000d10
  29996                               unsigned rd = ExtractDRegister(instr, 22, 12);
  29997                               unsigned rn = ExtractDRegister(instr, 7, 16);
  29998                               unsigned rm = ExtractDRegister(instr, 5, 0);
  29999                               // VMLA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
  30000                               vmla(CurrentCond(),
  30001                                    F32,
  30002                                    DRegister(rd),
  30003                                    DRegister(rn),
  30004                                    DRegister(rm));
  30005                               break;
  30006                             }
  30007                             case 0x00200000: {
  30008                               // 0xef200d10
  30009                               unsigned rd = ExtractDRegister(instr, 22, 12);
  30010                               unsigned rn = ExtractDRegister(instr, 7, 16);
  30011                               unsigned rm = ExtractDRegister(instr, 5, 0);
  30012                               // VMLS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
  30013                               vmls(CurrentCond(),
  30014                                    F32,
  30015                                    DRegister(rd),
  30016                                    DRegister(rn),
  30017                                    DRegister(rm));
  30018                               break;
  30019                             }
  30020                             case 0x10000000: {
  30021                               // 0xff000d10
  30022                               unsigned rd = ExtractDRegister(instr, 22, 12);
  30023                               unsigned rn = ExtractDRegister(instr, 7, 16);
  30024                               unsigned rm = ExtractDRegister(instr, 5, 0);
  30025                               // VMUL{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
  30026                               vmul(CurrentCond(),
  30027                                    F32,
  30028                                    DRegister(rd),
  30029                                    DRegister(rn),
  30030                                    DRegister(rm));
  30031                               break;
  30032                             }
  30033                             default:
  30034                               UnallocatedT32(instr);
  30035                               break;
  30036                           }
  30037                           break;
  30038                         }
  30039                         case 0x00000e00: {
  30040                           // 0xef000e10
  30041                           switch (instr & 0x10300000) {
  30042                             case 0x10000000: {
  30043                               // 0xff000e10
  30044                               unsigned rd = ExtractDRegister(instr, 22, 12);
  30045                               unsigned rn = ExtractDRegister(instr, 7, 16);
  30046                               unsigned rm = ExtractDRegister(instr, 5, 0);
  30047                               // VACGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
  30048                               vacge(CurrentCond(),
  30049                                     F32,
  30050                                     DRegister(rd),
  30051                                     DRegister(rn),
  30052                                     DRegister(rm));
  30053                               break;
  30054                             }
  30055                             case 0x10200000: {
  30056                               // 0xff200e10
  30057                               unsigned rd = ExtractDRegister(instr, 22, 12);
  30058                               unsigned rn = ExtractDRegister(instr, 7, 16);
  30059                               unsigned rm = ExtractDRegister(instr, 5, 0);
  30060                               // VACGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
  30061                               vacgt(CurrentCond(),
  30062                                     F32,
  30063                                     DRegister(rd),
  30064                                     DRegister(rn),
  30065                                     DRegister(rm));
  30066                               break;
  30067                             }
  30068                             default:
  30069                               UnallocatedT32(instr);
  30070                               break;
  30071                           }
  30072                           break;
  30073                         }
  30074                         case 0x00000f00: {
  30075                           // 0xef000f10
  30076                           switch (instr & 0x10300000) {
  30077                             case 0x00000000: {
  30078                               // 0xef000f10
  30079                               unsigned rd = ExtractDRegister(instr, 22, 12);
  30080                               unsigned rn = ExtractDRegister(instr, 7, 16);
  30081                               unsigned rm = ExtractDRegister(instr, 5, 0);
  30082                               // VRECPS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
  30083                               vrecps(CurrentCond(),
  30084                                      F32,
  30085                                      DRegister(rd),
  30086                                      DRegister(rn),
  30087                                      DRegister(rm));
  30088                               break;
  30089                             }
  30090                             case 0x00200000: {
  30091                               // 0xef200f10
  30092                               unsigned rd = ExtractDRegister(instr, 22, 12);
  30093                               unsigned rn = ExtractDRegister(instr, 7, 16);
  30094                               unsigned rm = ExtractDRegister(instr, 5, 0);
  30095                               // VRSQRTS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1
  30096                               vrsqrts(CurrentCond(),
  30097                                       F32,
  30098                                       DRegister(rd),
  30099                                       DRegister(rn),
  30100                                       DRegister(rm));
  30101                               break;
  30102                             }
  30103                             case 0x10000000: {
  30104                               // 0xff000f10
  30105                               unsigned rd = ExtractDRegister(instr, 22, 12);
  30106                               unsigned rn = ExtractDRegister(instr, 7, 16);
  30107                               unsigned rm = ExtractDRegister(instr, 5, 0);
  30108                               // VMAXNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
  30109                               vmaxnm(F32,
  30110                                      DRegister(rd),
  30111                                      DRegister(rn),
  30112                                      DRegister(rm));
  30113                               if (InITBlock()) {
  30114                                 UnpredictableT32(instr);
  30115                               }
  30116                               break;
  30117                             }
  30118                             case 0x10200000: {
  30119                               // 0xff200f10
  30120                               unsigned rd = ExtractDRegister(instr, 22, 12);
  30121                               unsigned rn = ExtractDRegister(instr, 7, 16);
  30122                               unsigned rm = ExtractDRegister(instr, 5, 0);
  30123                               // VMINNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1
  30124                               vminnm(F32,
  30125                                      DRegister(rd),
  30126                                      DRegister(rn),
  30127                                      DRegister(rm));
  30128                               if (InITBlock()) {
  30129                                 UnpredictableT32(instr);
  30130                               }
  30131                               break;
  30132                             }
  30133                             default:
  30134                               UnallocatedT32(instr);
  30135                               break;
  30136                           }
  30137                           break;
  30138                         }
  30139                       }
  30140                       break;
  30141                     }
  30142                     case 0x00000040: {
  30143                       // 0xef000050
  30144                       switch (instr & 0x00000f00) {
  30145                         case 0x00000000: {
  30146                           // 0xef000050
  30147                           DataType dt = Dt_U_size_3_Decode(
  30148                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  30149                           if (dt.Is(kDataTypeValueInvalid)) {
  30150                             UnallocatedT32(instr);
  30151                             return;
  30152                           }
  30153                           if (((instr >> 12) & 1) != 0) {
  30154                             UnallocatedT32(instr);
  30155                             return;
  30156                           }
  30157                           unsigned rd = ExtractQRegister(instr, 22, 12);
  30158                           if (((instr >> 16) & 1) != 0) {
  30159                             UnallocatedT32(instr);
  30160                             return;
  30161                           }
  30162                           unsigned rn = ExtractQRegister(instr, 7, 16);
  30163                           if ((instr & 1) != 0) {
  30164                             UnallocatedT32(instr);
  30165                             return;
  30166                           }
  30167                           unsigned rm = ExtractQRegister(instr, 5, 0);
  30168                           // VQADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
  30169                           vqadd(CurrentCond(),
  30170                                 dt,
  30171                                 QRegister(rd),
  30172                                 QRegister(rn),
  30173                                 QRegister(rm));
  30174                           break;
  30175                         }
  30176                         case 0x00000100: {
  30177                           // 0xef000150
  30178                           switch (instr & 0x10300000) {
  30179                             case 0x00000000: {
  30180                               // 0xef000150
  30181                               if (((instr >> 12) & 1) != 0) {
  30182                                 UnallocatedT32(instr);
  30183                                 return;
  30184                               }
  30185                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30186                               if (((instr >> 16) & 1) != 0) {
  30187                                 UnallocatedT32(instr);
  30188                                 return;
  30189                               }
  30190                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30191                               if ((instr & 1) != 0) {
  30192                                 UnallocatedT32(instr);
  30193                                 return;
  30194                               }
  30195                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30196                               // VAND{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
  30197                               vand(CurrentCond(),
  30198                                    kDataTypeValueNone,
  30199                                    QRegister(rd),
  30200                                    QRegister(rn),
  30201                                    QRegister(rm));
  30202                               break;
  30203                             }
  30204                             case 0x00100000: {
  30205                               // 0xef100150
  30206                               if (((instr >> 12) & 1) != 0) {
  30207                                 UnallocatedT32(instr);
  30208                                 return;
  30209                               }
  30210                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30211                               if (((instr >> 16) & 1) != 0) {
  30212                                 UnallocatedT32(instr);
  30213                                 return;
  30214                               }
  30215                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30216                               if ((instr & 1) != 0) {
  30217                                 UnallocatedT32(instr);
  30218                                 return;
  30219                               }
  30220                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30221                               // VBIC{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
  30222                               vbic(CurrentCond(),
  30223                                    kDataTypeValueNone,
  30224                                    QRegister(rd),
  30225                                    QRegister(rn),
  30226                                    QRegister(rm));
  30227                               break;
  30228                             }
  30229                             case 0x00200000: {
  30230                               // 0xef200150
  30231                               if (((instr & 0x00000040) == 0x00000040) &&
  30232                                   ((((Uint32((instr >> 7)) & Uint32(0x1))
  30233                                      << 4) |
  30234                                     (Uint32((instr >> 16)) & Uint32(0xf))) ==
  30235                                    (((Uint32((instr >> 5)) & Uint32(0x1))
  30236                                      << 4) |
  30237                                     (Uint32(instr) & Uint32(0xf))))) {
  30238                                 if (((instr >> 12) & 1) != 0) {
  30239                                   UnallocatedT32(instr);
  30240                                   return;
  30241                                 }
  30242                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  30243                                 if (((instr >> 16) & 1) != 0) {
  30244                                   UnallocatedT32(instr);
  30245                                   return;
  30246                                 }
  30247                                 unsigned rm = ExtractQRegister(instr, 7, 16);
  30248                                 // VMOV{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1
  30249                                 vmov(CurrentCond(),
  30250                                      kDataTypeValueNone,
  30251                                      QRegister(rd),
  30252                                      QRegister(rm));
  30253                                 return;
  30254                               }
  30255                               if (((instr >> 12) & 1) != 0) {
  30256                                 UnallocatedT32(instr);
  30257                                 return;
  30258                               }
  30259                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30260                               if (((instr >> 16) & 1) != 0) {
  30261                                 UnallocatedT32(instr);
  30262                                 return;
  30263                               }
  30264                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30265                               if ((instr & 1) != 0) {
  30266                                 UnallocatedT32(instr);
  30267                                 return;
  30268                               }
  30269                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30270                               // VORR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
  30271                               vorr(CurrentCond(),
  30272                                    kDataTypeValueNone,
  30273                                    QRegister(rd),
  30274                                    QRegister(rn),
  30275                                    QRegister(rm));
  30276                               break;
  30277                             }
  30278                             case 0x00300000: {
  30279                               // 0xef300150
  30280                               if (((instr >> 12) & 1) != 0) {
  30281                                 UnallocatedT32(instr);
  30282                                 return;
  30283                               }
  30284                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30285                               if (((instr >> 16) & 1) != 0) {
  30286                                 UnallocatedT32(instr);
  30287                                 return;
  30288                               }
  30289                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30290                               if ((instr & 1) != 0) {
  30291                                 UnallocatedT32(instr);
  30292                                 return;
  30293                               }
  30294                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30295                               // VORN{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
  30296                               vorn(CurrentCond(),
  30297                                    kDataTypeValueNone,
  30298                                    QRegister(rd),
  30299                                    QRegister(rn),
  30300                                    QRegister(rm));
  30301                               break;
  30302                             }
  30303                             case 0x10000000: {
  30304                               // 0xff000150
  30305                               if (((instr >> 12) & 1) != 0) {
  30306                                 UnallocatedT32(instr);
  30307                                 return;
  30308                               }
  30309                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30310                               if (((instr >> 16) & 1) != 0) {
  30311                                 UnallocatedT32(instr);
  30312                                 return;
  30313                               }
  30314                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30315                               if ((instr & 1) != 0) {
  30316                                 UnallocatedT32(instr);
  30317                                 return;
  30318                               }
  30319                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30320                               // VEOR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
  30321                               veor(CurrentCond(),
  30322                                    kDataTypeValueNone,
  30323                                    QRegister(rd),
  30324                                    QRegister(rn),
  30325                                    QRegister(rm));
  30326                               break;
  30327                             }
  30328                             case 0x10100000: {
  30329                               // 0xff100150
  30330                               if (((instr >> 12) & 1) != 0) {
  30331                                 UnallocatedT32(instr);
  30332                                 return;
  30333                               }
  30334                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30335                               if (((instr >> 16) & 1) != 0) {
  30336                                 UnallocatedT32(instr);
  30337                                 return;
  30338                               }
  30339                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30340                               if ((instr & 1) != 0) {
  30341                                 UnallocatedT32(instr);
  30342                                 return;
  30343                               }
  30344                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30345                               // VBSL{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
  30346                               vbsl(CurrentCond(),
  30347                                    kDataTypeValueNone,
  30348                                    QRegister(rd),
  30349                                    QRegister(rn),
  30350                                    QRegister(rm));
  30351                               break;
  30352                             }
  30353                             case 0x10200000: {
  30354                               // 0xff200150
  30355                               if (((instr >> 12) & 1) != 0) {
  30356                                 UnallocatedT32(instr);
  30357                                 return;
  30358                               }
  30359                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30360                               if (((instr >> 16) & 1) != 0) {
  30361                                 UnallocatedT32(instr);
  30362                                 return;
  30363                               }
  30364                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30365                               if ((instr & 1) != 0) {
  30366                                 UnallocatedT32(instr);
  30367                                 return;
  30368                               }
  30369                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30370                               // VBIT{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
  30371                               vbit(CurrentCond(),
  30372                                    kDataTypeValueNone,
  30373                                    QRegister(rd),
  30374                                    QRegister(rn),
  30375                                    QRegister(rm));
  30376                               break;
  30377                             }
  30378                             case 0x10300000: {
  30379                               // 0xff300150
  30380                               if (((instr >> 12) & 1) != 0) {
  30381                                 UnallocatedT32(instr);
  30382                                 return;
  30383                               }
  30384                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30385                               if (((instr >> 16) & 1) != 0) {
  30386                                 UnallocatedT32(instr);
  30387                                 return;
  30388                               }
  30389                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30390                               if ((instr & 1) != 0) {
  30391                                 UnallocatedT32(instr);
  30392                                 return;
  30393                               }
  30394                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30395                               // VBIF{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1
  30396                               vbif(CurrentCond(),
  30397                                    kDataTypeValueNone,
  30398                                    QRegister(rd),
  30399                                    QRegister(rn),
  30400                                    QRegister(rm));
  30401                               break;
  30402                             }
  30403                           }
  30404                           break;
  30405                         }
  30406                         case 0x00000200: {
  30407                           // 0xef000250
  30408                           DataType dt = Dt_U_size_3_Decode(
  30409                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  30410                           if (dt.Is(kDataTypeValueInvalid)) {
  30411                             UnallocatedT32(instr);
  30412                             return;
  30413                           }
  30414                           if (((instr >> 12) & 1) != 0) {
  30415                             UnallocatedT32(instr);
  30416                             return;
  30417                           }
  30418                           unsigned rd = ExtractQRegister(instr, 22, 12);
  30419                           if (((instr >> 16) & 1) != 0) {
  30420                             UnallocatedT32(instr);
  30421                             return;
  30422                           }
  30423                           unsigned rn = ExtractQRegister(instr, 7, 16);
  30424                           if ((instr & 1) != 0) {
  30425                             UnallocatedT32(instr);
  30426                             return;
  30427                           }
  30428                           unsigned rm = ExtractQRegister(instr, 5, 0);
  30429                           // VQSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
  30430                           vqsub(CurrentCond(),
  30431                                 dt,
  30432                                 QRegister(rd),
  30433                                 QRegister(rn),
  30434                                 QRegister(rm));
  30435                           break;
  30436                         }
  30437                         case 0x00000300: {
  30438                           // 0xef000350
  30439                           DataType dt = Dt_U_size_1_Decode(
  30440                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  30441                           if (dt.Is(kDataTypeValueInvalid)) {
  30442                             UnallocatedT32(instr);
  30443                             return;
  30444                           }
  30445                           if (((instr >> 12) & 1) != 0) {
  30446                             UnallocatedT32(instr);
  30447                             return;
  30448                           }
  30449                           unsigned rd = ExtractQRegister(instr, 22, 12);
  30450                           if (((instr >> 16) & 1) != 0) {
  30451                             UnallocatedT32(instr);
  30452                             return;
  30453                           }
  30454                           unsigned rn = ExtractQRegister(instr, 7, 16);
  30455                           if ((instr & 1) != 0) {
  30456                             UnallocatedT32(instr);
  30457                             return;
  30458                           }
  30459                           unsigned rm = ExtractQRegister(instr, 5, 0);
  30460                           // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
  30461                           vcge(CurrentCond(),
  30462                                dt,
  30463                                QRegister(rd),
  30464                                QRegister(rn),
  30465                                QRegister(rm));
  30466                           break;
  30467                         }
  30468                         case 0x00000400: {
  30469                           // 0xef000450
  30470                           DataType dt = Dt_U_size_3_Decode(
  30471                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  30472                           if (dt.Is(kDataTypeValueInvalid)) {
  30473                             UnallocatedT32(instr);
  30474                             return;
  30475                           }
  30476                           if (((instr >> 12) & 1) != 0) {
  30477                             UnallocatedT32(instr);
  30478                             return;
  30479                           }
  30480                           unsigned rd = ExtractQRegister(instr, 22, 12);
  30481                           if ((instr & 1) != 0) {
  30482                             UnallocatedT32(instr);
  30483                             return;
  30484                           }
  30485                           unsigned rm = ExtractQRegister(instr, 5, 0);
  30486                           if (((instr >> 16) & 1) != 0) {
  30487                             UnallocatedT32(instr);
  30488                             return;
  30489                           }
  30490                           unsigned rn = ExtractQRegister(instr, 7, 16);
  30491                           // VQSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
  30492                           vqshl(CurrentCond(),
  30493                                 dt,
  30494                                 QRegister(rd),
  30495                                 QRegister(rm),
  30496                                 QRegister(rn));
  30497                           break;
  30498                         }
  30499                         case 0x00000500: {
  30500                           // 0xef000550
  30501                           DataType dt = Dt_U_size_3_Decode(
  30502                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  30503                           if (dt.Is(kDataTypeValueInvalid)) {
  30504                             UnallocatedT32(instr);
  30505                             return;
  30506                           }
  30507                           if (((instr >> 12) & 1) != 0) {
  30508                             UnallocatedT32(instr);
  30509                             return;
  30510                           }
  30511                           unsigned rd = ExtractQRegister(instr, 22, 12);
  30512                           if ((instr & 1) != 0) {
  30513                             UnallocatedT32(instr);
  30514                             return;
  30515                           }
  30516                           unsigned rm = ExtractQRegister(instr, 5, 0);
  30517                           if (((instr >> 16) & 1) != 0) {
  30518                             UnallocatedT32(instr);
  30519                             return;
  30520                           }
  30521                           unsigned rn = ExtractQRegister(instr, 7, 16);
  30522                           // VQRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1
  30523                           vqrshl(CurrentCond(),
  30524                                  dt,
  30525                                  QRegister(rd),
  30526                                  QRegister(rm),
  30527                                  QRegister(rn));
  30528                           break;
  30529                         }
  30530                         case 0x00000600: {
  30531                           // 0xef000650
  30532                           DataType dt = Dt_U_size_1_Decode(
  30533                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  30534                           if (dt.Is(kDataTypeValueInvalid)) {
  30535                             UnallocatedT32(instr);
  30536                             return;
  30537                           }
  30538                           if (((instr >> 12) & 1) != 0) {
  30539                             UnallocatedT32(instr);
  30540                             return;
  30541                           }
  30542                           unsigned rd = ExtractQRegister(instr, 22, 12);
  30543                           if (((instr >> 16) & 1) != 0) {
  30544                             UnallocatedT32(instr);
  30545                             return;
  30546                           }
  30547                           unsigned rn = ExtractQRegister(instr, 7, 16);
  30548                           if ((instr & 1) != 0) {
  30549                             UnallocatedT32(instr);
  30550                             return;
  30551                           }
  30552                           unsigned rm = ExtractQRegister(instr, 5, 0);
  30553                           // VMIN{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
  30554                           vmin(CurrentCond(),
  30555                                dt,
  30556                                QRegister(rd),
  30557                                QRegister(rn),
  30558                                QRegister(rm));
  30559                           break;
  30560                         }
  30561                         case 0x00000700: {
  30562                           // 0xef000750
  30563                           DataType dt = Dt_U_size_1_Decode(
  30564                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  30565                           if (dt.Is(kDataTypeValueInvalid)) {
  30566                             UnallocatedT32(instr);
  30567                             return;
  30568                           }
  30569                           if (((instr >> 12) & 1) != 0) {
  30570                             UnallocatedT32(instr);
  30571                             return;
  30572                           }
  30573                           unsigned rd = ExtractQRegister(instr, 22, 12);
  30574                           if (((instr >> 16) & 1) != 0) {
  30575                             UnallocatedT32(instr);
  30576                             return;
  30577                           }
  30578                           unsigned rn = ExtractQRegister(instr, 7, 16);
  30579                           if ((instr & 1) != 0) {
  30580                             UnallocatedT32(instr);
  30581                             return;
  30582                           }
  30583                           unsigned rm = ExtractQRegister(instr, 5, 0);
  30584                           // VABA{<c>}{<q>}.<dt> <Qd>, <Qn>, <Qm> ; T1
  30585                           vaba(CurrentCond(),
  30586                                dt,
  30587                                QRegister(rd),
  30588                                QRegister(rn),
  30589                                QRegister(rm));
  30590                           break;
  30591                         }
  30592                         case 0x00000800: {
  30593                           // 0xef000850
  30594                           switch (instr & 0x10000000) {
  30595                             case 0x00000000: {
  30596                               // 0xef000850
  30597                               DataType dt =
  30598                                   Dt_size_7_Decode((instr >> 20) & 0x3);
  30599                               if (dt.Is(kDataTypeValueInvalid)) {
  30600                                 UnallocatedT32(instr);
  30601                                 return;
  30602                               }
  30603                               if (((instr >> 12) & 1) != 0) {
  30604                                 UnallocatedT32(instr);
  30605                                 return;
  30606                               }
  30607                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30608                               if (((instr >> 16) & 1) != 0) {
  30609                                 UnallocatedT32(instr);
  30610                                 return;
  30611                               }
  30612                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30613                               if ((instr & 1) != 0) {
  30614                                 UnallocatedT32(instr);
  30615                                 return;
  30616                               }
  30617                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30618                               // VTST{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
  30619                               vtst(CurrentCond(),
  30620                                    dt,
  30621                                    QRegister(rd),
  30622                                    QRegister(rn),
  30623                                    QRegister(rm));
  30624                               break;
  30625                             }
  30626                             case 0x10000000: {
  30627                               // 0xff000850
  30628                               DataType dt =
  30629                                   Dt_size_4_Decode((instr >> 20) & 0x3);
  30630                               if (dt.Is(kDataTypeValueInvalid)) {
  30631                                 UnallocatedT32(instr);
  30632                                 return;
  30633                               }
  30634                               if (((instr >> 12) & 1) != 0) {
  30635                                 UnallocatedT32(instr);
  30636                                 return;
  30637                               }
  30638                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30639                               if (((instr >> 16) & 1) != 0) {
  30640                                 UnallocatedT32(instr);
  30641                                 return;
  30642                               }
  30643                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30644                               if ((instr & 1) != 0) {
  30645                                 UnallocatedT32(instr);
  30646                                 return;
  30647                               }
  30648                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30649                               // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
  30650                               vceq(CurrentCond(),
  30651                                    dt,
  30652                                    QRegister(rd),
  30653                                    QRegister(rn),
  30654                                    QRegister(rm));
  30655                               break;
  30656                             }
  30657                           }
  30658                           break;
  30659                         }
  30660                         case 0x00000900: {
  30661                           // 0xef000950
  30662                           DataType dt = Dt_op_size_1_Decode(
  30663                               ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4));
  30664                           if (dt.Is(kDataTypeValueInvalid)) {
  30665                             UnallocatedT32(instr);
  30666                             return;
  30667                           }
  30668                           if (((instr >> 12) & 1) != 0) {
  30669                             UnallocatedT32(instr);
  30670                             return;
  30671                           }
  30672                           unsigned rd = ExtractQRegister(instr, 22, 12);
  30673                           if (((instr >> 16) & 1) != 0) {
  30674                             UnallocatedT32(instr);
  30675                             return;
  30676                           }
  30677                           unsigned rn = ExtractQRegister(instr, 7, 16);
  30678                           if ((instr & 1) != 0) {
  30679                             UnallocatedT32(instr);
  30680                             return;
  30681                           }
  30682                           unsigned rm = ExtractQRegister(instr, 5, 0);
  30683                           // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1
  30684                           vmul(CurrentCond(),
  30685                                dt,
  30686                                QRegister(rd),
  30687                                QRegister(rn),
  30688                                QRegister(rm));
  30689                           break;
  30690                         }
  30691                         case 0x00000c00: {
  30692                           // 0xef000c50
  30693                           switch (instr & 0x10300000) {
  30694                             case 0x00000000: {
  30695                               // 0xef000c50
  30696                               if (((instr >> 12) & 1) != 0) {
  30697                                 UnallocatedT32(instr);
  30698                                 return;
  30699                               }
  30700                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30701                               if (((instr >> 16) & 1) != 0) {
  30702                                 UnallocatedT32(instr);
  30703                                 return;
  30704                               }
  30705                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30706                               if ((instr & 1) != 0) {
  30707                                 UnallocatedT32(instr);
  30708                                 return;
  30709                               }
  30710                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30711                               // VFMA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
  30712                               vfma(CurrentCond(),
  30713                                    F32,
  30714                                    QRegister(rd),
  30715                                    QRegister(rn),
  30716                                    QRegister(rm));
  30717                               break;
  30718                             }
  30719                             case 0x00200000: {
  30720                               // 0xef200c50
  30721                               if (((instr >> 12) & 1) != 0) {
  30722                                 UnallocatedT32(instr);
  30723                                 return;
  30724                               }
  30725                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30726                               if (((instr >> 16) & 1) != 0) {
  30727                                 UnallocatedT32(instr);
  30728                                 return;
  30729                               }
  30730                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30731                               if ((instr & 1) != 0) {
  30732                                 UnallocatedT32(instr);
  30733                                 return;
  30734                               }
  30735                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30736                               // VFMS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
  30737                               vfms(CurrentCond(),
  30738                                    F32,
  30739                                    QRegister(rd),
  30740                                    QRegister(rn),
  30741                                    QRegister(rm));
  30742                               break;
  30743                             }
  30744                             default:
  30745                               UnallocatedT32(instr);
  30746                               break;
  30747                           }
  30748                           break;
  30749                         }
  30750                         case 0x00000d00: {
  30751                           // 0xef000d50
  30752                           switch (instr & 0x10300000) {
  30753                             case 0x00000000: {
  30754                               // 0xef000d50
  30755                               if (((instr >> 12) & 1) != 0) {
  30756                                 UnallocatedT32(instr);
  30757                                 return;
  30758                               }
  30759                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30760                               if (((instr >> 16) & 1) != 0) {
  30761                                 UnallocatedT32(instr);
  30762                                 return;
  30763                               }
  30764                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30765                               if ((instr & 1) != 0) {
  30766                                 UnallocatedT32(instr);
  30767                                 return;
  30768                               }
  30769                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30770                               // VMLA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
  30771                               vmla(CurrentCond(),
  30772                                    F32,
  30773                                    QRegister(rd),
  30774                                    QRegister(rn),
  30775                                    QRegister(rm));
  30776                               break;
  30777                             }
  30778                             case 0x00200000: {
  30779                               // 0xef200d50
  30780                               if (((instr >> 12) & 1) != 0) {
  30781                                 UnallocatedT32(instr);
  30782                                 return;
  30783                               }
  30784                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30785                               if (((instr >> 16) & 1) != 0) {
  30786                                 UnallocatedT32(instr);
  30787                                 return;
  30788                               }
  30789                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30790                               if ((instr & 1) != 0) {
  30791                                 UnallocatedT32(instr);
  30792                                 return;
  30793                               }
  30794                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30795                               // VMLS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
  30796                               vmls(CurrentCond(),
  30797                                    F32,
  30798                                    QRegister(rd),
  30799                                    QRegister(rn),
  30800                                    QRegister(rm));
  30801                               break;
  30802                             }
  30803                             case 0x10000000: {
  30804                               // 0xff000d50
  30805                               if (((instr >> 12) & 1) != 0) {
  30806                                 UnallocatedT32(instr);
  30807                                 return;
  30808                               }
  30809                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30810                               if (((instr >> 16) & 1) != 0) {
  30811                                 UnallocatedT32(instr);
  30812                                 return;
  30813                               }
  30814                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30815                               if ((instr & 1) != 0) {
  30816                                 UnallocatedT32(instr);
  30817                                 return;
  30818                               }
  30819                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30820                               // VMUL{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
  30821                               vmul(CurrentCond(),
  30822                                    F32,
  30823                                    QRegister(rd),
  30824                                    QRegister(rn),
  30825                                    QRegister(rm));
  30826                               break;
  30827                             }
  30828                             default:
  30829                               UnallocatedT32(instr);
  30830                               break;
  30831                           }
  30832                           break;
  30833                         }
  30834                         case 0x00000e00: {
  30835                           // 0xef000e50
  30836                           switch (instr & 0x10300000) {
  30837                             case 0x10000000: {
  30838                               // 0xff000e50
  30839                               if (((instr >> 12) & 1) != 0) {
  30840                                 UnallocatedT32(instr);
  30841                                 return;
  30842                               }
  30843                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30844                               if (((instr >> 16) & 1) != 0) {
  30845                                 UnallocatedT32(instr);
  30846                                 return;
  30847                               }
  30848                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30849                               if ((instr & 1) != 0) {
  30850                                 UnallocatedT32(instr);
  30851                                 return;
  30852                               }
  30853                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30854                               // VACGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
  30855                               vacge(CurrentCond(),
  30856                                     F32,
  30857                                     QRegister(rd),
  30858                                     QRegister(rn),
  30859                                     QRegister(rm));
  30860                               break;
  30861                             }
  30862                             case 0x10200000: {
  30863                               // 0xff200e50
  30864                               if (((instr >> 12) & 1) != 0) {
  30865                                 UnallocatedT32(instr);
  30866                                 return;
  30867                               }
  30868                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30869                               if (((instr >> 16) & 1) != 0) {
  30870                                 UnallocatedT32(instr);
  30871                                 return;
  30872                               }
  30873                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30874                               if ((instr & 1) != 0) {
  30875                                 UnallocatedT32(instr);
  30876                                 return;
  30877                               }
  30878                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30879                               // VACGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
  30880                               vacgt(CurrentCond(),
  30881                                     F32,
  30882                                     QRegister(rd),
  30883                                     QRegister(rn),
  30884                                     QRegister(rm));
  30885                               break;
  30886                             }
  30887                             default:
  30888                               UnallocatedT32(instr);
  30889                               break;
  30890                           }
  30891                           break;
  30892                         }
  30893                         case 0x00000f00: {
  30894                           // 0xef000f50
  30895                           switch (instr & 0x10300000) {
  30896                             case 0x00000000: {
  30897                               // 0xef000f50
  30898                               if (((instr >> 12) & 1) != 0) {
  30899                                 UnallocatedT32(instr);
  30900                                 return;
  30901                               }
  30902                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30903                               if (((instr >> 16) & 1) != 0) {
  30904                                 UnallocatedT32(instr);
  30905                                 return;
  30906                               }
  30907                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30908                               if ((instr & 1) != 0) {
  30909                                 UnallocatedT32(instr);
  30910                                 return;
  30911                               }
  30912                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30913                               // VRECPS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
  30914                               vrecps(CurrentCond(),
  30915                                      F32,
  30916                                      QRegister(rd),
  30917                                      QRegister(rn),
  30918                                      QRegister(rm));
  30919                               break;
  30920                             }
  30921                             case 0x00200000: {
  30922                               // 0xef200f50
  30923                               if (((instr >> 12) & 1) != 0) {
  30924                                 UnallocatedT32(instr);
  30925                                 return;
  30926                               }
  30927                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30928                               if (((instr >> 16) & 1) != 0) {
  30929                                 UnallocatedT32(instr);
  30930                                 return;
  30931                               }
  30932                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30933                               if ((instr & 1) != 0) {
  30934                                 UnallocatedT32(instr);
  30935                                 return;
  30936                               }
  30937                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30938                               // VRSQRTS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1
  30939                               vrsqrts(CurrentCond(),
  30940                                       F32,
  30941                                       QRegister(rd),
  30942                                       QRegister(rn),
  30943                                       QRegister(rm));
  30944                               break;
  30945                             }
  30946                             case 0x10000000: {
  30947                               // 0xff000f50
  30948                               if (((instr >> 12) & 1) != 0) {
  30949                                 UnallocatedT32(instr);
  30950                                 return;
  30951                               }
  30952                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30953                               if (((instr >> 16) & 1) != 0) {
  30954                                 UnallocatedT32(instr);
  30955                                 return;
  30956                               }
  30957                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30958                               if ((instr & 1) != 0) {
  30959                                 UnallocatedT32(instr);
  30960                                 return;
  30961                               }
  30962                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30963                               // VMAXNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
  30964                               vmaxnm(F32,
  30965                                      QRegister(rd),
  30966                                      QRegister(rn),
  30967                                      QRegister(rm));
  30968                               if (InITBlock()) {
  30969                                 UnpredictableT32(instr);
  30970                               }
  30971                               break;
  30972                             }
  30973                             case 0x10200000: {
  30974                               // 0xff200f50
  30975                               if (((instr >> 12) & 1) != 0) {
  30976                                 UnallocatedT32(instr);
  30977                                 return;
  30978                               }
  30979                               unsigned rd = ExtractQRegister(instr, 22, 12);
  30980                               if (((instr >> 16) & 1) != 0) {
  30981                                 UnallocatedT32(instr);
  30982                                 return;
  30983                               }
  30984                               unsigned rn = ExtractQRegister(instr, 7, 16);
  30985                               if ((instr & 1) != 0) {
  30986                                 UnallocatedT32(instr);
  30987                                 return;
  30988                               }
  30989                               unsigned rm = ExtractQRegister(instr, 5, 0);
  30990                               // VMINNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1
  30991                               vminnm(F32,
  30992                                      QRegister(rd),
  30993                                      QRegister(rn),
  30994                                      QRegister(rm));
  30995                               if (InITBlock()) {
  30996                                 UnpredictableT32(instr);
  30997                               }
  30998                               break;
  30999                             }
  31000                             default:
  31001                               UnallocatedT32(instr);
  31002                               break;
  31003                           }
  31004                           break;
  31005                         }
  31006                         default:
  31007                           UnallocatedT32(instr);
  31008                           break;
  31009                       }
  31010                       break;
  31011                     }
  31012                     case 0x00800000: {
  31013                       // 0xef800010
  31014                       switch (instr & 0x00000c00) {
  31015                         case 0x00000000: {
  31016                           // 0xef800010
  31017                           switch (instr & 0x00380080) {
  31018                             case 0x00000000: {
  31019                               // 0xef800010
  31020                               switch (instr & 0x00000100) {
  31021                                 case 0x00000000: {
  31022                                   // 0xef800010
  31023                                   switch (instr & 0x00000200) {
  31024                                     default: {
  31025                                       switch (instr & 0x00000020) {
  31026                                         case 0x00000020: {
  31027                                           // 0xef800030
  31028                                           if (((instr & 0xd00) == 0x100) ||
  31029                                               ((instr & 0xd00) == 0x500) ||
  31030                                               ((instr & 0xd00) == 0x900) ||
  31031                                               ((instr & 0xe00) == 0xe00)) {
  31032                                             UnallocatedT32(instr);
  31033                                             return;
  31034                                           }
  31035                                           unsigned cmode = (instr >> 8) & 0xf;
  31036                                           DataType dt =
  31037                                               ImmediateVmvn::DecodeDt(cmode);
  31038                                           if (dt.Is(kDataTypeValueInvalid)) {
  31039                                             UnallocatedT32(instr);
  31040                                             return;
  31041                                           }
  31042                                           unsigned rd =
  31043                                               ExtractDRegister(instr, 22, 12);
  31044                                           DOperand imm =
  31045                                               ImmediateVmvn::DecodeImmediate(
  31046                                                   cmode,
  31047                                                   (instr & 0xf) |
  31048                                                       ((instr >> 12) & 0x70) |
  31049                                                       ((instr >> 21) & 0x80));
  31050                                           // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31051                                           vmvn(CurrentCond(),
  31052                                                dt,
  31053                                                DRegister(rd),
  31054                                                imm);
  31055                                           break;
  31056                                         }
  31057                                         default: {
  31058                                           if (((instr & 0x920) == 0x100) ||
  31059                                               ((instr & 0x520) == 0x100) ||
  31060                                               ((instr & 0x820) == 0x20) ||
  31061                                               ((instr & 0x420) == 0x20) ||
  31062                                               ((instr & 0x220) == 0x20) ||
  31063                                               ((instr & 0x120) == 0x120)) {
  31064                                             UnallocatedT32(instr);
  31065                                             return;
  31066                                           }
  31067                                           unsigned cmode =
  31068                                               ((instr >> 8) & 0xf) |
  31069                                               ((instr >> 1) & 0x10);
  31070                                           DataType dt =
  31071                                               ImmediateVmov::DecodeDt(cmode);
  31072                                           if (dt.Is(kDataTypeValueInvalid)) {
  31073                                             UnallocatedT32(instr);
  31074                                             return;
  31075                                           }
  31076                                           unsigned rd =
  31077                                               ExtractDRegister(instr, 22, 12);
  31078                                           DOperand imm =
  31079                                               ImmediateVmov::DecodeImmediate(
  31080                                                   cmode,
  31081                                                   (instr & 0xf) |
  31082                                                       ((instr >> 12) & 0x70) |
  31083                                                       ((instr >> 21) & 0x80));
  31084                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31085                                           vmov(CurrentCond(),
  31086                                                dt,
  31087                                                DRegister(rd),
  31088                                                imm);
  31089                                           break;
  31090                                         }
  31091                                       }
  31092                                       break;
  31093                                     }
  31094                                   }
  31095                                   break;
  31096                                 }
  31097                                 case 0x00000100: {
  31098                                   // 0xef800110
  31099                                   switch (instr & 0x00000020) {
  31100                                     case 0x00000000: {
  31101                                       // 0xef800110
  31102                                       if (((instr & 0x100) == 0x0) ||
  31103                                           ((instr & 0xc00) == 0xc00)) {
  31104                                         UnallocatedT32(instr);
  31105                                         return;
  31106                                       }
  31107                                       unsigned cmode = (instr >> 8) & 0xf;
  31108                                       DataType dt =
  31109                                           ImmediateVorr::DecodeDt(cmode);
  31110                                       if (dt.Is(kDataTypeValueInvalid)) {
  31111                                         UnallocatedT32(instr);
  31112                                         return;
  31113                                       }
  31114                                       unsigned rd =
  31115                                           ExtractDRegister(instr, 22, 12);
  31116                                       DOperand imm =
  31117                                           ImmediateVorr::DecodeImmediate(
  31118                                               cmode,
  31119                                               (instr & 0xf) |
  31120                                                   ((instr >> 12) & 0x70) |
  31121                                                   ((instr >> 21) & 0x80));
  31122                                       // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31123                                       vorr(CurrentCond(),
  31124                                            dt,
  31125                                            DRegister(rd),
  31126                                            DRegister(rd),
  31127                                            imm);
  31128                                       break;
  31129                                     }
  31130                                     case 0x00000020: {
  31131                                       // 0xef800130
  31132                                       if (((instr & 0x100) == 0x0) ||
  31133                                           ((instr & 0xc00) == 0xc00)) {
  31134                                         UnallocatedT32(instr);
  31135                                         return;
  31136                                       }
  31137                                       unsigned cmode = (instr >> 8) & 0xf;
  31138                                       DataType dt =
  31139                                           ImmediateVbic::DecodeDt(cmode);
  31140                                       if (dt.Is(kDataTypeValueInvalid)) {
  31141                                         UnallocatedT32(instr);
  31142                                         return;
  31143                                       }
  31144                                       unsigned rd =
  31145                                           ExtractDRegister(instr, 22, 12);
  31146                                       DOperand imm =
  31147                                           ImmediateVbic::DecodeImmediate(
  31148                                               cmode,
  31149                                               (instr & 0xf) |
  31150                                                   ((instr >> 12) & 0x70) |
  31151                                                   ((instr >> 21) & 0x80));
  31152                                       // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31153                                       vbic(CurrentCond(),
  31154                                            dt,
  31155                                            DRegister(rd),
  31156                                            DRegister(rd),
  31157                                            imm);
  31158                                       break;
  31159                                     }
  31160                                   }
  31161                                   break;
  31162                                 }
  31163                               }
  31164                               break;
  31165                             }
  31166                             default: {
  31167                               switch (instr & 0x00000300) {
  31168                                 case 0x00000000: {
  31169                                   // 0xef800010
  31170                                   if (((instr & 0x380080) == 0x0)) {
  31171                                     UnallocatedT32(instr);
  31172                                     return;
  31173                                   }
  31174                                   DataType dt =
  31175                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  31176                                                              ((instr >> 4) &
  31177                                                               0x8),
  31178                                                          (instr >> 28) & 0x1);
  31179                                   if (dt.Is(kDataTypeValueInvalid)) {
  31180                                     UnallocatedT32(instr);
  31181                                     return;
  31182                                   }
  31183                                   unsigned rd = ExtractDRegister(instr, 22, 12);
  31184                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  31185                                   uint32_t imm6 = (instr >> 16) & 0x3f;
  31186                                   uint32_t imm =
  31187                                       (dt.IsSize(64) ? 64
  31188                                                      : (dt.GetSize() * 2)) -
  31189                                       imm6;
  31190                                   // VSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31191                                   vshr(CurrentCond(),
  31192                                        dt,
  31193                                        DRegister(rd),
  31194                                        DRegister(rm),
  31195                                        imm);
  31196                                   break;
  31197                                 }
  31198                                 case 0x00000100: {
  31199                                   // 0xef800110
  31200                                   if (((instr & 0x380080) == 0x0)) {
  31201                                     UnallocatedT32(instr);
  31202                                     return;
  31203                                   }
  31204                                   DataType dt =
  31205                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  31206                                                              ((instr >> 4) &
  31207                                                               0x8),
  31208                                                          (instr >> 28) & 0x1);
  31209                                   if (dt.Is(kDataTypeValueInvalid)) {
  31210                                     UnallocatedT32(instr);
  31211                                     return;
  31212                                   }
  31213                                   unsigned rd = ExtractDRegister(instr, 22, 12);
  31214                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  31215                                   uint32_t imm6 = (instr >> 16) & 0x3f;
  31216                                   uint32_t imm =
  31217                                       (dt.IsSize(64) ? 64
  31218                                                      : (dt.GetSize() * 2)) -
  31219                                       imm6;
  31220                                   // VSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31221                                   vsra(CurrentCond(),
  31222                                        dt,
  31223                                        DRegister(rd),
  31224                                        DRegister(rm),
  31225                                        imm);
  31226                                   break;
  31227                                 }
  31228                                 case 0x00000200: {
  31229                                   // 0xef800210
  31230                                   if (((instr & 0x380080) == 0x0)) {
  31231                                     UnallocatedT32(instr);
  31232                                     return;
  31233                                   }
  31234                                   DataType dt =
  31235                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  31236                                                              ((instr >> 4) &
  31237                                                               0x8),
  31238                                                          (instr >> 28) & 0x1);
  31239                                   if (dt.Is(kDataTypeValueInvalid)) {
  31240                                     UnallocatedT32(instr);
  31241                                     return;
  31242                                   }
  31243                                   unsigned rd = ExtractDRegister(instr, 22, 12);
  31244                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  31245                                   uint32_t imm6 = (instr >> 16) & 0x3f;
  31246                                   uint32_t imm =
  31247                                       (dt.IsSize(64) ? 64
  31248                                                      : (dt.GetSize() * 2)) -
  31249                                       imm6;
  31250                                   // VRSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31251                                   vrshr(CurrentCond(),
  31252                                         dt,
  31253                                         DRegister(rd),
  31254                                         DRegister(rm),
  31255                                         imm);
  31256                                   break;
  31257                                 }
  31258                                 case 0x00000300: {
  31259                                   // 0xef800310
  31260                                   if (((instr & 0x380080) == 0x0)) {
  31261                                     UnallocatedT32(instr);
  31262                                     return;
  31263                                   }
  31264                                   DataType dt =
  31265                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  31266                                                              ((instr >> 4) &
  31267                                                               0x8),
  31268                                                          (instr >> 28) & 0x1);
  31269                                   if (dt.Is(kDataTypeValueInvalid)) {
  31270                                     UnallocatedT32(instr);
  31271                                     return;
  31272                                   }
  31273                                   unsigned rd = ExtractDRegister(instr, 22, 12);
  31274                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  31275                                   uint32_t imm6 = (instr >> 16) & 0x3f;
  31276                                   uint32_t imm =
  31277                                       (dt.IsSize(64) ? 64
  31278                                                      : (dt.GetSize() * 2)) -
  31279                                       imm6;
  31280                                   // VRSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31281                                   vrsra(CurrentCond(),
  31282                                         dt,
  31283                                         DRegister(rd),
  31284                                         DRegister(rm),
  31285                                         imm);
  31286                                   break;
  31287                                 }
  31288                               }
  31289                               break;
  31290                             }
  31291                           }
  31292                           break;
  31293                         }
  31294                         case 0x00000400: {
  31295                           // 0xef800410
  31296                           switch (instr & 0x00380080) {
  31297                             case 0x00000000: {
  31298                               // 0xef800410
  31299                               switch (instr & 0x00000100) {
  31300                                 case 0x00000000: {
  31301                                   // 0xef800410
  31302                                   switch (instr & 0x00000200) {
  31303                                     default: {
  31304                                       switch (instr & 0x00000020) {
  31305                                         case 0x00000020: {
  31306                                           // 0xef800430
  31307                                           if (((instr & 0xd00) == 0x100) ||
  31308                                               ((instr & 0xd00) == 0x500) ||
  31309                                               ((instr & 0xd00) == 0x900) ||
  31310                                               ((instr & 0xe00) == 0xe00)) {
  31311                                             UnallocatedT32(instr);
  31312                                             return;
  31313                                           }
  31314                                           unsigned cmode = (instr >> 8) & 0xf;
  31315                                           DataType dt =
  31316                                               ImmediateVmvn::DecodeDt(cmode);
  31317                                           if (dt.Is(kDataTypeValueInvalid)) {
  31318                                             UnallocatedT32(instr);
  31319                                             return;
  31320                                           }
  31321                                           unsigned rd =
  31322                                               ExtractDRegister(instr, 22, 12);
  31323                                           DOperand imm =
  31324                                               ImmediateVmvn::DecodeImmediate(
  31325                                                   cmode,
  31326                                                   (instr & 0xf) |
  31327                                                       ((instr >> 12) & 0x70) |
  31328                                                       ((instr >> 21) & 0x80));
  31329                                           // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31330                                           vmvn(CurrentCond(),
  31331                                                dt,
  31332                                                DRegister(rd),
  31333                                                imm);
  31334                                           break;
  31335                                         }
  31336                                         default: {
  31337                                           if (((instr & 0x920) == 0x100) ||
  31338                                               ((instr & 0x520) == 0x100) ||
  31339                                               ((instr & 0x820) == 0x20) ||
  31340                                               ((instr & 0x420) == 0x20) ||
  31341                                               ((instr & 0x220) == 0x20) ||
  31342                                               ((instr & 0x120) == 0x120)) {
  31343                                             UnallocatedT32(instr);
  31344                                             return;
  31345                                           }
  31346                                           unsigned cmode =
  31347                                               ((instr >> 8) & 0xf) |
  31348                                               ((instr >> 1) & 0x10);
  31349                                           DataType dt =
  31350                                               ImmediateVmov::DecodeDt(cmode);
  31351                                           if (dt.Is(kDataTypeValueInvalid)) {
  31352                                             UnallocatedT32(instr);
  31353                                             return;
  31354                                           }
  31355                                           unsigned rd =
  31356                                               ExtractDRegister(instr, 22, 12);
  31357                                           DOperand imm =
  31358                                               ImmediateVmov::DecodeImmediate(
  31359                                                   cmode,
  31360                                                   (instr & 0xf) |
  31361                                                       ((instr >> 12) & 0x70) |
  31362                                                       ((instr >> 21) & 0x80));
  31363                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31364                                           vmov(CurrentCond(),
  31365                                                dt,
  31366                                                DRegister(rd),
  31367                                                imm);
  31368                                           break;
  31369                                         }
  31370                                       }
  31371                                       break;
  31372                                     }
  31373                                   }
  31374                                   break;
  31375                                 }
  31376                                 case 0x00000100: {
  31377                                   // 0xef800510
  31378                                   switch (instr & 0x00000020) {
  31379                                     case 0x00000000: {
  31380                                       // 0xef800510
  31381                                       if (((instr & 0x100) == 0x0) ||
  31382                                           ((instr & 0xc00) == 0xc00)) {
  31383                                         UnallocatedT32(instr);
  31384                                         return;
  31385                                       }
  31386                                       unsigned cmode = (instr >> 8) & 0xf;
  31387                                       DataType dt =
  31388                                           ImmediateVorr::DecodeDt(cmode);
  31389                                       if (dt.Is(kDataTypeValueInvalid)) {
  31390                                         UnallocatedT32(instr);
  31391                                         return;
  31392                                       }
  31393                                       unsigned rd =
  31394                                           ExtractDRegister(instr, 22, 12);
  31395                                       DOperand imm =
  31396                                           ImmediateVorr::DecodeImmediate(
  31397                                               cmode,
  31398                                               (instr & 0xf) |
  31399                                                   ((instr >> 12) & 0x70) |
  31400                                                   ((instr >> 21) & 0x80));
  31401                                       // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31402                                       vorr(CurrentCond(),
  31403                                            dt,
  31404                                            DRegister(rd),
  31405                                            DRegister(rd),
  31406                                            imm);
  31407                                       break;
  31408                                     }
  31409                                     case 0x00000020: {
  31410                                       // 0xef800530
  31411                                       if (((instr & 0x100) == 0x0) ||
  31412                                           ((instr & 0xc00) == 0xc00)) {
  31413                                         UnallocatedT32(instr);
  31414                                         return;
  31415                                       }
  31416                                       unsigned cmode = (instr >> 8) & 0xf;
  31417                                       DataType dt =
  31418                                           ImmediateVbic::DecodeDt(cmode);
  31419                                       if (dt.Is(kDataTypeValueInvalid)) {
  31420                                         UnallocatedT32(instr);
  31421                                         return;
  31422                                       }
  31423                                       unsigned rd =
  31424                                           ExtractDRegister(instr, 22, 12);
  31425                                       DOperand imm =
  31426                                           ImmediateVbic::DecodeImmediate(
  31427                                               cmode,
  31428                                               (instr & 0xf) |
  31429                                                   ((instr >> 12) & 0x70) |
  31430                                                   ((instr >> 21) & 0x80));
  31431                                       // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31432                                       vbic(CurrentCond(),
  31433                                            dt,
  31434                                            DRegister(rd),
  31435                                            DRegister(rd),
  31436                                            imm);
  31437                                       break;
  31438                                     }
  31439                                   }
  31440                                   break;
  31441                                 }
  31442                               }
  31443                               break;
  31444                             }
  31445                             default: {
  31446                               switch (instr & 0x00000300) {
  31447                                 case 0x00000000: {
  31448                                   // 0xef800410
  31449                                   if ((instr & 0x10000000) == 0x10000000) {
  31450                                     if (((instr & 0x380080) == 0x0)) {
  31451                                       UnallocatedT32(instr);
  31452                                       return;
  31453                                     }
  31454                                     DataType dt = Dt_L_imm6_4_Decode(
  31455                                         ((instr >> 19) & 0x7) |
  31456                                         ((instr >> 4) & 0x8));
  31457                                     if (dt.Is(kDataTypeValueInvalid)) {
  31458                                       UnallocatedT32(instr);
  31459                                       return;
  31460                                     }
  31461                                     unsigned rd =
  31462                                         ExtractDRegister(instr, 22, 12);
  31463                                     unsigned rm = ExtractDRegister(instr, 5, 0);
  31464                                     uint32_t imm6 = (instr >> 16) & 0x3f;
  31465                                     uint32_t imm =
  31466                                         (dt.IsSize(64) ? 64
  31467                                                        : (dt.GetSize() * 2)) -
  31468                                         imm6;
  31469                                     // VSRI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31470                                     vsri(CurrentCond(),
  31471                                          dt,
  31472                                          DRegister(rd),
  31473                                          DRegister(rm),
  31474                                          imm);
  31475                                   } else {
  31476                                     UnallocatedT32(instr);
  31477                                   }
  31478                                   break;
  31479                                 }
  31480                                 case 0x00000100: {
  31481                                   // 0xef800510
  31482                                   switch (instr & 0x10000000) {
  31483                                     case 0x00000000: {
  31484                                       // 0xef800510
  31485                                       if (((instr & 0x380080) == 0x0)) {
  31486                                         UnallocatedT32(instr);
  31487                                         return;
  31488                                       }
  31489                                       DataType dt = Dt_L_imm6_3_Decode(
  31490                                           ((instr >> 19) & 0x7) |
  31491                                           ((instr >> 4) & 0x8));
  31492                                       if (dt.Is(kDataTypeValueInvalid)) {
  31493                                         UnallocatedT32(instr);
  31494                                         return;
  31495                                       }
  31496                                       unsigned rd =
  31497                                           ExtractDRegister(instr, 22, 12);
  31498                                       unsigned rm =
  31499                                           ExtractDRegister(instr, 5, 0);
  31500                                       uint32_t imm6 = (instr >> 16) & 0x3f;
  31501                                       uint32_t imm =
  31502                                           imm6 -
  31503                                           (dt.IsSize(64) ? 0 : dt.GetSize());
  31504                                       // VSHL{<c>}{<q>}.I<size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31505                                       vshl(CurrentCond(),
  31506                                            dt,
  31507                                            DRegister(rd),
  31508                                            DRegister(rm),
  31509                                            imm);
  31510                                       break;
  31511                                     }
  31512                                     case 0x10000000: {
  31513                                       // 0xff800510
  31514                                       if (((instr & 0x380080) == 0x0)) {
  31515                                         UnallocatedT32(instr);
  31516                                         return;
  31517                                       }
  31518                                       DataType dt = Dt_L_imm6_4_Decode(
  31519                                           ((instr >> 19) & 0x7) |
  31520                                           ((instr >> 4) & 0x8));
  31521                                       if (dt.Is(kDataTypeValueInvalid)) {
  31522                                         UnallocatedT32(instr);
  31523                                         return;
  31524                                       }
  31525                                       unsigned rd =
  31526                                           ExtractDRegister(instr, 22, 12);
  31527                                       unsigned rm =
  31528                                           ExtractDRegister(instr, 5, 0);
  31529                                       uint32_t imm6 = (instr >> 16) & 0x3f;
  31530                                       uint32_t imm =
  31531                                           imm6 -
  31532                                           (dt.IsSize(64) ? 0 : dt.GetSize());
  31533                                       // VSLI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31534                                       vsli(CurrentCond(),
  31535                                            dt,
  31536                                            DRegister(rd),
  31537                                            DRegister(rm),
  31538                                            imm);
  31539                                       break;
  31540                                     }
  31541                                   }
  31542                                   break;
  31543                                 }
  31544                                 case 0x00000200: {
  31545                                   // 0xef800610
  31546                                   if (((instr & 0x380080) == 0x0)) {
  31547                                     UnallocatedT32(instr);
  31548                                     return;
  31549                                   }
  31550                                   DataType dt =
  31551                                       Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
  31552                                                              ((instr >> 4) &
  31553                                                               0x8),
  31554                                                          (instr >> 28) & 0x1);
  31555                                   if (dt.Is(kDataTypeValueInvalid)) {
  31556                                     UnallocatedT32(instr);
  31557                                     return;
  31558                                   }
  31559                                   unsigned rd = ExtractDRegister(instr, 22, 12);
  31560                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  31561                                   uint32_t imm6 = (instr >> 16) & 0x3f;
  31562                                   uint32_t imm =
  31563                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
  31564                                   // VQSHLU{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31565                                   vqshlu(CurrentCond(),
  31566                                          dt,
  31567                                          DRegister(rd),
  31568                                          DRegister(rm),
  31569                                          imm);
  31570                                   break;
  31571                                 }
  31572                                 case 0x00000300: {
  31573                                   // 0xef800710
  31574                                   if (((instr & 0x380080) == 0x0)) {
  31575                                     UnallocatedT32(instr);
  31576                                     return;
  31577                                   }
  31578                                   DataType dt =
  31579                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  31580                                                              ((instr >> 4) &
  31581                                                               0x8),
  31582                                                          (instr >> 28) & 0x1);
  31583                                   if (dt.Is(kDataTypeValueInvalid)) {
  31584                                     UnallocatedT32(instr);
  31585                                     return;
  31586                                   }
  31587                                   unsigned rd = ExtractDRegister(instr, 22, 12);
  31588                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  31589                                   uint32_t imm6 = (instr >> 16) & 0x3f;
  31590                                   uint32_t imm =
  31591                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
  31592                                   // VQSHL{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31593                                   vqshl(CurrentCond(),
  31594                                         dt,
  31595                                         DRegister(rd),
  31596                                         DRegister(rm),
  31597                                         imm);
  31598                                   break;
  31599                                 }
  31600                               }
  31601                               break;
  31602                             }
  31603                           }
  31604                           break;
  31605                         }
  31606                         case 0x00000800: {
  31607                           // 0xef800810
  31608                           switch (instr & 0x00000080) {
  31609                             case 0x00000000: {
  31610                               // 0xef800810
  31611                               switch (instr & 0x00380000) {
  31612                                 case 0x00000000: {
  31613                                   // 0xef800810
  31614                                   switch (instr & 0x00000100) {
  31615                                     case 0x00000000: {
  31616                                       // 0xef800810
  31617                                       switch (instr & 0x00000200) {
  31618                                         default: {
  31619                                           switch (instr & 0x00000020) {
  31620                                             case 0x00000020: {
  31621                                               // 0xef800830
  31622                                               if (((instr & 0xd00) == 0x100) ||
  31623                                                   ((instr & 0xd00) == 0x500) ||
  31624                                                   ((instr & 0xd00) == 0x900) ||
  31625                                                   ((instr & 0xe00) == 0xe00)) {
  31626                                                 UnallocatedT32(instr);
  31627                                                 return;
  31628                                               }
  31629                                               unsigned cmode =
  31630                                                   (instr >> 8) & 0xf;
  31631                                               DataType dt =
  31632                                                   ImmediateVmvn::DecodeDt(
  31633                                                       cmode);
  31634                                               if (dt.Is(
  31635                                                       kDataTypeValueInvalid)) {
  31636                                                 UnallocatedT32(instr);
  31637                                                 return;
  31638                                               }
  31639                                               unsigned rd =
  31640                                                   ExtractDRegister(instr,
  31641                                                                    22,
  31642                                                                    12);
  31643                                               DOperand imm = ImmediateVmvn::
  31644                                                   DecodeImmediate(cmode,
  31645                                                                   (instr &
  31646                                                                    0xf) |
  31647                                                                       ((instr >>
  31648                                                                         12) &
  31649                                                                        0x70) |
  31650                                                                       ((instr >>
  31651                                                                         21) &
  31652                                                                        0x80));
  31653                                               // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31654                                               vmvn(CurrentCond(),
  31655                                                    dt,
  31656                                                    DRegister(rd),
  31657                                                    imm);
  31658                                               break;
  31659                                             }
  31660                                             default: {
  31661                                               if (((instr & 0x920) == 0x100) ||
  31662                                                   ((instr & 0x520) == 0x100) ||
  31663                                                   ((instr & 0x820) == 0x20) ||
  31664                                                   ((instr & 0x420) == 0x20) ||
  31665                                                   ((instr & 0x220) == 0x20) ||
  31666                                                   ((instr & 0x120) == 0x120)) {
  31667                                                 UnallocatedT32(instr);
  31668                                                 return;
  31669                                               }
  31670                                               unsigned cmode =
  31671                                                   ((instr >> 8) & 0xf) |
  31672                                                   ((instr >> 1) & 0x10);
  31673                                               DataType dt =
  31674                                                   ImmediateVmov::DecodeDt(
  31675                                                       cmode);
  31676                                               if (dt.Is(
  31677                                                       kDataTypeValueInvalid)) {
  31678                                                 UnallocatedT32(instr);
  31679                                                 return;
  31680                                               }
  31681                                               unsigned rd =
  31682                                                   ExtractDRegister(instr,
  31683                                                                    22,
  31684                                                                    12);
  31685                                               DOperand imm = ImmediateVmov::
  31686                                                   DecodeImmediate(cmode,
  31687                                                                   (instr &
  31688                                                                    0xf) |
  31689                                                                       ((instr >>
  31690                                                                         12) &
  31691                                                                        0x70) |
  31692                                                                       ((instr >>
  31693                                                                         21) &
  31694                                                                        0x80));
  31695                                               // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31696                                               vmov(CurrentCond(),
  31697                                                    dt,
  31698                                                    DRegister(rd),
  31699                                                    imm);
  31700                                               break;
  31701                                             }
  31702                                           }
  31703                                           break;
  31704                                         }
  31705                                       }
  31706                                       break;
  31707                                     }
  31708                                     case 0x00000100: {
  31709                                       // 0xef800910
  31710                                       switch (instr & 0x00000020) {
  31711                                         case 0x00000000: {
  31712                                           // 0xef800910
  31713                                           if (((instr & 0x100) == 0x0) ||
  31714                                               ((instr & 0xc00) == 0xc00)) {
  31715                                             UnallocatedT32(instr);
  31716                                             return;
  31717                                           }
  31718                                           unsigned cmode = (instr >> 8) & 0xf;
  31719                                           DataType dt =
  31720                                               ImmediateVorr::DecodeDt(cmode);
  31721                                           if (dt.Is(kDataTypeValueInvalid)) {
  31722                                             UnallocatedT32(instr);
  31723                                             return;
  31724                                           }
  31725                                           unsigned rd =
  31726                                               ExtractDRegister(instr, 22, 12);
  31727                                           DOperand imm =
  31728                                               ImmediateVorr::DecodeImmediate(
  31729                                                   cmode,
  31730                                                   (instr & 0xf) |
  31731                                                       ((instr >> 12) & 0x70) |
  31732                                                       ((instr >> 21) & 0x80));
  31733                                           // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31734                                           vorr(CurrentCond(),
  31735                                                dt,
  31736                                                DRegister(rd),
  31737                                                DRegister(rd),
  31738                                                imm);
  31739                                           break;
  31740                                         }
  31741                                         case 0x00000020: {
  31742                                           // 0xef800930
  31743                                           if (((instr & 0x100) == 0x0) ||
  31744                                               ((instr & 0xc00) == 0xc00)) {
  31745                                             UnallocatedT32(instr);
  31746                                             return;
  31747                                           }
  31748                                           unsigned cmode = (instr >> 8) & 0xf;
  31749                                           DataType dt =
  31750                                               ImmediateVbic::DecodeDt(cmode);
  31751                                           if (dt.Is(kDataTypeValueInvalid)) {
  31752                                             UnallocatedT32(instr);
  31753                                             return;
  31754                                           }
  31755                                           unsigned rd =
  31756                                               ExtractDRegister(instr, 22, 12);
  31757                                           DOperand imm =
  31758                                               ImmediateVbic::DecodeImmediate(
  31759                                                   cmode,
  31760                                                   (instr & 0xf) |
  31761                                                       ((instr >> 12) & 0x70) |
  31762                                                       ((instr >> 21) & 0x80));
  31763                                           // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31764                                           vbic(CurrentCond(),
  31765                                                dt,
  31766                                                DRegister(rd),
  31767                                                DRegister(rd),
  31768                                                imm);
  31769                                           break;
  31770                                         }
  31771                                       }
  31772                                       break;
  31773                                     }
  31774                                   }
  31775                                   break;
  31776                                 }
  31777                                 case 0x00180000: {
  31778                                   // 0xef980810
  31779                                   switch (instr & 0x00000300) {
  31780                                     case 0x00000000: {
  31781                                       // 0xef980810
  31782                                       switch (instr & 0x10000000) {
  31783                                         case 0x00000000: {
  31784                                           // 0xef980810
  31785                                           if (((instr & 0x380000) == 0x0)) {
  31786                                             UnallocatedT32(instr);
  31787                                             return;
  31788                                           }
  31789                                           DataType dt = Dt_imm6_3_Decode(
  31790                                               (instr >> 19) & 0x7);
  31791                                           if (dt.Is(kDataTypeValueInvalid)) {
  31792                                             UnallocatedT32(instr);
  31793                                             return;
  31794                                           }
  31795                                           unsigned rd =
  31796                                               ExtractDRegister(instr, 22, 12);
  31797                                           if ((instr & 1) != 0) {
  31798                                             UnallocatedT32(instr);
  31799                                             return;
  31800                                           }
  31801                                           unsigned rm =
  31802                                               ExtractQRegister(instr, 5, 0);
  31803                                           uint32_t imm6 = (instr >> 16) & 0x3f;
  31804                                           uint32_t imm = dt.GetSize() - imm6;
  31805                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31806                                           vshrn(CurrentCond(),
  31807                                                 dt,
  31808                                                 DRegister(rd),
  31809                                                 QRegister(rm),
  31810                                                 imm);
  31811                                           break;
  31812                                         }
  31813                                         case 0x10000000: {
  31814                                           // 0xff980810
  31815                                           if (((instr & 0x380000) == 0x0)) {
  31816                                             UnallocatedT32(instr);
  31817                                             return;
  31818                                           }
  31819                                           DataType dt =
  31820                                               Dt_imm6_2_Decode((instr >> 19) &
  31821                                                                    0x7,
  31822                                                                (instr >> 28) &
  31823                                                                    0x1);
  31824                                           if (dt.Is(kDataTypeValueInvalid)) {
  31825                                             UnallocatedT32(instr);
  31826                                             return;
  31827                                           }
  31828                                           unsigned rd =
  31829                                               ExtractDRegister(instr, 22, 12);
  31830                                           if ((instr & 1) != 0) {
  31831                                             UnallocatedT32(instr);
  31832                                             return;
  31833                                           }
  31834                                           unsigned rm =
  31835                                               ExtractQRegister(instr, 5, 0);
  31836                                           uint32_t imm6 = (instr >> 16) & 0x3f;
  31837                                           uint32_t imm = dt.GetSize() - imm6;
  31838                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31839                                           vqshrun(CurrentCond(),
  31840                                                   dt,
  31841                                                   DRegister(rd),
  31842                                                   QRegister(rm),
  31843                                                   imm);
  31844                                           break;
  31845                                         }
  31846                                       }
  31847                                       break;
  31848                                     }
  31849                                     case 0x00000100: {
  31850                                       // 0xef980910
  31851                                       if (((instr & 0x380000) == 0x0)) {
  31852                                         UnallocatedT32(instr);
  31853                                         return;
  31854                                       }
  31855                                       DataType dt =
  31856                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
  31857                                                            (instr >> 28) & 0x1);
  31858                                       if (dt.Is(kDataTypeValueInvalid)) {
  31859                                         UnallocatedT32(instr);
  31860                                         return;
  31861                                       }
  31862                                       unsigned rd =
  31863                                           ExtractDRegister(instr, 22, 12);
  31864                                       if ((instr & 1) != 0) {
  31865                                         UnallocatedT32(instr);
  31866                                         return;
  31867                                       }
  31868                                       unsigned rm =
  31869                                           ExtractQRegister(instr, 5, 0);
  31870                                       uint32_t imm6 = (instr >> 16) & 0x3f;
  31871                                       uint32_t imm = dt.GetSize() - imm6;
  31872                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31873                                       vqshrn(CurrentCond(),
  31874                                              dt,
  31875                                              DRegister(rd),
  31876                                              QRegister(rm),
  31877                                              imm);
  31878                                       break;
  31879                                     }
  31880                                     case 0x00000200: {
  31881                                       // 0xef980a10
  31882                                       if (((instr & 0x380000) == 0x0) ||
  31883                                           ((instr & 0x3f0000) == 0x80000) ||
  31884                                           ((instr & 0x3f0000) == 0x100000) ||
  31885                                           ((instr & 0x3f0000) == 0x200000)) {
  31886                                         UnallocatedT32(instr);
  31887                                         return;
  31888                                       }
  31889                                       DataType dt =
  31890                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
  31891                                                            (instr >> 28) & 0x1);
  31892                                       if (dt.Is(kDataTypeValueInvalid)) {
  31893                                         UnallocatedT32(instr);
  31894                                         return;
  31895                                       }
  31896                                       if (((instr >> 12) & 1) != 0) {
  31897                                         UnallocatedT32(instr);
  31898                                         return;
  31899                                       }
  31900                                       unsigned rd =
  31901                                           ExtractQRegister(instr, 22, 12);
  31902                                       unsigned rm =
  31903                                           ExtractDRegister(instr, 5, 0);
  31904                                       uint32_t imm6 = (instr >> 16) & 0x3f;
  31905                                       uint32_t imm = imm6 - dt.GetSize();
  31906                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31907                                       vshll(CurrentCond(),
  31908                                             dt,
  31909                                             QRegister(rd),
  31910                                             DRegister(rm),
  31911                                             imm);
  31912                                       break;
  31913                                     }
  31914                                     default:
  31915                                       UnallocatedT32(instr);
  31916                                       break;
  31917                                   }
  31918                                   break;
  31919                                 }
  31920                                 case 0x00280000: {
  31921                                   // 0xefa80810
  31922                                   switch (instr & 0x00000300) {
  31923                                     case 0x00000000: {
  31924                                       // 0xefa80810
  31925                                       switch (instr & 0x10000000) {
  31926                                         case 0x00000000: {
  31927                                           // 0xefa80810
  31928                                           if (((instr & 0x380000) == 0x0)) {
  31929                                             UnallocatedT32(instr);
  31930                                             return;
  31931                                           }
  31932                                           DataType dt = Dt_imm6_3_Decode(
  31933                                               (instr >> 19) & 0x7);
  31934                                           if (dt.Is(kDataTypeValueInvalid)) {
  31935                                             UnallocatedT32(instr);
  31936                                             return;
  31937                                           }
  31938                                           unsigned rd =
  31939                                               ExtractDRegister(instr, 22, 12);
  31940                                           if ((instr & 1) != 0) {
  31941                                             UnallocatedT32(instr);
  31942                                             return;
  31943                                           }
  31944                                           unsigned rm =
  31945                                               ExtractQRegister(instr, 5, 0);
  31946                                           uint32_t imm6 = (instr >> 16) & 0x3f;
  31947                                           uint32_t imm = dt.GetSize() - imm6;
  31948                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31949                                           vshrn(CurrentCond(),
  31950                                                 dt,
  31951                                                 DRegister(rd),
  31952                                                 QRegister(rm),
  31953                                                 imm);
  31954                                           break;
  31955                                         }
  31956                                         case 0x10000000: {
  31957                                           // 0xffa80810
  31958                                           if (((instr & 0x380000) == 0x0)) {
  31959                                             UnallocatedT32(instr);
  31960                                             return;
  31961                                           }
  31962                                           DataType dt =
  31963                                               Dt_imm6_2_Decode((instr >> 19) &
  31964                                                                    0x7,
  31965                                                                (instr >> 28) &
  31966                                                                    0x1);
  31967                                           if (dt.Is(kDataTypeValueInvalid)) {
  31968                                             UnallocatedT32(instr);
  31969                                             return;
  31970                                           }
  31971                                           unsigned rd =
  31972                                               ExtractDRegister(instr, 22, 12);
  31973                                           if ((instr & 1) != 0) {
  31974                                             UnallocatedT32(instr);
  31975                                             return;
  31976                                           }
  31977                                           unsigned rm =
  31978                                               ExtractQRegister(instr, 5, 0);
  31979                                           uint32_t imm6 = (instr >> 16) & 0x3f;
  31980                                           uint32_t imm = dt.GetSize() - imm6;
  31981                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  31982                                           vqshrun(CurrentCond(),
  31983                                                   dt,
  31984                                                   DRegister(rd),
  31985                                                   QRegister(rm),
  31986                                                   imm);
  31987                                           break;
  31988                                         }
  31989                                       }
  31990                                       break;
  31991                                     }
  31992                                     case 0x00000100: {
  31993                                       // 0xefa80910
  31994                                       if (((instr & 0x380000) == 0x0)) {
  31995                                         UnallocatedT32(instr);
  31996                                         return;
  31997                                       }
  31998                                       DataType dt =
  31999                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
  32000                                                            (instr >> 28) & 0x1);
  32001                                       if (dt.Is(kDataTypeValueInvalid)) {
  32002                                         UnallocatedT32(instr);
  32003                                         return;
  32004                                       }
  32005                                       unsigned rd =
  32006                                           ExtractDRegister(instr, 22, 12);
  32007                                       if ((instr & 1) != 0) {
  32008                                         UnallocatedT32(instr);
  32009                                         return;
  32010                                       }
  32011                                       unsigned rm =
  32012                                           ExtractQRegister(instr, 5, 0);
  32013                                       uint32_t imm6 = (instr >> 16) & 0x3f;
  32014                                       uint32_t imm = dt.GetSize() - imm6;
  32015                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32016                                       vqshrn(CurrentCond(),
  32017                                              dt,
  32018                                              DRegister(rd),
  32019                                              QRegister(rm),
  32020                                              imm);
  32021                                       break;
  32022                                     }
  32023                                     case 0x00000200: {
  32024                                       // 0xefa80a10
  32025                                       if (((instr & 0x380000) == 0x0) ||
  32026                                           ((instr & 0x3f0000) == 0x80000) ||
  32027                                           ((instr & 0x3f0000) == 0x100000) ||
  32028                                           ((instr & 0x3f0000) == 0x200000)) {
  32029                                         UnallocatedT32(instr);
  32030                                         return;
  32031                                       }
  32032                                       DataType dt =
  32033                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
  32034                                                            (instr >> 28) & 0x1);
  32035                                       if (dt.Is(kDataTypeValueInvalid)) {
  32036                                         UnallocatedT32(instr);
  32037                                         return;
  32038                                       }
  32039                                       if (((instr >> 12) & 1) != 0) {
  32040                                         UnallocatedT32(instr);
  32041                                         return;
  32042                                       }
  32043                                       unsigned rd =
  32044                                           ExtractQRegister(instr, 22, 12);
  32045                                       unsigned rm =
  32046                                           ExtractDRegister(instr, 5, 0);
  32047                                       uint32_t imm6 = (instr >> 16) & 0x3f;
  32048                                       uint32_t imm = imm6 - dt.GetSize();
  32049                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32050                                       vshll(CurrentCond(),
  32051                                             dt,
  32052                                             QRegister(rd),
  32053                                             DRegister(rm),
  32054                                             imm);
  32055                                       break;
  32056                                     }
  32057                                     default:
  32058                                       UnallocatedT32(instr);
  32059                                       break;
  32060                                   }
  32061                                   break;
  32062                                 }
  32063                                 case 0x00300000: {
  32064                                   // 0xefb00810
  32065                                   switch (instr & 0x00000300) {
  32066                                     case 0x00000000: {
  32067                                       // 0xefb00810
  32068                                       switch (instr & 0x10000000) {
  32069                                         case 0x00000000: {
  32070                                           // 0xefb00810
  32071                                           if (((instr & 0x380000) == 0x0)) {
  32072                                             UnallocatedT32(instr);
  32073                                             return;
  32074                                           }
  32075                                           DataType dt = Dt_imm6_3_Decode(
  32076                                               (instr >> 19) & 0x7);
  32077                                           if (dt.Is(kDataTypeValueInvalid)) {
  32078                                             UnallocatedT32(instr);
  32079                                             return;
  32080                                           }
  32081                                           unsigned rd =
  32082                                               ExtractDRegister(instr, 22, 12);
  32083                                           if ((instr & 1) != 0) {
  32084                                             UnallocatedT32(instr);
  32085                                             return;
  32086                                           }
  32087                                           unsigned rm =
  32088                                               ExtractQRegister(instr, 5, 0);
  32089                                           uint32_t imm6 = (instr >> 16) & 0x3f;
  32090                                           uint32_t imm = dt.GetSize() - imm6;
  32091                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32092                                           vshrn(CurrentCond(),
  32093                                                 dt,
  32094                                                 DRegister(rd),
  32095                                                 QRegister(rm),
  32096                                                 imm);
  32097                                           break;
  32098                                         }
  32099                                         case 0x10000000: {
  32100                                           // 0xffb00810
  32101                                           if (((instr & 0x380000) == 0x0)) {
  32102                                             UnallocatedT32(instr);
  32103                                             return;
  32104                                           }
  32105                                           DataType dt =
  32106                                               Dt_imm6_2_Decode((instr >> 19) &
  32107                                                                    0x7,
  32108                                                                (instr >> 28) &
  32109                                                                    0x1);
  32110                                           if (dt.Is(kDataTypeValueInvalid)) {
  32111                                             UnallocatedT32(instr);
  32112                                             return;
  32113                                           }
  32114                                           unsigned rd =
  32115                                               ExtractDRegister(instr, 22, 12);
  32116                                           if ((instr & 1) != 0) {
  32117                                             UnallocatedT32(instr);
  32118                                             return;
  32119                                           }
  32120                                           unsigned rm =
  32121                                               ExtractQRegister(instr, 5, 0);
  32122                                           uint32_t imm6 = (instr >> 16) & 0x3f;
  32123                                           uint32_t imm = dt.GetSize() - imm6;
  32124                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32125                                           vqshrun(CurrentCond(),
  32126                                                   dt,
  32127                                                   DRegister(rd),
  32128                                                   QRegister(rm),
  32129                                                   imm);
  32130                                           break;
  32131                                         }
  32132                                       }
  32133                                       break;
  32134                                     }
  32135                                     case 0x00000100: {
  32136                                       // 0xefb00910
  32137                                       if (((instr & 0x380000) == 0x0)) {
  32138                                         UnallocatedT32(instr);
  32139                                         return;
  32140                                       }
  32141                                       DataType dt =
  32142                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
  32143                                                            (instr >> 28) & 0x1);
  32144                                       if (dt.Is(kDataTypeValueInvalid)) {
  32145                                         UnallocatedT32(instr);
  32146                                         return;
  32147                                       }
  32148                                       unsigned rd =
  32149                                           ExtractDRegister(instr, 22, 12);
  32150                                       if ((instr & 1) != 0) {
  32151                                         UnallocatedT32(instr);
  32152                                         return;
  32153                                       }
  32154                                       unsigned rm =
  32155                                           ExtractQRegister(instr, 5, 0);
  32156                                       uint32_t imm6 = (instr >> 16) & 0x3f;
  32157                                       uint32_t imm = dt.GetSize() - imm6;
  32158                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32159                                       vqshrn(CurrentCond(),
  32160                                              dt,
  32161                                              DRegister(rd),
  32162                                              QRegister(rm),
  32163                                              imm);
  32164                                       break;
  32165                                     }
  32166                                     case 0x00000200: {
  32167                                       // 0xefb00a10
  32168                                       if (((instr & 0x380000) == 0x0) ||
  32169                                           ((instr & 0x3f0000) == 0x80000) ||
  32170                                           ((instr & 0x3f0000) == 0x100000) ||
  32171                                           ((instr & 0x3f0000) == 0x200000)) {
  32172                                         UnallocatedT32(instr);
  32173                                         return;
  32174                                       }
  32175                                       DataType dt =
  32176                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
  32177                                                            (instr >> 28) & 0x1);
  32178                                       if (dt.Is(kDataTypeValueInvalid)) {
  32179                                         UnallocatedT32(instr);
  32180                                         return;
  32181                                       }
  32182                                       if (((instr >> 12) & 1) != 0) {
  32183                                         UnallocatedT32(instr);
  32184                                         return;
  32185                                       }
  32186                                       unsigned rd =
  32187                                           ExtractQRegister(instr, 22, 12);
  32188                                       unsigned rm =
  32189                                           ExtractDRegister(instr, 5, 0);
  32190                                       uint32_t imm6 = (instr >> 16) & 0x3f;
  32191                                       uint32_t imm = imm6 - dt.GetSize();
  32192                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32193                                       vshll(CurrentCond(),
  32194                                             dt,
  32195                                             QRegister(rd),
  32196                                             DRegister(rm),
  32197                                             imm);
  32198                                       break;
  32199                                     }
  32200                                     default:
  32201                                       UnallocatedT32(instr);
  32202                                       break;
  32203                                   }
  32204                                   break;
  32205                                 }
  32206                                 case 0x00380000: {
  32207                                   // 0xefb80810
  32208                                   switch (instr & 0x00000300) {
  32209                                     case 0x00000000: {
  32210                                       // 0xefb80810
  32211                                       switch (instr & 0x10000000) {
  32212                                         case 0x00000000: {
  32213                                           // 0xefb80810
  32214                                           if (((instr & 0x380000) == 0x0)) {
  32215                                             UnallocatedT32(instr);
  32216                                             return;
  32217                                           }
  32218                                           DataType dt = Dt_imm6_3_Decode(
  32219                                               (instr >> 19) & 0x7);
  32220                                           if (dt.Is(kDataTypeValueInvalid)) {
  32221                                             UnallocatedT32(instr);
  32222                                             return;
  32223                                           }
  32224                                           unsigned rd =
  32225                                               ExtractDRegister(instr, 22, 12);
  32226                                           if ((instr & 1) != 0) {
  32227                                             UnallocatedT32(instr);
  32228                                             return;
  32229                                           }
  32230                                           unsigned rm =
  32231                                               ExtractQRegister(instr, 5, 0);
  32232                                           uint32_t imm6 = (instr >> 16) & 0x3f;
  32233                                           uint32_t imm = dt.GetSize() - imm6;
  32234                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32235                                           vshrn(CurrentCond(),
  32236                                                 dt,
  32237                                                 DRegister(rd),
  32238                                                 QRegister(rm),
  32239                                                 imm);
  32240                                           break;
  32241                                         }
  32242                                         case 0x10000000: {
  32243                                           // 0xffb80810
  32244                                           if (((instr & 0x380000) == 0x0)) {
  32245                                             UnallocatedT32(instr);
  32246                                             return;
  32247                                           }
  32248                                           DataType dt =
  32249                                               Dt_imm6_2_Decode((instr >> 19) &
  32250                                                                    0x7,
  32251                                                                (instr >> 28) &
  32252                                                                    0x1);
  32253                                           if (dt.Is(kDataTypeValueInvalid)) {
  32254                                             UnallocatedT32(instr);
  32255                                             return;
  32256                                           }
  32257                                           unsigned rd =
  32258                                               ExtractDRegister(instr, 22, 12);
  32259                                           if ((instr & 1) != 0) {
  32260                                             UnallocatedT32(instr);
  32261                                             return;
  32262                                           }
  32263                                           unsigned rm =
  32264                                               ExtractQRegister(instr, 5, 0);
  32265                                           uint32_t imm6 = (instr >> 16) & 0x3f;
  32266                                           uint32_t imm = dt.GetSize() - imm6;
  32267                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32268                                           vqshrun(CurrentCond(),
  32269                                                   dt,
  32270                                                   DRegister(rd),
  32271                                                   QRegister(rm),
  32272                                                   imm);
  32273                                           break;
  32274                                         }
  32275                                       }
  32276                                       break;
  32277                                     }
  32278                                     case 0x00000100: {
  32279                                       // 0xefb80910
  32280                                       if (((instr & 0x380000) == 0x0)) {
  32281                                         UnallocatedT32(instr);
  32282                                         return;
  32283                                       }
  32284                                       DataType dt =
  32285                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
  32286                                                            (instr >> 28) & 0x1);
  32287                                       if (dt.Is(kDataTypeValueInvalid)) {
  32288                                         UnallocatedT32(instr);
  32289                                         return;
  32290                                       }
  32291                                       unsigned rd =
  32292                                           ExtractDRegister(instr, 22, 12);
  32293                                       if ((instr & 1) != 0) {
  32294                                         UnallocatedT32(instr);
  32295                                         return;
  32296                                       }
  32297                                       unsigned rm =
  32298                                           ExtractQRegister(instr, 5, 0);
  32299                                       uint32_t imm6 = (instr >> 16) & 0x3f;
  32300                                       uint32_t imm = dt.GetSize() - imm6;
  32301                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32302                                       vqshrn(CurrentCond(),
  32303                                              dt,
  32304                                              DRegister(rd),
  32305                                              QRegister(rm),
  32306                                              imm);
  32307                                       break;
  32308                                     }
  32309                                     case 0x00000200: {
  32310                                       // 0xefb80a10
  32311                                       if (((instr & 0x380000) == 0x0) ||
  32312                                           ((instr & 0x3f0000) == 0x80000) ||
  32313                                           ((instr & 0x3f0000) == 0x100000) ||
  32314                                           ((instr & 0x3f0000) == 0x200000)) {
  32315                                         UnallocatedT32(instr);
  32316                                         return;
  32317                                       }
  32318                                       DataType dt =
  32319                                           Dt_imm6_4_Decode((instr >> 19) & 0x7,
  32320                                                            (instr >> 28) & 0x1);
  32321                                       if (dt.Is(kDataTypeValueInvalid)) {
  32322                                         UnallocatedT32(instr);
  32323                                         return;
  32324                                       }
  32325                                       if (((instr >> 12) & 1) != 0) {
  32326                                         UnallocatedT32(instr);
  32327                                         return;
  32328                                       }
  32329                                       unsigned rd =
  32330                                           ExtractQRegister(instr, 22, 12);
  32331                                       unsigned rm =
  32332                                           ExtractDRegister(instr, 5, 0);
  32333                                       uint32_t imm6 = (instr >> 16) & 0x3f;
  32334                                       uint32_t imm = imm6 - dt.GetSize();
  32335                                       // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32336                                       vshll(CurrentCond(),
  32337                                             dt,
  32338                                             QRegister(rd),
  32339                                             DRegister(rm),
  32340                                             imm);
  32341                                       break;
  32342                                     }
  32343                                     default:
  32344                                       UnallocatedT32(instr);
  32345                                       break;
  32346                                   }
  32347                                   break;
  32348                                 }
  32349                                 default: {
  32350                                   switch (instr & 0x00000300) {
  32351                                     case 0x00000000: {
  32352                                       // 0xef800810
  32353                                       switch (instr & 0x10000000) {
  32354                                         case 0x00000000: {
  32355                                           // 0xef800810
  32356                                           if (((instr & 0x380000) == 0x0)) {
  32357                                             UnallocatedT32(instr);
  32358                                             return;
  32359                                           }
  32360                                           DataType dt = Dt_imm6_3_Decode(
  32361                                               (instr >> 19) & 0x7);
  32362                                           if (dt.Is(kDataTypeValueInvalid)) {
  32363                                             UnallocatedT32(instr);
  32364                                             return;
  32365                                           }
  32366                                           unsigned rd =
  32367                                               ExtractDRegister(instr, 22, 12);
  32368                                           if ((instr & 1) != 0) {
  32369                                             UnallocatedT32(instr);
  32370                                             return;
  32371                                           }
  32372                                           unsigned rm =
  32373                                               ExtractQRegister(instr, 5, 0);
  32374                                           uint32_t imm6 = (instr >> 16) & 0x3f;
  32375                                           uint32_t imm = dt.GetSize() - imm6;
  32376                                           // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32377                                           vshrn(CurrentCond(),
  32378                                                 dt,
  32379                                                 DRegister(rd),
  32380                                                 QRegister(rm),
  32381                                                 imm);
  32382                                           break;
  32383                                         }
  32384                                         case 0x10000000: {
  32385                                           // 0xff800810
  32386                                           if (((instr & 0x380000) == 0x0)) {
  32387                                             UnallocatedT32(instr);
  32388                                             return;
  32389                                           }
  32390                                           DataType dt =
  32391                                               Dt_imm6_2_Decode((instr >> 19) &
  32392                                                                    0x7,
  32393                                                                (instr >> 28) &
  32394                                                                    0x1);
  32395                                           if (dt.Is(kDataTypeValueInvalid)) {
  32396                                             UnallocatedT32(instr);
  32397                                             return;
  32398                                           }
  32399                                           unsigned rd =
  32400                                               ExtractDRegister(instr, 22, 12);
  32401                                           if ((instr & 1) != 0) {
  32402                                             UnallocatedT32(instr);
  32403                                             return;
  32404                                           }
  32405                                           unsigned rm =
  32406                                               ExtractQRegister(instr, 5, 0);
  32407                                           uint32_t imm6 = (instr >> 16) & 0x3f;
  32408                                           uint32_t imm = dt.GetSize() - imm6;
  32409                                           // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32410                                           vqshrun(CurrentCond(),
  32411                                                   dt,
  32412                                                   DRegister(rd),
  32413                                                   QRegister(rm),
  32414                                                   imm);
  32415                                           break;
  32416                                         }
  32417                                       }
  32418                                       break;
  32419                                     }
  32420                                     case 0x00000100: {
  32421                                       // 0xef800910
  32422                                       if (((instr & 0x380000) == 0x0)) {
  32423                                         UnallocatedT32(instr);
  32424                                         return;
  32425                                       }
  32426                                       DataType dt =
  32427                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
  32428                                                            (instr >> 28) & 0x1);
  32429                                       if (dt.Is(kDataTypeValueInvalid)) {
  32430                                         UnallocatedT32(instr);
  32431                                         return;
  32432                                       }
  32433                                       unsigned rd =
  32434                                           ExtractDRegister(instr, 22, 12);
  32435                                       if ((instr & 1) != 0) {
  32436                                         UnallocatedT32(instr);
  32437                                         return;
  32438                                       }
  32439                                       unsigned rm =
  32440                                           ExtractQRegister(instr, 5, 0);
  32441                                       uint32_t imm6 = (instr >> 16) & 0x3f;
  32442                                       uint32_t imm = dt.GetSize() - imm6;
  32443                                       // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32444                                       vqshrn(CurrentCond(),
  32445                                              dt,
  32446                                              DRegister(rd),
  32447                                              QRegister(rm),
  32448                                              imm);
  32449                                       break;
  32450                                     }
  32451                                     case 0x00000200: {
  32452                                       // 0xef800a10
  32453                                       switch (instr & 0x00070000) {
  32454                                         case 0x00000000: {
  32455                                           // 0xef800a10
  32456                                           switch (instr & 0x003f0000) {
  32457                                             case 0x00080000: {
  32458                                               // 0xef880a10
  32459                                               if (((instr & 0x380000) == 0x0) ||
  32460                                                   ((instr & 0x380000) ==
  32461                                                    0x180000) ||
  32462                                                   ((instr & 0x380000) ==
  32463                                                    0x280000) ||
  32464                                                   ((instr & 0x380000) ==
  32465                                                    0x300000) ||
  32466                                                   ((instr & 0x380000) ==
  32467                                                    0x380000)) {
  32468                                                 UnallocatedT32(instr);
  32469                                                 return;
  32470                                               }
  32471                                               DataType dt = Dt_U_imm3H_1_Decode(
  32472                                                   ((instr >> 19) & 0x7) |
  32473                                                   ((instr >> 25) & 0x8));
  32474                                               if (dt.Is(
  32475                                                       kDataTypeValueInvalid)) {
  32476                                                 UnallocatedT32(instr);
  32477                                                 return;
  32478                                               }
  32479                                               if (((instr >> 12) & 1) != 0) {
  32480                                                 UnallocatedT32(instr);
  32481                                                 return;
  32482                                               }
  32483                                               unsigned rd =
  32484                                                   ExtractQRegister(instr,
  32485                                                                    22,
  32486                                                                    12);
  32487                                               unsigned rm =
  32488                                                   ExtractDRegister(instr, 5, 0);
  32489                                               // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  32490                                               vmovl(CurrentCond(),
  32491                                                     dt,
  32492                                                     QRegister(rd),
  32493                                                     DRegister(rm));
  32494                                               break;
  32495                                             }
  32496                                             case 0x00090000: {
  32497                                               // 0xef890a10
  32498                                               if (((instr & 0x380000) == 0x0) ||
  32499                                                   ((instr & 0x3f0000) ==
  32500                                                    0x80000) ||
  32501                                                   ((instr & 0x3f0000) ==
  32502                                                    0x100000) ||
  32503                                                   ((instr & 0x3f0000) ==
  32504                                                    0x200000)) {
  32505                                                 UnallocatedT32(instr);
  32506                                                 return;
  32507                                               }
  32508                                               DataType dt =
  32509                                                   Dt_imm6_4_Decode((instr >>
  32510                                                                     19) &
  32511                                                                        0x7,
  32512                                                                    (instr >>
  32513                                                                     28) &
  32514                                                                        0x1);
  32515                                               if (dt.Is(
  32516                                                       kDataTypeValueInvalid)) {
  32517                                                 UnallocatedT32(instr);
  32518                                                 return;
  32519                                               }
  32520                                               if (((instr >> 12) & 1) != 0) {
  32521                                                 UnallocatedT32(instr);
  32522                                                 return;
  32523                                               }
  32524                                               unsigned rd =
  32525                                                   ExtractQRegister(instr,
  32526                                                                    22,
  32527                                                                    12);
  32528                                               unsigned rm =
  32529                                                   ExtractDRegister(instr, 5, 0);
  32530                                               uint32_t imm6 =
  32531                                                   (instr >> 16) & 0x3f;
  32532                                               uint32_t imm =
  32533                                                   imm6 - dt.GetSize();
  32534                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32535                                               vshll(CurrentCond(),
  32536                                                     dt,
  32537                                                     QRegister(rd),
  32538                                                     DRegister(rm),
  32539                                                     imm);
  32540                                               break;
  32541                                             }
  32542                                             case 0x000a0000: {
  32543                                               // 0xef8a0a10
  32544                                               if (((instr & 0x380000) == 0x0) ||
  32545                                                   ((instr & 0x3f0000) ==
  32546                                                    0x80000) ||
  32547                                                   ((instr & 0x3f0000) ==
  32548                                                    0x100000) ||
  32549                                                   ((instr & 0x3f0000) ==
  32550                                                    0x200000)) {
  32551                                                 UnallocatedT32(instr);
  32552                                                 return;
  32553                                               }
  32554                                               DataType dt =
  32555                                                   Dt_imm6_4_Decode((instr >>
  32556                                                                     19) &
  32557                                                                        0x7,
  32558                                                                    (instr >>
  32559                                                                     28) &
  32560                                                                        0x1);
  32561                                               if (dt.Is(
  32562                                                       kDataTypeValueInvalid)) {
  32563                                                 UnallocatedT32(instr);
  32564                                                 return;
  32565                                               }
  32566                                               if (((instr >> 12) & 1) != 0) {
  32567                                                 UnallocatedT32(instr);
  32568                                                 return;
  32569                                               }
  32570                                               unsigned rd =
  32571                                                   ExtractQRegister(instr,
  32572                                                                    22,
  32573                                                                    12);
  32574                                               unsigned rm =
  32575                                                   ExtractDRegister(instr, 5, 0);
  32576                                               uint32_t imm6 =
  32577                                                   (instr >> 16) & 0x3f;
  32578                                               uint32_t imm =
  32579                                                   imm6 - dt.GetSize();
  32580                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32581                                               vshll(CurrentCond(),
  32582                                                     dt,
  32583                                                     QRegister(rd),
  32584                                                     DRegister(rm),
  32585                                                     imm);
  32586                                               break;
  32587                                             }
  32588                                             case 0x000b0000: {
  32589                                               // 0xef8b0a10
  32590                                               if (((instr & 0x380000) == 0x0) ||
  32591                                                   ((instr & 0x3f0000) ==
  32592                                                    0x80000) ||
  32593                                                   ((instr & 0x3f0000) ==
  32594                                                    0x100000) ||
  32595                                                   ((instr & 0x3f0000) ==
  32596                                                    0x200000)) {
  32597                                                 UnallocatedT32(instr);
  32598                                                 return;
  32599                                               }
  32600                                               DataType dt =
  32601                                                   Dt_imm6_4_Decode((instr >>
  32602                                                                     19) &
  32603                                                                        0x7,
  32604                                                                    (instr >>
  32605                                                                     28) &
  32606                                                                        0x1);
  32607                                               if (dt.Is(
  32608                                                       kDataTypeValueInvalid)) {
  32609                                                 UnallocatedT32(instr);
  32610                                                 return;
  32611                                               }
  32612                                               if (((instr >> 12) & 1) != 0) {
  32613                                                 UnallocatedT32(instr);
  32614                                                 return;
  32615                                               }
  32616                                               unsigned rd =
  32617                                                   ExtractQRegister(instr,
  32618                                                                    22,
  32619                                                                    12);
  32620                                               unsigned rm =
  32621                                                   ExtractDRegister(instr, 5, 0);
  32622                                               uint32_t imm6 =
  32623                                                   (instr >> 16) & 0x3f;
  32624                                               uint32_t imm =
  32625                                                   imm6 - dt.GetSize();
  32626                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32627                                               vshll(CurrentCond(),
  32628                                                     dt,
  32629                                                     QRegister(rd),
  32630                                                     DRegister(rm),
  32631                                                     imm);
  32632                                               break;
  32633                                             }
  32634                                             case 0x000c0000: {
  32635                                               // 0xef8c0a10
  32636                                               if (((instr & 0x380000) == 0x0) ||
  32637                                                   ((instr & 0x3f0000) ==
  32638                                                    0x80000) ||
  32639                                                   ((instr & 0x3f0000) ==
  32640                                                    0x100000) ||
  32641                                                   ((instr & 0x3f0000) ==
  32642                                                    0x200000)) {
  32643                                                 UnallocatedT32(instr);
  32644                                                 return;
  32645                                               }
  32646                                               DataType dt =
  32647                                                   Dt_imm6_4_Decode((instr >>
  32648                                                                     19) &
  32649                                                                        0x7,
  32650                                                                    (instr >>
  32651                                                                     28) &
  32652                                                                        0x1);
  32653                                               if (dt.Is(
  32654                                                       kDataTypeValueInvalid)) {
  32655                                                 UnallocatedT32(instr);
  32656                                                 return;
  32657                                               }
  32658                                               if (((instr >> 12) & 1) != 0) {
  32659                                                 UnallocatedT32(instr);
  32660                                                 return;
  32661                                               }
  32662                                               unsigned rd =
  32663                                                   ExtractQRegister(instr,
  32664                                                                    22,
  32665                                                                    12);
  32666                                               unsigned rm =
  32667                                                   ExtractDRegister(instr, 5, 0);
  32668                                               uint32_t imm6 =
  32669                                                   (instr >> 16) & 0x3f;
  32670                                               uint32_t imm =
  32671                                                   imm6 - dt.GetSize();
  32672                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32673                                               vshll(CurrentCond(),
  32674                                                     dt,
  32675                                                     QRegister(rd),
  32676                                                     DRegister(rm),
  32677                                                     imm);
  32678                                               break;
  32679                                             }
  32680                                             case 0x000d0000: {
  32681                                               // 0xef8d0a10
  32682                                               if (((instr & 0x380000) == 0x0) ||
  32683                                                   ((instr & 0x3f0000) ==
  32684                                                    0x80000) ||
  32685                                                   ((instr & 0x3f0000) ==
  32686                                                    0x100000) ||
  32687                                                   ((instr & 0x3f0000) ==
  32688                                                    0x200000)) {
  32689                                                 UnallocatedT32(instr);
  32690                                                 return;
  32691                                               }
  32692                                               DataType dt =
  32693                                                   Dt_imm6_4_Decode((instr >>
  32694                                                                     19) &
  32695                                                                        0x7,
  32696                                                                    (instr >>
  32697                                                                     28) &
  32698                                                                        0x1);
  32699                                               if (dt.Is(
  32700                                                       kDataTypeValueInvalid)) {
  32701                                                 UnallocatedT32(instr);
  32702                                                 return;
  32703                                               }
  32704                                               if (((instr >> 12) & 1) != 0) {
  32705                                                 UnallocatedT32(instr);
  32706                                                 return;
  32707                                               }
  32708                                               unsigned rd =
  32709                                                   ExtractQRegister(instr,
  32710                                                                    22,
  32711                                                                    12);
  32712                                               unsigned rm =
  32713                                                   ExtractDRegister(instr, 5, 0);
  32714                                               uint32_t imm6 =
  32715                                                   (instr >> 16) & 0x3f;
  32716                                               uint32_t imm =
  32717                                                   imm6 - dt.GetSize();
  32718                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32719                                               vshll(CurrentCond(),
  32720                                                     dt,
  32721                                                     QRegister(rd),
  32722                                                     DRegister(rm),
  32723                                                     imm);
  32724                                               break;
  32725                                             }
  32726                                             case 0x000e0000: {
  32727                                               // 0xef8e0a10
  32728                                               if (((instr & 0x380000) == 0x0) ||
  32729                                                   ((instr & 0x3f0000) ==
  32730                                                    0x80000) ||
  32731                                                   ((instr & 0x3f0000) ==
  32732                                                    0x100000) ||
  32733                                                   ((instr & 0x3f0000) ==
  32734                                                    0x200000)) {
  32735                                                 UnallocatedT32(instr);
  32736                                                 return;
  32737                                               }
  32738                                               DataType dt =
  32739                                                   Dt_imm6_4_Decode((instr >>
  32740                                                                     19) &
  32741                                                                        0x7,
  32742                                                                    (instr >>
  32743                                                                     28) &
  32744                                                                        0x1);
  32745                                               if (dt.Is(
  32746                                                       kDataTypeValueInvalid)) {
  32747                                                 UnallocatedT32(instr);
  32748                                                 return;
  32749                                               }
  32750                                               if (((instr >> 12) & 1) != 0) {
  32751                                                 UnallocatedT32(instr);
  32752                                                 return;
  32753                                               }
  32754                                               unsigned rd =
  32755                                                   ExtractQRegister(instr,
  32756                                                                    22,
  32757                                                                    12);
  32758                                               unsigned rm =
  32759                                                   ExtractDRegister(instr, 5, 0);
  32760                                               uint32_t imm6 =
  32761                                                   (instr >> 16) & 0x3f;
  32762                                               uint32_t imm =
  32763                                                   imm6 - dt.GetSize();
  32764                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32765                                               vshll(CurrentCond(),
  32766                                                     dt,
  32767                                                     QRegister(rd),
  32768                                                     DRegister(rm),
  32769                                                     imm);
  32770                                               break;
  32771                                             }
  32772                                             case 0x000f0000: {
  32773                                               // 0xef8f0a10
  32774                                               if (((instr & 0x380000) == 0x0) ||
  32775                                                   ((instr & 0x3f0000) ==
  32776                                                    0x80000) ||
  32777                                                   ((instr & 0x3f0000) ==
  32778                                                    0x100000) ||
  32779                                                   ((instr & 0x3f0000) ==
  32780                                                    0x200000)) {
  32781                                                 UnallocatedT32(instr);
  32782                                                 return;
  32783                                               }
  32784                                               DataType dt =
  32785                                                   Dt_imm6_4_Decode((instr >>
  32786                                                                     19) &
  32787                                                                        0x7,
  32788                                                                    (instr >>
  32789                                                                     28) &
  32790                                                                        0x1);
  32791                                               if (dt.Is(
  32792                                                       kDataTypeValueInvalid)) {
  32793                                                 UnallocatedT32(instr);
  32794                                                 return;
  32795                                               }
  32796                                               if (((instr >> 12) & 1) != 0) {
  32797                                                 UnallocatedT32(instr);
  32798                                                 return;
  32799                                               }
  32800                                               unsigned rd =
  32801                                                   ExtractQRegister(instr,
  32802                                                                    22,
  32803                                                                    12);
  32804                                               unsigned rm =
  32805                                                   ExtractDRegister(instr, 5, 0);
  32806                                               uint32_t imm6 =
  32807                                                   (instr >> 16) & 0x3f;
  32808                                               uint32_t imm =
  32809                                                   imm6 - dt.GetSize();
  32810                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32811                                               vshll(CurrentCond(),
  32812                                                     dt,
  32813                                                     QRegister(rd),
  32814                                                     DRegister(rm),
  32815                                                     imm);
  32816                                               break;
  32817                                             }
  32818                                             case 0x00100000: {
  32819                                               // 0xef900a10
  32820                                               if (((instr & 0x380000) == 0x0) ||
  32821                                                   ((instr & 0x380000) ==
  32822                                                    0x180000) ||
  32823                                                   ((instr & 0x380000) ==
  32824                                                    0x280000) ||
  32825                                                   ((instr & 0x380000) ==
  32826                                                    0x300000) ||
  32827                                                   ((instr & 0x380000) ==
  32828                                                    0x380000)) {
  32829                                                 UnallocatedT32(instr);
  32830                                                 return;
  32831                                               }
  32832                                               DataType dt = Dt_U_imm3H_1_Decode(
  32833                                                   ((instr >> 19) & 0x7) |
  32834                                                   ((instr >> 25) & 0x8));
  32835                                               if (dt.Is(
  32836                                                       kDataTypeValueInvalid)) {
  32837                                                 UnallocatedT32(instr);
  32838                                                 return;
  32839                                               }
  32840                                               if (((instr >> 12) & 1) != 0) {
  32841                                                 UnallocatedT32(instr);
  32842                                                 return;
  32843                                               }
  32844                                               unsigned rd =
  32845                                                   ExtractQRegister(instr,
  32846                                                                    22,
  32847                                                                    12);
  32848                                               unsigned rm =
  32849                                                   ExtractDRegister(instr, 5, 0);
  32850                                               // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  32851                                               vmovl(CurrentCond(),
  32852                                                     dt,
  32853                                                     QRegister(rd),
  32854                                                     DRegister(rm));
  32855                                               break;
  32856                                             }
  32857                                             case 0x00110000: {
  32858                                               // 0xef910a10
  32859                                               if (((instr & 0x380000) == 0x0) ||
  32860                                                   ((instr & 0x3f0000) ==
  32861                                                    0x80000) ||
  32862                                                   ((instr & 0x3f0000) ==
  32863                                                    0x100000) ||
  32864                                                   ((instr & 0x3f0000) ==
  32865                                                    0x200000)) {
  32866                                                 UnallocatedT32(instr);
  32867                                                 return;
  32868                                               }
  32869                                               DataType dt =
  32870                                                   Dt_imm6_4_Decode((instr >>
  32871                                                                     19) &
  32872                                                                        0x7,
  32873                                                                    (instr >>
  32874                                                                     28) &
  32875                                                                        0x1);
  32876                                               if (dt.Is(
  32877                                                       kDataTypeValueInvalid)) {
  32878                                                 UnallocatedT32(instr);
  32879                                                 return;
  32880                                               }
  32881                                               if (((instr >> 12) & 1) != 0) {
  32882                                                 UnallocatedT32(instr);
  32883                                                 return;
  32884                                               }
  32885                                               unsigned rd =
  32886                                                   ExtractQRegister(instr,
  32887                                                                    22,
  32888                                                                    12);
  32889                                               unsigned rm =
  32890                                                   ExtractDRegister(instr, 5, 0);
  32891                                               uint32_t imm6 =
  32892                                                   (instr >> 16) & 0x3f;
  32893                                               uint32_t imm =
  32894                                                   imm6 - dt.GetSize();
  32895                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32896                                               vshll(CurrentCond(),
  32897                                                     dt,
  32898                                                     QRegister(rd),
  32899                                                     DRegister(rm),
  32900                                                     imm);
  32901                                               break;
  32902                                             }
  32903                                             case 0x00120000: {
  32904                                               // 0xef920a10
  32905                                               if (((instr & 0x380000) == 0x0) ||
  32906                                                   ((instr & 0x3f0000) ==
  32907                                                    0x80000) ||
  32908                                                   ((instr & 0x3f0000) ==
  32909                                                    0x100000) ||
  32910                                                   ((instr & 0x3f0000) ==
  32911                                                    0x200000)) {
  32912                                                 UnallocatedT32(instr);
  32913                                                 return;
  32914                                               }
  32915                                               DataType dt =
  32916                                                   Dt_imm6_4_Decode((instr >>
  32917                                                                     19) &
  32918                                                                        0x7,
  32919                                                                    (instr >>
  32920                                                                     28) &
  32921                                                                        0x1);
  32922                                               if (dt.Is(
  32923                                                       kDataTypeValueInvalid)) {
  32924                                                 UnallocatedT32(instr);
  32925                                                 return;
  32926                                               }
  32927                                               if (((instr >> 12) & 1) != 0) {
  32928                                                 UnallocatedT32(instr);
  32929                                                 return;
  32930                                               }
  32931                                               unsigned rd =
  32932                                                   ExtractQRegister(instr,
  32933                                                                    22,
  32934                                                                    12);
  32935                                               unsigned rm =
  32936                                                   ExtractDRegister(instr, 5, 0);
  32937                                               uint32_t imm6 =
  32938                                                   (instr >> 16) & 0x3f;
  32939                                               uint32_t imm =
  32940                                                   imm6 - dt.GetSize();
  32941                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32942                                               vshll(CurrentCond(),
  32943                                                     dt,
  32944                                                     QRegister(rd),
  32945                                                     DRegister(rm),
  32946                                                     imm);
  32947                                               break;
  32948                                             }
  32949                                             case 0x00130000: {
  32950                                               // 0xef930a10
  32951                                               if (((instr & 0x380000) == 0x0) ||
  32952                                                   ((instr & 0x3f0000) ==
  32953                                                    0x80000) ||
  32954                                                   ((instr & 0x3f0000) ==
  32955                                                    0x100000) ||
  32956                                                   ((instr & 0x3f0000) ==
  32957                                                    0x200000)) {
  32958                                                 UnallocatedT32(instr);
  32959                                                 return;
  32960                                               }
  32961                                               DataType dt =
  32962                                                   Dt_imm6_4_Decode((instr >>
  32963                                                                     19) &
  32964                                                                        0x7,
  32965                                                                    (instr >>
  32966                                                                     28) &
  32967                                                                        0x1);
  32968                                               if (dt.Is(
  32969                                                       kDataTypeValueInvalid)) {
  32970                                                 UnallocatedT32(instr);
  32971                                                 return;
  32972                                               }
  32973                                               if (((instr >> 12) & 1) != 0) {
  32974                                                 UnallocatedT32(instr);
  32975                                                 return;
  32976                                               }
  32977                                               unsigned rd =
  32978                                                   ExtractQRegister(instr,
  32979                                                                    22,
  32980                                                                    12);
  32981                                               unsigned rm =
  32982                                                   ExtractDRegister(instr, 5, 0);
  32983                                               uint32_t imm6 =
  32984                                                   (instr >> 16) & 0x3f;
  32985                                               uint32_t imm =
  32986                                                   imm6 - dt.GetSize();
  32987                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  32988                                               vshll(CurrentCond(),
  32989                                                     dt,
  32990                                                     QRegister(rd),
  32991                                                     DRegister(rm),
  32992                                                     imm);
  32993                                               break;
  32994                                             }
  32995                                             case 0x00140000: {
  32996                                               // 0xef940a10
  32997                                               if (((instr & 0x380000) == 0x0) ||
  32998                                                   ((instr & 0x3f0000) ==
  32999                                                    0x80000) ||
  33000                                                   ((instr & 0x3f0000) ==
  33001                                                    0x100000) ||
  33002                                                   ((instr & 0x3f0000) ==
  33003                                                    0x200000)) {
  33004                                                 UnallocatedT32(instr);
  33005                                                 return;
  33006                                               }
  33007                                               DataType dt =
  33008                                                   Dt_imm6_4_Decode((instr >>
  33009                                                                     19) &
  33010                                                                        0x7,
  33011                                                                    (instr >>
  33012                                                                     28) &
  33013                                                                        0x1);
  33014                                               if (dt.Is(
  33015                                                       kDataTypeValueInvalid)) {
  33016                                                 UnallocatedT32(instr);
  33017                                                 return;
  33018                                               }
  33019                                               if (((instr >> 12) & 1) != 0) {
  33020                                                 UnallocatedT32(instr);
  33021                                                 return;
  33022                                               }
  33023                                               unsigned rd =
  33024                                                   ExtractQRegister(instr,
  33025                                                                    22,
  33026                                                                    12);
  33027                                               unsigned rm =
  33028                                                   ExtractDRegister(instr, 5, 0);
  33029                                               uint32_t imm6 =
  33030                                                   (instr >> 16) & 0x3f;
  33031                                               uint32_t imm =
  33032                                                   imm6 - dt.GetSize();
  33033                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33034                                               vshll(CurrentCond(),
  33035                                                     dt,
  33036                                                     QRegister(rd),
  33037                                                     DRegister(rm),
  33038                                                     imm);
  33039                                               break;
  33040                                             }
  33041                                             case 0x00150000: {
  33042                                               // 0xef950a10
  33043                                               if (((instr & 0x380000) == 0x0) ||
  33044                                                   ((instr & 0x3f0000) ==
  33045                                                    0x80000) ||
  33046                                                   ((instr & 0x3f0000) ==
  33047                                                    0x100000) ||
  33048                                                   ((instr & 0x3f0000) ==
  33049                                                    0x200000)) {
  33050                                                 UnallocatedT32(instr);
  33051                                                 return;
  33052                                               }
  33053                                               DataType dt =
  33054                                                   Dt_imm6_4_Decode((instr >>
  33055                                                                     19) &
  33056                                                                        0x7,
  33057                                                                    (instr >>
  33058                                                                     28) &
  33059                                                                        0x1);
  33060                                               if (dt.Is(
  33061                                                       kDataTypeValueInvalid)) {
  33062                                                 UnallocatedT32(instr);
  33063                                                 return;
  33064                                               }
  33065                                               if (((instr >> 12) & 1) != 0) {
  33066                                                 UnallocatedT32(instr);
  33067                                                 return;
  33068                                               }
  33069                                               unsigned rd =
  33070                                                   ExtractQRegister(instr,
  33071                                                                    22,
  33072                                                                    12);
  33073                                               unsigned rm =
  33074                                                   ExtractDRegister(instr, 5, 0);
  33075                                               uint32_t imm6 =
  33076                                                   (instr >> 16) & 0x3f;
  33077                                               uint32_t imm =
  33078                                                   imm6 - dt.GetSize();
  33079                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33080                                               vshll(CurrentCond(),
  33081                                                     dt,
  33082                                                     QRegister(rd),
  33083                                                     DRegister(rm),
  33084                                                     imm);
  33085                                               break;
  33086                                             }
  33087                                             case 0x00160000: {
  33088                                               // 0xef960a10
  33089                                               if (((instr & 0x380000) == 0x0) ||
  33090                                                   ((instr & 0x3f0000) ==
  33091                                                    0x80000) ||
  33092                                                   ((instr & 0x3f0000) ==
  33093                                                    0x100000) ||
  33094                                                   ((instr & 0x3f0000) ==
  33095                                                    0x200000)) {
  33096                                                 UnallocatedT32(instr);
  33097                                                 return;
  33098                                               }
  33099                                               DataType dt =
  33100                                                   Dt_imm6_4_Decode((instr >>
  33101                                                                     19) &
  33102                                                                        0x7,
  33103                                                                    (instr >>
  33104                                                                     28) &
  33105                                                                        0x1);
  33106                                               if (dt.Is(
  33107                                                       kDataTypeValueInvalid)) {
  33108                                                 UnallocatedT32(instr);
  33109                                                 return;
  33110                                               }
  33111                                               if (((instr >> 12) & 1) != 0) {
  33112                                                 UnallocatedT32(instr);
  33113                                                 return;
  33114                                               }
  33115                                               unsigned rd =
  33116                                                   ExtractQRegister(instr,
  33117                                                                    22,
  33118                                                                    12);
  33119                                               unsigned rm =
  33120                                                   ExtractDRegister(instr, 5, 0);
  33121                                               uint32_t imm6 =
  33122                                                   (instr >> 16) & 0x3f;
  33123                                               uint32_t imm =
  33124                                                   imm6 - dt.GetSize();
  33125                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33126                                               vshll(CurrentCond(),
  33127                                                     dt,
  33128                                                     QRegister(rd),
  33129                                                     DRegister(rm),
  33130                                                     imm);
  33131                                               break;
  33132                                             }
  33133                                             case 0x00170000: {
  33134                                               // 0xef970a10
  33135                                               if (((instr & 0x380000) == 0x0) ||
  33136                                                   ((instr & 0x3f0000) ==
  33137                                                    0x80000) ||
  33138                                                   ((instr & 0x3f0000) ==
  33139                                                    0x100000) ||
  33140                                                   ((instr & 0x3f0000) ==
  33141                                                    0x200000)) {
  33142                                                 UnallocatedT32(instr);
  33143                                                 return;
  33144                                               }
  33145                                               DataType dt =
  33146                                                   Dt_imm6_4_Decode((instr >>
  33147                                                                     19) &
  33148                                                                        0x7,
  33149                                                                    (instr >>
  33150                                                                     28) &
  33151                                                                        0x1);
  33152                                               if (dt.Is(
  33153                                                       kDataTypeValueInvalid)) {
  33154                                                 UnallocatedT32(instr);
  33155                                                 return;
  33156                                               }
  33157                                               if (((instr >> 12) & 1) != 0) {
  33158                                                 UnallocatedT32(instr);
  33159                                                 return;
  33160                                               }
  33161                                               unsigned rd =
  33162                                                   ExtractQRegister(instr,
  33163                                                                    22,
  33164                                                                    12);
  33165                                               unsigned rm =
  33166                                                   ExtractDRegister(instr, 5, 0);
  33167                                               uint32_t imm6 =
  33168                                                   (instr >> 16) & 0x3f;
  33169                                               uint32_t imm =
  33170                                                   imm6 - dt.GetSize();
  33171                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33172                                               vshll(CurrentCond(),
  33173                                                     dt,
  33174                                                     QRegister(rd),
  33175                                                     DRegister(rm),
  33176                                                     imm);
  33177                                               break;
  33178                                             }
  33179                                             case 0x00180000: {
  33180                                               // 0xef980a10
  33181                                               if (((instr & 0x380000) == 0x0) ||
  33182                                                   ((instr & 0x3f0000) ==
  33183                                                    0x80000) ||
  33184                                                   ((instr & 0x3f0000) ==
  33185                                                    0x100000) ||
  33186                                                   ((instr & 0x3f0000) ==
  33187                                                    0x200000)) {
  33188                                                 UnallocatedT32(instr);
  33189                                                 return;
  33190                                               }
  33191                                               DataType dt =
  33192                                                   Dt_imm6_4_Decode((instr >>
  33193                                                                     19) &
  33194                                                                        0x7,
  33195                                                                    (instr >>
  33196                                                                     28) &
  33197                                                                        0x1);
  33198                                               if (dt.Is(
  33199                                                       kDataTypeValueInvalid)) {
  33200                                                 UnallocatedT32(instr);
  33201                                                 return;
  33202                                               }
  33203                                               if (((instr >> 12) & 1) != 0) {
  33204                                                 UnallocatedT32(instr);
  33205                                                 return;
  33206                                               }
  33207                                               unsigned rd =
  33208                                                   ExtractQRegister(instr,
  33209                                                                    22,
  33210                                                                    12);
  33211                                               unsigned rm =
  33212                                                   ExtractDRegister(instr, 5, 0);
  33213                                               uint32_t imm6 =
  33214                                                   (instr >> 16) & 0x3f;
  33215                                               uint32_t imm =
  33216                                                   imm6 - dt.GetSize();
  33217                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33218                                               vshll(CurrentCond(),
  33219                                                     dt,
  33220                                                     QRegister(rd),
  33221                                                     DRegister(rm),
  33222                                                     imm);
  33223                                               break;
  33224                                             }
  33225                                             case 0x00190000: {
  33226                                               // 0xef990a10
  33227                                               if (((instr & 0x380000) == 0x0) ||
  33228                                                   ((instr & 0x3f0000) ==
  33229                                                    0x80000) ||
  33230                                                   ((instr & 0x3f0000) ==
  33231                                                    0x100000) ||
  33232                                                   ((instr & 0x3f0000) ==
  33233                                                    0x200000)) {
  33234                                                 UnallocatedT32(instr);
  33235                                                 return;
  33236                                               }
  33237                                               DataType dt =
  33238                                                   Dt_imm6_4_Decode((instr >>
  33239                                                                     19) &
  33240                                                                        0x7,
  33241                                                                    (instr >>
  33242                                                                     28) &
  33243                                                                        0x1);
  33244                                               if (dt.Is(
  33245                                                       kDataTypeValueInvalid)) {
  33246                                                 UnallocatedT32(instr);
  33247                                                 return;
  33248                                               }
  33249                                               if (((instr >> 12) & 1) != 0) {
  33250                                                 UnallocatedT32(instr);
  33251                                                 return;
  33252                                               }
  33253                                               unsigned rd =
  33254                                                   ExtractQRegister(instr,
  33255                                                                    22,
  33256                                                                    12);
  33257                                               unsigned rm =
  33258                                                   ExtractDRegister(instr, 5, 0);
  33259                                               uint32_t imm6 =
  33260                                                   (instr >> 16) & 0x3f;
  33261                                               uint32_t imm =
  33262                                                   imm6 - dt.GetSize();
  33263                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33264                                               vshll(CurrentCond(),
  33265                                                     dt,
  33266                                                     QRegister(rd),
  33267                                                     DRegister(rm),
  33268                                                     imm);
  33269                                               break;
  33270                                             }
  33271                                             case 0x001a0000: {
  33272                                               // 0xef9a0a10
  33273                                               if (((instr & 0x380000) == 0x0) ||
  33274                                                   ((instr & 0x3f0000) ==
  33275                                                    0x80000) ||
  33276                                                   ((instr & 0x3f0000) ==
  33277                                                    0x100000) ||
  33278                                                   ((instr & 0x3f0000) ==
  33279                                                    0x200000)) {
  33280                                                 UnallocatedT32(instr);
  33281                                                 return;
  33282                                               }
  33283                                               DataType dt =
  33284                                                   Dt_imm6_4_Decode((instr >>
  33285                                                                     19) &
  33286                                                                        0x7,
  33287                                                                    (instr >>
  33288                                                                     28) &
  33289                                                                        0x1);
  33290                                               if (dt.Is(
  33291                                                       kDataTypeValueInvalid)) {
  33292                                                 UnallocatedT32(instr);
  33293                                                 return;
  33294                                               }
  33295                                               if (((instr >> 12) & 1) != 0) {
  33296                                                 UnallocatedT32(instr);
  33297                                                 return;
  33298                                               }
  33299                                               unsigned rd =
  33300                                                   ExtractQRegister(instr,
  33301                                                                    22,
  33302                                                                    12);
  33303                                               unsigned rm =
  33304                                                   ExtractDRegister(instr, 5, 0);
  33305                                               uint32_t imm6 =
  33306                                                   (instr >> 16) & 0x3f;
  33307                                               uint32_t imm =
  33308                                                   imm6 - dt.GetSize();
  33309                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33310                                               vshll(CurrentCond(),
  33311                                                     dt,
  33312                                                     QRegister(rd),
  33313                                                     DRegister(rm),
  33314                                                     imm);
  33315                                               break;
  33316                                             }
  33317                                             case 0x001b0000: {
  33318                                               // 0xef9b0a10
  33319                                               if (((instr & 0x380000) == 0x0) ||
  33320                                                   ((instr & 0x3f0000) ==
  33321                                                    0x80000) ||
  33322                                                   ((instr & 0x3f0000) ==
  33323                                                    0x100000) ||
  33324                                                   ((instr & 0x3f0000) ==
  33325                                                    0x200000)) {
  33326                                                 UnallocatedT32(instr);
  33327                                                 return;
  33328                                               }
  33329                                               DataType dt =
  33330                                                   Dt_imm6_4_Decode((instr >>
  33331                                                                     19) &
  33332                                                                        0x7,
  33333                                                                    (instr >>
  33334                                                                     28) &
  33335                                                                        0x1);
  33336                                               if (dt.Is(
  33337                                                       kDataTypeValueInvalid)) {
  33338                                                 UnallocatedT32(instr);
  33339                                                 return;
  33340                                               }
  33341                                               if (((instr >> 12) & 1) != 0) {
  33342                                                 UnallocatedT32(instr);
  33343                                                 return;
  33344                                               }
  33345                                               unsigned rd =
  33346                                                   ExtractQRegister(instr,
  33347                                                                    22,
  33348                                                                    12);
  33349                                               unsigned rm =
  33350                                                   ExtractDRegister(instr, 5, 0);
  33351                                               uint32_t imm6 =
  33352                                                   (instr >> 16) & 0x3f;
  33353                                               uint32_t imm =
  33354                                                   imm6 - dt.GetSize();
  33355                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33356                                               vshll(CurrentCond(),
  33357                                                     dt,
  33358                                                     QRegister(rd),
  33359                                                     DRegister(rm),
  33360                                                     imm);
  33361                                               break;
  33362                                             }
  33363                                             case 0x001c0000: {
  33364                                               // 0xef9c0a10
  33365                                               if (((instr & 0x380000) == 0x0) ||
  33366                                                   ((instr & 0x3f0000) ==
  33367                                                    0x80000) ||
  33368                                                   ((instr & 0x3f0000) ==
  33369                                                    0x100000) ||
  33370                                                   ((instr & 0x3f0000) ==
  33371                                                    0x200000)) {
  33372                                                 UnallocatedT32(instr);
  33373                                                 return;
  33374                                               }
  33375                                               DataType dt =
  33376                                                   Dt_imm6_4_Decode((instr >>
  33377                                                                     19) &
  33378                                                                        0x7,
  33379                                                                    (instr >>
  33380                                                                     28) &
  33381                                                                        0x1);
  33382                                               if (dt.Is(
  33383                                                       kDataTypeValueInvalid)) {
  33384                                                 UnallocatedT32(instr);
  33385                                                 return;
  33386                                               }
  33387                                               if (((instr >> 12) & 1) != 0) {
  33388                                                 UnallocatedT32(instr);
  33389                                                 return;
  33390                                               }
  33391                                               unsigned rd =
  33392                                                   ExtractQRegister(instr,
  33393                                                                    22,
  33394                                                                    12);
  33395                                               unsigned rm =
  33396                                                   ExtractDRegister(instr, 5, 0);
  33397                                               uint32_t imm6 =
  33398                                                   (instr >> 16) & 0x3f;
  33399                                               uint32_t imm =
  33400                                                   imm6 - dt.GetSize();
  33401                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33402                                               vshll(CurrentCond(),
  33403                                                     dt,
  33404                                                     QRegister(rd),
  33405                                                     DRegister(rm),
  33406                                                     imm);
  33407                                               break;
  33408                                             }
  33409                                             case 0x001d0000: {
  33410                                               // 0xef9d0a10
  33411                                               if (((instr & 0x380000) == 0x0) ||
  33412                                                   ((instr & 0x3f0000) ==
  33413                                                    0x80000) ||
  33414                                                   ((instr & 0x3f0000) ==
  33415                                                    0x100000) ||
  33416                                                   ((instr & 0x3f0000) ==
  33417                                                    0x200000)) {
  33418                                                 UnallocatedT32(instr);
  33419                                                 return;
  33420                                               }
  33421                                               DataType dt =
  33422                                                   Dt_imm6_4_Decode((instr >>
  33423                                                                     19) &
  33424                                                                        0x7,
  33425                                                                    (instr >>
  33426                                                                     28) &
  33427                                                                        0x1);
  33428                                               if (dt.Is(
  33429                                                       kDataTypeValueInvalid)) {
  33430                                                 UnallocatedT32(instr);
  33431                                                 return;
  33432                                               }
  33433                                               if (((instr >> 12) & 1) != 0) {
  33434                                                 UnallocatedT32(instr);
  33435                                                 return;
  33436                                               }
  33437                                               unsigned rd =
  33438                                                   ExtractQRegister(instr,
  33439                                                                    22,
  33440                                                                    12);
  33441                                               unsigned rm =
  33442                                                   ExtractDRegister(instr, 5, 0);
  33443                                               uint32_t imm6 =
  33444                                                   (instr >> 16) & 0x3f;
  33445                                               uint32_t imm =
  33446                                                   imm6 - dt.GetSize();
  33447                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33448                                               vshll(CurrentCond(),
  33449                                                     dt,
  33450                                                     QRegister(rd),
  33451                                                     DRegister(rm),
  33452                                                     imm);
  33453                                               break;
  33454                                             }
  33455                                             case 0x001e0000: {
  33456                                               // 0xef9e0a10
  33457                                               if (((instr & 0x380000) == 0x0) ||
  33458                                                   ((instr & 0x3f0000) ==
  33459                                                    0x80000) ||
  33460                                                   ((instr & 0x3f0000) ==
  33461                                                    0x100000) ||
  33462                                                   ((instr & 0x3f0000) ==
  33463                                                    0x200000)) {
  33464                                                 UnallocatedT32(instr);
  33465                                                 return;
  33466                                               }
  33467                                               DataType dt =
  33468                                                   Dt_imm6_4_Decode((instr >>
  33469                                                                     19) &
  33470                                                                        0x7,
  33471                                                                    (instr >>
  33472                                                                     28) &
  33473                                                                        0x1);
  33474                                               if (dt.Is(
  33475                                                       kDataTypeValueInvalid)) {
  33476                                                 UnallocatedT32(instr);
  33477                                                 return;
  33478                                               }
  33479                                               if (((instr >> 12) & 1) != 0) {
  33480                                                 UnallocatedT32(instr);
  33481                                                 return;
  33482                                               }
  33483                                               unsigned rd =
  33484                                                   ExtractQRegister(instr,
  33485                                                                    22,
  33486                                                                    12);
  33487                                               unsigned rm =
  33488                                                   ExtractDRegister(instr, 5, 0);
  33489                                               uint32_t imm6 =
  33490                                                   (instr >> 16) & 0x3f;
  33491                                               uint32_t imm =
  33492                                                   imm6 - dt.GetSize();
  33493                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33494                                               vshll(CurrentCond(),
  33495                                                     dt,
  33496                                                     QRegister(rd),
  33497                                                     DRegister(rm),
  33498                                                     imm);
  33499                                               break;
  33500                                             }
  33501                                             case 0x001f0000: {
  33502                                               // 0xef9f0a10
  33503                                               if (((instr & 0x380000) == 0x0) ||
  33504                                                   ((instr & 0x3f0000) ==
  33505                                                    0x80000) ||
  33506                                                   ((instr & 0x3f0000) ==
  33507                                                    0x100000) ||
  33508                                                   ((instr & 0x3f0000) ==
  33509                                                    0x200000)) {
  33510                                                 UnallocatedT32(instr);
  33511                                                 return;
  33512                                               }
  33513                                               DataType dt =
  33514                                                   Dt_imm6_4_Decode((instr >>
  33515                                                                     19) &
  33516                                                                        0x7,
  33517                                                                    (instr >>
  33518                                                                     28) &
  33519                                                                        0x1);
  33520                                               if (dt.Is(
  33521                                                       kDataTypeValueInvalid)) {
  33522                                                 UnallocatedT32(instr);
  33523                                                 return;
  33524                                               }
  33525                                               if (((instr >> 12) & 1) != 0) {
  33526                                                 UnallocatedT32(instr);
  33527                                                 return;
  33528                                               }
  33529                                               unsigned rd =
  33530                                                   ExtractQRegister(instr,
  33531                                                                    22,
  33532                                                                    12);
  33533                                               unsigned rm =
  33534                                                   ExtractDRegister(instr, 5, 0);
  33535                                               uint32_t imm6 =
  33536                                                   (instr >> 16) & 0x3f;
  33537                                               uint32_t imm =
  33538                                                   imm6 - dt.GetSize();
  33539                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33540                                               vshll(CurrentCond(),
  33541                                                     dt,
  33542                                                     QRegister(rd),
  33543                                                     DRegister(rm),
  33544                                                     imm);
  33545                                               break;
  33546                                             }
  33547                                             case 0x00200000: {
  33548                                               // 0xefa00a10
  33549                                               if (((instr & 0x380000) == 0x0) ||
  33550                                                   ((instr & 0x380000) ==
  33551                                                    0x180000) ||
  33552                                                   ((instr & 0x380000) ==
  33553                                                    0x280000) ||
  33554                                                   ((instr & 0x380000) ==
  33555                                                    0x300000) ||
  33556                                                   ((instr & 0x380000) ==
  33557                                                    0x380000)) {
  33558                                                 UnallocatedT32(instr);
  33559                                                 return;
  33560                                               }
  33561                                               DataType dt = Dt_U_imm3H_1_Decode(
  33562                                                   ((instr >> 19) & 0x7) |
  33563                                                   ((instr >> 25) & 0x8));
  33564                                               if (dt.Is(
  33565                                                       kDataTypeValueInvalid)) {
  33566                                                 UnallocatedT32(instr);
  33567                                                 return;
  33568                                               }
  33569                                               if (((instr >> 12) & 1) != 0) {
  33570                                                 UnallocatedT32(instr);
  33571                                                 return;
  33572                                               }
  33573                                               unsigned rd =
  33574                                                   ExtractQRegister(instr,
  33575                                                                    22,
  33576                                                                    12);
  33577                                               unsigned rm =
  33578                                                   ExtractDRegister(instr, 5, 0);
  33579                                               // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length)
  33580                                               vmovl(CurrentCond(),
  33581                                                     dt,
  33582                                                     QRegister(rd),
  33583                                                     DRegister(rm));
  33584                                               break;
  33585                                             }
  33586                                             case 0x00210000: {
  33587                                               // 0xefa10a10
  33588                                               if (((instr & 0x380000) == 0x0) ||
  33589                                                   ((instr & 0x3f0000) ==
  33590                                                    0x80000) ||
  33591                                                   ((instr & 0x3f0000) ==
  33592                                                    0x100000) ||
  33593                                                   ((instr & 0x3f0000) ==
  33594                                                    0x200000)) {
  33595                                                 UnallocatedT32(instr);
  33596                                                 return;
  33597                                               }
  33598                                               DataType dt =
  33599                                                   Dt_imm6_4_Decode((instr >>
  33600                                                                     19) &
  33601                                                                        0x7,
  33602                                                                    (instr >>
  33603                                                                     28) &
  33604                                                                        0x1);
  33605                                               if (dt.Is(
  33606                                                       kDataTypeValueInvalid)) {
  33607                                                 UnallocatedT32(instr);
  33608                                                 return;
  33609                                               }
  33610                                               if (((instr >> 12) & 1) != 0) {
  33611                                                 UnallocatedT32(instr);
  33612                                                 return;
  33613                                               }
  33614                                               unsigned rd =
  33615                                                   ExtractQRegister(instr,
  33616                                                                    22,
  33617                                                                    12);
  33618                                               unsigned rm =
  33619                                                   ExtractDRegister(instr, 5, 0);
  33620                                               uint32_t imm6 =
  33621                                                   (instr >> 16) & 0x3f;
  33622                                               uint32_t imm =
  33623                                                   imm6 - dt.GetSize();
  33624                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33625                                               vshll(CurrentCond(),
  33626                                                     dt,
  33627                                                     QRegister(rd),
  33628                                                     DRegister(rm),
  33629                                                     imm);
  33630                                               break;
  33631                                             }
  33632                                             case 0x00220000: {
  33633                                               // 0xefa20a10
  33634                                               if (((instr & 0x380000) == 0x0) ||
  33635                                                   ((instr & 0x3f0000) ==
  33636                                                    0x80000) ||
  33637                                                   ((instr & 0x3f0000) ==
  33638                                                    0x100000) ||
  33639                                                   ((instr & 0x3f0000) ==
  33640                                                    0x200000)) {
  33641                                                 UnallocatedT32(instr);
  33642                                                 return;
  33643                                               }
  33644                                               DataType dt =
  33645                                                   Dt_imm6_4_Decode((instr >>
  33646                                                                     19) &
  33647                                                                        0x7,
  33648                                                                    (instr >>
  33649                                                                     28) &
  33650                                                                        0x1);
  33651                                               if (dt.Is(
  33652                                                       kDataTypeValueInvalid)) {
  33653                                                 UnallocatedT32(instr);
  33654                                                 return;
  33655                                               }
  33656                                               if (((instr >> 12) & 1) != 0) {
  33657                                                 UnallocatedT32(instr);
  33658                                                 return;
  33659                                               }
  33660                                               unsigned rd =
  33661                                                   ExtractQRegister(instr,
  33662                                                                    22,
  33663                                                                    12);
  33664                                               unsigned rm =
  33665                                                   ExtractDRegister(instr, 5, 0);
  33666                                               uint32_t imm6 =
  33667                                                   (instr >> 16) & 0x3f;
  33668                                               uint32_t imm =
  33669                                                   imm6 - dt.GetSize();
  33670                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33671                                               vshll(CurrentCond(),
  33672                                                     dt,
  33673                                                     QRegister(rd),
  33674                                                     DRegister(rm),
  33675                                                     imm);
  33676                                               break;
  33677                                             }
  33678                                             case 0x00230000: {
  33679                                               // 0xefa30a10
  33680                                               if (((instr & 0x380000) == 0x0) ||
  33681                                                   ((instr & 0x3f0000) ==
  33682                                                    0x80000) ||
  33683                                                   ((instr & 0x3f0000) ==
  33684                                                    0x100000) ||
  33685                                                   ((instr & 0x3f0000) ==
  33686                                                    0x200000)) {
  33687                                                 UnallocatedT32(instr);
  33688                                                 return;
  33689                                               }
  33690                                               DataType dt =
  33691                                                   Dt_imm6_4_Decode((instr >>
  33692                                                                     19) &
  33693                                                                        0x7,
  33694                                                                    (instr >>
  33695                                                                     28) &
  33696                                                                        0x1);
  33697                                               if (dt.Is(
  33698                                                       kDataTypeValueInvalid)) {
  33699                                                 UnallocatedT32(instr);
  33700                                                 return;
  33701                                               }
  33702                                               if (((instr >> 12) & 1) != 0) {
  33703                                                 UnallocatedT32(instr);
  33704                                                 return;
  33705                                               }
  33706                                               unsigned rd =
  33707                                                   ExtractQRegister(instr,
  33708                                                                    22,
  33709                                                                    12);
  33710                                               unsigned rm =
  33711                                                   ExtractDRegister(instr, 5, 0);
  33712                                               uint32_t imm6 =
  33713                                                   (instr >> 16) & 0x3f;
  33714                                               uint32_t imm =
  33715                                                   imm6 - dt.GetSize();
  33716                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33717                                               vshll(CurrentCond(),
  33718                                                     dt,
  33719                                                     QRegister(rd),
  33720                                                     DRegister(rm),
  33721                                                     imm);
  33722                                               break;
  33723                                             }
  33724                                             case 0x00240000: {
  33725                                               // 0xefa40a10
  33726                                               if (((instr & 0x380000) == 0x0) ||
  33727                                                   ((instr & 0x3f0000) ==
  33728                                                    0x80000) ||
  33729                                                   ((instr & 0x3f0000) ==
  33730                                                    0x100000) ||
  33731                                                   ((instr & 0x3f0000) ==
  33732                                                    0x200000)) {
  33733                                                 UnallocatedT32(instr);
  33734                                                 return;
  33735                                               }
  33736                                               DataType dt =
  33737                                                   Dt_imm6_4_Decode((instr >>
  33738                                                                     19) &
  33739                                                                        0x7,
  33740                                                                    (instr >>
  33741                                                                     28) &
  33742                                                                        0x1);
  33743                                               if (dt.Is(
  33744                                                       kDataTypeValueInvalid)) {
  33745                                                 UnallocatedT32(instr);
  33746                                                 return;
  33747                                               }
  33748                                               if (((instr >> 12) & 1) != 0) {
  33749                                                 UnallocatedT32(instr);
  33750                                                 return;
  33751                                               }
  33752                                               unsigned rd =
  33753                                                   ExtractQRegister(instr,
  33754                                                                    22,
  33755                                                                    12);
  33756                                               unsigned rm =
  33757                                                   ExtractDRegister(instr, 5, 0);
  33758                                               uint32_t imm6 =
  33759                                                   (instr >> 16) & 0x3f;
  33760                                               uint32_t imm =
  33761                                                   imm6 - dt.GetSize();
  33762                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33763                                               vshll(CurrentCond(),
  33764                                                     dt,
  33765                                                     QRegister(rd),
  33766                                                     DRegister(rm),
  33767                                                     imm);
  33768                                               break;
  33769                                             }
  33770                                             case 0x00250000: {
  33771                                               // 0xefa50a10
  33772                                               if (((instr & 0x380000) == 0x0) ||
  33773                                                   ((instr & 0x3f0000) ==
  33774                                                    0x80000) ||
  33775                                                   ((instr & 0x3f0000) ==
  33776                                                    0x100000) ||
  33777                                                   ((instr & 0x3f0000) ==
  33778                                                    0x200000)) {
  33779                                                 UnallocatedT32(instr);
  33780                                                 return;
  33781                                               }
  33782                                               DataType dt =
  33783                                                   Dt_imm6_4_Decode((instr >>
  33784                                                                     19) &
  33785                                                                        0x7,
  33786                                                                    (instr >>
  33787                                                                     28) &
  33788                                                                        0x1);
  33789                                               if (dt.Is(
  33790                                                       kDataTypeValueInvalid)) {
  33791                                                 UnallocatedT32(instr);
  33792                                                 return;
  33793                                               }
  33794                                               if (((instr >> 12) & 1) != 0) {
  33795                                                 UnallocatedT32(instr);
  33796                                                 return;
  33797                                               }
  33798                                               unsigned rd =
  33799                                                   ExtractQRegister(instr,
  33800                                                                    22,
  33801                                                                    12);
  33802                                               unsigned rm =
  33803                                                   ExtractDRegister(instr, 5, 0);
  33804                                               uint32_t imm6 =
  33805                                                   (instr >> 16) & 0x3f;
  33806                                               uint32_t imm =
  33807                                                   imm6 - dt.GetSize();
  33808                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33809                                               vshll(CurrentCond(),
  33810                                                     dt,
  33811                                                     QRegister(rd),
  33812                                                     DRegister(rm),
  33813                                                     imm);
  33814                                               break;
  33815                                             }
  33816                                             case 0x00260000: {
  33817                                               // 0xefa60a10
  33818                                               if (((instr & 0x380000) == 0x0) ||
  33819                                                   ((instr & 0x3f0000) ==
  33820                                                    0x80000) ||
  33821                                                   ((instr & 0x3f0000) ==
  33822                                                    0x100000) ||
  33823                                                   ((instr & 0x3f0000) ==
  33824                                                    0x200000)) {
  33825                                                 UnallocatedT32(instr);
  33826                                                 return;
  33827                                               }
  33828                                               DataType dt =
  33829                                                   Dt_imm6_4_Decode((instr >>
  33830                                                                     19) &
  33831                                                                        0x7,
  33832                                                                    (instr >>
  33833                                                                     28) &
  33834                                                                        0x1);
  33835                                               if (dt.Is(
  33836                                                       kDataTypeValueInvalid)) {
  33837                                                 UnallocatedT32(instr);
  33838                                                 return;
  33839                                               }
  33840                                               if (((instr >> 12) & 1) != 0) {
  33841                                                 UnallocatedT32(instr);
  33842                                                 return;
  33843                                               }
  33844                                               unsigned rd =
  33845                                                   ExtractQRegister(instr,
  33846                                                                    22,
  33847                                                                    12);
  33848                                               unsigned rm =
  33849                                                   ExtractDRegister(instr, 5, 0);
  33850                                               uint32_t imm6 =
  33851                                                   (instr >> 16) & 0x3f;
  33852                                               uint32_t imm =
  33853                                                   imm6 - dt.GetSize();
  33854                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33855                                               vshll(CurrentCond(),
  33856                                                     dt,
  33857                                                     QRegister(rd),
  33858                                                     DRegister(rm),
  33859                                                     imm);
  33860                                               break;
  33861                                             }
  33862                                             case 0x00270000: {
  33863                                               // 0xefa70a10
  33864                                               if (((instr & 0x380000) == 0x0) ||
  33865                                                   ((instr & 0x3f0000) ==
  33866                                                    0x80000) ||
  33867                                                   ((instr & 0x3f0000) ==
  33868                                                    0x100000) ||
  33869                                                   ((instr & 0x3f0000) ==
  33870                                                    0x200000)) {
  33871                                                 UnallocatedT32(instr);
  33872                                                 return;
  33873                                               }
  33874                                               DataType dt =
  33875                                                   Dt_imm6_4_Decode((instr >>
  33876                                                                     19) &
  33877                                                                        0x7,
  33878                                                                    (instr >>
  33879                                                                     28) &
  33880                                                                        0x1);
  33881                                               if (dt.Is(
  33882                                                       kDataTypeValueInvalid)) {
  33883                                                 UnallocatedT32(instr);
  33884                                                 return;
  33885                                               }
  33886                                               if (((instr >> 12) & 1) != 0) {
  33887                                                 UnallocatedT32(instr);
  33888                                                 return;
  33889                                               }
  33890                                               unsigned rd =
  33891                                                   ExtractQRegister(instr,
  33892                                                                    22,
  33893                                                                    12);
  33894                                               unsigned rm =
  33895                                                   ExtractDRegister(instr, 5, 0);
  33896                                               uint32_t imm6 =
  33897                                                   (instr >> 16) & 0x3f;
  33898                                               uint32_t imm =
  33899                                                   imm6 - dt.GetSize();
  33900                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33901                                               vshll(CurrentCond(),
  33902                                                     dt,
  33903                                                     QRegister(rd),
  33904                                                     DRegister(rm),
  33905                                                     imm);
  33906                                               break;
  33907                                             }
  33908                                             case 0x00280000: {
  33909                                               // 0xefa80a10
  33910                                               if (((instr & 0x380000) == 0x0) ||
  33911                                                   ((instr & 0x3f0000) ==
  33912                                                    0x80000) ||
  33913                                                   ((instr & 0x3f0000) ==
  33914                                                    0x100000) ||
  33915                                                   ((instr & 0x3f0000) ==
  33916                                                    0x200000)) {
  33917                                                 UnallocatedT32(instr);
  33918                                                 return;
  33919                                               }
  33920                                               DataType dt =
  33921                                                   Dt_imm6_4_Decode((instr >>
  33922                                                                     19) &
  33923                                                                        0x7,
  33924                                                                    (instr >>
  33925                                                                     28) &
  33926                                                                        0x1);
  33927                                               if (dt.Is(
  33928                                                       kDataTypeValueInvalid)) {
  33929                                                 UnallocatedT32(instr);
  33930                                                 return;
  33931                                               }
  33932                                               if (((instr >> 12) & 1) != 0) {
  33933                                                 UnallocatedT32(instr);
  33934                                                 return;
  33935                                               }
  33936                                               unsigned rd =
  33937                                                   ExtractQRegister(instr,
  33938                                                                    22,
  33939                                                                    12);
  33940                                               unsigned rm =
  33941                                                   ExtractDRegister(instr, 5, 0);
  33942                                               uint32_t imm6 =
  33943                                                   (instr >> 16) & 0x3f;
  33944                                               uint32_t imm =
  33945                                                   imm6 - dt.GetSize();
  33946                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33947                                               vshll(CurrentCond(),
  33948                                                     dt,
  33949                                                     QRegister(rd),
  33950                                                     DRegister(rm),
  33951                                                     imm);
  33952                                               break;
  33953                                             }
  33954                                             case 0x00290000: {
  33955                                               // 0xefa90a10
  33956                                               if (((instr & 0x380000) == 0x0) ||
  33957                                                   ((instr & 0x3f0000) ==
  33958                                                    0x80000) ||
  33959                                                   ((instr & 0x3f0000) ==
  33960                                                    0x100000) ||
  33961                                                   ((instr & 0x3f0000) ==
  33962                                                    0x200000)) {
  33963                                                 UnallocatedT32(instr);
  33964                                                 return;
  33965                                               }
  33966                                               DataType dt =
  33967                                                   Dt_imm6_4_Decode((instr >>
  33968                                                                     19) &
  33969                                                                        0x7,
  33970                                                                    (instr >>
  33971                                                                     28) &
  33972                                                                        0x1);
  33973                                               if (dt.Is(
  33974                                                       kDataTypeValueInvalid)) {
  33975                                                 UnallocatedT32(instr);
  33976                                                 return;
  33977                                               }
  33978                                               if (((instr >> 12) & 1) != 0) {
  33979                                                 UnallocatedT32(instr);
  33980                                                 return;
  33981                                               }
  33982                                               unsigned rd =
  33983                                                   ExtractQRegister(instr,
  33984                                                                    22,
  33985                                                                    12);
  33986                                               unsigned rm =
  33987                                                   ExtractDRegister(instr, 5, 0);
  33988                                               uint32_t imm6 =
  33989                                                   (instr >> 16) & 0x3f;
  33990                                               uint32_t imm =
  33991                                                   imm6 - dt.GetSize();
  33992                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  33993                                               vshll(CurrentCond(),
  33994                                                     dt,
  33995                                                     QRegister(rd),
  33996                                                     DRegister(rm),
  33997                                                     imm);
  33998                                               break;
  33999                                             }
  34000                                             case 0x002a0000: {
  34001                                               // 0xefaa0a10
  34002                                               if (((instr & 0x380000) == 0x0) ||
  34003                                                   ((instr & 0x3f0000) ==
  34004                                                    0x80000) ||
  34005                                                   ((instr & 0x3f0000) ==
  34006                                                    0x100000) ||
  34007                                                   ((instr & 0x3f0000) ==
  34008                                                    0x200000)) {
  34009                                                 UnallocatedT32(instr);
  34010                                                 return;
  34011                                               }
  34012                                               DataType dt =
  34013                                                   Dt_imm6_4_Decode((instr >>
  34014                                                                     19) &
  34015                                                                        0x7,
  34016                                                                    (instr >>
  34017                                                                     28) &
  34018                                                                        0x1);
  34019                                               if (dt.Is(
  34020                                                       kDataTypeValueInvalid)) {
  34021                                                 UnallocatedT32(instr);
  34022                                                 return;
  34023                                               }
  34024                                               if (((instr >> 12) & 1) != 0) {
  34025                                                 UnallocatedT32(instr);
  34026                                                 return;
  34027                                               }
  34028                                               unsigned rd =
  34029                                                   ExtractQRegister(instr,
  34030                                                                    22,
  34031                                                                    12);
  34032                                               unsigned rm =
  34033                                                   ExtractDRegister(instr, 5, 0);
  34034                                               uint32_t imm6 =
  34035                                                   (instr >> 16) & 0x3f;
  34036                                               uint32_t imm =
  34037                                                   imm6 - dt.GetSize();
  34038                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34039                                               vshll(CurrentCond(),
  34040                                                     dt,
  34041                                                     QRegister(rd),
  34042                                                     DRegister(rm),
  34043                                                     imm);
  34044                                               break;
  34045                                             }
  34046                                             case 0x002b0000: {
  34047                                               // 0xefab0a10
  34048                                               if (((instr & 0x380000) == 0x0) ||
  34049                                                   ((instr & 0x3f0000) ==
  34050                                                    0x80000) ||
  34051                                                   ((instr & 0x3f0000) ==
  34052                                                    0x100000) ||
  34053                                                   ((instr & 0x3f0000) ==
  34054                                                    0x200000)) {
  34055                                                 UnallocatedT32(instr);
  34056                                                 return;
  34057                                               }
  34058                                               DataType dt =
  34059                                                   Dt_imm6_4_Decode((instr >>
  34060                                                                     19) &
  34061                                                                        0x7,
  34062                                                                    (instr >>
  34063                                                                     28) &
  34064                                                                        0x1);
  34065                                               if (dt.Is(
  34066                                                       kDataTypeValueInvalid)) {
  34067                                                 UnallocatedT32(instr);
  34068                                                 return;
  34069                                               }
  34070                                               if (((instr >> 12) & 1) != 0) {
  34071                                                 UnallocatedT32(instr);
  34072                                                 return;
  34073                                               }
  34074                                               unsigned rd =
  34075                                                   ExtractQRegister(instr,
  34076                                                                    22,
  34077                                                                    12);
  34078                                               unsigned rm =
  34079                                                   ExtractDRegister(instr, 5, 0);
  34080                                               uint32_t imm6 =
  34081                                                   (instr >> 16) & 0x3f;
  34082                                               uint32_t imm =
  34083                                                   imm6 - dt.GetSize();
  34084                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34085                                               vshll(CurrentCond(),
  34086                                                     dt,
  34087                                                     QRegister(rd),
  34088                                                     DRegister(rm),
  34089                                                     imm);
  34090                                               break;
  34091                                             }
  34092                                             case 0x002c0000: {
  34093                                               // 0xefac0a10
  34094                                               if (((instr & 0x380000) == 0x0) ||
  34095                                                   ((instr & 0x3f0000) ==
  34096                                                    0x80000) ||
  34097                                                   ((instr & 0x3f0000) ==
  34098                                                    0x100000) ||
  34099                                                   ((instr & 0x3f0000) ==
  34100                                                    0x200000)) {
  34101                                                 UnallocatedT32(instr);
  34102                                                 return;
  34103                                               }
  34104                                               DataType dt =
  34105                                                   Dt_imm6_4_Decode((instr >>
  34106                                                                     19) &
  34107                                                                        0x7,
  34108                                                                    (instr >>
  34109                                                                     28) &
  34110                                                                        0x1);
  34111                                               if (dt.Is(
  34112                                                       kDataTypeValueInvalid)) {
  34113                                                 UnallocatedT32(instr);
  34114                                                 return;
  34115                                               }
  34116                                               if (((instr >> 12) & 1) != 0) {
  34117                                                 UnallocatedT32(instr);
  34118                                                 return;
  34119                                               }
  34120                                               unsigned rd =
  34121                                                   ExtractQRegister(instr,
  34122                                                                    22,
  34123                                                                    12);
  34124                                               unsigned rm =
  34125                                                   ExtractDRegister(instr, 5, 0);
  34126                                               uint32_t imm6 =
  34127                                                   (instr >> 16) & 0x3f;
  34128                                               uint32_t imm =
  34129                                                   imm6 - dt.GetSize();
  34130                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34131                                               vshll(CurrentCond(),
  34132                                                     dt,
  34133                                                     QRegister(rd),
  34134                                                     DRegister(rm),
  34135                                                     imm);
  34136                                               break;
  34137                                             }
  34138                                             case 0x002d0000: {
  34139                                               // 0xefad0a10
  34140                                               if (((instr & 0x380000) == 0x0) ||
  34141                                                   ((instr & 0x3f0000) ==
  34142                                                    0x80000) ||
  34143                                                   ((instr & 0x3f0000) ==
  34144                                                    0x100000) ||
  34145                                                   ((instr & 0x3f0000) ==
  34146                                                    0x200000)) {
  34147                                                 UnallocatedT32(instr);
  34148                                                 return;
  34149                                               }
  34150                                               DataType dt =
  34151                                                   Dt_imm6_4_Decode((instr >>
  34152                                                                     19) &
  34153                                                                        0x7,
  34154                                                                    (instr >>
  34155                                                                     28) &
  34156                                                                        0x1);
  34157                                               if (dt.Is(
  34158                                                       kDataTypeValueInvalid)) {
  34159                                                 UnallocatedT32(instr);
  34160                                                 return;
  34161                                               }
  34162                                               if (((instr >> 12) & 1) != 0) {
  34163                                                 UnallocatedT32(instr);
  34164                                                 return;
  34165                                               }
  34166                                               unsigned rd =
  34167                                                   ExtractQRegister(instr,
  34168                                                                    22,
  34169                                                                    12);
  34170                                               unsigned rm =
  34171                                                   ExtractDRegister(instr, 5, 0);
  34172                                               uint32_t imm6 =
  34173                                                   (instr >> 16) & 0x3f;
  34174                                               uint32_t imm =
  34175                                                   imm6 - dt.GetSize();
  34176                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34177                                               vshll(CurrentCond(),
  34178                                                     dt,
  34179                                                     QRegister(rd),
  34180                                                     DRegister(rm),
  34181                                                     imm);
  34182                                               break;
  34183                                             }
  34184                                             case 0x002e0000: {
  34185                                               // 0xefae0a10
  34186                                               if (((instr & 0x380000) == 0x0) ||
  34187                                                   ((instr & 0x3f0000) ==
  34188                                                    0x80000) ||
  34189                                                   ((instr & 0x3f0000) ==
  34190                                                    0x100000) ||
  34191                                                   ((instr & 0x3f0000) ==
  34192                                                    0x200000)) {
  34193                                                 UnallocatedT32(instr);
  34194                                                 return;
  34195                                               }
  34196                                               DataType dt =
  34197                                                   Dt_imm6_4_Decode((instr >>
  34198                                                                     19) &
  34199                                                                        0x7,
  34200                                                                    (instr >>
  34201                                                                     28) &
  34202                                                                        0x1);
  34203                                               if (dt.Is(
  34204                                                       kDataTypeValueInvalid)) {
  34205                                                 UnallocatedT32(instr);
  34206                                                 return;
  34207                                               }
  34208                                               if (((instr >> 12) & 1) != 0) {
  34209                                                 UnallocatedT32(instr);
  34210                                                 return;
  34211                                               }
  34212                                               unsigned rd =
  34213                                                   ExtractQRegister(instr,
  34214                                                                    22,
  34215                                                                    12);
  34216                                               unsigned rm =
  34217                                                   ExtractDRegister(instr, 5, 0);
  34218                                               uint32_t imm6 =
  34219                                                   (instr >> 16) & 0x3f;
  34220                                               uint32_t imm =
  34221                                                   imm6 - dt.GetSize();
  34222                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34223                                               vshll(CurrentCond(),
  34224                                                     dt,
  34225                                                     QRegister(rd),
  34226                                                     DRegister(rm),
  34227                                                     imm);
  34228                                               break;
  34229                                             }
  34230                                             case 0x002f0000: {
  34231                                               // 0xefaf0a10
  34232                                               if (((instr & 0x380000) == 0x0) ||
  34233                                                   ((instr & 0x3f0000) ==
  34234                                                    0x80000) ||
  34235                                                   ((instr & 0x3f0000) ==
  34236                                                    0x100000) ||
  34237                                                   ((instr & 0x3f0000) ==
  34238                                                    0x200000)) {
  34239                                                 UnallocatedT32(instr);
  34240                                                 return;
  34241                                               }
  34242                                               DataType dt =
  34243                                                   Dt_imm6_4_Decode((instr >>
  34244                                                                     19) &
  34245                                                                        0x7,
  34246                                                                    (instr >>
  34247                                                                     28) &
  34248                                                                        0x1);
  34249                                               if (dt.Is(
  34250                                                       kDataTypeValueInvalid)) {
  34251                                                 UnallocatedT32(instr);
  34252                                                 return;
  34253                                               }
  34254                                               if (((instr >> 12) & 1) != 0) {
  34255                                                 UnallocatedT32(instr);
  34256                                                 return;
  34257                                               }
  34258                                               unsigned rd =
  34259                                                   ExtractQRegister(instr,
  34260                                                                    22,
  34261                                                                    12);
  34262                                               unsigned rm =
  34263                                                   ExtractDRegister(instr, 5, 0);
  34264                                               uint32_t imm6 =
  34265                                                   (instr >> 16) & 0x3f;
  34266                                               uint32_t imm =
  34267                                                   imm6 - dt.GetSize();
  34268                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34269                                               vshll(CurrentCond(),
  34270                                                     dt,
  34271                                                     QRegister(rd),
  34272                                                     DRegister(rm),
  34273                                                     imm);
  34274                                               break;
  34275                                             }
  34276                                             case 0x00300000: {
  34277                                               // 0xefb00a10
  34278                                               if (((instr & 0x380000) == 0x0) ||
  34279                                                   ((instr & 0x3f0000) ==
  34280                                                    0x80000) ||
  34281                                                   ((instr & 0x3f0000) ==
  34282                                                    0x100000) ||
  34283                                                   ((instr & 0x3f0000) ==
  34284                                                    0x200000)) {
  34285                                                 UnallocatedT32(instr);
  34286                                                 return;
  34287                                               }
  34288                                               DataType dt =
  34289                                                   Dt_imm6_4_Decode((instr >>
  34290                                                                     19) &
  34291                                                                        0x7,
  34292                                                                    (instr >>
  34293                                                                     28) &
  34294                                                                        0x1);
  34295                                               if (dt.Is(
  34296                                                       kDataTypeValueInvalid)) {
  34297                                                 UnallocatedT32(instr);
  34298                                                 return;
  34299                                               }
  34300                                               if (((instr >> 12) & 1) != 0) {
  34301                                                 UnallocatedT32(instr);
  34302                                                 return;
  34303                                               }
  34304                                               unsigned rd =
  34305                                                   ExtractQRegister(instr,
  34306                                                                    22,
  34307                                                                    12);
  34308                                               unsigned rm =
  34309                                                   ExtractDRegister(instr, 5, 0);
  34310                                               uint32_t imm6 =
  34311                                                   (instr >> 16) & 0x3f;
  34312                                               uint32_t imm =
  34313                                                   imm6 - dt.GetSize();
  34314                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34315                                               vshll(CurrentCond(),
  34316                                                     dt,
  34317                                                     QRegister(rd),
  34318                                                     DRegister(rm),
  34319                                                     imm);
  34320                                               break;
  34321                                             }
  34322                                             case 0x00310000: {
  34323                                               // 0xefb10a10
  34324                                               if (((instr & 0x380000) == 0x0) ||
  34325                                                   ((instr & 0x3f0000) ==
  34326                                                    0x80000) ||
  34327                                                   ((instr & 0x3f0000) ==
  34328                                                    0x100000) ||
  34329                                                   ((instr & 0x3f0000) ==
  34330                                                    0x200000)) {
  34331                                                 UnallocatedT32(instr);
  34332                                                 return;
  34333                                               }
  34334                                               DataType dt =
  34335                                                   Dt_imm6_4_Decode((instr >>
  34336                                                                     19) &
  34337                                                                        0x7,
  34338                                                                    (instr >>
  34339                                                                     28) &
  34340                                                                        0x1);
  34341                                               if (dt.Is(
  34342                                                       kDataTypeValueInvalid)) {
  34343                                                 UnallocatedT32(instr);
  34344                                                 return;
  34345                                               }
  34346                                               if (((instr >> 12) & 1) != 0) {
  34347                                                 UnallocatedT32(instr);
  34348                                                 return;
  34349                                               }
  34350                                               unsigned rd =
  34351                                                   ExtractQRegister(instr,
  34352                                                                    22,
  34353                                                                    12);
  34354                                               unsigned rm =
  34355                                                   ExtractDRegister(instr, 5, 0);
  34356                                               uint32_t imm6 =
  34357                                                   (instr >> 16) & 0x3f;
  34358                                               uint32_t imm =
  34359                                                   imm6 - dt.GetSize();
  34360                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34361                                               vshll(CurrentCond(),
  34362                                                     dt,
  34363                                                     QRegister(rd),
  34364                                                     DRegister(rm),
  34365                                                     imm);
  34366                                               break;
  34367                                             }
  34368                                             case 0x00320000: {
  34369                                               // 0xefb20a10
  34370                                               if (((instr & 0x380000) == 0x0) ||
  34371                                                   ((instr & 0x3f0000) ==
  34372                                                    0x80000) ||
  34373                                                   ((instr & 0x3f0000) ==
  34374                                                    0x100000) ||
  34375                                                   ((instr & 0x3f0000) ==
  34376                                                    0x200000)) {
  34377                                                 UnallocatedT32(instr);
  34378                                                 return;
  34379                                               }
  34380                                               DataType dt =
  34381                                                   Dt_imm6_4_Decode((instr >>
  34382                                                                     19) &
  34383                                                                        0x7,
  34384                                                                    (instr >>
  34385                                                                     28) &
  34386                                                                        0x1);
  34387                                               if (dt.Is(
  34388                                                       kDataTypeValueInvalid)) {
  34389                                                 UnallocatedT32(instr);
  34390                                                 return;
  34391                                               }
  34392                                               if (((instr >> 12) & 1) != 0) {
  34393                                                 UnallocatedT32(instr);
  34394                                                 return;
  34395                                               }
  34396                                               unsigned rd =
  34397                                                   ExtractQRegister(instr,
  34398                                                                    22,
  34399                                                                    12);
  34400                                               unsigned rm =
  34401                                                   ExtractDRegister(instr, 5, 0);
  34402                                               uint32_t imm6 =
  34403                                                   (instr >> 16) & 0x3f;
  34404                                               uint32_t imm =
  34405                                                   imm6 - dt.GetSize();
  34406                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34407                                               vshll(CurrentCond(),
  34408                                                     dt,
  34409                                                     QRegister(rd),
  34410                                                     DRegister(rm),
  34411                                                     imm);
  34412                                               break;
  34413                                             }
  34414                                             case 0x00330000: {
  34415                                               // 0xefb30a10
  34416                                               if (((instr & 0x380000) == 0x0) ||
  34417                                                   ((instr & 0x3f0000) ==
  34418                                                    0x80000) ||
  34419                                                   ((instr & 0x3f0000) ==
  34420                                                    0x100000) ||
  34421                                                   ((instr & 0x3f0000) ==
  34422                                                    0x200000)) {
  34423                                                 UnallocatedT32(instr);
  34424                                                 return;
  34425                                               }
  34426                                               DataType dt =
  34427                                                   Dt_imm6_4_Decode((instr >>
  34428                                                                     19) &
  34429                                                                        0x7,
  34430                                                                    (instr >>
  34431                                                                     28) &
  34432                                                                        0x1);
  34433                                               if (dt.Is(
  34434                                                       kDataTypeValueInvalid)) {
  34435                                                 UnallocatedT32(instr);
  34436                                                 return;
  34437                                               }
  34438                                               if (((instr >> 12) & 1) != 0) {
  34439                                                 UnallocatedT32(instr);
  34440                                                 return;
  34441                                               }
  34442                                               unsigned rd =
  34443                                                   ExtractQRegister(instr,
  34444                                                                    22,
  34445                                                                    12);
  34446                                               unsigned rm =
  34447                                                   ExtractDRegister(instr, 5, 0);
  34448                                               uint32_t imm6 =
  34449                                                   (instr >> 16) & 0x3f;
  34450                                               uint32_t imm =
  34451                                                   imm6 - dt.GetSize();
  34452                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34453                                               vshll(CurrentCond(),
  34454                                                     dt,
  34455                                                     QRegister(rd),
  34456                                                     DRegister(rm),
  34457                                                     imm);
  34458                                               break;
  34459                                             }
  34460                                             case 0x00340000: {
  34461                                               // 0xefb40a10
  34462                                               if (((instr & 0x380000) == 0x0) ||
  34463                                                   ((instr & 0x3f0000) ==
  34464                                                    0x80000) ||
  34465                                                   ((instr & 0x3f0000) ==
  34466                                                    0x100000) ||
  34467                                                   ((instr & 0x3f0000) ==
  34468                                                    0x200000)) {
  34469                                                 UnallocatedT32(instr);
  34470                                                 return;
  34471                                               }
  34472                                               DataType dt =
  34473                                                   Dt_imm6_4_Decode((instr >>
  34474                                                                     19) &
  34475                                                                        0x7,
  34476                                                                    (instr >>
  34477                                                                     28) &
  34478                                                                        0x1);
  34479                                               if (dt.Is(
  34480                                                       kDataTypeValueInvalid)) {
  34481                                                 UnallocatedT32(instr);
  34482                                                 return;
  34483                                               }
  34484                                               if (((instr >> 12) & 1) != 0) {
  34485                                                 UnallocatedT32(instr);
  34486                                                 return;
  34487                                               }
  34488                                               unsigned rd =
  34489                                                   ExtractQRegister(instr,
  34490                                                                    22,
  34491                                                                    12);
  34492                                               unsigned rm =
  34493                                                   ExtractDRegister(instr, 5, 0);
  34494                                               uint32_t imm6 =
  34495                                                   (instr >> 16) & 0x3f;
  34496                                               uint32_t imm =
  34497                                                   imm6 - dt.GetSize();
  34498                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34499                                               vshll(CurrentCond(),
  34500                                                     dt,
  34501                                                     QRegister(rd),
  34502                                                     DRegister(rm),
  34503                                                     imm);
  34504                                               break;
  34505                                             }
  34506                                             case 0x00350000: {
  34507                                               // 0xefb50a10
  34508                                               if (((instr & 0x380000) == 0x0) ||
  34509                                                   ((instr & 0x3f0000) ==
  34510                                                    0x80000) ||
  34511                                                   ((instr & 0x3f0000) ==
  34512                                                    0x100000) ||
  34513                                                   ((instr & 0x3f0000) ==
  34514                                                    0x200000)) {
  34515                                                 UnallocatedT32(instr);
  34516                                                 return;
  34517                                               }
  34518                                               DataType dt =
  34519                                                   Dt_imm6_4_Decode((instr >>
  34520                                                                     19) &
  34521                                                                        0x7,
  34522                                                                    (instr >>
  34523                                                                     28) &
  34524                                                                        0x1);
  34525                                               if (dt.Is(
  34526                                                       kDataTypeValueInvalid)) {
  34527                                                 UnallocatedT32(instr);
  34528                                                 return;
  34529                                               }
  34530                                               if (((instr >> 12) & 1) != 0) {
  34531                                                 UnallocatedT32(instr);
  34532                                                 return;
  34533                                               }
  34534                                               unsigned rd =
  34535                                                   ExtractQRegister(instr,
  34536                                                                    22,
  34537                                                                    12);
  34538                                               unsigned rm =
  34539                                                   ExtractDRegister(instr, 5, 0);
  34540                                               uint32_t imm6 =
  34541                                                   (instr >> 16) & 0x3f;
  34542                                               uint32_t imm =
  34543                                                   imm6 - dt.GetSize();
  34544                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34545                                               vshll(CurrentCond(),
  34546                                                     dt,
  34547                                                     QRegister(rd),
  34548                                                     DRegister(rm),
  34549                                                     imm);
  34550                                               break;
  34551                                             }
  34552                                             case 0x00360000: {
  34553                                               // 0xefb60a10
  34554                                               if (((instr & 0x380000) == 0x0) ||
  34555                                                   ((instr & 0x3f0000) ==
  34556                                                    0x80000) ||
  34557                                                   ((instr & 0x3f0000) ==
  34558                                                    0x100000) ||
  34559                                                   ((instr & 0x3f0000) ==
  34560                                                    0x200000)) {
  34561                                                 UnallocatedT32(instr);
  34562                                                 return;
  34563                                               }
  34564                                               DataType dt =
  34565                                                   Dt_imm6_4_Decode((instr >>
  34566                                                                     19) &
  34567                                                                        0x7,
  34568                                                                    (instr >>
  34569                                                                     28) &
  34570                                                                        0x1);
  34571                                               if (dt.Is(
  34572                                                       kDataTypeValueInvalid)) {
  34573                                                 UnallocatedT32(instr);
  34574                                                 return;
  34575                                               }
  34576                                               if (((instr >> 12) & 1) != 0) {
  34577                                                 UnallocatedT32(instr);
  34578                                                 return;
  34579                                               }
  34580                                               unsigned rd =
  34581                                                   ExtractQRegister(instr,
  34582                                                                    22,
  34583                                                                    12);
  34584                                               unsigned rm =
  34585                                                   ExtractDRegister(instr, 5, 0);
  34586                                               uint32_t imm6 =
  34587                                                   (instr >> 16) & 0x3f;
  34588                                               uint32_t imm =
  34589                                                   imm6 - dt.GetSize();
  34590                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34591                                               vshll(CurrentCond(),
  34592                                                     dt,
  34593                                                     QRegister(rd),
  34594                                                     DRegister(rm),
  34595                                                     imm);
  34596                                               break;
  34597                                             }
  34598                                             case 0x00370000: {
  34599                                               // 0xefb70a10
  34600                                               if (((instr & 0x380000) == 0x0) ||
  34601                                                   ((instr & 0x3f0000) ==
  34602                                                    0x80000) ||
  34603                                                   ((instr & 0x3f0000) ==
  34604                                                    0x100000) ||
  34605                                                   ((instr & 0x3f0000) ==
  34606                                                    0x200000)) {
  34607                                                 UnallocatedT32(instr);
  34608                                                 return;
  34609                                               }
  34610                                               DataType dt =
  34611                                                   Dt_imm6_4_Decode((instr >>
  34612                                                                     19) &
  34613                                                                        0x7,
  34614                                                                    (instr >>
  34615                                                                     28) &
  34616                                                                        0x1);
  34617                                               if (dt.Is(
  34618                                                       kDataTypeValueInvalid)) {
  34619                                                 UnallocatedT32(instr);
  34620                                                 return;
  34621                                               }
  34622                                               if (((instr >> 12) & 1) != 0) {
  34623                                                 UnallocatedT32(instr);
  34624                                                 return;
  34625                                               }
  34626                                               unsigned rd =
  34627                                                   ExtractQRegister(instr,
  34628                                                                    22,
  34629                                                                    12);
  34630                                               unsigned rm =
  34631                                                   ExtractDRegister(instr, 5, 0);
  34632                                               uint32_t imm6 =
  34633                                                   (instr >> 16) & 0x3f;
  34634                                               uint32_t imm =
  34635                                                   imm6 - dt.GetSize();
  34636                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34637                                               vshll(CurrentCond(),
  34638                                                     dt,
  34639                                                     QRegister(rd),
  34640                                                     DRegister(rm),
  34641                                                     imm);
  34642                                               break;
  34643                                             }
  34644                                             case 0x00380000: {
  34645                                               // 0xefb80a10
  34646                                               if (((instr & 0x380000) == 0x0) ||
  34647                                                   ((instr & 0x3f0000) ==
  34648                                                    0x80000) ||
  34649                                                   ((instr & 0x3f0000) ==
  34650                                                    0x100000) ||
  34651                                                   ((instr & 0x3f0000) ==
  34652                                                    0x200000)) {
  34653                                                 UnallocatedT32(instr);
  34654                                                 return;
  34655                                               }
  34656                                               DataType dt =
  34657                                                   Dt_imm6_4_Decode((instr >>
  34658                                                                     19) &
  34659                                                                        0x7,
  34660                                                                    (instr >>
  34661                                                                     28) &
  34662                                                                        0x1);
  34663                                               if (dt.Is(
  34664                                                       kDataTypeValueInvalid)) {
  34665                                                 UnallocatedT32(instr);
  34666                                                 return;
  34667                                               }
  34668                                               if (((instr >> 12) & 1) != 0) {
  34669                                                 UnallocatedT32(instr);
  34670                                                 return;
  34671                                               }
  34672                                               unsigned rd =
  34673                                                   ExtractQRegister(instr,
  34674                                                                    22,
  34675                                                                    12);
  34676                                               unsigned rm =
  34677                                                   ExtractDRegister(instr, 5, 0);
  34678                                               uint32_t imm6 =
  34679                                                   (instr >> 16) & 0x3f;
  34680                                               uint32_t imm =
  34681                                                   imm6 - dt.GetSize();
  34682                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34683                                               vshll(CurrentCond(),
  34684                                                     dt,
  34685                                                     QRegister(rd),
  34686                                                     DRegister(rm),
  34687                                                     imm);
  34688                                               break;
  34689                                             }
  34690                                             case 0x00390000: {
  34691                                               // 0xefb90a10
  34692                                               if (((instr & 0x380000) == 0x0) ||
  34693                                                   ((instr & 0x3f0000) ==
  34694                                                    0x80000) ||
  34695                                                   ((instr & 0x3f0000) ==
  34696                                                    0x100000) ||
  34697                                                   ((instr & 0x3f0000) ==
  34698                                                    0x200000)) {
  34699                                                 UnallocatedT32(instr);
  34700                                                 return;
  34701                                               }
  34702                                               DataType dt =
  34703                                                   Dt_imm6_4_Decode((instr >>
  34704                                                                     19) &
  34705                                                                        0x7,
  34706                                                                    (instr >>
  34707                                                                     28) &
  34708                                                                        0x1);
  34709                                               if (dt.Is(
  34710                                                       kDataTypeValueInvalid)) {
  34711                                                 UnallocatedT32(instr);
  34712                                                 return;
  34713                                               }
  34714                                               if (((instr >> 12) & 1) != 0) {
  34715                                                 UnallocatedT32(instr);
  34716                                                 return;
  34717                                               }
  34718                                               unsigned rd =
  34719                                                   ExtractQRegister(instr,
  34720                                                                    22,
  34721                                                                    12);
  34722                                               unsigned rm =
  34723                                                   ExtractDRegister(instr, 5, 0);
  34724                                               uint32_t imm6 =
  34725                                                   (instr >> 16) & 0x3f;
  34726                                               uint32_t imm =
  34727                                                   imm6 - dt.GetSize();
  34728                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34729                                               vshll(CurrentCond(),
  34730                                                     dt,
  34731                                                     QRegister(rd),
  34732                                                     DRegister(rm),
  34733                                                     imm);
  34734                                               break;
  34735                                             }
  34736                                             case 0x003a0000: {
  34737                                               // 0xefba0a10
  34738                                               if (((instr & 0x380000) == 0x0) ||
  34739                                                   ((instr & 0x3f0000) ==
  34740                                                    0x80000) ||
  34741                                                   ((instr & 0x3f0000) ==
  34742                                                    0x100000) ||
  34743                                                   ((instr & 0x3f0000) ==
  34744                                                    0x200000)) {
  34745                                                 UnallocatedT32(instr);
  34746                                                 return;
  34747                                               }
  34748                                               DataType dt =
  34749                                                   Dt_imm6_4_Decode((instr >>
  34750                                                                     19) &
  34751                                                                        0x7,
  34752                                                                    (instr >>
  34753                                                                     28) &
  34754                                                                        0x1);
  34755                                               if (dt.Is(
  34756                                                       kDataTypeValueInvalid)) {
  34757                                                 UnallocatedT32(instr);
  34758                                                 return;
  34759                                               }
  34760                                               if (((instr >> 12) & 1) != 0) {
  34761                                                 UnallocatedT32(instr);
  34762                                                 return;
  34763                                               }
  34764                                               unsigned rd =
  34765                                                   ExtractQRegister(instr,
  34766                                                                    22,
  34767                                                                    12);
  34768                                               unsigned rm =
  34769                                                   ExtractDRegister(instr, 5, 0);
  34770                                               uint32_t imm6 =
  34771                                                   (instr >> 16) & 0x3f;
  34772                                               uint32_t imm =
  34773                                                   imm6 - dt.GetSize();
  34774                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34775                                               vshll(CurrentCond(),
  34776                                                     dt,
  34777                                                     QRegister(rd),
  34778                                                     DRegister(rm),
  34779                                                     imm);
  34780                                               break;
  34781                                             }
  34782                                             case 0x003b0000: {
  34783                                               // 0xefbb0a10
  34784                                               if (((instr & 0x380000) == 0x0) ||
  34785                                                   ((instr & 0x3f0000) ==
  34786                                                    0x80000) ||
  34787                                                   ((instr & 0x3f0000) ==
  34788                                                    0x100000) ||
  34789                                                   ((instr & 0x3f0000) ==
  34790                                                    0x200000)) {
  34791                                                 UnallocatedT32(instr);
  34792                                                 return;
  34793                                               }
  34794                                               DataType dt =
  34795                                                   Dt_imm6_4_Decode((instr >>
  34796                                                                     19) &
  34797                                                                        0x7,
  34798                                                                    (instr >>
  34799                                                                     28) &
  34800                                                                        0x1);
  34801                                               if (dt.Is(
  34802                                                       kDataTypeValueInvalid)) {
  34803                                                 UnallocatedT32(instr);
  34804                                                 return;
  34805                                               }
  34806                                               if (((instr >> 12) & 1) != 0) {
  34807                                                 UnallocatedT32(instr);
  34808                                                 return;
  34809                                               }
  34810                                               unsigned rd =
  34811                                                   ExtractQRegister(instr,
  34812                                                                    22,
  34813                                                                    12);
  34814                                               unsigned rm =
  34815                                                   ExtractDRegister(instr, 5, 0);
  34816                                               uint32_t imm6 =
  34817                                                   (instr >> 16) & 0x3f;
  34818                                               uint32_t imm =
  34819                                                   imm6 - dt.GetSize();
  34820                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34821                                               vshll(CurrentCond(),
  34822                                                     dt,
  34823                                                     QRegister(rd),
  34824                                                     DRegister(rm),
  34825                                                     imm);
  34826                                               break;
  34827                                             }
  34828                                             case 0x003c0000: {
  34829                                               // 0xefbc0a10
  34830                                               if (((instr & 0x380000) == 0x0) ||
  34831                                                   ((instr & 0x3f0000) ==
  34832                                                    0x80000) ||
  34833                                                   ((instr & 0x3f0000) ==
  34834                                                    0x100000) ||
  34835                                                   ((instr & 0x3f0000) ==
  34836                                                    0x200000)) {
  34837                                                 UnallocatedT32(instr);
  34838                                                 return;
  34839                                               }
  34840                                               DataType dt =
  34841                                                   Dt_imm6_4_Decode((instr >>
  34842                                                                     19) &
  34843                                                                        0x7,
  34844                                                                    (instr >>
  34845                                                                     28) &
  34846                                                                        0x1);
  34847                                               if (dt.Is(
  34848                                                       kDataTypeValueInvalid)) {
  34849                                                 UnallocatedT32(instr);
  34850                                                 return;
  34851                                               }
  34852                                               if (((instr >> 12) & 1) != 0) {
  34853                                                 UnallocatedT32(instr);
  34854                                                 return;
  34855                                               }
  34856                                               unsigned rd =
  34857                                                   ExtractQRegister(instr,
  34858                                                                    22,
  34859                                                                    12);
  34860                                               unsigned rm =
  34861                                                   ExtractDRegister(instr, 5, 0);
  34862                                               uint32_t imm6 =
  34863                                                   (instr >> 16) & 0x3f;
  34864                                               uint32_t imm =
  34865                                                   imm6 - dt.GetSize();
  34866                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34867                                               vshll(CurrentCond(),
  34868                                                     dt,
  34869                                                     QRegister(rd),
  34870                                                     DRegister(rm),
  34871                                                     imm);
  34872                                               break;
  34873                                             }
  34874                                             case 0x003d0000: {
  34875                                               // 0xefbd0a10
  34876                                               if (((instr & 0x380000) == 0x0) ||
  34877                                                   ((instr & 0x3f0000) ==
  34878                                                    0x80000) ||
  34879                                                   ((instr & 0x3f0000) ==
  34880                                                    0x100000) ||
  34881                                                   ((instr & 0x3f0000) ==
  34882                                                    0x200000)) {
  34883                                                 UnallocatedT32(instr);
  34884                                                 return;
  34885                                               }
  34886                                               DataType dt =
  34887                                                   Dt_imm6_4_Decode((instr >>
  34888                                                                     19) &
  34889                                                                        0x7,
  34890                                                                    (instr >>
  34891                                                                     28) &
  34892                                                                        0x1);
  34893                                               if (dt.Is(
  34894                                                       kDataTypeValueInvalid)) {
  34895                                                 UnallocatedT32(instr);
  34896                                                 return;
  34897                                               }
  34898                                               if (((instr >> 12) & 1) != 0) {
  34899                                                 UnallocatedT32(instr);
  34900                                                 return;
  34901                                               }
  34902                                               unsigned rd =
  34903                                                   ExtractQRegister(instr,
  34904                                                                    22,
  34905                                                                    12);
  34906                                               unsigned rm =
  34907                                                   ExtractDRegister(instr, 5, 0);
  34908                                               uint32_t imm6 =
  34909                                                   (instr >> 16) & 0x3f;
  34910                                               uint32_t imm =
  34911                                                   imm6 - dt.GetSize();
  34912                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34913                                               vshll(CurrentCond(),
  34914                                                     dt,
  34915                                                     QRegister(rd),
  34916                                                     DRegister(rm),
  34917                                                     imm);
  34918                                               break;
  34919                                             }
  34920                                             case 0x003e0000: {
  34921                                               // 0xefbe0a10
  34922                                               if (((instr & 0x380000) == 0x0) ||
  34923                                                   ((instr & 0x3f0000) ==
  34924                                                    0x80000) ||
  34925                                                   ((instr & 0x3f0000) ==
  34926                                                    0x100000) ||
  34927                                                   ((instr & 0x3f0000) ==
  34928                                                    0x200000)) {
  34929                                                 UnallocatedT32(instr);
  34930                                                 return;
  34931                                               }
  34932                                               DataType dt =
  34933                                                   Dt_imm6_4_Decode((instr >>
  34934                                                                     19) &
  34935                                                                        0x7,
  34936                                                                    (instr >>
  34937                                                                     28) &
  34938                                                                        0x1);
  34939                                               if (dt.Is(
  34940                                                       kDataTypeValueInvalid)) {
  34941                                                 UnallocatedT32(instr);
  34942                                                 return;
  34943                                               }
  34944                                               if (((instr >> 12) & 1) != 0) {
  34945                                                 UnallocatedT32(instr);
  34946                                                 return;
  34947                                               }
  34948                                               unsigned rd =
  34949                                                   ExtractQRegister(instr,
  34950                                                                    22,
  34951                                                                    12);
  34952                                               unsigned rm =
  34953                                                   ExtractDRegister(instr, 5, 0);
  34954                                               uint32_t imm6 =
  34955                                                   (instr >> 16) & 0x3f;
  34956                                               uint32_t imm =
  34957                                                   imm6 - dt.GetSize();
  34958                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  34959                                               vshll(CurrentCond(),
  34960                                                     dt,
  34961                                                     QRegister(rd),
  34962                                                     DRegister(rm),
  34963                                                     imm);
  34964                                               break;
  34965                                             }
  34966                                             case 0x003f0000: {
  34967                                               // 0xefbf0a10
  34968                                               if (((instr & 0x380000) == 0x0) ||
  34969                                                   ((instr & 0x3f0000) ==
  34970                                                    0x80000) ||
  34971                                                   ((instr & 0x3f0000) ==
  34972                                                    0x100000) ||
  34973                                                   ((instr & 0x3f0000) ==
  34974                                                    0x200000)) {
  34975                                                 UnallocatedT32(instr);
  34976                                                 return;
  34977                                               }
  34978                                               DataType dt =
  34979                                                   Dt_imm6_4_Decode((instr >>
  34980                                                                     19) &
  34981                                                                        0x7,
  34982                                                                    (instr >>
  34983                                                                     28) &
  34984                                                                        0x1);
  34985                                               if (dt.Is(
  34986                                                       kDataTypeValueInvalid)) {
  34987                                                 UnallocatedT32(instr);
  34988                                                 return;
  34989                                               }
  34990                                               if (((instr >> 12) & 1) != 0) {
  34991                                                 UnallocatedT32(instr);
  34992                                                 return;
  34993                                               }
  34994                                               unsigned rd =
  34995                                                   ExtractQRegister(instr,
  34996                                                                    22,
  34997                                                                    12);
  34998                                               unsigned rm =
  34999                                                   ExtractDRegister(instr, 5, 0);
  35000                                               uint32_t imm6 =
  35001                                                   (instr >> 16) & 0x3f;
  35002                                               uint32_t imm =
  35003                                                   imm6 - dt.GetSize();
  35004                                               // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35005                                               vshll(CurrentCond(),
  35006                                                     dt,
  35007                                                     QRegister(rd),
  35008                                                     DRegister(rm),
  35009                                                     imm);
  35010                                               break;
  35011                                             }
  35012                                             default:
  35013                                               UnallocatedT32(instr);
  35014                                               break;
  35015                                           }
  35016                                           break;
  35017                                         }
  35018                                         default: {
  35019                                           if (((instr & 0x380000) == 0x0) ||
  35020                                               ((instr & 0x3f0000) == 0x80000) ||
  35021                                               ((instr & 0x3f0000) ==
  35022                                                0x100000) ||
  35023                                               ((instr & 0x3f0000) ==
  35024                                                0x200000)) {
  35025                                             UnallocatedT32(instr);
  35026                                             return;
  35027                                           }
  35028                                           DataType dt =
  35029                                               Dt_imm6_4_Decode((instr >> 19) &
  35030                                                                    0x7,
  35031                                                                (instr >> 28) &
  35032                                                                    0x1);
  35033                                           if (dt.Is(kDataTypeValueInvalid)) {
  35034                                             UnallocatedT32(instr);
  35035                                             return;
  35036                                           }
  35037                                           if (((instr >> 12) & 1) != 0) {
  35038                                             UnallocatedT32(instr);
  35039                                             return;
  35040                                           }
  35041                                           unsigned rd =
  35042                                               ExtractQRegister(instr, 22, 12);
  35043                                           unsigned rm =
  35044                                               ExtractDRegister(instr, 5, 0);
  35045                                           uint32_t imm6 = (instr >> 16) & 0x3f;
  35046                                           uint32_t imm = imm6 - dt.GetSize();
  35047                                           // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35048                                           vshll(CurrentCond(),
  35049                                                 dt,
  35050                                                 QRegister(rd),
  35051                                                 DRegister(rm),
  35052                                                 imm);
  35053                                           break;
  35054                                         }
  35055                                       }
  35056                                       break;
  35057                                     }
  35058                                     default:
  35059                                       UnallocatedT32(instr);
  35060                                       break;
  35061                                   }
  35062                                   break;
  35063                                 }
  35064                               }
  35065                               break;
  35066                             }
  35067                             default:
  35068                               UnallocatedT32(instr);
  35069                               break;
  35070                           }
  35071                           break;
  35072                         }
  35073                         case 0x00000c00: {
  35074                           // 0xef800c10
  35075                           switch (instr & 0x00000080) {
  35076                             case 0x00000000: {
  35077                               // 0xef800c10
  35078                               switch (instr & 0x00200000) {
  35079                                 case 0x00000000: {
  35080                                   // 0xef800c10
  35081                                   switch (instr & 0x00180000) {
  35082                                     case 0x00000000: {
  35083                                       // 0xef800c10
  35084                                       switch (instr & 0x00000300) {
  35085                                         case 0x00000200: {
  35086                                           // 0xef800e10
  35087                                           if (((instr & 0x920) == 0x100) ||
  35088                                               ((instr & 0x520) == 0x100) ||
  35089                                               ((instr & 0x820) == 0x20) ||
  35090                                               ((instr & 0x420) == 0x20) ||
  35091                                               ((instr & 0x220) == 0x20) ||
  35092                                               ((instr & 0x120) == 0x120)) {
  35093                                             UnallocatedT32(instr);
  35094                                             return;
  35095                                           }
  35096                                           unsigned cmode =
  35097                                               ((instr >> 8) & 0xf) |
  35098                                               ((instr >> 1) & 0x10);
  35099                                           DataType dt =
  35100                                               ImmediateVmov::DecodeDt(cmode);
  35101                                           if (dt.Is(kDataTypeValueInvalid)) {
  35102                                             UnallocatedT32(instr);
  35103                                             return;
  35104                                           }
  35105                                           unsigned rd =
  35106                                               ExtractDRegister(instr, 22, 12);
  35107                                           DOperand imm =
  35108                                               ImmediateVmov::DecodeImmediate(
  35109                                                   cmode,
  35110                                                   (instr & 0xf) |
  35111                                                       ((instr >> 12) & 0x70) |
  35112                                                       ((instr >> 21) & 0x80));
  35113                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35114                                           vmov(CurrentCond(),
  35115                                                dt,
  35116                                                DRegister(rd),
  35117                                                imm);
  35118                                           break;
  35119                                         }
  35120                                         case 0x00000300: {
  35121                                           // 0xef800f10
  35122                                           if (((instr & 0x920) == 0x100) ||
  35123                                               ((instr & 0x520) == 0x100) ||
  35124                                               ((instr & 0x820) == 0x20) ||
  35125                                               ((instr & 0x420) == 0x20) ||
  35126                                               ((instr & 0x220) == 0x20) ||
  35127                                               ((instr & 0x120) == 0x120)) {
  35128                                             UnallocatedT32(instr);
  35129                                             return;
  35130                                           }
  35131                                           unsigned cmode =
  35132                                               ((instr >> 8) & 0xf) |
  35133                                               ((instr >> 1) & 0x10);
  35134                                           DataType dt =
  35135                                               ImmediateVmov::DecodeDt(cmode);
  35136                                           if (dt.Is(kDataTypeValueInvalid)) {
  35137                                             UnallocatedT32(instr);
  35138                                             return;
  35139                                           }
  35140                                           unsigned rd =
  35141                                               ExtractDRegister(instr, 22, 12);
  35142                                           DOperand imm =
  35143                                               ImmediateVmov::DecodeImmediate(
  35144                                                   cmode,
  35145                                                   (instr & 0xf) |
  35146                                                       ((instr >> 12) & 0x70) |
  35147                                                       ((instr >> 21) & 0x80));
  35148                                           // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35149                                           vmov(CurrentCond(),
  35150                                                dt,
  35151                                                DRegister(rd),
  35152                                                imm);
  35153                                           break;
  35154                                         }
  35155                                         default: {
  35156                                           switch (instr & 0x00000020) {
  35157                                             case 0x00000020: {
  35158                                               // 0xef800c30
  35159                                               switch (instr & 0x00000f20) {
  35160                                                 case 0x00000000: {
  35161                                                   // 0xef800c10
  35162                                                   if (((instr & 0x920) ==
  35163                                                        0x100) ||
  35164                                                       ((instr & 0x520) ==
  35165                                                        0x100) ||
  35166                                                       ((instr & 0x820) ==
  35167                                                        0x20) ||
  35168                                                       ((instr & 0x420) ==
  35169                                                        0x20) ||
  35170                                                       ((instr & 0x220) ==
  35171                                                        0x20) ||
  35172                                                       ((instr & 0x120) ==
  35173                                                        0x120)) {
  35174                                                     UnallocatedT32(instr);
  35175                                                     return;
  35176                                                   }
  35177                                                   unsigned cmode =
  35178                                                       ((instr >> 8) & 0xf) |
  35179                                                       ((instr >> 1) & 0x10);
  35180                                                   DataType dt =
  35181                                                       ImmediateVmov::DecodeDt(
  35182                                                           cmode);
  35183                                                   if (dt.Is(
  35184                                                           kDataTypeValueInvalid)) {
  35185                                                     UnallocatedT32(instr);
  35186                                                     return;
  35187                                                   }
  35188                                                   unsigned rd =
  35189                                                       ExtractDRegister(instr,
  35190                                                                        22,
  35191                                                                        12);
  35192                                                   DOperand imm = ImmediateVmov::
  35193                                                       DecodeImmediate(
  35194                                                           cmode,
  35195                                                           (instr & 0xf) |
  35196                                                               ((instr >> 12) &
  35197                                                                0x70) |
  35198                                                               ((instr >> 21) &
  35199                                                                0x80));
  35200                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35201                                                   vmov(CurrentCond(),
  35202                                                        dt,
  35203                                                        DRegister(rd),
  35204                                                        imm);
  35205                                                   break;
  35206                                                 }
  35207                                                 case 0x00000020: {
  35208                                                   // 0xef800c30
  35209                                                   if (((instr & 0xd00) ==
  35210                                                        0x100) ||
  35211                                                       ((instr & 0xd00) ==
  35212                                                        0x500) ||
  35213                                                       ((instr & 0xd00) ==
  35214                                                        0x900) ||
  35215                                                       ((instr & 0xe00) ==
  35216                                                        0xe00)) {
  35217                                                     UnallocatedT32(instr);
  35218                                                     return;
  35219                                                   }
  35220                                                   unsigned cmode =
  35221                                                       (instr >> 8) & 0xf;
  35222                                                   DataType dt =
  35223                                                       ImmediateVmvn::DecodeDt(
  35224                                                           cmode);
  35225                                                   if (dt.Is(
  35226                                                           kDataTypeValueInvalid)) {
  35227                                                     UnallocatedT32(instr);
  35228                                                     return;
  35229                                                   }
  35230                                                   unsigned rd =
  35231                                                       ExtractDRegister(instr,
  35232                                                                        22,
  35233                                                                        12);
  35234                                                   DOperand imm = ImmediateVmvn::
  35235                                                       DecodeImmediate(
  35236                                                           cmode,
  35237                                                           (instr & 0xf) |
  35238                                                               ((instr >> 12) &
  35239                                                                0x70) |
  35240                                                               ((instr >> 21) &
  35241                                                                0x80));
  35242                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35243                                                   vmvn(CurrentCond(),
  35244                                                        dt,
  35245                                                        DRegister(rd),
  35246                                                        imm);
  35247                                                   break;
  35248                                                 }
  35249                                                 case 0x00000200: {
  35250                                                   // 0xef800e10
  35251                                                   if (((instr & 0x920) ==
  35252                                                        0x100) ||
  35253                                                       ((instr & 0x520) ==
  35254                                                        0x100) ||
  35255                                                       ((instr & 0x820) ==
  35256                                                        0x20) ||
  35257                                                       ((instr & 0x420) ==
  35258                                                        0x20) ||
  35259                                                       ((instr & 0x220) ==
  35260                                                        0x20) ||
  35261                                                       ((instr & 0x120) ==
  35262                                                        0x120)) {
  35263                                                     UnallocatedT32(instr);
  35264                                                     return;
  35265                                                   }
  35266                                                   unsigned cmode =
  35267                                                       ((instr >> 8) & 0xf) |
  35268                                                       ((instr >> 1) & 0x10);
  35269                                                   DataType dt =
  35270                                                       ImmediateVmov::DecodeDt(
  35271                                                           cmode);
  35272                                                   if (dt.Is(
  35273                                                           kDataTypeValueInvalid)) {
  35274                                                     UnallocatedT32(instr);
  35275                                                     return;
  35276                                                   }
  35277                                                   unsigned rd =
  35278                                                       ExtractDRegister(instr,
  35279                                                                        22,
  35280                                                                        12);
  35281                                                   DOperand imm = ImmediateVmov::
  35282                                                       DecodeImmediate(
  35283                                                           cmode,
  35284                                                           (instr & 0xf) |
  35285                                                               ((instr >> 12) &
  35286                                                                0x70) |
  35287                                                               ((instr >> 21) &
  35288                                                                0x80));
  35289                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35290                                                   vmov(CurrentCond(),
  35291                                                        dt,
  35292                                                        DRegister(rd),
  35293                                                        imm);
  35294                                                   break;
  35295                                                 }
  35296                                                 case 0x00000220: {
  35297                                                   // 0xef800e30
  35298                                                   if (((instr & 0xd00) ==
  35299                                                        0x100) ||
  35300                                                       ((instr & 0xd00) ==
  35301                                                        0x500) ||
  35302                                                       ((instr & 0xd00) ==
  35303                                                        0x900) ||
  35304                                                       ((instr & 0xe00) ==
  35305                                                        0xe00)) {
  35306                                                     UnallocatedT32(instr);
  35307                                                     return;
  35308                                                   }
  35309                                                   unsigned cmode =
  35310                                                       (instr >> 8) & 0xf;
  35311                                                   DataType dt =
  35312                                                       ImmediateVmvn::DecodeDt(
  35313                                                           cmode);
  35314                                                   if (dt.Is(
  35315                                                           kDataTypeValueInvalid)) {
  35316                                                     UnallocatedT32(instr);
  35317                                                     return;
  35318                                                   }
  35319                                                   unsigned rd =
  35320                                                       ExtractDRegister(instr,
  35321                                                                        22,
  35322                                                                        12);
  35323                                                   DOperand imm = ImmediateVmvn::
  35324                                                       DecodeImmediate(
  35325                                                           cmode,
  35326                                                           (instr & 0xf) |
  35327                                                               ((instr >> 12) &
  35328                                                                0x70) |
  35329                                                               ((instr >> 21) &
  35330                                                                0x80));
  35331                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35332                                                   vmvn(CurrentCond(),
  35333                                                        dt,
  35334                                                        DRegister(rd),
  35335                                                        imm);
  35336                                                   break;
  35337                                                 }
  35338                                                 case 0x00000400: {
  35339                                                   // 0xef800c10
  35340                                                   if (((instr & 0x920) ==
  35341                                                        0x100) ||
  35342                                                       ((instr & 0x520) ==
  35343                                                        0x100) ||
  35344                                                       ((instr & 0x820) ==
  35345                                                        0x20) ||
  35346                                                       ((instr & 0x420) ==
  35347                                                        0x20) ||
  35348                                                       ((instr & 0x220) ==
  35349                                                        0x20) ||
  35350                                                       ((instr & 0x120) ==
  35351                                                        0x120)) {
  35352                                                     UnallocatedT32(instr);
  35353                                                     return;
  35354                                                   }
  35355                                                   unsigned cmode =
  35356                                                       ((instr >> 8) & 0xf) |
  35357                                                       ((instr >> 1) & 0x10);
  35358                                                   DataType dt =
  35359                                                       ImmediateVmov::DecodeDt(
  35360                                                           cmode);
  35361                                                   if (dt.Is(
  35362                                                           kDataTypeValueInvalid)) {
  35363                                                     UnallocatedT32(instr);
  35364                                                     return;
  35365                                                   }
  35366                                                   unsigned rd =
  35367                                                       ExtractDRegister(instr,
  35368                                                                        22,
  35369                                                                        12);
  35370                                                   DOperand imm = ImmediateVmov::
  35371                                                       DecodeImmediate(
  35372                                                           cmode,
  35373                                                           (instr & 0xf) |
  35374                                                               ((instr >> 12) &
  35375                                                                0x70) |
  35376                                                               ((instr >> 21) &
  35377                                                                0x80));
  35378                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35379                                                   vmov(CurrentCond(),
  35380                                                        dt,
  35381                                                        DRegister(rd),
  35382                                                        imm);
  35383                                                   break;
  35384                                                 }
  35385                                                 case 0x00000420: {
  35386                                                   // 0xef800c30
  35387                                                   if (((instr & 0xd00) ==
  35388                                                        0x100) ||
  35389                                                       ((instr & 0xd00) ==
  35390                                                        0x500) ||
  35391                                                       ((instr & 0xd00) ==
  35392                                                        0x900) ||
  35393                                                       ((instr & 0xe00) ==
  35394                                                        0xe00)) {
  35395                                                     UnallocatedT32(instr);
  35396                                                     return;
  35397                                                   }
  35398                                                   unsigned cmode =
  35399                                                       (instr >> 8) & 0xf;
  35400                                                   DataType dt =
  35401                                                       ImmediateVmvn::DecodeDt(
  35402                                                           cmode);
  35403                                                   if (dt.Is(
  35404                                                           kDataTypeValueInvalid)) {
  35405                                                     UnallocatedT32(instr);
  35406                                                     return;
  35407                                                   }
  35408                                                   unsigned rd =
  35409                                                       ExtractDRegister(instr,
  35410                                                                        22,
  35411                                                                        12);
  35412                                                   DOperand imm = ImmediateVmvn::
  35413                                                       DecodeImmediate(
  35414                                                           cmode,
  35415                                                           (instr & 0xf) |
  35416                                                               ((instr >> 12) &
  35417                                                                0x70) |
  35418                                                               ((instr >> 21) &
  35419                                                                0x80));
  35420                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35421                                                   vmvn(CurrentCond(),
  35422                                                        dt,
  35423                                                        DRegister(rd),
  35424                                                        imm);
  35425                                                   break;
  35426                                                 }
  35427                                                 case 0x00000600: {
  35428                                                   // 0xef800e10
  35429                                                   if (((instr & 0x920) ==
  35430                                                        0x100) ||
  35431                                                       ((instr & 0x520) ==
  35432                                                        0x100) ||
  35433                                                       ((instr & 0x820) ==
  35434                                                        0x20) ||
  35435                                                       ((instr & 0x420) ==
  35436                                                        0x20) ||
  35437                                                       ((instr & 0x220) ==
  35438                                                        0x20) ||
  35439                                                       ((instr & 0x120) ==
  35440                                                        0x120)) {
  35441                                                     UnallocatedT32(instr);
  35442                                                     return;
  35443                                                   }
  35444                                                   unsigned cmode =
  35445                                                       ((instr >> 8) & 0xf) |
  35446                                                       ((instr >> 1) & 0x10);
  35447                                                   DataType dt =
  35448                                                       ImmediateVmov::DecodeDt(
  35449                                                           cmode);
  35450                                                   if (dt.Is(
  35451                                                           kDataTypeValueInvalid)) {
  35452                                                     UnallocatedT32(instr);
  35453                                                     return;
  35454                                                   }
  35455                                                   unsigned rd =
  35456                                                       ExtractDRegister(instr,
  35457                                                                        22,
  35458                                                                        12);
  35459                                                   DOperand imm = ImmediateVmov::
  35460                                                       DecodeImmediate(
  35461                                                           cmode,
  35462                                                           (instr & 0xf) |
  35463                                                               ((instr >> 12) &
  35464                                                                0x70) |
  35465                                                               ((instr >> 21) &
  35466                                                                0x80));
  35467                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35468                                                   vmov(CurrentCond(),
  35469                                                        dt,
  35470                                                        DRegister(rd),
  35471                                                        imm);
  35472                                                   break;
  35473                                                 }
  35474                                                 case 0x00000620: {
  35475                                                   // 0xef800e30
  35476                                                   if (((instr & 0xd00) ==
  35477                                                        0x100) ||
  35478                                                       ((instr & 0xd00) ==
  35479                                                        0x500) ||
  35480                                                       ((instr & 0xd00) ==
  35481                                                        0x900) ||
  35482                                                       ((instr & 0xe00) ==
  35483                                                        0xe00)) {
  35484                                                     UnallocatedT32(instr);
  35485                                                     return;
  35486                                                   }
  35487                                                   unsigned cmode =
  35488                                                       (instr >> 8) & 0xf;
  35489                                                   DataType dt =
  35490                                                       ImmediateVmvn::DecodeDt(
  35491                                                           cmode);
  35492                                                   if (dt.Is(
  35493                                                           kDataTypeValueInvalid)) {
  35494                                                     UnallocatedT32(instr);
  35495                                                     return;
  35496                                                   }
  35497                                                   unsigned rd =
  35498                                                       ExtractDRegister(instr,
  35499                                                                        22,
  35500                                                                        12);
  35501                                                   DOperand imm = ImmediateVmvn::
  35502                                                       DecodeImmediate(
  35503                                                           cmode,
  35504                                                           (instr & 0xf) |
  35505                                                               ((instr >> 12) &
  35506                                                                0x70) |
  35507                                                               ((instr >> 21) &
  35508                                                                0x80));
  35509                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35510                                                   vmvn(CurrentCond(),
  35511                                                        dt,
  35512                                                        DRegister(rd),
  35513                                                        imm);
  35514                                                   break;
  35515                                                 }
  35516                                                 case 0x00000800: {
  35517                                                   // 0xef800c10
  35518                                                   if (((instr & 0x920) ==
  35519                                                        0x100) ||
  35520                                                       ((instr & 0x520) ==
  35521                                                        0x100) ||
  35522                                                       ((instr & 0x820) ==
  35523                                                        0x20) ||
  35524                                                       ((instr & 0x420) ==
  35525                                                        0x20) ||
  35526                                                       ((instr & 0x220) ==
  35527                                                        0x20) ||
  35528                                                       ((instr & 0x120) ==
  35529                                                        0x120)) {
  35530                                                     UnallocatedT32(instr);
  35531                                                     return;
  35532                                                   }
  35533                                                   unsigned cmode =
  35534                                                       ((instr >> 8) & 0xf) |
  35535                                                       ((instr >> 1) & 0x10);
  35536                                                   DataType dt =
  35537                                                       ImmediateVmov::DecodeDt(
  35538                                                           cmode);
  35539                                                   if (dt.Is(
  35540                                                           kDataTypeValueInvalid)) {
  35541                                                     UnallocatedT32(instr);
  35542                                                     return;
  35543                                                   }
  35544                                                   unsigned rd =
  35545                                                       ExtractDRegister(instr,
  35546                                                                        22,
  35547                                                                        12);
  35548                                                   DOperand imm = ImmediateVmov::
  35549                                                       DecodeImmediate(
  35550                                                           cmode,
  35551                                                           (instr & 0xf) |
  35552                                                               ((instr >> 12) &
  35553                                                                0x70) |
  35554                                                               ((instr >> 21) &
  35555                                                                0x80));
  35556                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35557                                                   vmov(CurrentCond(),
  35558                                                        dt,
  35559                                                        DRegister(rd),
  35560                                                        imm);
  35561                                                   break;
  35562                                                 }
  35563                                                 case 0x00000820: {
  35564                                                   // 0xef800c30
  35565                                                   if (((instr & 0xd00) ==
  35566                                                        0x100) ||
  35567                                                       ((instr & 0xd00) ==
  35568                                                        0x500) ||
  35569                                                       ((instr & 0xd00) ==
  35570                                                        0x900) ||
  35571                                                       ((instr & 0xe00) ==
  35572                                                        0xe00)) {
  35573                                                     UnallocatedT32(instr);
  35574                                                     return;
  35575                                                   }
  35576                                                   unsigned cmode =
  35577                                                       (instr >> 8) & 0xf;
  35578                                                   DataType dt =
  35579                                                       ImmediateVmvn::DecodeDt(
  35580                                                           cmode);
  35581                                                   if (dt.Is(
  35582                                                           kDataTypeValueInvalid)) {
  35583                                                     UnallocatedT32(instr);
  35584                                                     return;
  35585                                                   }
  35586                                                   unsigned rd =
  35587                                                       ExtractDRegister(instr,
  35588                                                                        22,
  35589                                                                        12);
  35590                                                   DOperand imm = ImmediateVmvn::
  35591                                                       DecodeImmediate(
  35592                                                           cmode,
  35593                                                           (instr & 0xf) |
  35594                                                               ((instr >> 12) &
  35595                                                                0x70) |
  35596                                                               ((instr >> 21) &
  35597                                                                0x80));
  35598                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35599                                                   vmvn(CurrentCond(),
  35600                                                        dt,
  35601                                                        DRegister(rd),
  35602                                                        imm);
  35603                                                   break;
  35604                                                 }
  35605                                                 case 0x00000a00: {
  35606                                                   // 0xef800e10
  35607                                                   if (((instr & 0x920) ==
  35608                                                        0x100) ||
  35609                                                       ((instr & 0x520) ==
  35610                                                        0x100) ||
  35611                                                       ((instr & 0x820) ==
  35612                                                        0x20) ||
  35613                                                       ((instr & 0x420) ==
  35614                                                        0x20) ||
  35615                                                       ((instr & 0x220) ==
  35616                                                        0x20) ||
  35617                                                       ((instr & 0x120) ==
  35618                                                        0x120)) {
  35619                                                     UnallocatedT32(instr);
  35620                                                     return;
  35621                                                   }
  35622                                                   unsigned cmode =
  35623                                                       ((instr >> 8) & 0xf) |
  35624                                                       ((instr >> 1) & 0x10);
  35625                                                   DataType dt =
  35626                                                       ImmediateVmov::DecodeDt(
  35627                                                           cmode);
  35628                                                   if (dt.Is(
  35629                                                           kDataTypeValueInvalid)) {
  35630                                                     UnallocatedT32(instr);
  35631                                                     return;
  35632                                                   }
  35633                                                   unsigned rd =
  35634                                                       ExtractDRegister(instr,
  35635                                                                        22,
  35636                                                                        12);
  35637                                                   DOperand imm = ImmediateVmov::
  35638                                                       DecodeImmediate(
  35639                                                           cmode,
  35640                                                           (instr & 0xf) |
  35641                                                               ((instr >> 12) &
  35642                                                                0x70) |
  35643                                                               ((instr >> 21) &
  35644                                                                0x80));
  35645                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35646                                                   vmov(CurrentCond(),
  35647                                                        dt,
  35648                                                        DRegister(rd),
  35649                                                        imm);
  35650                                                   break;
  35651                                                 }
  35652                                                 case 0x00000a20: {
  35653                                                   // 0xef800e30
  35654                                                   if (((instr & 0xd00) ==
  35655                                                        0x100) ||
  35656                                                       ((instr & 0xd00) ==
  35657                                                        0x500) ||
  35658                                                       ((instr & 0xd00) ==
  35659                                                        0x900) ||
  35660                                                       ((instr & 0xe00) ==
  35661                                                        0xe00)) {
  35662                                                     UnallocatedT32(instr);
  35663                                                     return;
  35664                                                   }
  35665                                                   unsigned cmode =
  35666                                                       (instr >> 8) & 0xf;
  35667                                                   DataType dt =
  35668                                                       ImmediateVmvn::DecodeDt(
  35669                                                           cmode);
  35670                                                   if (dt.Is(
  35671                                                           kDataTypeValueInvalid)) {
  35672                                                     UnallocatedT32(instr);
  35673                                                     return;
  35674                                                   }
  35675                                                   unsigned rd =
  35676                                                       ExtractDRegister(instr,
  35677                                                                        22,
  35678                                                                        12);
  35679                                                   DOperand imm = ImmediateVmvn::
  35680                                                       DecodeImmediate(
  35681                                                           cmode,
  35682                                                           (instr & 0xf) |
  35683                                                               ((instr >> 12) &
  35684                                                                0x70) |
  35685                                                               ((instr >> 21) &
  35686                                                                0x80));
  35687                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35688                                                   vmvn(CurrentCond(),
  35689                                                        dt,
  35690                                                        DRegister(rd),
  35691                                                        imm);
  35692                                                   break;
  35693                                                 }
  35694                                                 case 0x00000c00: {
  35695                                                   // 0xef800c10
  35696                                                   if (((instr & 0x920) ==
  35697                                                        0x100) ||
  35698                                                       ((instr & 0x520) ==
  35699                                                        0x100) ||
  35700                                                       ((instr & 0x820) ==
  35701                                                        0x20) ||
  35702                                                       ((instr & 0x420) ==
  35703                                                        0x20) ||
  35704                                                       ((instr & 0x220) ==
  35705                                                        0x20) ||
  35706                                                       ((instr & 0x120) ==
  35707                                                        0x120)) {
  35708                                                     UnallocatedT32(instr);
  35709                                                     return;
  35710                                                   }
  35711                                                   unsigned cmode =
  35712                                                       ((instr >> 8) & 0xf) |
  35713                                                       ((instr >> 1) & 0x10);
  35714                                                   DataType dt =
  35715                                                       ImmediateVmov::DecodeDt(
  35716                                                           cmode);
  35717                                                   if (dt.Is(
  35718                                                           kDataTypeValueInvalid)) {
  35719                                                     UnallocatedT32(instr);
  35720                                                     return;
  35721                                                   }
  35722                                                   unsigned rd =
  35723                                                       ExtractDRegister(instr,
  35724                                                                        22,
  35725                                                                        12);
  35726                                                   DOperand imm = ImmediateVmov::
  35727                                                       DecodeImmediate(
  35728                                                           cmode,
  35729                                                           (instr & 0xf) |
  35730                                                               ((instr >> 12) &
  35731                                                                0x70) |
  35732                                                               ((instr >> 21) &
  35733                                                                0x80));
  35734                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35735                                                   vmov(CurrentCond(),
  35736                                                        dt,
  35737                                                        DRegister(rd),
  35738                                                        imm);
  35739                                                   break;
  35740                                                 }
  35741                                                 case 0x00000c20: {
  35742                                                   // 0xef800c30
  35743                                                   if (((instr & 0xd00) ==
  35744                                                        0x100) ||
  35745                                                       ((instr & 0xd00) ==
  35746                                                        0x500) ||
  35747                                                       ((instr & 0xd00) ==
  35748                                                        0x900) ||
  35749                                                       ((instr & 0xe00) ==
  35750                                                        0xe00)) {
  35751                                                     UnallocatedT32(instr);
  35752                                                     return;
  35753                                                   }
  35754                                                   unsigned cmode =
  35755                                                       (instr >> 8) & 0xf;
  35756                                                   DataType dt =
  35757                                                       ImmediateVmvn::DecodeDt(
  35758                                                           cmode);
  35759                                                   if (dt.Is(
  35760                                                           kDataTypeValueInvalid)) {
  35761                                                     UnallocatedT32(instr);
  35762                                                     return;
  35763                                                   }
  35764                                                   unsigned rd =
  35765                                                       ExtractDRegister(instr,
  35766                                                                        22,
  35767                                                                        12);
  35768                                                   DOperand imm = ImmediateVmvn::
  35769                                                       DecodeImmediate(
  35770                                                           cmode,
  35771                                                           (instr & 0xf) |
  35772                                                               ((instr >> 12) &
  35773                                                                0x70) |
  35774                                                               ((instr >> 21) &
  35775                                                                0x80));
  35776                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35777                                                   vmvn(CurrentCond(),
  35778                                                        dt,
  35779                                                        DRegister(rd),
  35780                                                        imm);
  35781                                                   break;
  35782                                                 }
  35783                                                 case 0x00000d00: {
  35784                                                   // 0xef800d10
  35785                                                   if (((instr & 0x920) ==
  35786                                                        0x100) ||
  35787                                                       ((instr & 0x520) ==
  35788                                                        0x100) ||
  35789                                                       ((instr & 0x820) ==
  35790                                                        0x20) ||
  35791                                                       ((instr & 0x420) ==
  35792                                                        0x20) ||
  35793                                                       ((instr & 0x220) ==
  35794                                                        0x20) ||
  35795                                                       ((instr & 0x120) ==
  35796                                                        0x120)) {
  35797                                                     UnallocatedT32(instr);
  35798                                                     return;
  35799                                                   }
  35800                                                   unsigned cmode =
  35801                                                       ((instr >> 8) & 0xf) |
  35802                                                       ((instr >> 1) & 0x10);
  35803                                                   DataType dt =
  35804                                                       ImmediateVmov::DecodeDt(
  35805                                                           cmode);
  35806                                                   if (dt.Is(
  35807                                                           kDataTypeValueInvalid)) {
  35808                                                     UnallocatedT32(instr);
  35809                                                     return;
  35810                                                   }
  35811                                                   unsigned rd =
  35812                                                       ExtractDRegister(instr,
  35813                                                                        22,
  35814                                                                        12);
  35815                                                   DOperand imm = ImmediateVmov::
  35816                                                       DecodeImmediate(
  35817                                                           cmode,
  35818                                                           (instr & 0xf) |
  35819                                                               ((instr >> 12) &
  35820                                                                0x70) |
  35821                                                               ((instr >> 21) &
  35822                                                                0x80));
  35823                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35824                                                   vmov(CurrentCond(),
  35825                                                        dt,
  35826                                                        DRegister(rd),
  35827                                                        imm);
  35828                                                   break;
  35829                                                 }
  35830                                                 case 0x00000d20: {
  35831                                                   // 0xef800d30
  35832                                                   if (((instr & 0xd00) ==
  35833                                                        0x100) ||
  35834                                                       ((instr & 0xd00) ==
  35835                                                        0x500) ||
  35836                                                       ((instr & 0xd00) ==
  35837                                                        0x900) ||
  35838                                                       ((instr & 0xe00) ==
  35839                                                        0xe00)) {
  35840                                                     UnallocatedT32(instr);
  35841                                                     return;
  35842                                                   }
  35843                                                   unsigned cmode =
  35844                                                       (instr >> 8) & 0xf;
  35845                                                   DataType dt =
  35846                                                       ImmediateVmvn::DecodeDt(
  35847                                                           cmode);
  35848                                                   if (dt.Is(
  35849                                                           kDataTypeValueInvalid)) {
  35850                                                     UnallocatedT32(instr);
  35851                                                     return;
  35852                                                   }
  35853                                                   unsigned rd =
  35854                                                       ExtractDRegister(instr,
  35855                                                                        22,
  35856                                                                        12);
  35857                                                   DOperand imm = ImmediateVmvn::
  35858                                                       DecodeImmediate(
  35859                                                           cmode,
  35860                                                           (instr & 0xf) |
  35861                                                               ((instr >> 12) &
  35862                                                                0x70) |
  35863                                                               ((instr >> 21) &
  35864                                                                0x80));
  35865                                                   // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35866                                                   vmvn(CurrentCond(),
  35867                                                        dt,
  35868                                                        DRegister(rd),
  35869                                                        imm);
  35870                                                   break;
  35871                                                 }
  35872                                                 case 0x00000e00: {
  35873                                                   // 0xef800e10
  35874                                                   if (((instr & 0x920) ==
  35875                                                        0x100) ||
  35876                                                       ((instr & 0x520) ==
  35877                                                        0x100) ||
  35878                                                       ((instr & 0x820) ==
  35879                                                        0x20) ||
  35880                                                       ((instr & 0x420) ==
  35881                                                        0x20) ||
  35882                                                       ((instr & 0x220) ==
  35883                                                        0x20) ||
  35884                                                       ((instr & 0x120) ==
  35885                                                        0x120)) {
  35886                                                     UnallocatedT32(instr);
  35887                                                     return;
  35888                                                   }
  35889                                                   unsigned cmode =
  35890                                                       ((instr >> 8) & 0xf) |
  35891                                                       ((instr >> 1) & 0x10);
  35892                                                   DataType dt =
  35893                                                       ImmediateVmov::DecodeDt(
  35894                                                           cmode);
  35895                                                   if (dt.Is(
  35896                                                           kDataTypeValueInvalid)) {
  35897                                                     UnallocatedT32(instr);
  35898                                                     return;
  35899                                                   }
  35900                                                   unsigned rd =
  35901                                                       ExtractDRegister(instr,
  35902                                                                        22,
  35903                                                                        12);
  35904                                                   DOperand imm = ImmediateVmov::
  35905                                                       DecodeImmediate(
  35906                                                           cmode,
  35907                                                           (instr & 0xf) |
  35908                                                               ((instr >> 12) &
  35909                                                                0x70) |
  35910                                                               ((instr >> 21) &
  35911                                                                0x80));
  35912                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35913                                                   vmov(CurrentCond(),
  35914                                                        dt,
  35915                                                        DRegister(rd),
  35916                                                        imm);
  35917                                                   break;
  35918                                                 }
  35919                                                 case 0x00000e20: {
  35920                                                   // 0xef800e30
  35921                                                   if (((instr & 0x920) ==
  35922                                                        0x100) ||
  35923                                                       ((instr & 0x520) ==
  35924                                                        0x100) ||
  35925                                                       ((instr & 0x820) ==
  35926                                                        0x20) ||
  35927                                                       ((instr & 0x420) ==
  35928                                                        0x20) ||
  35929                                                       ((instr & 0x220) ==
  35930                                                        0x20) ||
  35931                                                       ((instr & 0x120) ==
  35932                                                        0x120)) {
  35933                                                     UnallocatedT32(instr);
  35934                                                     return;
  35935                                                   }
  35936                                                   unsigned cmode =
  35937                                                       ((instr >> 8) & 0xf) |
  35938                                                       ((instr >> 1) & 0x10);
  35939                                                   DataType dt =
  35940                                                       ImmediateVmov::DecodeDt(
  35941                                                           cmode);
  35942                                                   if (dt.Is(
  35943                                                           kDataTypeValueInvalid)) {
  35944                                                     UnallocatedT32(instr);
  35945                                                     return;
  35946                                                   }
  35947                                                   unsigned rd =
  35948                                                       ExtractDRegister(instr,
  35949                                                                        22,
  35950                                                                        12);
  35951                                                   DOperand imm = ImmediateVmov::
  35952                                                       DecodeImmediate(
  35953                                                           cmode,
  35954                                                           (instr & 0xf) |
  35955                                                               ((instr >> 12) &
  35956                                                                0x70) |
  35957                                                               ((instr >> 21) &
  35958                                                                0x80));
  35959                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  35960                                                   vmov(CurrentCond(),
  35961                                                        dt,
  35962                                                        DRegister(rd),
  35963                                                        imm);
  35964                                                   break;
  35965                                                 }
  35966                                                 case 0x00000f00: {
  35967                                                   // 0xef800f10
  35968                                                   if (((instr & 0x920) ==
  35969                                                        0x100) ||
  35970                                                       ((instr & 0x520) ==
  35971                                                        0x100) ||
  35972                                                       ((instr & 0x820) ==
  35973                                                        0x20) ||
  35974                                                       ((instr & 0x420) ==
  35975                                                        0x20) ||
  35976                                                       ((instr & 0x220) ==
  35977                                                        0x20) ||
  35978                                                       ((instr & 0x120) ==
  35979                                                        0x120)) {
  35980                                                     UnallocatedT32(instr);
  35981                                                     return;
  35982                                                   }
  35983                                                   unsigned cmode =
  35984                                                       ((instr >> 8) & 0xf) |
  35985                                                       ((instr >> 1) & 0x10);
  35986                                                   DataType dt =
  35987                                                       ImmediateVmov::DecodeDt(
  35988                                                           cmode);
  35989                                                   if (dt.Is(
  35990                                                           kDataTypeValueInvalid)) {
  35991                                                     UnallocatedT32(instr);
  35992                                                     return;
  35993                                                   }
  35994                                                   unsigned rd =
  35995                                                       ExtractDRegister(instr,
  35996                                                                        22,
  35997                                                                        12);
  35998                                                   DOperand imm = ImmediateVmov::
  35999                                                       DecodeImmediate(
  36000                                                           cmode,
  36001                                                           (instr & 0xf) |
  36002                                                               ((instr >> 12) &
  36003                                                                0x70) |
  36004                                                               ((instr >> 21) &
  36005                                                                0x80));
  36006                                                   // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36007                                                   vmov(CurrentCond(),
  36008                                                        dt,
  36009                                                        DRegister(rd),
  36010                                                        imm);
  36011                                                   break;
  36012                                                 }
  36013                                                 default:
  36014                                                   UnallocatedT32(instr);
  36015                                                   break;
  36016                                               }
  36017                                               break;
  36018                                             }
  36019                                             default: {
  36020                                               if (((instr & 0x920) == 0x100) ||
  36021                                                   ((instr & 0x520) == 0x100) ||
  36022                                                   ((instr & 0x820) == 0x20) ||
  36023                                                   ((instr & 0x420) == 0x20) ||
  36024                                                   ((instr & 0x220) == 0x20) ||
  36025                                                   ((instr & 0x120) == 0x120)) {
  36026                                                 UnallocatedT32(instr);
  36027                                                 return;
  36028                                               }
  36029                                               unsigned cmode =
  36030                                                   ((instr >> 8) & 0xf) |
  36031                                                   ((instr >> 1) & 0x10);
  36032                                               DataType dt =
  36033                                                   ImmediateVmov::DecodeDt(
  36034                                                       cmode);
  36035                                               if (dt.Is(
  36036                                                       kDataTypeValueInvalid)) {
  36037                                                 UnallocatedT32(instr);
  36038                                                 return;
  36039                                               }
  36040                                               unsigned rd =
  36041                                                   ExtractDRegister(instr,
  36042                                                                    22,
  36043                                                                    12);
  36044                                               DOperand imm = ImmediateVmov::
  36045                                                   DecodeImmediate(cmode,
  36046                                                                   (instr &
  36047                                                                    0xf) |
  36048                                                                       ((instr >>
  36049                                                                         12) &
  36050                                                                        0x70) |
  36051                                                                       ((instr >>
  36052                                                                         21) &
  36053                                                                        0x80));
  36054                                               // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36055                                               vmov(CurrentCond(),
  36056                                                    dt,
  36057                                                    DRegister(rd),
  36058                                                    imm);
  36059                                               break;
  36060                                             }
  36061                                           }
  36062                                           break;
  36063                                         }
  36064                                       }
  36065                                       break;
  36066                                     }
  36067                                     default:
  36068                                       UnallocatedT32(instr);
  36069                                       break;
  36070                                   }
  36071                                   break;
  36072                                 }
  36073                                 default: {
  36074                                   if ((instr & 0x00000200) == 0x00000200) {
  36075                                     if (((instr & 0x200000) == 0x0)) {
  36076                                       UnallocatedT32(instr);
  36077                                       return;
  36078                                     }
  36079                                     DataType dt1 = Dt_op_U_1_Decode1(
  36080                                         ((instr >> 28) & 0x1) |
  36081                                         ((instr >> 7) & 0x2));
  36082                                     if (dt1.Is(kDataTypeValueInvalid)) {
  36083                                       UnallocatedT32(instr);
  36084                                       return;
  36085                                     }
  36086                                     DataType dt2 = Dt_op_U_1_Decode2(
  36087                                         ((instr >> 28) & 0x1) |
  36088                                         ((instr >> 7) & 0x2));
  36089                                     if (dt2.Is(kDataTypeValueInvalid)) {
  36090                                       UnallocatedT32(instr);
  36091                                       return;
  36092                                     }
  36093                                     unsigned rd =
  36094                                         ExtractDRegister(instr, 22, 12);
  36095                                     unsigned rm = ExtractDRegister(instr, 5, 0);
  36096                                     uint32_t fbits =
  36097                                         64 - ((instr >> 16) & 0x3f);
  36098                                     // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
  36099                                     vcvt(CurrentCond(),
  36100                                          dt1,
  36101                                          dt2,
  36102                                          DRegister(rd),
  36103                                          DRegister(rm),
  36104                                          fbits);
  36105                                   } else {
  36106                                     UnallocatedT32(instr);
  36107                                   }
  36108                                   break;
  36109                                 }
  36110                               }
  36111                               break;
  36112                             }
  36113                             default:
  36114                               UnallocatedT32(instr);
  36115                               break;
  36116                           }
  36117                           break;
  36118                         }
  36119                       }
  36120                       break;
  36121                     }
  36122                     case 0x00800040: {
  36123                       // 0xef800050
  36124                       switch (instr & 0x00000c00) {
  36125                         case 0x00000000: {
  36126                           // 0xef800050
  36127                           switch (instr & 0x00380080) {
  36128                             case 0x00000000: {
  36129                               // 0xef800050
  36130                               switch (instr & 0x00000100) {
  36131                                 case 0x00000000: {
  36132                                   // 0xef800050
  36133                                   switch (instr & 0x00000200) {
  36134                                     default: {
  36135                                       switch (instr & 0x00000020) {
  36136                                         case 0x00000020: {
  36137                                           // 0xef800070
  36138                                           if (((instr & 0xd00) == 0x100) ||
  36139                                               ((instr & 0xd00) == 0x500) ||
  36140                                               ((instr & 0xd00) == 0x900) ||
  36141                                               ((instr & 0xe00) == 0xe00)) {
  36142                                             UnallocatedT32(instr);
  36143                                             return;
  36144                                           }
  36145                                           unsigned cmode = (instr >> 8) & 0xf;
  36146                                           DataType dt =
  36147                                               ImmediateVmvn::DecodeDt(cmode);
  36148                                           if (dt.Is(kDataTypeValueInvalid)) {
  36149                                             UnallocatedT32(instr);
  36150                                             return;
  36151                                           }
  36152                                           if (((instr >> 12) & 1) != 0) {
  36153                                             UnallocatedT32(instr);
  36154                                             return;
  36155                                           }
  36156                                           unsigned rd =
  36157                                               ExtractQRegister(instr, 22, 12);
  36158                                           QOperand imm =
  36159                                               ImmediateVmvn::DecodeImmediate(
  36160                                                   cmode,
  36161                                                   (instr & 0xf) |
  36162                                                       ((instr >> 12) & 0x70) |
  36163                                                       ((instr >> 21) & 0x80));
  36164                                           // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36165                                           vmvn(CurrentCond(),
  36166                                                dt,
  36167                                                QRegister(rd),
  36168                                                imm);
  36169                                           break;
  36170                                         }
  36171                                         default: {
  36172                                           if (((instr & 0x920) == 0x100) ||
  36173                                               ((instr & 0x520) == 0x100) ||
  36174                                               ((instr & 0x820) == 0x20) ||
  36175                                               ((instr & 0x420) == 0x20) ||
  36176                                               ((instr & 0x220) == 0x20) ||
  36177                                               ((instr & 0x120) == 0x120)) {
  36178                                             UnallocatedT32(instr);
  36179                                             return;
  36180                                           }
  36181                                           unsigned cmode =
  36182                                               ((instr >> 8) & 0xf) |
  36183                                               ((instr >> 1) & 0x10);
  36184                                           DataType dt =
  36185                                               ImmediateVmov::DecodeDt(cmode);
  36186                                           if (dt.Is(kDataTypeValueInvalid)) {
  36187                                             UnallocatedT32(instr);
  36188                                             return;
  36189                                           }
  36190                                           if (((instr >> 12) & 1) != 0) {
  36191                                             UnallocatedT32(instr);
  36192                                             return;
  36193                                           }
  36194                                           unsigned rd =
  36195                                               ExtractQRegister(instr, 22, 12);
  36196                                           QOperand imm =
  36197                                               ImmediateVmov::DecodeImmediate(
  36198                                                   cmode,
  36199                                                   (instr & 0xf) |
  36200                                                       ((instr >> 12) & 0x70) |
  36201                                                       ((instr >> 21) & 0x80));
  36202                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36203                                           vmov(CurrentCond(),
  36204                                                dt,
  36205                                                QRegister(rd),
  36206                                                imm);
  36207                                           break;
  36208                                         }
  36209                                       }
  36210                                       break;
  36211                                     }
  36212                                   }
  36213                                   break;
  36214                                 }
  36215                                 case 0x00000100: {
  36216                                   // 0xef800150
  36217                                   switch (instr & 0x00000020) {
  36218                                     case 0x00000000: {
  36219                                       // 0xef800150
  36220                                       if (((instr & 0x100) == 0x0) ||
  36221                                           ((instr & 0xc00) == 0xc00)) {
  36222                                         UnallocatedT32(instr);
  36223                                         return;
  36224                                       }
  36225                                       unsigned cmode = (instr >> 8) & 0xf;
  36226                                       DataType dt =
  36227                                           ImmediateVorr::DecodeDt(cmode);
  36228                                       if (dt.Is(kDataTypeValueInvalid)) {
  36229                                         UnallocatedT32(instr);
  36230                                         return;
  36231                                       }
  36232                                       if (((instr >> 12) & 1) != 0) {
  36233                                         UnallocatedT32(instr);
  36234                                         return;
  36235                                       }
  36236                                       unsigned rd =
  36237                                           ExtractQRegister(instr, 22, 12);
  36238                                       QOperand imm =
  36239                                           ImmediateVorr::DecodeImmediate(
  36240                                               cmode,
  36241                                               (instr & 0xf) |
  36242                                                   ((instr >> 12) & 0x70) |
  36243                                                   ((instr >> 21) & 0x80));
  36244                                       // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36245                                       vorr(CurrentCond(),
  36246                                            dt,
  36247                                            QRegister(rd),
  36248                                            QRegister(rd),
  36249                                            imm);
  36250                                       break;
  36251                                     }
  36252                                     case 0x00000020: {
  36253                                       // 0xef800170
  36254                                       if (((instr & 0x100) == 0x0) ||
  36255                                           ((instr & 0xc00) == 0xc00)) {
  36256                                         UnallocatedT32(instr);
  36257                                         return;
  36258                                       }
  36259                                       unsigned cmode = (instr >> 8) & 0xf;
  36260                                       DataType dt =
  36261                                           ImmediateVbic::DecodeDt(cmode);
  36262                                       if (dt.Is(kDataTypeValueInvalid)) {
  36263                                         UnallocatedT32(instr);
  36264                                         return;
  36265                                       }
  36266                                       if (((instr >> 12) & 1) != 0) {
  36267                                         UnallocatedT32(instr);
  36268                                         return;
  36269                                       }
  36270                                       unsigned rd =
  36271                                           ExtractQRegister(instr, 22, 12);
  36272                                       QOperand imm =
  36273                                           ImmediateVbic::DecodeImmediate(
  36274                                               cmode,
  36275                                               (instr & 0xf) |
  36276                                                   ((instr >> 12) & 0x70) |
  36277                                                   ((instr >> 21) & 0x80));
  36278                                       // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36279                                       vbic(CurrentCond(),
  36280                                            dt,
  36281                                            QRegister(rd),
  36282                                            QRegister(rd),
  36283                                            imm);
  36284                                       break;
  36285                                     }
  36286                                   }
  36287                                   break;
  36288                                 }
  36289                               }
  36290                               break;
  36291                             }
  36292                             default: {
  36293                               switch (instr & 0x00000300) {
  36294                                 case 0x00000000: {
  36295                                   // 0xef800050
  36296                                   if (((instr & 0x380080) == 0x0)) {
  36297                                     UnallocatedT32(instr);
  36298                                     return;
  36299                                   }
  36300                                   DataType dt =
  36301                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  36302                                                              ((instr >> 4) &
  36303                                                               0x8),
  36304                                                          (instr >> 28) & 0x1);
  36305                                   if (dt.Is(kDataTypeValueInvalid)) {
  36306                                     UnallocatedT32(instr);
  36307                                     return;
  36308                                   }
  36309                                   if (((instr >> 12) & 1) != 0) {
  36310                                     UnallocatedT32(instr);
  36311                                     return;
  36312                                   }
  36313                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  36314                                   if ((instr & 1) != 0) {
  36315                                     UnallocatedT32(instr);
  36316                                     return;
  36317                                   }
  36318                                   unsigned rm = ExtractQRegister(instr, 5, 0);
  36319                                   uint32_t imm6 = (instr >> 16) & 0x3f;
  36320                                   uint32_t imm =
  36321                                       (dt.IsSize(64) ? 64
  36322                                                      : (dt.GetSize() * 2)) -
  36323                                       imm6;
  36324                                   // VSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36325                                   vshr(CurrentCond(),
  36326                                        dt,
  36327                                        QRegister(rd),
  36328                                        QRegister(rm),
  36329                                        imm);
  36330                                   break;
  36331                                 }
  36332                                 case 0x00000100: {
  36333                                   // 0xef800150
  36334                                   if (((instr & 0x380080) == 0x0)) {
  36335                                     UnallocatedT32(instr);
  36336                                     return;
  36337                                   }
  36338                                   DataType dt =
  36339                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  36340                                                              ((instr >> 4) &
  36341                                                               0x8),
  36342                                                          (instr >> 28) & 0x1);
  36343                                   if (dt.Is(kDataTypeValueInvalid)) {
  36344                                     UnallocatedT32(instr);
  36345                                     return;
  36346                                   }
  36347                                   if (((instr >> 12) & 1) != 0) {
  36348                                     UnallocatedT32(instr);
  36349                                     return;
  36350                                   }
  36351                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  36352                                   if ((instr & 1) != 0) {
  36353                                     UnallocatedT32(instr);
  36354                                     return;
  36355                                   }
  36356                                   unsigned rm = ExtractQRegister(instr, 5, 0);
  36357                                   uint32_t imm6 = (instr >> 16) & 0x3f;
  36358                                   uint32_t imm =
  36359                                       (dt.IsSize(64) ? 64
  36360                                                      : (dt.GetSize() * 2)) -
  36361                                       imm6;
  36362                                   // VSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36363                                   vsra(CurrentCond(),
  36364                                        dt,
  36365                                        QRegister(rd),
  36366                                        QRegister(rm),
  36367                                        imm);
  36368                                   break;
  36369                                 }
  36370                                 case 0x00000200: {
  36371                                   // 0xef800250
  36372                                   if (((instr & 0x380080) == 0x0)) {
  36373                                     UnallocatedT32(instr);
  36374                                     return;
  36375                                   }
  36376                                   DataType dt =
  36377                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  36378                                                              ((instr >> 4) &
  36379                                                               0x8),
  36380                                                          (instr >> 28) & 0x1);
  36381                                   if (dt.Is(kDataTypeValueInvalid)) {
  36382                                     UnallocatedT32(instr);
  36383                                     return;
  36384                                   }
  36385                                   if (((instr >> 12) & 1) != 0) {
  36386                                     UnallocatedT32(instr);
  36387                                     return;
  36388                                   }
  36389                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  36390                                   if ((instr & 1) != 0) {
  36391                                     UnallocatedT32(instr);
  36392                                     return;
  36393                                   }
  36394                                   unsigned rm = ExtractQRegister(instr, 5, 0);
  36395                                   uint32_t imm6 = (instr >> 16) & 0x3f;
  36396                                   uint32_t imm =
  36397                                       (dt.IsSize(64) ? 64
  36398                                                      : (dt.GetSize() * 2)) -
  36399                                       imm6;
  36400                                   // VRSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36401                                   vrshr(CurrentCond(),
  36402                                         dt,
  36403                                         QRegister(rd),
  36404                                         QRegister(rm),
  36405                                         imm);
  36406                                   break;
  36407                                 }
  36408                                 case 0x00000300: {
  36409                                   // 0xef800350
  36410                                   if (((instr & 0x380080) == 0x0)) {
  36411                                     UnallocatedT32(instr);
  36412                                     return;
  36413                                   }
  36414                                   DataType dt =
  36415                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  36416                                                              ((instr >> 4) &
  36417                                                               0x8),
  36418                                                          (instr >> 28) & 0x1);
  36419                                   if (dt.Is(kDataTypeValueInvalid)) {
  36420                                     UnallocatedT32(instr);
  36421                                     return;
  36422                                   }
  36423                                   if (((instr >> 12) & 1) != 0) {
  36424                                     UnallocatedT32(instr);
  36425                                     return;
  36426                                   }
  36427                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  36428                                   if ((instr & 1) != 0) {
  36429                                     UnallocatedT32(instr);
  36430                                     return;
  36431                                   }
  36432                                   unsigned rm = ExtractQRegister(instr, 5, 0);
  36433                                   uint32_t imm6 = (instr >> 16) & 0x3f;
  36434                                   uint32_t imm =
  36435                                       (dt.IsSize(64) ? 64
  36436                                                      : (dt.GetSize() * 2)) -
  36437                                       imm6;
  36438                                   // VRSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36439                                   vrsra(CurrentCond(),
  36440                                         dt,
  36441                                         QRegister(rd),
  36442                                         QRegister(rm),
  36443                                         imm);
  36444                                   break;
  36445                                 }
  36446                               }
  36447                               break;
  36448                             }
  36449                           }
  36450                           break;
  36451                         }
  36452                         case 0x00000400: {
  36453                           // 0xef800450
  36454                           switch (instr & 0x00380080) {
  36455                             case 0x00000000: {
  36456                               // 0xef800450
  36457                               switch (instr & 0x00000100) {
  36458                                 case 0x00000000: {
  36459                                   // 0xef800450
  36460                                   switch (instr & 0x00000200) {
  36461                                     default: {
  36462                                       switch (instr & 0x00000020) {
  36463                                         case 0x00000020: {
  36464                                           // 0xef800470
  36465                                           if (((instr & 0xd00) == 0x100) ||
  36466                                               ((instr & 0xd00) == 0x500) ||
  36467                                               ((instr & 0xd00) == 0x900) ||
  36468                                               ((instr & 0xe00) == 0xe00)) {
  36469                                             UnallocatedT32(instr);
  36470                                             return;
  36471                                           }
  36472                                           unsigned cmode = (instr >> 8) & 0xf;
  36473                                           DataType dt =
  36474                                               ImmediateVmvn::DecodeDt(cmode);
  36475                                           if (dt.Is(kDataTypeValueInvalid)) {
  36476                                             UnallocatedT32(instr);
  36477                                             return;
  36478                                           }
  36479                                           if (((instr >> 12) & 1) != 0) {
  36480                                             UnallocatedT32(instr);
  36481                                             return;
  36482                                           }
  36483                                           unsigned rd =
  36484                                               ExtractQRegister(instr, 22, 12);
  36485                                           QOperand imm =
  36486                                               ImmediateVmvn::DecodeImmediate(
  36487                                                   cmode,
  36488                                                   (instr & 0xf) |
  36489                                                       ((instr >> 12) & 0x70) |
  36490                                                       ((instr >> 21) & 0x80));
  36491                                           // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36492                                           vmvn(CurrentCond(),
  36493                                                dt,
  36494                                                QRegister(rd),
  36495                                                imm);
  36496                                           break;
  36497                                         }
  36498                                         default: {
  36499                                           if (((instr & 0x920) == 0x100) ||
  36500                                               ((instr & 0x520) == 0x100) ||
  36501                                               ((instr & 0x820) == 0x20) ||
  36502                                               ((instr & 0x420) == 0x20) ||
  36503                                               ((instr & 0x220) == 0x20) ||
  36504                                               ((instr & 0x120) == 0x120)) {
  36505                                             UnallocatedT32(instr);
  36506                                             return;
  36507                                           }
  36508                                           unsigned cmode =
  36509                                               ((instr >> 8) & 0xf) |
  36510                                               ((instr >> 1) & 0x10);
  36511                                           DataType dt =
  36512                                               ImmediateVmov::DecodeDt(cmode);
  36513                                           if (dt.Is(kDataTypeValueInvalid)) {
  36514                                             UnallocatedT32(instr);
  36515                                             return;
  36516                                           }
  36517                                           if (((instr >> 12) & 1) != 0) {
  36518                                             UnallocatedT32(instr);
  36519                                             return;
  36520                                           }
  36521                                           unsigned rd =
  36522                                               ExtractQRegister(instr, 22, 12);
  36523                                           QOperand imm =
  36524                                               ImmediateVmov::DecodeImmediate(
  36525                                                   cmode,
  36526                                                   (instr & 0xf) |
  36527                                                       ((instr >> 12) & 0x70) |
  36528                                                       ((instr >> 21) & 0x80));
  36529                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36530                                           vmov(CurrentCond(),
  36531                                                dt,
  36532                                                QRegister(rd),
  36533                                                imm);
  36534                                           break;
  36535                                         }
  36536                                       }
  36537                                       break;
  36538                                     }
  36539                                   }
  36540                                   break;
  36541                                 }
  36542                                 case 0x00000100: {
  36543                                   // 0xef800550
  36544                                   switch (instr & 0x00000020) {
  36545                                     case 0x00000000: {
  36546                                       // 0xef800550
  36547                                       if (((instr & 0x100) == 0x0) ||
  36548                                           ((instr & 0xc00) == 0xc00)) {
  36549                                         UnallocatedT32(instr);
  36550                                         return;
  36551                                       }
  36552                                       unsigned cmode = (instr >> 8) & 0xf;
  36553                                       DataType dt =
  36554                                           ImmediateVorr::DecodeDt(cmode);
  36555                                       if (dt.Is(kDataTypeValueInvalid)) {
  36556                                         UnallocatedT32(instr);
  36557                                         return;
  36558                                       }
  36559                                       if (((instr >> 12) & 1) != 0) {
  36560                                         UnallocatedT32(instr);
  36561                                         return;
  36562                                       }
  36563                                       unsigned rd =
  36564                                           ExtractQRegister(instr, 22, 12);
  36565                                       QOperand imm =
  36566                                           ImmediateVorr::DecodeImmediate(
  36567                                               cmode,
  36568                                               (instr & 0xf) |
  36569                                                   ((instr >> 12) & 0x70) |
  36570                                                   ((instr >> 21) & 0x80));
  36571                                       // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36572                                       vorr(CurrentCond(),
  36573                                            dt,
  36574                                            QRegister(rd),
  36575                                            QRegister(rd),
  36576                                            imm);
  36577                                       break;
  36578                                     }
  36579                                     case 0x00000020: {
  36580                                       // 0xef800570
  36581                                       if (((instr & 0x100) == 0x0) ||
  36582                                           ((instr & 0xc00) == 0xc00)) {
  36583                                         UnallocatedT32(instr);
  36584                                         return;
  36585                                       }
  36586                                       unsigned cmode = (instr >> 8) & 0xf;
  36587                                       DataType dt =
  36588                                           ImmediateVbic::DecodeDt(cmode);
  36589                                       if (dt.Is(kDataTypeValueInvalid)) {
  36590                                         UnallocatedT32(instr);
  36591                                         return;
  36592                                       }
  36593                                       if (((instr >> 12) & 1) != 0) {
  36594                                         UnallocatedT32(instr);
  36595                                         return;
  36596                                       }
  36597                                       unsigned rd =
  36598                                           ExtractQRegister(instr, 22, 12);
  36599                                       QOperand imm =
  36600                                           ImmediateVbic::DecodeImmediate(
  36601                                               cmode,
  36602                                               (instr & 0xf) |
  36603                                                   ((instr >> 12) & 0x70) |
  36604                                                   ((instr >> 21) & 0x80));
  36605                                       // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36606                                       vbic(CurrentCond(),
  36607                                            dt,
  36608                                            QRegister(rd),
  36609                                            QRegister(rd),
  36610                                            imm);
  36611                                       break;
  36612                                     }
  36613                                   }
  36614                                   break;
  36615                                 }
  36616                               }
  36617                               break;
  36618                             }
  36619                             default: {
  36620                               switch (instr & 0x00000300) {
  36621                                 case 0x00000000: {
  36622                                   // 0xef800450
  36623                                   if ((instr & 0x10000000) == 0x10000000) {
  36624                                     if (((instr & 0x380080) == 0x0)) {
  36625                                       UnallocatedT32(instr);
  36626                                       return;
  36627                                     }
  36628                                     DataType dt = Dt_L_imm6_4_Decode(
  36629                                         ((instr >> 19) & 0x7) |
  36630                                         ((instr >> 4) & 0x8));
  36631                                     if (dt.Is(kDataTypeValueInvalid)) {
  36632                                       UnallocatedT32(instr);
  36633                                       return;
  36634                                     }
  36635                                     if (((instr >> 12) & 1) != 0) {
  36636                                       UnallocatedT32(instr);
  36637                                       return;
  36638                                     }
  36639                                     unsigned rd =
  36640                                         ExtractQRegister(instr, 22, 12);
  36641                                     if ((instr & 1) != 0) {
  36642                                       UnallocatedT32(instr);
  36643                                       return;
  36644                                     }
  36645                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  36646                                     uint32_t imm6 = (instr >> 16) & 0x3f;
  36647                                     uint32_t imm =
  36648                                         (dt.IsSize(64) ? 64
  36649                                                        : (dt.GetSize() * 2)) -
  36650                                         imm6;
  36651                                     // VSRI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36652                                     vsri(CurrentCond(),
  36653                                          dt,
  36654                                          QRegister(rd),
  36655                                          QRegister(rm),
  36656                                          imm);
  36657                                   } else {
  36658                                     UnallocatedT32(instr);
  36659                                   }
  36660                                   break;
  36661                                 }
  36662                                 case 0x00000100: {
  36663                                   // 0xef800550
  36664                                   switch (instr & 0x10000000) {
  36665                                     case 0x00000000: {
  36666                                       // 0xef800550
  36667                                       if (((instr & 0x380080) == 0x0)) {
  36668                                         UnallocatedT32(instr);
  36669                                         return;
  36670                                       }
  36671                                       DataType dt = Dt_L_imm6_3_Decode(
  36672                                           ((instr >> 19) & 0x7) |
  36673                                           ((instr >> 4) & 0x8));
  36674                                       if (dt.Is(kDataTypeValueInvalid)) {
  36675                                         UnallocatedT32(instr);
  36676                                         return;
  36677                                       }
  36678                                       if (((instr >> 12) & 1) != 0) {
  36679                                         UnallocatedT32(instr);
  36680                                         return;
  36681                                       }
  36682                                       unsigned rd =
  36683                                           ExtractQRegister(instr, 22, 12);
  36684                                       if ((instr & 1) != 0) {
  36685                                         UnallocatedT32(instr);
  36686                                         return;
  36687                                       }
  36688                                       unsigned rm =
  36689                                           ExtractQRegister(instr, 5, 0);
  36690                                       uint32_t imm6 = (instr >> 16) & 0x3f;
  36691                                       uint32_t imm =
  36692                                           imm6 -
  36693                                           (dt.IsSize(64) ? 0 : dt.GetSize());
  36694                                       // VSHL{<c>}{<q>}.I<size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36695                                       vshl(CurrentCond(),
  36696                                            dt,
  36697                                            QRegister(rd),
  36698                                            QRegister(rm),
  36699                                            imm);
  36700                                       break;
  36701                                     }
  36702                                     case 0x10000000: {
  36703                                       // 0xff800550
  36704                                       if (((instr & 0x380080) == 0x0)) {
  36705                                         UnallocatedT32(instr);
  36706                                         return;
  36707                                       }
  36708                                       DataType dt = Dt_L_imm6_4_Decode(
  36709                                           ((instr >> 19) & 0x7) |
  36710                                           ((instr >> 4) & 0x8));
  36711                                       if (dt.Is(kDataTypeValueInvalid)) {
  36712                                         UnallocatedT32(instr);
  36713                                         return;
  36714                                       }
  36715                                       if (((instr >> 12) & 1) != 0) {
  36716                                         UnallocatedT32(instr);
  36717                                         return;
  36718                                       }
  36719                                       unsigned rd =
  36720                                           ExtractQRegister(instr, 22, 12);
  36721                                       if ((instr & 1) != 0) {
  36722                                         UnallocatedT32(instr);
  36723                                         return;
  36724                                       }
  36725                                       unsigned rm =
  36726                                           ExtractQRegister(instr, 5, 0);
  36727                                       uint32_t imm6 = (instr >> 16) & 0x3f;
  36728                                       uint32_t imm =
  36729                                           imm6 -
  36730                                           (dt.IsSize(64) ? 0 : dt.GetSize());
  36731                                       // VSLI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36732                                       vsli(CurrentCond(),
  36733                                            dt,
  36734                                            QRegister(rd),
  36735                                            QRegister(rm),
  36736                                            imm);
  36737                                       break;
  36738                                     }
  36739                                   }
  36740                                   break;
  36741                                 }
  36742                                 case 0x00000200: {
  36743                                   // 0xef800650
  36744                                   if (((instr & 0x380080) == 0x0)) {
  36745                                     UnallocatedT32(instr);
  36746                                     return;
  36747                                   }
  36748                                   DataType dt =
  36749                                       Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
  36750                                                              ((instr >> 4) &
  36751                                                               0x8),
  36752                                                          (instr >> 28) & 0x1);
  36753                                   if (dt.Is(kDataTypeValueInvalid)) {
  36754                                     UnallocatedT32(instr);
  36755                                     return;
  36756                                   }
  36757                                   if (((instr >> 12) & 1) != 0) {
  36758                                     UnallocatedT32(instr);
  36759                                     return;
  36760                                   }
  36761                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  36762                                   if ((instr & 1) != 0) {
  36763                                     UnallocatedT32(instr);
  36764                                     return;
  36765                                   }
  36766                                   unsigned rm = ExtractQRegister(instr, 5, 0);
  36767                                   uint32_t imm6 = (instr >> 16) & 0x3f;
  36768                                   uint32_t imm =
  36769                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
  36770                                   // VQSHLU{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36771                                   vqshlu(CurrentCond(),
  36772                                          dt,
  36773                                          QRegister(rd),
  36774                                          QRegister(rm),
  36775                                          imm);
  36776                                   break;
  36777                                 }
  36778                                 case 0x00000300: {
  36779                                   // 0xef800750
  36780                                   if (((instr & 0x380080) == 0x0)) {
  36781                                     UnallocatedT32(instr);
  36782                                     return;
  36783                                   }
  36784                                   DataType dt =
  36785                                       Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  36786                                                              ((instr >> 4) &
  36787                                                               0x8),
  36788                                                          (instr >> 28) & 0x1);
  36789                                   if (dt.Is(kDataTypeValueInvalid)) {
  36790                                     UnallocatedT32(instr);
  36791                                     return;
  36792                                   }
  36793                                   if (((instr >> 12) & 1) != 0) {
  36794                                     UnallocatedT32(instr);
  36795                                     return;
  36796                                   }
  36797                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  36798                                   if ((instr & 1) != 0) {
  36799                                     UnallocatedT32(instr);
  36800                                     return;
  36801                                   }
  36802                                   unsigned rm = ExtractQRegister(instr, 5, 0);
  36803                                   uint32_t imm6 = (instr >> 16) & 0x3f;
  36804                                   uint32_t imm =
  36805                                       imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
  36806                                   // VQSHL{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36807                                   vqshl(CurrentCond(),
  36808                                         dt,
  36809                                         QRegister(rd),
  36810                                         QRegister(rm),
  36811                                         imm);
  36812                                   break;
  36813                                 }
  36814                               }
  36815                               break;
  36816                             }
  36817                           }
  36818                           break;
  36819                         }
  36820                         case 0x00000800: {
  36821                           // 0xef800850
  36822                           switch (instr & 0x00000080) {
  36823                             case 0x00000000: {
  36824                               // 0xef800850
  36825                               switch (instr & 0x00380000) {
  36826                                 case 0x00000000: {
  36827                                   // 0xef800850
  36828                                   switch (instr & 0x00000100) {
  36829                                     case 0x00000000: {
  36830                                       // 0xef800850
  36831                                       switch (instr & 0x00000200) {
  36832                                         default: {
  36833                                           switch (instr & 0x00000020) {
  36834                                             case 0x00000020: {
  36835                                               // 0xef800870
  36836                                               if (((instr & 0xd00) == 0x100) ||
  36837                                                   ((instr & 0xd00) == 0x500) ||
  36838                                                   ((instr & 0xd00) == 0x900) ||
  36839                                                   ((instr & 0xe00) == 0xe00)) {
  36840                                                 UnallocatedT32(instr);
  36841                                                 return;
  36842                                               }
  36843                                               unsigned cmode =
  36844                                                   (instr >> 8) & 0xf;
  36845                                               DataType dt =
  36846                                                   ImmediateVmvn::DecodeDt(
  36847                                                       cmode);
  36848                                               if (dt.Is(
  36849                                                       kDataTypeValueInvalid)) {
  36850                                                 UnallocatedT32(instr);
  36851                                                 return;
  36852                                               }
  36853                                               if (((instr >> 12) & 1) != 0) {
  36854                                                 UnallocatedT32(instr);
  36855                                                 return;
  36856                                               }
  36857                                               unsigned rd =
  36858                                                   ExtractQRegister(instr,
  36859                                                                    22,
  36860                                                                    12);
  36861                                               QOperand imm = ImmediateVmvn::
  36862                                                   DecodeImmediate(cmode,
  36863                                                                   (instr &
  36864                                                                    0xf) |
  36865                                                                       ((instr >>
  36866                                                                         12) &
  36867                                                                        0x70) |
  36868                                                                       ((instr >>
  36869                                                                         21) &
  36870                                                                        0x80));
  36871                                               // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36872                                               vmvn(CurrentCond(),
  36873                                                    dt,
  36874                                                    QRegister(rd),
  36875                                                    imm);
  36876                                               break;
  36877                                             }
  36878                                             default: {
  36879                                               if (((instr & 0x920) == 0x100) ||
  36880                                                   ((instr & 0x520) == 0x100) ||
  36881                                                   ((instr & 0x820) == 0x20) ||
  36882                                                   ((instr & 0x420) == 0x20) ||
  36883                                                   ((instr & 0x220) == 0x20) ||
  36884                                                   ((instr & 0x120) == 0x120)) {
  36885                                                 UnallocatedT32(instr);
  36886                                                 return;
  36887                                               }
  36888                                               unsigned cmode =
  36889                                                   ((instr >> 8) & 0xf) |
  36890                                                   ((instr >> 1) & 0x10);
  36891                                               DataType dt =
  36892                                                   ImmediateVmov::DecodeDt(
  36893                                                       cmode);
  36894                                               if (dt.Is(
  36895                                                       kDataTypeValueInvalid)) {
  36896                                                 UnallocatedT32(instr);
  36897                                                 return;
  36898                                               }
  36899                                               if (((instr >> 12) & 1) != 0) {
  36900                                                 UnallocatedT32(instr);
  36901                                                 return;
  36902                                               }
  36903                                               unsigned rd =
  36904                                                   ExtractQRegister(instr,
  36905                                                                    22,
  36906                                                                    12);
  36907                                               QOperand imm = ImmediateVmov::
  36908                                                   DecodeImmediate(cmode,
  36909                                                                   (instr &
  36910                                                                    0xf) |
  36911                                                                       ((instr >>
  36912                                                                         12) &
  36913                                                                        0x70) |
  36914                                                                       ((instr >>
  36915                                                                         21) &
  36916                                                                        0x80));
  36917                                               // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36918                                               vmov(CurrentCond(),
  36919                                                    dt,
  36920                                                    QRegister(rd),
  36921                                                    imm);
  36922                                               break;
  36923                                             }
  36924                                           }
  36925                                           break;
  36926                                         }
  36927                                       }
  36928                                       break;
  36929                                     }
  36930                                     case 0x00000100: {
  36931                                       // 0xef800950
  36932                                       switch (instr & 0x00000020) {
  36933                                         case 0x00000000: {
  36934                                           // 0xef800950
  36935                                           if (((instr & 0x100) == 0x0) ||
  36936                                               ((instr & 0xc00) == 0xc00)) {
  36937                                             UnallocatedT32(instr);
  36938                                             return;
  36939                                           }
  36940                                           unsigned cmode = (instr >> 8) & 0xf;
  36941                                           DataType dt =
  36942                                               ImmediateVorr::DecodeDt(cmode);
  36943                                           if (dt.Is(kDataTypeValueInvalid)) {
  36944                                             UnallocatedT32(instr);
  36945                                             return;
  36946                                           }
  36947                                           if (((instr >> 12) & 1) != 0) {
  36948                                             UnallocatedT32(instr);
  36949                                             return;
  36950                                           }
  36951                                           unsigned rd =
  36952                                               ExtractQRegister(instr, 22, 12);
  36953                                           QOperand imm =
  36954                                               ImmediateVorr::DecodeImmediate(
  36955                                                   cmode,
  36956                                                   (instr & 0xf) |
  36957                                                       ((instr >> 12) & 0x70) |
  36958                                                       ((instr >> 21) & 0x80));
  36959                                           // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36960                                           vorr(CurrentCond(),
  36961                                                dt,
  36962                                                QRegister(rd),
  36963                                                QRegister(rd),
  36964                                                imm);
  36965                                           break;
  36966                                         }
  36967                                         case 0x00000020: {
  36968                                           // 0xef800970
  36969                                           if (((instr & 0x100) == 0x0) ||
  36970                                               ((instr & 0xc00) == 0xc00)) {
  36971                                             UnallocatedT32(instr);
  36972                                             return;
  36973                                           }
  36974                                           unsigned cmode = (instr >> 8) & 0xf;
  36975                                           DataType dt =
  36976                                               ImmediateVbic::DecodeDt(cmode);
  36977                                           if (dt.Is(kDataTypeValueInvalid)) {
  36978                                             UnallocatedT32(instr);
  36979                                             return;
  36980                                           }
  36981                                           if (((instr >> 12) & 1) != 0) {
  36982                                             UnallocatedT32(instr);
  36983                                             return;
  36984                                           }
  36985                                           unsigned rd =
  36986                                               ExtractQRegister(instr, 22, 12);
  36987                                           QOperand imm =
  36988                                               ImmediateVbic::DecodeImmediate(
  36989                                                   cmode,
  36990                                                   (instr & 0xf) |
  36991                                                       ((instr >> 12) & 0x70) |
  36992                                                       ((instr >> 21) & 0x80));
  36993                                           // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length)
  36994                                           vbic(CurrentCond(),
  36995                                                dt,
  36996                                                QRegister(rd),
  36997                                                QRegister(rd),
  36998                                                imm);
  36999                                           break;
  37000                                         }
  37001                                       }
  37002                                       break;
  37003                                     }
  37004                                   }
  37005                                   break;
  37006                                 }
  37007                                 default: {
  37008                                   switch (instr & 0x00000300) {
  37009                                     case 0x00000000: {
  37010                                       // 0xef800850
  37011                                       switch (instr & 0x10000000) {
  37012                                         case 0x00000000: {
  37013                                           // 0xef800850
  37014                                           if (((instr & 0x380000) == 0x0)) {
  37015                                             UnallocatedT32(instr);
  37016                                             return;
  37017                                           }
  37018                                           DataType dt = Dt_imm6_3_Decode(
  37019                                               (instr >> 19) & 0x7);
  37020                                           if (dt.Is(kDataTypeValueInvalid)) {
  37021                                             UnallocatedT32(instr);
  37022                                             return;
  37023                                           }
  37024                                           unsigned rd =
  37025                                               ExtractDRegister(instr, 22, 12);
  37026                                           if ((instr & 1) != 0) {
  37027                                             UnallocatedT32(instr);
  37028                                             return;
  37029                                           }
  37030                                           unsigned rm =
  37031                                               ExtractQRegister(instr, 5, 0);
  37032                                           uint32_t imm6 = (instr >> 16) & 0x3f;
  37033                                           uint32_t imm = dt.GetSize() - imm6;
  37034                                           // VRSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37035                                           vrshrn(CurrentCond(),
  37036                                                  dt,
  37037                                                  DRegister(rd),
  37038                                                  QRegister(rm),
  37039                                                  imm);
  37040                                           break;
  37041                                         }
  37042                                         case 0x10000000: {
  37043                                           // 0xff800850
  37044                                           if (((instr & 0x380000) == 0x0)) {
  37045                                             UnallocatedT32(instr);
  37046                                             return;
  37047                                           }
  37048                                           DataType dt =
  37049                                               Dt_imm6_2_Decode((instr >> 19) &
  37050                                                                    0x7,
  37051                                                                (instr >> 28) &
  37052                                                                    0x1);
  37053                                           if (dt.Is(kDataTypeValueInvalid)) {
  37054                                             UnallocatedT32(instr);
  37055                                             return;
  37056                                           }
  37057                                           unsigned rd =
  37058                                               ExtractDRegister(instr, 22, 12);
  37059                                           if ((instr & 1) != 0) {
  37060                                             UnallocatedT32(instr);
  37061                                             return;
  37062                                           }
  37063                                           unsigned rm =
  37064                                               ExtractQRegister(instr, 5, 0);
  37065                                           uint32_t imm6 = (instr >> 16) & 0x3f;
  37066                                           uint32_t imm = dt.GetSize() - imm6;
  37067                                           // VQRSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37068                                           vqrshrun(CurrentCond(),
  37069                                                    dt,
  37070                                                    DRegister(rd),
  37071                                                    QRegister(rm),
  37072                                                    imm);
  37073                                           break;
  37074                                         }
  37075                                       }
  37076                                       break;
  37077                                     }
  37078                                     case 0x00000100: {
  37079                                       // 0xef800950
  37080                                       if (((instr & 0x380000) == 0x0)) {
  37081                                         UnallocatedT32(instr);
  37082                                         return;
  37083                                       }
  37084                                       DataType dt =
  37085                                           Dt_imm6_1_Decode((instr >> 19) & 0x7,
  37086                                                            (instr >> 28) & 0x1);
  37087                                       if (dt.Is(kDataTypeValueInvalid)) {
  37088                                         UnallocatedT32(instr);
  37089                                         return;
  37090                                       }
  37091                                       unsigned rd =
  37092                                           ExtractDRegister(instr, 22, 12);
  37093                                       if ((instr & 1) != 0) {
  37094                                         UnallocatedT32(instr);
  37095                                         return;
  37096                                       }
  37097                                       unsigned rm =
  37098                                           ExtractQRegister(instr, 5, 0);
  37099                                       uint32_t imm6 = (instr >> 16) & 0x3f;
  37100                                       uint32_t imm = dt.GetSize() - imm6;
  37101                                       // VQRSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37102                                       vqrshrn(CurrentCond(),
  37103                                               dt,
  37104                                               DRegister(rd),
  37105                                               QRegister(rm),
  37106                                               imm);
  37107                                       break;
  37108                                     }
  37109                                     default:
  37110                                       UnallocatedT32(instr);
  37111                                       break;
  37112                                   }
  37113                                   break;
  37114                                 }
  37115                               }
  37116                               break;
  37117                             }
  37118                             default:
  37119                               UnallocatedT32(instr);
  37120                               break;
  37121                           }
  37122                           break;
  37123                         }
  37124                         case 0x00000c00: {
  37125                           // 0xef800c50
  37126                           switch (instr & 0x00000080) {
  37127                             case 0x00000000: {
  37128                               // 0xef800c50
  37129                               switch (instr & 0x00200000) {
  37130                                 case 0x00000000: {
  37131                                   // 0xef800c50
  37132                                   switch (instr & 0x00180000) {
  37133                                     case 0x00000000: {
  37134                                       // 0xef800c50
  37135                                       switch (instr & 0x00000300) {
  37136                                         case 0x00000200: {
  37137                                           // 0xef800e50
  37138                                           if (((instr & 0x920) == 0x100) ||
  37139                                               ((instr & 0x520) == 0x100) ||
  37140                                               ((instr & 0x820) == 0x20) ||
  37141                                               ((instr & 0x420) == 0x20) ||
  37142                                               ((instr & 0x220) == 0x20) ||
  37143                                               ((instr & 0x120) == 0x120)) {
  37144                                             UnallocatedT32(instr);
  37145                                             return;
  37146                                           }
  37147                                           unsigned cmode =
  37148                                               ((instr >> 8) & 0xf) |
  37149                                               ((instr >> 1) & 0x10);
  37150                                           DataType dt =
  37151                                               ImmediateVmov::DecodeDt(cmode);
  37152                                           if (dt.Is(kDataTypeValueInvalid)) {
  37153                                             UnallocatedT32(instr);
  37154                                             return;
  37155                                           }
  37156                                           if (((instr >> 12) & 1) != 0) {
  37157                                             UnallocatedT32(instr);
  37158                                             return;
  37159                                           }
  37160                                           unsigned rd =
  37161                                               ExtractQRegister(instr, 22, 12);
  37162                                           QOperand imm =
  37163                                               ImmediateVmov::DecodeImmediate(
  37164                                                   cmode,
  37165                                                   (instr & 0xf) |
  37166                                                       ((instr >> 12) & 0x70) |
  37167                                                       ((instr >> 21) & 0x80));
  37168                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37169                                           vmov(CurrentCond(),
  37170                                                dt,
  37171                                                QRegister(rd),
  37172                                                imm);
  37173                                           break;
  37174                                         }
  37175                                         case 0x00000300: {
  37176                                           // 0xef800f50
  37177                                           if (((instr & 0x920) == 0x100) ||
  37178                                               ((instr & 0x520) == 0x100) ||
  37179                                               ((instr & 0x820) == 0x20) ||
  37180                                               ((instr & 0x420) == 0x20) ||
  37181                                               ((instr & 0x220) == 0x20) ||
  37182                                               ((instr & 0x120) == 0x120)) {
  37183                                             UnallocatedT32(instr);
  37184                                             return;
  37185                                           }
  37186                                           unsigned cmode =
  37187                                               ((instr >> 8) & 0xf) |
  37188                                               ((instr >> 1) & 0x10);
  37189                                           DataType dt =
  37190                                               ImmediateVmov::DecodeDt(cmode);
  37191                                           if (dt.Is(kDataTypeValueInvalid)) {
  37192                                             UnallocatedT32(instr);
  37193                                             return;
  37194                                           }
  37195                                           if (((instr >> 12) & 1) != 0) {
  37196                                             UnallocatedT32(instr);
  37197                                             return;
  37198                                           }
  37199                                           unsigned rd =
  37200                                               ExtractQRegister(instr, 22, 12);
  37201                                           QOperand imm =
  37202                                               ImmediateVmov::DecodeImmediate(
  37203                                                   cmode,
  37204                                                   (instr & 0xf) |
  37205                                                       ((instr >> 12) & 0x70) |
  37206                                                       ((instr >> 21) & 0x80));
  37207                                           // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37208                                           vmov(CurrentCond(),
  37209                                                dt,
  37210                                                QRegister(rd),
  37211                                                imm);
  37212                                           break;
  37213                                         }
  37214                                         default: {
  37215                                           switch (instr & 0x00000020) {
  37216                                             case 0x00000020: {
  37217                                               // 0xef800c70
  37218                                               switch (instr & 0x00000f20) {
  37219                                                 case 0x00000000: {
  37220                                                   // 0xef800c50
  37221                                                   if (((instr & 0x920) ==
  37222                                                        0x100) ||
  37223                                                       ((instr & 0x520) ==
  37224                                                        0x100) ||
  37225                                                       ((instr & 0x820) ==
  37226                                                        0x20) ||
  37227                                                       ((instr & 0x420) ==
  37228                                                        0x20) ||
  37229                                                       ((instr & 0x220) ==
  37230                                                        0x20) ||
  37231                                                       ((instr & 0x120) ==
  37232                                                        0x120)) {
  37233                                                     UnallocatedT32(instr);
  37234                                                     return;
  37235                                                   }
  37236                                                   unsigned cmode =
  37237                                                       ((instr >> 8) & 0xf) |
  37238                                                       ((instr >> 1) & 0x10);
  37239                                                   DataType dt =
  37240                                                       ImmediateVmov::DecodeDt(
  37241                                                           cmode);
  37242                                                   if (dt.Is(
  37243                                                           kDataTypeValueInvalid)) {
  37244                                                     UnallocatedT32(instr);
  37245                                                     return;
  37246                                                   }
  37247                                                   if (((instr >> 12) & 1) !=
  37248                                                       0) {
  37249                                                     UnallocatedT32(instr);
  37250                                                     return;
  37251                                                   }
  37252                                                   unsigned rd =
  37253                                                       ExtractQRegister(instr,
  37254                                                                        22,
  37255                                                                        12);
  37256                                                   QOperand imm = ImmediateVmov::
  37257                                                       DecodeImmediate(
  37258                                                           cmode,
  37259                                                           (instr & 0xf) |
  37260                                                               ((instr >> 12) &
  37261                                                                0x70) |
  37262                                                               ((instr >> 21) &
  37263                                                                0x80));
  37264                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37265                                                   vmov(CurrentCond(),
  37266                                                        dt,
  37267                                                        QRegister(rd),
  37268                                                        imm);
  37269                                                   break;
  37270                                                 }
  37271                                                 case 0x00000020: {
  37272                                                   // 0xef800c70
  37273                                                   if (((instr & 0xd00) ==
  37274                                                        0x100) ||
  37275                                                       ((instr & 0xd00) ==
  37276                                                        0x500) ||
  37277                                                       ((instr & 0xd00) ==
  37278                                                        0x900) ||
  37279                                                       ((instr & 0xe00) ==
  37280                                                        0xe00)) {
  37281                                                     UnallocatedT32(instr);
  37282                                                     return;
  37283                                                   }
  37284                                                   unsigned cmode =
  37285                                                       (instr >> 8) & 0xf;
  37286                                                   DataType dt =
  37287                                                       ImmediateVmvn::DecodeDt(
  37288                                                           cmode);
  37289                                                   if (dt.Is(
  37290                                                           kDataTypeValueInvalid)) {
  37291                                                     UnallocatedT32(instr);
  37292                                                     return;
  37293                                                   }
  37294                                                   if (((instr >> 12) & 1) !=
  37295                                                       0) {
  37296                                                     UnallocatedT32(instr);
  37297                                                     return;
  37298                                                   }
  37299                                                   unsigned rd =
  37300                                                       ExtractQRegister(instr,
  37301                                                                        22,
  37302                                                                        12);
  37303                                                   QOperand imm = ImmediateVmvn::
  37304                                                       DecodeImmediate(
  37305                                                           cmode,
  37306                                                           (instr & 0xf) |
  37307                                                               ((instr >> 12) &
  37308                                                                0x70) |
  37309                                                               ((instr >> 21) &
  37310                                                                0x80));
  37311                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37312                                                   vmvn(CurrentCond(),
  37313                                                        dt,
  37314                                                        QRegister(rd),
  37315                                                        imm);
  37316                                                   break;
  37317                                                 }
  37318                                                 case 0x00000200: {
  37319                                                   // 0xef800e50
  37320                                                   if (((instr & 0x920) ==
  37321                                                        0x100) ||
  37322                                                       ((instr & 0x520) ==
  37323                                                        0x100) ||
  37324                                                       ((instr & 0x820) ==
  37325                                                        0x20) ||
  37326                                                       ((instr & 0x420) ==
  37327                                                        0x20) ||
  37328                                                       ((instr & 0x220) ==
  37329                                                        0x20) ||
  37330                                                       ((instr & 0x120) ==
  37331                                                        0x120)) {
  37332                                                     UnallocatedT32(instr);
  37333                                                     return;
  37334                                                   }
  37335                                                   unsigned cmode =
  37336                                                       ((instr >> 8) & 0xf) |
  37337                                                       ((instr >> 1) & 0x10);
  37338                                                   DataType dt =
  37339                                                       ImmediateVmov::DecodeDt(
  37340                                                           cmode);
  37341                                                   if (dt.Is(
  37342                                                           kDataTypeValueInvalid)) {
  37343                                                     UnallocatedT32(instr);
  37344                                                     return;
  37345                                                   }
  37346                                                   if (((instr >> 12) & 1) !=
  37347                                                       0) {
  37348                                                     UnallocatedT32(instr);
  37349                                                     return;
  37350                                                   }
  37351                                                   unsigned rd =
  37352                                                       ExtractQRegister(instr,
  37353                                                                        22,
  37354                                                                        12);
  37355                                                   QOperand imm = ImmediateVmov::
  37356                                                       DecodeImmediate(
  37357                                                           cmode,
  37358                                                           (instr & 0xf) |
  37359                                                               ((instr >> 12) &
  37360                                                                0x70) |
  37361                                                               ((instr >> 21) &
  37362                                                                0x80));
  37363                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37364                                                   vmov(CurrentCond(),
  37365                                                        dt,
  37366                                                        QRegister(rd),
  37367                                                        imm);
  37368                                                   break;
  37369                                                 }
  37370                                                 case 0x00000220: {
  37371                                                   // 0xef800e70
  37372                                                   if (((instr & 0xd00) ==
  37373                                                        0x100) ||
  37374                                                       ((instr & 0xd00) ==
  37375                                                        0x500) ||
  37376                                                       ((instr & 0xd00) ==
  37377                                                        0x900) ||
  37378                                                       ((instr & 0xe00) ==
  37379                                                        0xe00)) {
  37380                                                     UnallocatedT32(instr);
  37381                                                     return;
  37382                                                   }
  37383                                                   unsigned cmode =
  37384                                                       (instr >> 8) & 0xf;
  37385                                                   DataType dt =
  37386                                                       ImmediateVmvn::DecodeDt(
  37387                                                           cmode);
  37388                                                   if (dt.Is(
  37389                                                           kDataTypeValueInvalid)) {
  37390                                                     UnallocatedT32(instr);
  37391                                                     return;
  37392                                                   }
  37393                                                   if (((instr >> 12) & 1) !=
  37394                                                       0) {
  37395                                                     UnallocatedT32(instr);
  37396                                                     return;
  37397                                                   }
  37398                                                   unsigned rd =
  37399                                                       ExtractQRegister(instr,
  37400                                                                        22,
  37401                                                                        12);
  37402                                                   QOperand imm = ImmediateVmvn::
  37403                                                       DecodeImmediate(
  37404                                                           cmode,
  37405                                                           (instr & 0xf) |
  37406                                                               ((instr >> 12) &
  37407                                                                0x70) |
  37408                                                               ((instr >> 21) &
  37409                                                                0x80));
  37410                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37411                                                   vmvn(CurrentCond(),
  37412                                                        dt,
  37413                                                        QRegister(rd),
  37414                                                        imm);
  37415                                                   break;
  37416                                                 }
  37417                                                 case 0x00000400: {
  37418                                                   // 0xef800c50
  37419                                                   if (((instr & 0x920) ==
  37420                                                        0x100) ||
  37421                                                       ((instr & 0x520) ==
  37422                                                        0x100) ||
  37423                                                       ((instr & 0x820) ==
  37424                                                        0x20) ||
  37425                                                       ((instr & 0x420) ==
  37426                                                        0x20) ||
  37427                                                       ((instr & 0x220) ==
  37428                                                        0x20) ||
  37429                                                       ((instr & 0x120) ==
  37430                                                        0x120)) {
  37431                                                     UnallocatedT32(instr);
  37432                                                     return;
  37433                                                   }
  37434                                                   unsigned cmode =
  37435                                                       ((instr >> 8) & 0xf) |
  37436                                                       ((instr >> 1) & 0x10);
  37437                                                   DataType dt =
  37438                                                       ImmediateVmov::DecodeDt(
  37439                                                           cmode);
  37440                                                   if (dt.Is(
  37441                                                           kDataTypeValueInvalid)) {
  37442                                                     UnallocatedT32(instr);
  37443                                                     return;
  37444                                                   }
  37445                                                   if (((instr >> 12) & 1) !=
  37446                                                       0) {
  37447                                                     UnallocatedT32(instr);
  37448                                                     return;
  37449                                                   }
  37450                                                   unsigned rd =
  37451                                                       ExtractQRegister(instr,
  37452                                                                        22,
  37453                                                                        12);
  37454                                                   QOperand imm = ImmediateVmov::
  37455                                                       DecodeImmediate(
  37456                                                           cmode,
  37457                                                           (instr & 0xf) |
  37458                                                               ((instr >> 12) &
  37459                                                                0x70) |
  37460                                                               ((instr >> 21) &
  37461                                                                0x80));
  37462                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37463                                                   vmov(CurrentCond(),
  37464                                                        dt,
  37465                                                        QRegister(rd),
  37466                                                        imm);
  37467                                                   break;
  37468                                                 }
  37469                                                 case 0x00000420: {
  37470                                                   // 0xef800c70
  37471                                                   if (((instr & 0xd00) ==
  37472                                                        0x100) ||
  37473                                                       ((instr & 0xd00) ==
  37474                                                        0x500) ||
  37475                                                       ((instr & 0xd00) ==
  37476                                                        0x900) ||
  37477                                                       ((instr & 0xe00) ==
  37478                                                        0xe00)) {
  37479                                                     UnallocatedT32(instr);
  37480                                                     return;
  37481                                                   }
  37482                                                   unsigned cmode =
  37483                                                       (instr >> 8) & 0xf;
  37484                                                   DataType dt =
  37485                                                       ImmediateVmvn::DecodeDt(
  37486                                                           cmode);
  37487                                                   if (dt.Is(
  37488                                                           kDataTypeValueInvalid)) {
  37489                                                     UnallocatedT32(instr);
  37490                                                     return;
  37491                                                   }
  37492                                                   if (((instr >> 12) & 1) !=
  37493                                                       0) {
  37494                                                     UnallocatedT32(instr);
  37495                                                     return;
  37496                                                   }
  37497                                                   unsigned rd =
  37498                                                       ExtractQRegister(instr,
  37499                                                                        22,
  37500                                                                        12);
  37501                                                   QOperand imm = ImmediateVmvn::
  37502                                                       DecodeImmediate(
  37503                                                           cmode,
  37504                                                           (instr & 0xf) |
  37505                                                               ((instr >> 12) &
  37506                                                                0x70) |
  37507                                                               ((instr >> 21) &
  37508                                                                0x80));
  37509                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37510                                                   vmvn(CurrentCond(),
  37511                                                        dt,
  37512                                                        QRegister(rd),
  37513                                                        imm);
  37514                                                   break;
  37515                                                 }
  37516                                                 case 0x00000600: {
  37517                                                   // 0xef800e50
  37518                                                   if (((instr & 0x920) ==
  37519                                                        0x100) ||
  37520                                                       ((instr & 0x520) ==
  37521                                                        0x100) ||
  37522                                                       ((instr & 0x820) ==
  37523                                                        0x20) ||
  37524                                                       ((instr & 0x420) ==
  37525                                                        0x20) ||
  37526                                                       ((instr & 0x220) ==
  37527                                                        0x20) ||
  37528                                                       ((instr & 0x120) ==
  37529                                                        0x120)) {
  37530                                                     UnallocatedT32(instr);
  37531                                                     return;
  37532                                                   }
  37533                                                   unsigned cmode =
  37534                                                       ((instr >> 8) & 0xf) |
  37535                                                       ((instr >> 1) & 0x10);
  37536                                                   DataType dt =
  37537                                                       ImmediateVmov::DecodeDt(
  37538                                                           cmode);
  37539                                                   if (dt.Is(
  37540                                                           kDataTypeValueInvalid)) {
  37541                                                     UnallocatedT32(instr);
  37542                                                     return;
  37543                                                   }
  37544                                                   if (((instr >> 12) & 1) !=
  37545                                                       0) {
  37546                                                     UnallocatedT32(instr);
  37547                                                     return;
  37548                                                   }
  37549                                                   unsigned rd =
  37550                                                       ExtractQRegister(instr,
  37551                                                                        22,
  37552                                                                        12);
  37553                                                   QOperand imm = ImmediateVmov::
  37554                                                       DecodeImmediate(
  37555                                                           cmode,
  37556                                                           (instr & 0xf) |
  37557                                                               ((instr >> 12) &
  37558                                                                0x70) |
  37559                                                               ((instr >> 21) &
  37560                                                                0x80));
  37561                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37562                                                   vmov(CurrentCond(),
  37563                                                        dt,
  37564                                                        QRegister(rd),
  37565                                                        imm);
  37566                                                   break;
  37567                                                 }
  37568                                                 case 0x00000620: {
  37569                                                   // 0xef800e70
  37570                                                   if (((instr & 0xd00) ==
  37571                                                        0x100) ||
  37572                                                       ((instr & 0xd00) ==
  37573                                                        0x500) ||
  37574                                                       ((instr & 0xd00) ==
  37575                                                        0x900) ||
  37576                                                       ((instr & 0xe00) ==
  37577                                                        0xe00)) {
  37578                                                     UnallocatedT32(instr);
  37579                                                     return;
  37580                                                   }
  37581                                                   unsigned cmode =
  37582                                                       (instr >> 8) & 0xf;
  37583                                                   DataType dt =
  37584                                                       ImmediateVmvn::DecodeDt(
  37585                                                           cmode);
  37586                                                   if (dt.Is(
  37587                                                           kDataTypeValueInvalid)) {
  37588                                                     UnallocatedT32(instr);
  37589                                                     return;
  37590                                                   }
  37591                                                   if (((instr >> 12) & 1) !=
  37592                                                       0) {
  37593                                                     UnallocatedT32(instr);
  37594                                                     return;
  37595                                                   }
  37596                                                   unsigned rd =
  37597                                                       ExtractQRegister(instr,
  37598                                                                        22,
  37599                                                                        12);
  37600                                                   QOperand imm = ImmediateVmvn::
  37601                                                       DecodeImmediate(
  37602                                                           cmode,
  37603                                                           (instr & 0xf) |
  37604                                                               ((instr >> 12) &
  37605                                                                0x70) |
  37606                                                               ((instr >> 21) &
  37607                                                                0x80));
  37608                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37609                                                   vmvn(CurrentCond(),
  37610                                                        dt,
  37611                                                        QRegister(rd),
  37612                                                        imm);
  37613                                                   break;
  37614                                                 }
  37615                                                 case 0x00000800: {
  37616                                                   // 0xef800c50
  37617                                                   if (((instr & 0x920) ==
  37618                                                        0x100) ||
  37619                                                       ((instr & 0x520) ==
  37620                                                        0x100) ||
  37621                                                       ((instr & 0x820) ==
  37622                                                        0x20) ||
  37623                                                       ((instr & 0x420) ==
  37624                                                        0x20) ||
  37625                                                       ((instr & 0x220) ==
  37626                                                        0x20) ||
  37627                                                       ((instr & 0x120) ==
  37628                                                        0x120)) {
  37629                                                     UnallocatedT32(instr);
  37630                                                     return;
  37631                                                   }
  37632                                                   unsigned cmode =
  37633                                                       ((instr >> 8) & 0xf) |
  37634                                                       ((instr >> 1) & 0x10);
  37635                                                   DataType dt =
  37636                                                       ImmediateVmov::DecodeDt(
  37637                                                           cmode);
  37638                                                   if (dt.Is(
  37639                                                           kDataTypeValueInvalid)) {
  37640                                                     UnallocatedT32(instr);
  37641                                                     return;
  37642                                                   }
  37643                                                   if (((instr >> 12) & 1) !=
  37644                                                       0) {
  37645                                                     UnallocatedT32(instr);
  37646                                                     return;
  37647                                                   }
  37648                                                   unsigned rd =
  37649                                                       ExtractQRegister(instr,
  37650                                                                        22,
  37651                                                                        12);
  37652                                                   QOperand imm = ImmediateVmov::
  37653                                                       DecodeImmediate(
  37654                                                           cmode,
  37655                                                           (instr & 0xf) |
  37656                                                               ((instr >> 12) &
  37657                                                                0x70) |
  37658                                                               ((instr >> 21) &
  37659                                                                0x80));
  37660                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37661                                                   vmov(CurrentCond(),
  37662                                                        dt,
  37663                                                        QRegister(rd),
  37664                                                        imm);
  37665                                                   break;
  37666                                                 }
  37667                                                 case 0x00000820: {
  37668                                                   // 0xef800c70
  37669                                                   if (((instr & 0xd00) ==
  37670                                                        0x100) ||
  37671                                                       ((instr & 0xd00) ==
  37672                                                        0x500) ||
  37673                                                       ((instr & 0xd00) ==
  37674                                                        0x900) ||
  37675                                                       ((instr & 0xe00) ==
  37676                                                        0xe00)) {
  37677                                                     UnallocatedT32(instr);
  37678                                                     return;
  37679                                                   }
  37680                                                   unsigned cmode =
  37681                                                       (instr >> 8) & 0xf;
  37682                                                   DataType dt =
  37683                                                       ImmediateVmvn::DecodeDt(
  37684                                                           cmode);
  37685                                                   if (dt.Is(
  37686                                                           kDataTypeValueInvalid)) {
  37687                                                     UnallocatedT32(instr);
  37688                                                     return;
  37689                                                   }
  37690                                                   if (((instr >> 12) & 1) !=
  37691                                                       0) {
  37692                                                     UnallocatedT32(instr);
  37693                                                     return;
  37694                                                   }
  37695                                                   unsigned rd =
  37696                                                       ExtractQRegister(instr,
  37697                                                                        22,
  37698                                                                        12);
  37699                                                   QOperand imm = ImmediateVmvn::
  37700                                                       DecodeImmediate(
  37701                                                           cmode,
  37702                                                           (instr & 0xf) |
  37703                                                               ((instr >> 12) &
  37704                                                                0x70) |
  37705                                                               ((instr >> 21) &
  37706                                                                0x80));
  37707                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37708                                                   vmvn(CurrentCond(),
  37709                                                        dt,
  37710                                                        QRegister(rd),
  37711                                                        imm);
  37712                                                   break;
  37713                                                 }
  37714                                                 case 0x00000a00: {
  37715                                                   // 0xef800e50
  37716                                                   if (((instr & 0x920) ==
  37717                                                        0x100) ||
  37718                                                       ((instr & 0x520) ==
  37719                                                        0x100) ||
  37720                                                       ((instr & 0x820) ==
  37721                                                        0x20) ||
  37722                                                       ((instr & 0x420) ==
  37723                                                        0x20) ||
  37724                                                       ((instr & 0x220) ==
  37725                                                        0x20) ||
  37726                                                       ((instr & 0x120) ==
  37727                                                        0x120)) {
  37728                                                     UnallocatedT32(instr);
  37729                                                     return;
  37730                                                   }
  37731                                                   unsigned cmode =
  37732                                                       ((instr >> 8) & 0xf) |
  37733                                                       ((instr >> 1) & 0x10);
  37734                                                   DataType dt =
  37735                                                       ImmediateVmov::DecodeDt(
  37736                                                           cmode);
  37737                                                   if (dt.Is(
  37738                                                           kDataTypeValueInvalid)) {
  37739                                                     UnallocatedT32(instr);
  37740                                                     return;
  37741                                                   }
  37742                                                   if (((instr >> 12) & 1) !=
  37743                                                       0) {
  37744                                                     UnallocatedT32(instr);
  37745                                                     return;
  37746                                                   }
  37747                                                   unsigned rd =
  37748                                                       ExtractQRegister(instr,
  37749                                                                        22,
  37750                                                                        12);
  37751                                                   QOperand imm = ImmediateVmov::
  37752                                                       DecodeImmediate(
  37753                                                           cmode,
  37754                                                           (instr & 0xf) |
  37755                                                               ((instr >> 12) &
  37756                                                                0x70) |
  37757                                                               ((instr >> 21) &
  37758                                                                0x80));
  37759                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37760                                                   vmov(CurrentCond(),
  37761                                                        dt,
  37762                                                        QRegister(rd),
  37763                                                        imm);
  37764                                                   break;
  37765                                                 }
  37766                                                 case 0x00000a20: {
  37767                                                   // 0xef800e70
  37768                                                   if (((instr & 0xd00) ==
  37769                                                        0x100) ||
  37770                                                       ((instr & 0xd00) ==
  37771                                                        0x500) ||
  37772                                                       ((instr & 0xd00) ==
  37773                                                        0x900) ||
  37774                                                       ((instr & 0xe00) ==
  37775                                                        0xe00)) {
  37776                                                     UnallocatedT32(instr);
  37777                                                     return;
  37778                                                   }
  37779                                                   unsigned cmode =
  37780                                                       (instr >> 8) & 0xf;
  37781                                                   DataType dt =
  37782                                                       ImmediateVmvn::DecodeDt(
  37783                                                           cmode);
  37784                                                   if (dt.Is(
  37785                                                           kDataTypeValueInvalid)) {
  37786                                                     UnallocatedT32(instr);
  37787                                                     return;
  37788                                                   }
  37789                                                   if (((instr >> 12) & 1) !=
  37790                                                       0) {
  37791                                                     UnallocatedT32(instr);
  37792                                                     return;
  37793                                                   }
  37794                                                   unsigned rd =
  37795                                                       ExtractQRegister(instr,
  37796                                                                        22,
  37797                                                                        12);
  37798                                                   QOperand imm = ImmediateVmvn::
  37799                                                       DecodeImmediate(
  37800                                                           cmode,
  37801                                                           (instr & 0xf) |
  37802                                                               ((instr >> 12) &
  37803                                                                0x70) |
  37804                                                               ((instr >> 21) &
  37805                                                                0x80));
  37806                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37807                                                   vmvn(CurrentCond(),
  37808                                                        dt,
  37809                                                        QRegister(rd),
  37810                                                        imm);
  37811                                                   break;
  37812                                                 }
  37813                                                 case 0x00000c00: {
  37814                                                   // 0xef800c50
  37815                                                   if (((instr & 0x920) ==
  37816                                                        0x100) ||
  37817                                                       ((instr & 0x520) ==
  37818                                                        0x100) ||
  37819                                                       ((instr & 0x820) ==
  37820                                                        0x20) ||
  37821                                                       ((instr & 0x420) ==
  37822                                                        0x20) ||
  37823                                                       ((instr & 0x220) ==
  37824                                                        0x20) ||
  37825                                                       ((instr & 0x120) ==
  37826                                                        0x120)) {
  37827                                                     UnallocatedT32(instr);
  37828                                                     return;
  37829                                                   }
  37830                                                   unsigned cmode =
  37831                                                       ((instr >> 8) & 0xf) |
  37832                                                       ((instr >> 1) & 0x10);
  37833                                                   DataType dt =
  37834                                                       ImmediateVmov::DecodeDt(
  37835                                                           cmode);
  37836                                                   if (dt.Is(
  37837                                                           kDataTypeValueInvalid)) {
  37838                                                     UnallocatedT32(instr);
  37839                                                     return;
  37840                                                   }
  37841                                                   if (((instr >> 12) & 1) !=
  37842                                                       0) {
  37843                                                     UnallocatedT32(instr);
  37844                                                     return;
  37845                                                   }
  37846                                                   unsigned rd =
  37847                                                       ExtractQRegister(instr,
  37848                                                                        22,
  37849                                                                        12);
  37850                                                   QOperand imm = ImmediateVmov::
  37851                                                       DecodeImmediate(
  37852                                                           cmode,
  37853                                                           (instr & 0xf) |
  37854                                                               ((instr >> 12) &
  37855                                                                0x70) |
  37856                                                               ((instr >> 21) &
  37857                                                                0x80));
  37858                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37859                                                   vmov(CurrentCond(),
  37860                                                        dt,
  37861                                                        QRegister(rd),
  37862                                                        imm);
  37863                                                   break;
  37864                                                 }
  37865                                                 case 0x00000c20: {
  37866                                                   // 0xef800c70
  37867                                                   if (((instr & 0xd00) ==
  37868                                                        0x100) ||
  37869                                                       ((instr & 0xd00) ==
  37870                                                        0x500) ||
  37871                                                       ((instr & 0xd00) ==
  37872                                                        0x900) ||
  37873                                                       ((instr & 0xe00) ==
  37874                                                        0xe00)) {
  37875                                                     UnallocatedT32(instr);
  37876                                                     return;
  37877                                                   }
  37878                                                   unsigned cmode =
  37879                                                       (instr >> 8) & 0xf;
  37880                                                   DataType dt =
  37881                                                       ImmediateVmvn::DecodeDt(
  37882                                                           cmode);
  37883                                                   if (dt.Is(
  37884                                                           kDataTypeValueInvalid)) {
  37885                                                     UnallocatedT32(instr);
  37886                                                     return;
  37887                                                   }
  37888                                                   if (((instr >> 12) & 1) !=
  37889                                                       0) {
  37890                                                     UnallocatedT32(instr);
  37891                                                     return;
  37892                                                   }
  37893                                                   unsigned rd =
  37894                                                       ExtractQRegister(instr,
  37895                                                                        22,
  37896                                                                        12);
  37897                                                   QOperand imm = ImmediateVmvn::
  37898                                                       DecodeImmediate(
  37899                                                           cmode,
  37900                                                           (instr & 0xf) |
  37901                                                               ((instr >> 12) &
  37902                                                                0x70) |
  37903                                                               ((instr >> 21) &
  37904                                                                0x80));
  37905                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37906                                                   vmvn(CurrentCond(),
  37907                                                        dt,
  37908                                                        QRegister(rd),
  37909                                                        imm);
  37910                                                   break;
  37911                                                 }
  37912                                                 case 0x00000d00: {
  37913                                                   // 0xef800d50
  37914                                                   if (((instr & 0x920) ==
  37915                                                        0x100) ||
  37916                                                       ((instr & 0x520) ==
  37917                                                        0x100) ||
  37918                                                       ((instr & 0x820) ==
  37919                                                        0x20) ||
  37920                                                       ((instr & 0x420) ==
  37921                                                        0x20) ||
  37922                                                       ((instr & 0x220) ==
  37923                                                        0x20) ||
  37924                                                       ((instr & 0x120) ==
  37925                                                        0x120)) {
  37926                                                     UnallocatedT32(instr);
  37927                                                     return;
  37928                                                   }
  37929                                                   unsigned cmode =
  37930                                                       ((instr >> 8) & 0xf) |
  37931                                                       ((instr >> 1) & 0x10);
  37932                                                   DataType dt =
  37933                                                       ImmediateVmov::DecodeDt(
  37934                                                           cmode);
  37935                                                   if (dt.Is(
  37936                                                           kDataTypeValueInvalid)) {
  37937                                                     UnallocatedT32(instr);
  37938                                                     return;
  37939                                                   }
  37940                                                   if (((instr >> 12) & 1) !=
  37941                                                       0) {
  37942                                                     UnallocatedT32(instr);
  37943                                                     return;
  37944                                                   }
  37945                                                   unsigned rd =
  37946                                                       ExtractQRegister(instr,
  37947                                                                        22,
  37948                                                                        12);
  37949                                                   QOperand imm = ImmediateVmov::
  37950                                                       DecodeImmediate(
  37951                                                           cmode,
  37952                                                           (instr & 0xf) |
  37953                                                               ((instr >> 12) &
  37954                                                                0x70) |
  37955                                                               ((instr >> 21) &
  37956                                                                0x80));
  37957                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  37958                                                   vmov(CurrentCond(),
  37959                                                        dt,
  37960                                                        QRegister(rd),
  37961                                                        imm);
  37962                                                   break;
  37963                                                 }
  37964                                                 case 0x00000d20: {
  37965                                                   // 0xef800d70
  37966                                                   if (((instr & 0xd00) ==
  37967                                                        0x100) ||
  37968                                                       ((instr & 0xd00) ==
  37969                                                        0x500) ||
  37970                                                       ((instr & 0xd00) ==
  37971                                                        0x900) ||
  37972                                                       ((instr & 0xe00) ==
  37973                                                        0xe00)) {
  37974                                                     UnallocatedT32(instr);
  37975                                                     return;
  37976                                                   }
  37977                                                   unsigned cmode =
  37978                                                       (instr >> 8) & 0xf;
  37979                                                   DataType dt =
  37980                                                       ImmediateVmvn::DecodeDt(
  37981                                                           cmode);
  37982                                                   if (dt.Is(
  37983                                                           kDataTypeValueInvalid)) {
  37984                                                     UnallocatedT32(instr);
  37985                                                     return;
  37986                                                   }
  37987                                                   if (((instr >> 12) & 1) !=
  37988                                                       0) {
  37989                                                     UnallocatedT32(instr);
  37990                                                     return;
  37991                                                   }
  37992                                                   unsigned rd =
  37993                                                       ExtractQRegister(instr,
  37994                                                                        22,
  37995                                                                        12);
  37996                                                   QOperand imm = ImmediateVmvn::
  37997                                                       DecodeImmediate(
  37998                                                           cmode,
  37999                                                           (instr & 0xf) |
  38000                                                               ((instr >> 12) &
  38001                                                                0x70) |
  38002                                                               ((instr >> 21) &
  38003                                                                0x80));
  38004                                                   // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  38005                                                   vmvn(CurrentCond(),
  38006                                                        dt,
  38007                                                        QRegister(rd),
  38008                                                        imm);
  38009                                                   break;
  38010                                                 }
  38011                                                 case 0x00000e00: {
  38012                                                   // 0xef800e50
  38013                                                   if (((instr & 0x920) ==
  38014                                                        0x100) ||
  38015                                                       ((instr & 0x520) ==
  38016                                                        0x100) ||
  38017                                                       ((instr & 0x820) ==
  38018                                                        0x20) ||
  38019                                                       ((instr & 0x420) ==
  38020                                                        0x20) ||
  38021                                                       ((instr & 0x220) ==
  38022                                                        0x20) ||
  38023                                                       ((instr & 0x120) ==
  38024                                                        0x120)) {
  38025                                                     UnallocatedT32(instr);
  38026                                                     return;
  38027                                                   }
  38028                                                   unsigned cmode =
  38029                                                       ((instr >> 8) & 0xf) |
  38030                                                       ((instr >> 1) & 0x10);
  38031                                                   DataType dt =
  38032                                                       ImmediateVmov::DecodeDt(
  38033                                                           cmode);
  38034                                                   if (dt.Is(
  38035                                                           kDataTypeValueInvalid)) {
  38036                                                     UnallocatedT32(instr);
  38037                                                     return;
  38038                                                   }
  38039                                                   if (((instr >> 12) & 1) !=
  38040                                                       0) {
  38041                                                     UnallocatedT32(instr);
  38042                                                     return;
  38043                                                   }
  38044                                                   unsigned rd =
  38045                                                       ExtractQRegister(instr,
  38046                                                                        22,
  38047                                                                        12);
  38048                                                   QOperand imm = ImmediateVmov::
  38049                                                       DecodeImmediate(
  38050                                                           cmode,
  38051                                                           (instr & 0xf) |
  38052                                                               ((instr >> 12) &
  38053                                                                0x70) |
  38054                                                               ((instr >> 21) &
  38055                                                                0x80));
  38056                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  38057                                                   vmov(CurrentCond(),
  38058                                                        dt,
  38059                                                        QRegister(rd),
  38060                                                        imm);
  38061                                                   break;
  38062                                                 }
  38063                                                 case 0x00000e20: {
  38064                                                   // 0xef800e70
  38065                                                   if (((instr & 0x920) ==
  38066                                                        0x100) ||
  38067                                                       ((instr & 0x520) ==
  38068                                                        0x100) ||
  38069                                                       ((instr & 0x820) ==
  38070                                                        0x20) ||
  38071                                                       ((instr & 0x420) ==
  38072                                                        0x20) ||
  38073                                                       ((instr & 0x220) ==
  38074                                                        0x20) ||
  38075                                                       ((instr & 0x120) ==
  38076                                                        0x120)) {
  38077                                                     UnallocatedT32(instr);
  38078                                                     return;
  38079                                                   }
  38080                                                   unsigned cmode =
  38081                                                       ((instr >> 8) & 0xf) |
  38082                                                       ((instr >> 1) & 0x10);
  38083                                                   DataType dt =
  38084                                                       ImmediateVmov::DecodeDt(
  38085                                                           cmode);
  38086                                                   if (dt.Is(
  38087                                                           kDataTypeValueInvalid)) {
  38088                                                     UnallocatedT32(instr);
  38089                                                     return;
  38090                                                   }
  38091                                                   if (((instr >> 12) & 1) !=
  38092                                                       0) {
  38093                                                     UnallocatedT32(instr);
  38094                                                     return;
  38095                                                   }
  38096                                                   unsigned rd =
  38097                                                       ExtractQRegister(instr,
  38098                                                                        22,
  38099                                                                        12);
  38100                                                   QOperand imm = ImmediateVmov::
  38101                                                       DecodeImmediate(
  38102                                                           cmode,
  38103                                                           (instr & 0xf) |
  38104                                                               ((instr >> 12) &
  38105                                                                0x70) |
  38106                                                               ((instr >> 21) &
  38107                                                                0x80));
  38108                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  38109                                                   vmov(CurrentCond(),
  38110                                                        dt,
  38111                                                        QRegister(rd),
  38112                                                        imm);
  38113                                                   break;
  38114                                                 }
  38115                                                 case 0x00000f00: {
  38116                                                   // 0xef800f50
  38117                                                   if (((instr & 0x920) ==
  38118                                                        0x100) ||
  38119                                                       ((instr & 0x520) ==
  38120                                                        0x100) ||
  38121                                                       ((instr & 0x820) ==
  38122                                                        0x20) ||
  38123                                                       ((instr & 0x420) ==
  38124                                                        0x20) ||
  38125                                                       ((instr & 0x220) ==
  38126                                                        0x20) ||
  38127                                                       ((instr & 0x120) ==
  38128                                                        0x120)) {
  38129                                                     UnallocatedT32(instr);
  38130                                                     return;
  38131                                                   }
  38132                                                   unsigned cmode =
  38133                                                       ((instr >> 8) & 0xf) |
  38134                                                       ((instr >> 1) & 0x10);
  38135                                                   DataType dt =
  38136                                                       ImmediateVmov::DecodeDt(
  38137                                                           cmode);
  38138                                                   if (dt.Is(
  38139                                                           kDataTypeValueInvalid)) {
  38140                                                     UnallocatedT32(instr);
  38141                                                     return;
  38142                                                   }
  38143                                                   if (((instr >> 12) & 1) !=
  38144                                                       0) {
  38145                                                     UnallocatedT32(instr);
  38146                                                     return;
  38147                                                   }
  38148                                                   unsigned rd =
  38149                                                       ExtractQRegister(instr,
  38150                                                                        22,
  38151                                                                        12);
  38152                                                   QOperand imm = ImmediateVmov::
  38153                                                       DecodeImmediate(
  38154                                                           cmode,
  38155                                                           (instr & 0xf) |
  38156                                                               ((instr >> 12) &
  38157                                                                0x70) |
  38158                                                               ((instr >> 21) &
  38159                                                                0x80));
  38160                                                   // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  38161                                                   vmov(CurrentCond(),
  38162                                                        dt,
  38163                                                        QRegister(rd),
  38164                                                        imm);
  38165                                                   break;
  38166                                                 }
  38167                                                 default:
  38168                                                   UnallocatedT32(instr);
  38169                                                   break;
  38170                                               }
  38171                                               break;
  38172                                             }
  38173                                             default: {
  38174                                               if (((instr & 0x920) == 0x100) ||
  38175                                                   ((instr & 0x520) == 0x100) ||
  38176                                                   ((instr & 0x820) == 0x20) ||
  38177                                                   ((instr & 0x420) == 0x20) ||
  38178                                                   ((instr & 0x220) == 0x20) ||
  38179                                                   ((instr & 0x120) == 0x120)) {
  38180                                                 UnallocatedT32(instr);
  38181                                                 return;
  38182                                               }
  38183                                               unsigned cmode =
  38184                                                   ((instr >> 8) & 0xf) |
  38185                                                   ((instr >> 1) & 0x10);
  38186                                               DataType dt =
  38187                                                   ImmediateVmov::DecodeDt(
  38188                                                       cmode);
  38189                                               if (dt.Is(
  38190                                                       kDataTypeValueInvalid)) {
  38191                                                 UnallocatedT32(instr);
  38192                                                 return;
  38193                                               }
  38194                                               if (((instr >> 12) & 1) != 0) {
  38195                                                 UnallocatedT32(instr);
  38196                                                 return;
  38197                                               }
  38198                                               unsigned rd =
  38199                                                   ExtractQRegister(instr,
  38200                                                                    22,
  38201                                                                    12);
  38202                                               QOperand imm = ImmediateVmov::
  38203                                                   DecodeImmediate(cmode,
  38204                                                                   (instr &
  38205                                                                    0xf) |
  38206                                                                       ((instr >>
  38207                                                                         12) &
  38208                                                                        0x70) |
  38209                                                                       ((instr >>
  38210                                                                         21) &
  38211                                                                        0x80));
  38212                                               // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length)
  38213                                               vmov(CurrentCond(),
  38214                                                    dt,
  38215                                                    QRegister(rd),
  38216                                                    imm);
  38217                                               break;
  38218                                             }
  38219                                           }
  38220                                           break;
  38221                                         }
  38222                                       }
  38223                                       break;
  38224                                     }
  38225                                     default:
  38226                                       UnallocatedT32(instr);
  38227                                       break;
  38228                                   }
  38229                                   break;
  38230                                 }
  38231                                 default: {
  38232                                   if ((instr & 0x00000200) == 0x00000200) {
  38233                                     if (((instr & 0x200000) == 0x0)) {
  38234                                       UnallocatedT32(instr);
  38235                                       return;
  38236                                     }
  38237                                     DataType dt1 = Dt_op_U_1_Decode1(
  38238                                         ((instr >> 28) & 0x1) |
  38239                                         ((instr >> 7) & 0x2));
  38240                                     if (dt1.Is(kDataTypeValueInvalid)) {
  38241                                       UnallocatedT32(instr);
  38242                                       return;
  38243                                     }
  38244                                     DataType dt2 = Dt_op_U_1_Decode2(
  38245                                         ((instr >> 28) & 0x1) |
  38246                                         ((instr >> 7) & 0x2));
  38247                                     if (dt2.Is(kDataTypeValueInvalid)) {
  38248                                       UnallocatedT32(instr);
  38249                                       return;
  38250                                     }
  38251                                     if (((instr >> 12) & 1) != 0) {
  38252                                       UnallocatedT32(instr);
  38253                                       return;
  38254                                     }
  38255                                     unsigned rd =
  38256                                         ExtractQRegister(instr, 22, 12);
  38257                                     if ((instr & 1) != 0) {
  38258                                       UnallocatedT32(instr);
  38259                                       return;
  38260                                     }
  38261                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  38262                                     uint32_t fbits =
  38263                                         64 - ((instr >> 16) & 0x3f);
  38264                                     // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm>, #<fbits> ; T1 NOLINT(whitespace/line_length)
  38265                                     vcvt(CurrentCond(),
  38266                                          dt1,
  38267                                          dt2,
  38268                                          QRegister(rd),
  38269                                          QRegister(rm),
  38270                                          fbits);
  38271                                   } else {
  38272                                     UnallocatedT32(instr);
  38273                                   }
  38274                                   break;
  38275                                 }
  38276                               }
  38277                               break;
  38278                             }
  38279                             default:
  38280                               UnallocatedT32(instr);
  38281                               break;
  38282                           }
  38283                           break;
  38284                         }
  38285                       }
  38286                       break;
  38287                     }
  38288                   }
  38289                   break;
  38290                 }
  38291               }
  38292               break;
  38293             }
  38294           }
  38295           break;
  38296         }
  38297       }
  38298       break;
  38299     }
  38300   }
  38301 }  // NOLINT(readability/fn_size)
  38302 
  38303 void Disassembler::DecodeA32(uint32_t instr) {
  38304   A32CodeAddressIncrementer incrementer(&code_address_);
  38305   if ((instr & 0xf0000000) == 0xf0000000) {
  38306     switch (instr & 0x0e000000) {
  38307       case 0x00000000: {
  38308         // 0xf0000000
  38309         switch (instr & 0x01f10020) {
  38310           case 0x01000000: {
  38311             // 0xf1000000
  38312             switch (instr & 0x000e0000) {
  38313               case 0x00020000: {
  38314                 // 0xf1020000
  38315                 if ((instr & 0x000001c0) == 0x00000000) {
  38316                   UnimplementedA32("CPS", instr);
  38317                 } else {
  38318                   UnallocatedA32(instr);
  38319                 }
  38320                 break;
  38321               }
  38322               case 0x00080000: {
  38323                 // 0xf1080000
  38324                 if ((instr & 0x0000001f) == 0x00000000) {
  38325                   UnimplementedA32("CPSIE", instr);
  38326                 } else {
  38327                   UnallocatedA32(instr);
  38328                 }
  38329                 break;
  38330               }
  38331               case 0x000a0000: {
  38332                 // 0xf10a0000
  38333                 UnimplementedA32("CPSIE", instr);
  38334                 break;
  38335               }
  38336               case 0x000c0000: {
  38337                 // 0xf10c0000
  38338                 if ((instr & 0x0000001f) == 0x00000000) {
  38339                   UnimplementedA32("CPSID", instr);
  38340                 } else {
  38341                   UnallocatedA32(instr);
  38342                 }
  38343                 break;
  38344               }
  38345               case 0x000e0000: {
  38346                 // 0xf10e0000
  38347                 UnimplementedA32("CPSID", instr);
  38348                 break;
  38349               }
  38350               default:
  38351                 UnallocatedA32(instr);
  38352                 break;
  38353             }
  38354             break;
  38355           }
  38356           case 0x01010000: {
  38357             // 0xf1010000
  38358             if ((instr & 0x000000d0) == 0x00000000) {
  38359               UnimplementedA32("SETEND", instr);
  38360             } else {
  38361               UnallocatedA32(instr);
  38362             }
  38363             break;
  38364           }
  38365           default:
  38366             UnallocatedA32(instr);
  38367             break;
  38368         }
  38369         break;
  38370       }
  38371       case 0x02000000: {
  38372         // 0xf2000000
  38373         switch (instr & 0x00800010) {
  38374           case 0x00000000: {
  38375             // 0xf2000000
  38376             switch (instr & 0x00000f40) {
  38377               case 0x00000000: {
  38378                 // 0xf2000000
  38379                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  38380                                                  ((instr >> 22) & 0x4));
  38381                 if (dt.Is(kDataTypeValueInvalid)) {
  38382                   UnallocatedA32(instr);
  38383                   return;
  38384                 }
  38385                 unsigned rd = ExtractDRegister(instr, 22, 12);
  38386                 unsigned rn = ExtractDRegister(instr, 7, 16);
  38387                 unsigned rm = ExtractDRegister(instr, 5, 0);
  38388                 // VHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  38389                 vhadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  38390                 break;
  38391               }
  38392               case 0x00000040: {
  38393                 // 0xf2000040
  38394                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  38395                                                  ((instr >> 22) & 0x4));
  38396                 if (dt.Is(kDataTypeValueInvalid)) {
  38397                   UnallocatedA32(instr);
  38398                   return;
  38399                 }
  38400                 if (((instr >> 12) & 1) != 0) {
  38401                   UnallocatedA32(instr);
  38402                   return;
  38403                 }
  38404                 unsigned rd = ExtractQRegister(instr, 22, 12);
  38405                 if (((instr >> 16) & 1) != 0) {
  38406                   UnallocatedA32(instr);
  38407                   return;
  38408                 }
  38409                 unsigned rn = ExtractQRegister(instr, 7, 16);
  38410                 if ((instr & 1) != 0) {
  38411                   UnallocatedA32(instr);
  38412                   return;
  38413                 }
  38414                 unsigned rm = ExtractQRegister(instr, 5, 0);
  38415                 // VHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
  38416                 vhadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  38417                 break;
  38418               }
  38419               case 0x00000100: {
  38420                 // 0xf2000100
  38421                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  38422                                                  ((instr >> 22) & 0x4));
  38423                 if (dt.Is(kDataTypeValueInvalid)) {
  38424                   UnallocatedA32(instr);
  38425                   return;
  38426                 }
  38427                 unsigned rd = ExtractDRegister(instr, 22, 12);
  38428                 unsigned rn = ExtractDRegister(instr, 7, 16);
  38429                 unsigned rm = ExtractDRegister(instr, 5, 0);
  38430                 // VRHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  38431                 vrhadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  38432                 break;
  38433               }
  38434               case 0x00000140: {
  38435                 // 0xf2000140
  38436                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  38437                                                  ((instr >> 22) & 0x4));
  38438                 if (dt.Is(kDataTypeValueInvalid)) {
  38439                   UnallocatedA32(instr);
  38440                   return;
  38441                 }
  38442                 if (((instr >> 12) & 1) != 0) {
  38443                   UnallocatedA32(instr);
  38444                   return;
  38445                 }
  38446                 unsigned rd = ExtractQRegister(instr, 22, 12);
  38447                 if (((instr >> 16) & 1) != 0) {
  38448                   UnallocatedA32(instr);
  38449                   return;
  38450                 }
  38451                 unsigned rn = ExtractQRegister(instr, 7, 16);
  38452                 if ((instr & 1) != 0) {
  38453                   UnallocatedA32(instr);
  38454                   return;
  38455                 }
  38456                 unsigned rm = ExtractQRegister(instr, 5, 0);
  38457                 // VRHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
  38458                 vrhadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  38459                 break;
  38460               }
  38461               case 0x00000200: {
  38462                 // 0xf2000200
  38463                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  38464                                                  ((instr >> 22) & 0x4));
  38465                 if (dt.Is(kDataTypeValueInvalid)) {
  38466                   UnallocatedA32(instr);
  38467                   return;
  38468                 }
  38469                 unsigned rd = ExtractDRegister(instr, 22, 12);
  38470                 unsigned rn = ExtractDRegister(instr, 7, 16);
  38471                 unsigned rm = ExtractDRegister(instr, 5, 0);
  38472                 // VHSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  38473                 vhsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  38474                 break;
  38475               }
  38476               case 0x00000240: {
  38477                 // 0xf2000240
  38478                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  38479                                                  ((instr >> 22) & 0x4));
  38480                 if (dt.Is(kDataTypeValueInvalid)) {
  38481                   UnallocatedA32(instr);
  38482                   return;
  38483                 }
  38484                 if (((instr >> 12) & 1) != 0) {
  38485                   UnallocatedA32(instr);
  38486                   return;
  38487                 }
  38488                 unsigned rd = ExtractQRegister(instr, 22, 12);
  38489                 if (((instr >> 16) & 1) != 0) {
  38490                   UnallocatedA32(instr);
  38491                   return;
  38492                 }
  38493                 unsigned rn = ExtractQRegister(instr, 7, 16);
  38494                 if ((instr & 1) != 0) {
  38495                   UnallocatedA32(instr);
  38496                   return;
  38497                 }
  38498                 unsigned rm = ExtractQRegister(instr, 5, 0);
  38499                 // VHSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
  38500                 vhsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  38501                 break;
  38502               }
  38503               case 0x00000300: {
  38504                 // 0xf2000300
  38505                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  38506                                                  ((instr >> 22) & 0x4));
  38507                 if (dt.Is(kDataTypeValueInvalid)) {
  38508                   UnallocatedA32(instr);
  38509                   return;
  38510                 }
  38511                 unsigned rd = ExtractDRegister(instr, 22, 12);
  38512                 unsigned rn = ExtractDRegister(instr, 7, 16);
  38513                 unsigned rm = ExtractDRegister(instr, 5, 0);
  38514                 // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  38515                 vcgt(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  38516                 break;
  38517               }
  38518               case 0x00000340: {
  38519                 // 0xf2000340
  38520                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  38521                                                  ((instr >> 22) & 0x4));
  38522                 if (dt.Is(kDataTypeValueInvalid)) {
  38523                   UnallocatedA32(instr);
  38524                   return;
  38525                 }
  38526                 if (((instr >> 12) & 1) != 0) {
  38527                   UnallocatedA32(instr);
  38528                   return;
  38529                 }
  38530                 unsigned rd = ExtractQRegister(instr, 22, 12);
  38531                 if (((instr >> 16) & 1) != 0) {
  38532                   UnallocatedA32(instr);
  38533                   return;
  38534                 }
  38535                 unsigned rn = ExtractQRegister(instr, 7, 16);
  38536                 if ((instr & 1) != 0) {
  38537                   UnallocatedA32(instr);
  38538                   return;
  38539                 }
  38540                 unsigned rm = ExtractQRegister(instr, 5, 0);
  38541                 // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
  38542                 vcgt(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  38543                 break;
  38544               }
  38545               case 0x00000400: {
  38546                 // 0xf2000400
  38547                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
  38548                                                  ((instr >> 22) & 0x4));
  38549                 if (dt.Is(kDataTypeValueInvalid)) {
  38550                   UnallocatedA32(instr);
  38551                   return;
  38552                 }
  38553                 unsigned rd = ExtractDRegister(instr, 22, 12);
  38554                 unsigned rm = ExtractDRegister(instr, 5, 0);
  38555                 unsigned rn = ExtractDRegister(instr, 7, 16);
  38556                 // VSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
  38557                 vshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
  38558                 break;
  38559               }
  38560               case 0x00000440: {
  38561                 // 0xf2000440
  38562                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
  38563                                                  ((instr >> 22) & 0x4));
  38564                 if (dt.Is(kDataTypeValueInvalid)) {
  38565                   UnallocatedA32(instr);
  38566                   return;
  38567                 }
  38568                 if (((instr >> 12) & 1) != 0) {
  38569                   UnallocatedA32(instr);
  38570                   return;
  38571                 }
  38572                 unsigned rd = ExtractQRegister(instr, 22, 12);
  38573                 if ((instr & 1) != 0) {
  38574                   UnallocatedA32(instr);
  38575                   return;
  38576                 }
  38577                 unsigned rm = ExtractQRegister(instr, 5, 0);
  38578                 if (((instr >> 16) & 1) != 0) {
  38579                   UnallocatedA32(instr);
  38580                   return;
  38581                 }
  38582                 unsigned rn = ExtractQRegister(instr, 7, 16);
  38583                 // VSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
  38584                 vshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
  38585                 break;
  38586               }
  38587               case 0x00000500: {
  38588                 // 0xf2000500
  38589                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
  38590                                                  ((instr >> 22) & 0x4));
  38591                 if (dt.Is(kDataTypeValueInvalid)) {
  38592                   UnallocatedA32(instr);
  38593                   return;
  38594                 }
  38595                 unsigned rd = ExtractDRegister(instr, 22, 12);
  38596                 unsigned rm = ExtractDRegister(instr, 5, 0);
  38597                 unsigned rn = ExtractDRegister(instr, 7, 16);
  38598                 // VRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
  38599                 vrshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
  38600                 break;
  38601               }
  38602               case 0x00000540: {
  38603                 // 0xf2000540
  38604                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
  38605                                                  ((instr >> 22) & 0x4));
  38606                 if (dt.Is(kDataTypeValueInvalid)) {
  38607                   UnallocatedA32(instr);
  38608                   return;
  38609                 }
  38610                 if (((instr >> 12) & 1) != 0) {
  38611                   UnallocatedA32(instr);
  38612                   return;
  38613                 }
  38614                 unsigned rd = ExtractQRegister(instr, 22, 12);
  38615                 if ((instr & 1) != 0) {
  38616                   UnallocatedA32(instr);
  38617                   return;
  38618                 }
  38619                 unsigned rm = ExtractQRegister(instr, 5, 0);
  38620                 if (((instr >> 16) & 1) != 0) {
  38621                   UnallocatedA32(instr);
  38622                   return;
  38623                 }
  38624                 unsigned rn = ExtractQRegister(instr, 7, 16);
  38625                 // VRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
  38626                 vrshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
  38627                 break;
  38628               }
  38629               case 0x00000600: {
  38630                 // 0xf2000600
  38631                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  38632                                                  ((instr >> 22) & 0x4));
  38633                 if (dt.Is(kDataTypeValueInvalid)) {
  38634                   UnallocatedA32(instr);
  38635                   return;
  38636                 }
  38637                 unsigned rd = ExtractDRegister(instr, 22, 12);
  38638                 unsigned rn = ExtractDRegister(instr, 7, 16);
  38639                 unsigned rm = ExtractDRegister(instr, 5, 0);
  38640                 // VMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  38641                 vmax(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  38642                 break;
  38643               }
  38644               case 0x00000640: {
  38645                 // 0xf2000640
  38646                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  38647                                                  ((instr >> 22) & 0x4));
  38648                 if (dt.Is(kDataTypeValueInvalid)) {
  38649                   UnallocatedA32(instr);
  38650                   return;
  38651                 }
  38652                 if (((instr >> 12) & 1) != 0) {
  38653                   UnallocatedA32(instr);
  38654                   return;
  38655                 }
  38656                 unsigned rd = ExtractQRegister(instr, 22, 12);
  38657                 if (((instr >> 16) & 1) != 0) {
  38658                   UnallocatedA32(instr);
  38659                   return;
  38660                 }
  38661                 unsigned rn = ExtractQRegister(instr, 7, 16);
  38662                 if ((instr & 1) != 0) {
  38663                   UnallocatedA32(instr);
  38664                   return;
  38665                 }
  38666                 unsigned rm = ExtractQRegister(instr, 5, 0);
  38667                 // VMAX{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
  38668                 vmax(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  38669                 break;
  38670               }
  38671               case 0x00000700: {
  38672                 // 0xf2000700
  38673                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  38674                                                  ((instr >> 22) & 0x4));
  38675                 if (dt.Is(kDataTypeValueInvalid)) {
  38676                   UnallocatedA32(instr);
  38677                   return;
  38678                 }
  38679                 unsigned rd = ExtractDRegister(instr, 22, 12);
  38680                 unsigned rn = ExtractDRegister(instr, 7, 16);
  38681                 unsigned rm = ExtractDRegister(instr, 5, 0);
  38682                 // VABD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  38683                 vabd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  38684                 break;
  38685               }
  38686               case 0x00000740: {
  38687                 // 0xf2000740
  38688                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  38689                                                  ((instr >> 22) & 0x4));
  38690                 if (dt.Is(kDataTypeValueInvalid)) {
  38691                   UnallocatedA32(instr);
  38692                   return;
  38693                 }
  38694                 if (((instr >> 12) & 1) != 0) {
  38695                   UnallocatedA32(instr);
  38696                   return;
  38697                 }
  38698                 unsigned rd = ExtractQRegister(instr, 22, 12);
  38699                 if (((instr >> 16) & 1) != 0) {
  38700                   UnallocatedA32(instr);
  38701                   return;
  38702                 }
  38703                 unsigned rn = ExtractQRegister(instr, 7, 16);
  38704                 if ((instr & 1) != 0) {
  38705                   UnallocatedA32(instr);
  38706                   return;
  38707                 }
  38708                 unsigned rm = ExtractQRegister(instr, 5, 0);
  38709                 // VABD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
  38710                 vabd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  38711                 break;
  38712               }
  38713               case 0x00000800: {
  38714                 // 0xf2000800
  38715                 switch (instr & 0x01000000) {
  38716                   case 0x00000000: {
  38717                     // 0xf2000800
  38718                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
  38719                     if (dt.Is(kDataTypeValueInvalid)) {
  38720                       UnallocatedA32(instr);
  38721                       return;
  38722                     }
  38723                     unsigned rd = ExtractDRegister(instr, 22, 12);
  38724                     unsigned rn = ExtractDRegister(instr, 7, 16);
  38725                     unsigned rm = ExtractDRegister(instr, 5, 0);
  38726                     // VADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  38727                     vadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  38728                     break;
  38729                   }
  38730                   case 0x01000000: {
  38731                     // 0xf3000800
  38732                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
  38733                     if (dt.Is(kDataTypeValueInvalid)) {
  38734                       UnallocatedA32(instr);
  38735                       return;
  38736                     }
  38737                     unsigned rd = ExtractDRegister(instr, 22, 12);
  38738                     unsigned rn = ExtractDRegister(instr, 7, 16);
  38739                     unsigned rm = ExtractDRegister(instr, 5, 0);
  38740                     // VSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  38741                     vsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  38742                     break;
  38743                   }
  38744                 }
  38745                 break;
  38746               }
  38747               case 0x00000840: {
  38748                 // 0xf2000840
  38749                 switch (instr & 0x01000000) {
  38750                   case 0x00000000: {
  38751                     // 0xf2000840
  38752                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
  38753                     if (dt.Is(kDataTypeValueInvalid)) {
  38754                       UnallocatedA32(instr);
  38755                       return;
  38756                     }
  38757                     if (((instr >> 12) & 1) != 0) {
  38758                       UnallocatedA32(instr);
  38759                       return;
  38760                     }
  38761                     unsigned rd = ExtractQRegister(instr, 22, 12);
  38762                     if (((instr >> 16) & 1) != 0) {
  38763                       UnallocatedA32(instr);
  38764                       return;
  38765                     }
  38766                     unsigned rn = ExtractQRegister(instr, 7, 16);
  38767                     if ((instr & 1) != 0) {
  38768                       UnallocatedA32(instr);
  38769                       return;
  38770                     }
  38771                     unsigned rm = ExtractQRegister(instr, 5, 0);
  38772                     // VADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
  38773                     vadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  38774                     break;
  38775                   }
  38776                   case 0x01000000: {
  38777                     // 0xf3000840
  38778                     DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3);
  38779                     if (dt.Is(kDataTypeValueInvalid)) {
  38780                       UnallocatedA32(instr);
  38781                       return;
  38782                     }
  38783                     if (((instr >> 12) & 1) != 0) {
  38784                       UnallocatedA32(instr);
  38785                       return;
  38786                     }
  38787                     unsigned rd = ExtractQRegister(instr, 22, 12);
  38788                     if (((instr >> 16) & 1) != 0) {
  38789                       UnallocatedA32(instr);
  38790                       return;
  38791                     }
  38792                     unsigned rn = ExtractQRegister(instr, 7, 16);
  38793                     if ((instr & 1) != 0) {
  38794                       UnallocatedA32(instr);
  38795                       return;
  38796                     }
  38797                     unsigned rm = ExtractQRegister(instr, 5, 0);
  38798                     // VSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
  38799                     vsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  38800                     break;
  38801                   }
  38802                 }
  38803                 break;
  38804               }
  38805               case 0x00000900: {
  38806                 // 0xf2000900
  38807                 switch (instr & 0x01000000) {
  38808                   case 0x00000000: {
  38809                     // 0xf2000900
  38810                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
  38811                     if (dt.Is(kDataTypeValueInvalid)) {
  38812                       UnallocatedA32(instr);
  38813                       return;
  38814                     }
  38815                     unsigned rd = ExtractDRegister(instr, 22, 12);
  38816                     unsigned rn = ExtractDRegister(instr, 7, 16);
  38817                     unsigned rm = ExtractDRegister(instr, 5, 0);
  38818                     // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; A1
  38819                     vmla(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  38820                     break;
  38821                   }
  38822                   case 0x01000000: {
  38823                     // 0xf3000900
  38824                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
  38825                     if (dt.Is(kDataTypeValueInvalid)) {
  38826                       UnallocatedA32(instr);
  38827                       return;
  38828                     }
  38829                     unsigned rd = ExtractDRegister(instr, 22, 12);
  38830                     unsigned rn = ExtractDRegister(instr, 7, 16);
  38831                     unsigned rm = ExtractDRegister(instr, 5, 0);
  38832                     // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; A1
  38833                     vmls(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  38834                     break;
  38835                   }
  38836                 }
  38837                 break;
  38838               }
  38839               case 0x00000940: {
  38840                 // 0xf2000940
  38841                 switch (instr & 0x01000000) {
  38842                   case 0x00000000: {
  38843                     // 0xf2000940
  38844                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
  38845                     if (dt.Is(kDataTypeValueInvalid)) {
  38846                       UnallocatedA32(instr);
  38847                       return;
  38848                     }
  38849                     if (((instr >> 12) & 1) != 0) {
  38850                       UnallocatedA32(instr);
  38851                       return;
  38852                     }
  38853                     unsigned rd = ExtractQRegister(instr, 22, 12);
  38854                     if (((instr >> 16) & 1) != 0) {
  38855                       UnallocatedA32(instr);
  38856                       return;
  38857                     }
  38858                     unsigned rn = ExtractQRegister(instr, 7, 16);
  38859                     if ((instr & 1) != 0) {
  38860                       UnallocatedA32(instr);
  38861                       return;
  38862                     }
  38863                     unsigned rm = ExtractQRegister(instr, 5, 0);
  38864                     // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; A1
  38865                     vmla(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  38866                     break;
  38867                   }
  38868                   case 0x01000000: {
  38869                     // 0xf3000940
  38870                     DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3);
  38871                     if (dt.Is(kDataTypeValueInvalid)) {
  38872                       UnallocatedA32(instr);
  38873                       return;
  38874                     }
  38875                     if (((instr >> 12) & 1) != 0) {
  38876                       UnallocatedA32(instr);
  38877                       return;
  38878                     }
  38879                     unsigned rd = ExtractQRegister(instr, 22, 12);
  38880                     if (((instr >> 16) & 1) != 0) {
  38881                       UnallocatedA32(instr);
  38882                       return;
  38883                     }
  38884                     unsigned rn = ExtractQRegister(instr, 7, 16);
  38885                     if ((instr & 1) != 0) {
  38886                       UnallocatedA32(instr);
  38887                       return;
  38888                     }
  38889                     unsigned rm = ExtractQRegister(instr, 5, 0);
  38890                     // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; A1
  38891                     vmls(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  38892                     break;
  38893                   }
  38894                 }
  38895                 break;
  38896               }
  38897               case 0x00000a00: {
  38898                 // 0xf2000a00
  38899                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  38900                                                  ((instr >> 22) & 0x4));
  38901                 if (dt.Is(kDataTypeValueInvalid)) {
  38902                   UnallocatedA32(instr);
  38903                   return;
  38904                 }
  38905                 unsigned rd = ExtractDRegister(instr, 22, 12);
  38906                 unsigned rn = ExtractDRegister(instr, 7, 16);
  38907                 unsigned rm = ExtractDRegister(instr, 5, 0);
  38908                 // VPMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  38909                 vpmax(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  38910                 break;
  38911               }
  38912               case 0x00000b00: {
  38913                 // 0xf2000b00
  38914                 switch (instr & 0x01000000) {
  38915                   case 0x00000000: {
  38916                     // 0xf2000b00
  38917                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
  38918                     if (dt.Is(kDataTypeValueInvalid)) {
  38919                       UnallocatedA32(instr);
  38920                       return;
  38921                     }
  38922                     unsigned rd = ExtractDRegister(instr, 22, 12);
  38923                     unsigned rn = ExtractDRegister(instr, 7, 16);
  38924                     unsigned rm = ExtractDRegister(instr, 5, 0);
  38925                     // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  38926                     vqdmulh(al,
  38927                             dt,
  38928                             DRegister(rd),
  38929                             DRegister(rn),
  38930                             DRegister(rm));
  38931                     break;
  38932                   }
  38933                   case 0x01000000: {
  38934                     // 0xf3000b00
  38935                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
  38936                     if (dt.Is(kDataTypeValueInvalid)) {
  38937                       UnallocatedA32(instr);
  38938                       return;
  38939                     }
  38940                     unsigned rd = ExtractDRegister(instr, 22, 12);
  38941                     unsigned rn = ExtractDRegister(instr, 7, 16);
  38942                     unsigned rm = ExtractDRegister(instr, 5, 0);
  38943                     // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  38944                     vqrdmulh(al,
  38945                              dt,
  38946                              DRegister(rd),
  38947                              DRegister(rn),
  38948                              DRegister(rm));
  38949                     break;
  38950                   }
  38951                 }
  38952                 break;
  38953               }
  38954               case 0x00000b40: {
  38955                 // 0xf2000b40
  38956                 switch (instr & 0x01000000) {
  38957                   case 0x00000000: {
  38958                     // 0xf2000b40
  38959                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
  38960                     if (dt.Is(kDataTypeValueInvalid)) {
  38961                       UnallocatedA32(instr);
  38962                       return;
  38963                     }
  38964                     if (((instr >> 12) & 1) != 0) {
  38965                       UnallocatedA32(instr);
  38966                       return;
  38967                     }
  38968                     unsigned rd = ExtractQRegister(instr, 22, 12);
  38969                     if (((instr >> 16) & 1) != 0) {
  38970                       UnallocatedA32(instr);
  38971                       return;
  38972                     }
  38973                     unsigned rn = ExtractQRegister(instr, 7, 16);
  38974                     if ((instr & 1) != 0) {
  38975                       UnallocatedA32(instr);
  38976                       return;
  38977                     }
  38978                     unsigned rm = ExtractQRegister(instr, 5, 0);
  38979                     // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
  38980                     vqdmulh(al,
  38981                             dt,
  38982                             QRegister(rd),
  38983                             QRegister(rn),
  38984                             QRegister(rm));
  38985                     break;
  38986                   }
  38987                   case 0x01000000: {
  38988                     // 0xf3000b40
  38989                     DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
  38990                     if (dt.Is(kDataTypeValueInvalid)) {
  38991                       UnallocatedA32(instr);
  38992                       return;
  38993                     }
  38994                     if (((instr >> 12) & 1) != 0) {
  38995                       UnallocatedA32(instr);
  38996                       return;
  38997                     }
  38998                     unsigned rd = ExtractQRegister(instr, 22, 12);
  38999                     if (((instr >> 16) & 1) != 0) {
  39000                       UnallocatedA32(instr);
  39001                       return;
  39002                     }
  39003                     unsigned rn = ExtractQRegister(instr, 7, 16);
  39004                     if ((instr & 1) != 0) {
  39005                       UnallocatedA32(instr);
  39006                       return;
  39007                     }
  39008                     unsigned rm = ExtractQRegister(instr, 5, 0);
  39009                     // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
  39010                     vqrdmulh(al,
  39011                              dt,
  39012                              QRegister(rd),
  39013                              QRegister(rn),
  39014                              QRegister(rm));
  39015                     break;
  39016                   }
  39017                 }
  39018                 break;
  39019               }
  39020               case 0x00000c40: {
  39021                 // 0xf2000c40
  39022                 switch (instr & 0x01300000) {
  39023                   case 0x00000000: {
  39024                     // 0xf2000c40
  39025                     UnimplementedA32("SHA1C", instr);
  39026                     break;
  39027                   }
  39028                   case 0x00100000: {
  39029                     // 0xf2100c40
  39030                     UnimplementedA32("SHA1P", instr);
  39031                     break;
  39032                   }
  39033                   case 0x00200000: {
  39034                     // 0xf2200c40
  39035                     UnimplementedA32("SHA1M", instr);
  39036                     break;
  39037                   }
  39038                   case 0x00300000: {
  39039                     // 0xf2300c40
  39040                     UnimplementedA32("SHA1SU0", instr);
  39041                     break;
  39042                   }
  39043                   case 0x01000000: {
  39044                     // 0xf3000c40
  39045                     UnimplementedA32("SHA256H", instr);
  39046                     break;
  39047                   }
  39048                   case 0x01100000: {
  39049                     // 0xf3100c40
  39050                     UnimplementedA32("SHA256H2", instr);
  39051                     break;
  39052                   }
  39053                   case 0x01200000: {
  39054                     // 0xf3200c40
  39055                     UnimplementedA32("SHA256SU1", instr);
  39056                     break;
  39057                   }
  39058                   default:
  39059                     UnallocatedA32(instr);
  39060                     break;
  39061                 }
  39062                 break;
  39063               }
  39064               case 0x00000d00: {
  39065                 // 0xf2000d00
  39066                 switch (instr & 0x01300000) {
  39067                   case 0x00000000: {
  39068                     // 0xf2000d00
  39069                     unsigned rd = ExtractDRegister(instr, 22, 12);
  39070                     unsigned rn = ExtractDRegister(instr, 7, 16);
  39071                     unsigned rm = ExtractDRegister(instr, 5, 0);
  39072                     // VADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
  39073                     vadd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
  39074                     break;
  39075                   }
  39076                   case 0x00200000: {
  39077                     // 0xf2200d00
  39078                     unsigned rd = ExtractDRegister(instr, 22, 12);
  39079                     unsigned rn = ExtractDRegister(instr, 7, 16);
  39080                     unsigned rm = ExtractDRegister(instr, 5, 0);
  39081                     // VSUB{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
  39082                     vsub(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
  39083                     break;
  39084                   }
  39085                   case 0x01000000: {
  39086                     // 0xf3000d00
  39087                     unsigned rd = ExtractDRegister(instr, 22, 12);
  39088                     unsigned rn = ExtractDRegister(instr, 7, 16);
  39089                     unsigned rm = ExtractDRegister(instr, 5, 0);
  39090                     // VPADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
  39091                     vpadd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
  39092                     break;
  39093                   }
  39094                   case 0x01200000: {
  39095                     // 0xf3200d00
  39096                     unsigned rd = ExtractDRegister(instr, 22, 12);
  39097                     unsigned rn = ExtractDRegister(instr, 7, 16);
  39098                     unsigned rm = ExtractDRegister(instr, 5, 0);
  39099                     // VABD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
  39100                     vabd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
  39101                     break;
  39102                   }
  39103                   default:
  39104                     UnallocatedA32(instr);
  39105                     break;
  39106                 }
  39107                 break;
  39108               }
  39109               case 0x00000d40: {
  39110                 // 0xf2000d40
  39111                 switch (instr & 0x01300000) {
  39112                   case 0x00000000: {
  39113                     // 0xf2000d40
  39114                     if (((instr >> 12) & 1) != 0) {
  39115                       UnallocatedA32(instr);
  39116                       return;
  39117                     }
  39118                     unsigned rd = ExtractQRegister(instr, 22, 12);
  39119                     if (((instr >> 16) & 1) != 0) {
  39120                       UnallocatedA32(instr);
  39121                       return;
  39122                     }
  39123                     unsigned rn = ExtractQRegister(instr, 7, 16);
  39124                     if ((instr & 1) != 0) {
  39125                       UnallocatedA32(instr);
  39126                       return;
  39127                     }
  39128                     unsigned rm = ExtractQRegister(instr, 5, 0);
  39129                     // VADD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
  39130                     vadd(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
  39131                     break;
  39132                   }
  39133                   case 0x00200000: {
  39134                     // 0xf2200d40
  39135                     if (((instr >> 12) & 1) != 0) {
  39136                       UnallocatedA32(instr);
  39137                       return;
  39138                     }
  39139                     unsigned rd = ExtractQRegister(instr, 22, 12);
  39140                     if (((instr >> 16) & 1) != 0) {
  39141                       UnallocatedA32(instr);
  39142                       return;
  39143                     }
  39144                     unsigned rn = ExtractQRegister(instr, 7, 16);
  39145                     if ((instr & 1) != 0) {
  39146                       UnallocatedA32(instr);
  39147                       return;
  39148                     }
  39149                     unsigned rm = ExtractQRegister(instr, 5, 0);
  39150                     // VSUB{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
  39151                     vsub(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
  39152                     break;
  39153                   }
  39154                   case 0x01200000: {
  39155                     // 0xf3200d40
  39156                     if (((instr >> 12) & 1) != 0) {
  39157                       UnallocatedA32(instr);
  39158                       return;
  39159                     }
  39160                     unsigned rd = ExtractQRegister(instr, 22, 12);
  39161                     if (((instr >> 16) & 1) != 0) {
  39162                       UnallocatedA32(instr);
  39163                       return;
  39164                     }
  39165                     unsigned rn = ExtractQRegister(instr, 7, 16);
  39166                     if ((instr & 1) != 0) {
  39167                       UnallocatedA32(instr);
  39168                       return;
  39169                     }
  39170                     unsigned rm = ExtractQRegister(instr, 5, 0);
  39171                     // VABD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
  39172                     vabd(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
  39173                     break;
  39174                   }
  39175                   default:
  39176                     UnallocatedA32(instr);
  39177                     break;
  39178                 }
  39179                 break;
  39180               }
  39181               case 0x00000e00: {
  39182                 // 0xf2000e00
  39183                 switch (instr & 0x01200000) {
  39184                   case 0x00000000: {
  39185                     // 0xf2000e00
  39186                     DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
  39187                     if (dt.Is(kDataTypeValueInvalid)) {
  39188                       UnallocatedA32(instr);
  39189                       return;
  39190                     }
  39191                     unsigned rd = ExtractDRegister(instr, 22, 12);
  39192                     unsigned rn = ExtractDRegister(instr, 7, 16);
  39193                     unsigned rm = ExtractDRegister(instr, 5, 0);
  39194                     // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A2
  39195                     vceq(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  39196                     break;
  39197                   }
  39198                   case 0x01000000: {
  39199                     // 0xf3000e00
  39200                     if ((instr & 0x00100000) == 0x00000000) {
  39201                       unsigned rd = ExtractDRegister(instr, 22, 12);
  39202                       unsigned rn = ExtractDRegister(instr, 7, 16);
  39203                       unsigned rm = ExtractDRegister(instr, 5, 0);
  39204                       // VCGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A2
  39205                       vcge(al,
  39206                            F32,
  39207                            DRegister(rd),
  39208                            DRegister(rn),
  39209                            DRegister(rm));
  39210                     } else {
  39211                       UnallocatedA32(instr);
  39212                     }
  39213                     break;
  39214                   }
  39215                   case 0x01200000: {
  39216                     // 0xf3200e00
  39217                     if ((instr & 0x00100000) == 0x00000000) {
  39218                       unsigned rd = ExtractDRegister(instr, 22, 12);
  39219                       unsigned rn = ExtractDRegister(instr, 7, 16);
  39220                       unsigned rm = ExtractDRegister(instr, 5, 0);
  39221                       // VCGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A2
  39222                       vcgt(al,
  39223                            F32,
  39224                            DRegister(rd),
  39225                            DRegister(rn),
  39226                            DRegister(rm));
  39227                     } else {
  39228                       UnallocatedA32(instr);
  39229                     }
  39230                     break;
  39231                   }
  39232                   default:
  39233                     UnallocatedA32(instr);
  39234                     break;
  39235                 }
  39236                 break;
  39237               }
  39238               case 0x00000e40: {
  39239                 // 0xf2000e40
  39240                 switch (instr & 0x01200000) {
  39241                   case 0x00000000: {
  39242                     // 0xf2000e40
  39243                     DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1);
  39244                     if (dt.Is(kDataTypeValueInvalid)) {
  39245                       UnallocatedA32(instr);
  39246                       return;
  39247                     }
  39248                     if (((instr >> 12) & 1) != 0) {
  39249                       UnallocatedA32(instr);
  39250                       return;
  39251                     }
  39252                     unsigned rd = ExtractQRegister(instr, 22, 12);
  39253                     if (((instr >> 16) & 1) != 0) {
  39254                       UnallocatedA32(instr);
  39255                       return;
  39256                     }
  39257                     unsigned rn = ExtractQRegister(instr, 7, 16);
  39258                     if ((instr & 1) != 0) {
  39259                       UnallocatedA32(instr);
  39260                       return;
  39261                     }
  39262                     unsigned rm = ExtractQRegister(instr, 5, 0);
  39263                     // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A2
  39264                     vceq(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  39265                     break;
  39266                   }
  39267                   case 0x01000000: {
  39268                     // 0xf3000e40
  39269                     if ((instr & 0x00100000) == 0x00000000) {
  39270                       if (((instr >> 12) & 1) != 0) {
  39271                         UnallocatedA32(instr);
  39272                         return;
  39273                       }
  39274                       unsigned rd = ExtractQRegister(instr, 22, 12);
  39275                       if (((instr >> 16) & 1) != 0) {
  39276                         UnallocatedA32(instr);
  39277                         return;
  39278                       }
  39279                       unsigned rn = ExtractQRegister(instr, 7, 16);
  39280                       if ((instr & 1) != 0) {
  39281                         UnallocatedA32(instr);
  39282                         return;
  39283                       }
  39284                       unsigned rm = ExtractQRegister(instr, 5, 0);
  39285                       // VCGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A2
  39286                       vcge(al,
  39287                            F32,
  39288                            QRegister(rd),
  39289                            QRegister(rn),
  39290                            QRegister(rm));
  39291                     } else {
  39292                       UnallocatedA32(instr);
  39293                     }
  39294                     break;
  39295                   }
  39296                   case 0x01200000: {
  39297                     // 0xf3200e40
  39298                     if ((instr & 0x00100000) == 0x00000000) {
  39299                       if (((instr >> 12) & 1) != 0) {
  39300                         UnallocatedA32(instr);
  39301                         return;
  39302                       }
  39303                       unsigned rd = ExtractQRegister(instr, 22, 12);
  39304                       if (((instr >> 16) & 1) != 0) {
  39305                         UnallocatedA32(instr);
  39306                         return;
  39307                       }
  39308                       unsigned rn = ExtractQRegister(instr, 7, 16);
  39309                       if ((instr & 1) != 0) {
  39310                         UnallocatedA32(instr);
  39311                         return;
  39312                       }
  39313                       unsigned rm = ExtractQRegister(instr, 5, 0);
  39314                       // VCGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A2
  39315                       vcgt(al,
  39316                            F32,
  39317                            QRegister(rd),
  39318                            QRegister(rn),
  39319                            QRegister(rm));
  39320                     } else {
  39321                       UnallocatedA32(instr);
  39322                     }
  39323                     break;
  39324                   }
  39325                   default:
  39326                     UnallocatedA32(instr);
  39327                     break;
  39328                 }
  39329                 break;
  39330               }
  39331               case 0x00000f00: {
  39332                 // 0xf2000f00
  39333                 switch (instr & 0x01300000) {
  39334                   case 0x00000000: {
  39335                     // 0xf2000f00
  39336                     unsigned rd = ExtractDRegister(instr, 22, 12);
  39337                     unsigned rn = ExtractDRegister(instr, 7, 16);
  39338                     unsigned rm = ExtractDRegister(instr, 5, 0);
  39339                     // VMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
  39340                     vmax(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
  39341                     break;
  39342                   }
  39343                   case 0x00200000: {
  39344                     // 0xf2200f00
  39345                     unsigned rd = ExtractDRegister(instr, 22, 12);
  39346                     unsigned rn = ExtractDRegister(instr, 7, 16);
  39347                     unsigned rm = ExtractDRegister(instr, 5, 0);
  39348                     // VMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
  39349                     vmin(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
  39350                     break;
  39351                   }
  39352                   case 0x01000000: {
  39353                     // 0xf3000f00
  39354                     unsigned rd = ExtractDRegister(instr, 22, 12);
  39355                     unsigned rn = ExtractDRegister(instr, 7, 16);
  39356                     unsigned rm = ExtractDRegister(instr, 5, 0);
  39357                     // VPMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
  39358                     vpmax(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
  39359                     break;
  39360                   }
  39361                   case 0x01200000: {
  39362                     // 0xf3200f00
  39363                     unsigned rd = ExtractDRegister(instr, 22, 12);
  39364                     unsigned rn = ExtractDRegister(instr, 7, 16);
  39365                     unsigned rm = ExtractDRegister(instr, 5, 0);
  39366                     // VPMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
  39367                     vpmin(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
  39368                     break;
  39369                   }
  39370                   default:
  39371                     UnallocatedA32(instr);
  39372                     break;
  39373                 }
  39374                 break;
  39375               }
  39376               case 0x00000f40: {
  39377                 // 0xf2000f40
  39378                 switch (instr & 0x01300000) {
  39379                   case 0x00000000: {
  39380                     // 0xf2000f40
  39381                     if (((instr >> 12) & 1) != 0) {
  39382                       UnallocatedA32(instr);
  39383                       return;
  39384                     }
  39385                     unsigned rd = ExtractQRegister(instr, 22, 12);
  39386                     if (((instr >> 16) & 1) != 0) {
  39387                       UnallocatedA32(instr);
  39388                       return;
  39389                     }
  39390                     unsigned rn = ExtractQRegister(instr, 7, 16);
  39391                     if ((instr & 1) != 0) {
  39392                       UnallocatedA32(instr);
  39393                       return;
  39394                     }
  39395                     unsigned rm = ExtractQRegister(instr, 5, 0);
  39396                     // VMAX{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
  39397                     vmax(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
  39398                     break;
  39399                   }
  39400                   case 0x00200000: {
  39401                     // 0xf2200f40
  39402                     if (((instr >> 12) & 1) != 0) {
  39403                       UnallocatedA32(instr);
  39404                       return;
  39405                     }
  39406                     unsigned rd = ExtractQRegister(instr, 22, 12);
  39407                     if (((instr >> 16) & 1) != 0) {
  39408                       UnallocatedA32(instr);
  39409                       return;
  39410                     }
  39411                     unsigned rn = ExtractQRegister(instr, 7, 16);
  39412                     if ((instr & 1) != 0) {
  39413                       UnallocatedA32(instr);
  39414                       return;
  39415                     }
  39416                     unsigned rm = ExtractQRegister(instr, 5, 0);
  39417                     // VMIN{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
  39418                     vmin(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
  39419                     break;
  39420                   }
  39421                   default:
  39422                     UnallocatedA32(instr);
  39423                     break;
  39424                 }
  39425                 break;
  39426               }
  39427               default:
  39428                 UnallocatedA32(instr);
  39429                 break;
  39430             }
  39431             break;
  39432           }
  39433           case 0x00000010: {
  39434             // 0xf2000010
  39435             switch (instr & 0x00000f40) {
  39436               case 0x00000000: {
  39437                 // 0xf2000010
  39438                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
  39439                                                  ((instr >> 22) & 0x4));
  39440                 if (dt.Is(kDataTypeValueInvalid)) {
  39441                   UnallocatedA32(instr);
  39442                   return;
  39443                 }
  39444                 unsigned rd = ExtractDRegister(instr, 22, 12);
  39445                 unsigned rn = ExtractDRegister(instr, 7, 16);
  39446                 unsigned rm = ExtractDRegister(instr, 5, 0);
  39447                 // VQADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  39448                 vqadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  39449                 break;
  39450               }
  39451               case 0x00000040: {
  39452                 // 0xf2000050
  39453                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
  39454                                                  ((instr >> 22) & 0x4));
  39455                 if (dt.Is(kDataTypeValueInvalid)) {
  39456                   UnallocatedA32(instr);
  39457                   return;
  39458                 }
  39459                 if (((instr >> 12) & 1) != 0) {
  39460                   UnallocatedA32(instr);
  39461                   return;
  39462                 }
  39463                 unsigned rd = ExtractQRegister(instr, 22, 12);
  39464                 if (((instr >> 16) & 1) != 0) {
  39465                   UnallocatedA32(instr);
  39466                   return;
  39467                 }
  39468                 unsigned rn = ExtractQRegister(instr, 7, 16);
  39469                 if ((instr & 1) != 0) {
  39470                   UnallocatedA32(instr);
  39471                   return;
  39472                 }
  39473                 unsigned rm = ExtractQRegister(instr, 5, 0);
  39474                 // VQADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
  39475                 vqadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  39476                 break;
  39477               }
  39478               case 0x00000100: {
  39479                 // 0xf2000110
  39480                 switch (instr & 0x01300000) {
  39481                   case 0x00000000: {
  39482                     // 0xf2000110
  39483                     unsigned rd = ExtractDRegister(instr, 22, 12);
  39484                     unsigned rn = ExtractDRegister(instr, 7, 16);
  39485                     unsigned rm = ExtractDRegister(instr, 5, 0);
  39486                     // VAND{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
  39487                     vand(al,
  39488                          kDataTypeValueNone,
  39489                          DRegister(rd),
  39490                          DRegister(rn),
  39491                          DRegister(rm));
  39492                     break;
  39493                   }
  39494                   case 0x00100000: {
  39495                     // 0xf2100110
  39496                     unsigned rd = ExtractDRegister(instr, 22, 12);
  39497                     unsigned rn = ExtractDRegister(instr, 7, 16);
  39498                     unsigned rm = ExtractDRegister(instr, 5, 0);
  39499                     // VBIC{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
  39500                     vbic(al,
  39501                          kDataTypeValueNone,
  39502                          DRegister(rd),
  39503                          DRegister(rn),
  39504                          DRegister(rm));
  39505                     break;
  39506                   }
  39507                   case 0x00200000: {
  39508                     // 0xf2200110
  39509                     if (((instr & 0x00000040) == 0x00000000) &&
  39510                         ((((Uint32((instr >> 7)) & Uint32(0x1)) << 4) |
  39511                           (Uint32((instr >> 16)) & Uint32(0xf))) ==
  39512                          (((Uint32((instr >> 5)) & Uint32(0x1)) << 4) |
  39513                           (Uint32(instr) & Uint32(0xf))))) {
  39514                       unsigned rd = ExtractDRegister(instr, 22, 12);
  39515                       unsigned rm = ExtractDRegister(instr, 7, 16);
  39516                       // VMOV{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
  39517                       vmov(al,
  39518                            kDataTypeValueNone,
  39519                            DRegister(rd),
  39520                            DRegister(rm));
  39521                       return;
  39522                     }
  39523                     unsigned rd = ExtractDRegister(instr, 22, 12);
  39524                     unsigned rn = ExtractDRegister(instr, 7, 16);
  39525                     unsigned rm = ExtractDRegister(instr, 5, 0);
  39526                     // VORR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
  39527                     vorr(al,
  39528                          kDataTypeValueNone,
  39529                          DRegister(rd),
  39530                          DRegister(rn),
  39531                          DRegister(rm));
  39532                     break;
  39533                   }
  39534                   case 0x00300000: {
  39535                     // 0xf2300110
  39536                     unsigned rd = ExtractDRegister(instr, 22, 12);
  39537                     unsigned rn = ExtractDRegister(instr, 7, 16);
  39538                     unsigned rm = ExtractDRegister(instr, 5, 0);
  39539                     // VORN{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
  39540                     vorn(al,
  39541                          kDataTypeValueNone,
  39542                          DRegister(rd),
  39543                          DRegister(rn),
  39544                          DRegister(rm));
  39545                     break;
  39546                   }
  39547                   case 0x01000000: {
  39548                     // 0xf3000110
  39549                     unsigned rd = ExtractDRegister(instr, 22, 12);
  39550                     unsigned rn = ExtractDRegister(instr, 7, 16);
  39551                     unsigned rm = ExtractDRegister(instr, 5, 0);
  39552                     // VEOR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
  39553                     veor(al,
  39554                          kDataTypeValueNone,
  39555                          DRegister(rd),
  39556                          DRegister(rn),
  39557                          DRegister(rm));
  39558                     break;
  39559                   }
  39560                   case 0x01100000: {
  39561                     // 0xf3100110
  39562                     unsigned rd = ExtractDRegister(instr, 22, 12);
  39563                     unsigned rn = ExtractDRegister(instr, 7, 16);
  39564                     unsigned rm = ExtractDRegister(instr, 5, 0);
  39565                     // VBSL{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
  39566                     vbsl(al,
  39567                          kDataTypeValueNone,
  39568                          DRegister(rd),
  39569                          DRegister(rn),
  39570                          DRegister(rm));
  39571                     break;
  39572                   }
  39573                   case 0x01200000: {
  39574                     // 0xf3200110
  39575                     unsigned rd = ExtractDRegister(instr, 22, 12);
  39576                     unsigned rn = ExtractDRegister(instr, 7, 16);
  39577                     unsigned rm = ExtractDRegister(instr, 5, 0);
  39578                     // VBIT{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
  39579                     vbit(al,
  39580                          kDataTypeValueNone,
  39581                          DRegister(rd),
  39582                          DRegister(rn),
  39583                          DRegister(rm));
  39584                     break;
  39585                   }
  39586                   case 0x01300000: {
  39587                     // 0xf3300110
  39588                     unsigned rd = ExtractDRegister(instr, 22, 12);
  39589                     unsigned rn = ExtractDRegister(instr, 7, 16);
  39590                     unsigned rm = ExtractDRegister(instr, 5, 0);
  39591                     // VBIF{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1
  39592                     vbif(al,
  39593                          kDataTypeValueNone,
  39594                          DRegister(rd),
  39595                          DRegister(rn),
  39596                          DRegister(rm));
  39597                     break;
  39598                   }
  39599                 }
  39600                 break;
  39601               }
  39602               case 0x00000140: {
  39603                 // 0xf2000150
  39604                 switch (instr & 0x01300000) {
  39605                   case 0x00000000: {
  39606                     // 0xf2000150
  39607                     if (((instr >> 12) & 1) != 0) {
  39608                       UnallocatedA32(instr);
  39609                       return;
  39610                     }
  39611                     unsigned rd = ExtractQRegister(instr, 22, 12);
  39612                     if (((instr >> 16) & 1) != 0) {
  39613                       UnallocatedA32(instr);
  39614                       return;
  39615                     }
  39616                     unsigned rn = ExtractQRegister(instr, 7, 16);
  39617                     if ((instr & 1) != 0) {
  39618                       UnallocatedA32(instr);
  39619                       return;
  39620                     }
  39621                     unsigned rm = ExtractQRegister(instr, 5, 0);
  39622                     // VAND{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
  39623                     vand(al,
  39624                          kDataTypeValueNone,
  39625                          QRegister(rd),
  39626                          QRegister(rn),
  39627                          QRegister(rm));
  39628                     break;
  39629                   }
  39630                   case 0x00100000: {
  39631                     // 0xf2100150
  39632                     if (((instr >> 12) & 1) != 0) {
  39633                       UnallocatedA32(instr);
  39634                       return;
  39635                     }
  39636                     unsigned rd = ExtractQRegister(instr, 22, 12);
  39637                     if (((instr >> 16) & 1) != 0) {
  39638                       UnallocatedA32(instr);
  39639                       return;
  39640                     }
  39641                     unsigned rn = ExtractQRegister(instr, 7, 16);
  39642                     if ((instr & 1) != 0) {
  39643                       UnallocatedA32(instr);
  39644                       return;
  39645                     }
  39646                     unsigned rm = ExtractQRegister(instr, 5, 0);
  39647                     // VBIC{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
  39648                     vbic(al,
  39649                          kDataTypeValueNone,
  39650                          QRegister(rd),
  39651                          QRegister(rn),
  39652                          QRegister(rm));
  39653                     break;
  39654                   }
  39655                   case 0x00200000: {
  39656                     // 0xf2200150
  39657                     if (((instr & 0x00000040) == 0x00000040) &&
  39658                         ((((Uint32((instr >> 7)) & Uint32(0x1)) << 4) |
  39659                           (Uint32((instr >> 16)) & Uint32(0xf))) ==
  39660                          (((Uint32((instr >> 5)) & Uint32(0x1)) << 4) |
  39661                           (Uint32(instr) & Uint32(0xf))))) {
  39662                       if (((instr >> 12) & 1) != 0) {
  39663                         UnallocatedA32(instr);
  39664                         return;
  39665                       }
  39666                       unsigned rd = ExtractQRegister(instr, 22, 12);
  39667                       if (((instr >> 16) & 1) != 0) {
  39668                         UnallocatedA32(instr);
  39669                         return;
  39670                       }
  39671                       unsigned rm = ExtractQRegister(instr, 7, 16);
  39672                       // VMOV{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
  39673                       vmov(al,
  39674                            kDataTypeValueNone,
  39675                            QRegister(rd),
  39676                            QRegister(rm));
  39677                       return;
  39678                     }
  39679                     if (((instr >> 12) & 1) != 0) {
  39680                       UnallocatedA32(instr);
  39681                       return;
  39682                     }
  39683                     unsigned rd = ExtractQRegister(instr, 22, 12);
  39684                     if (((instr >> 16) & 1) != 0) {
  39685                       UnallocatedA32(instr);
  39686                       return;
  39687                     }
  39688                     unsigned rn = ExtractQRegister(instr, 7, 16);
  39689                     if ((instr & 1) != 0) {
  39690                       UnallocatedA32(instr);
  39691                       return;
  39692                     }
  39693                     unsigned rm = ExtractQRegister(instr, 5, 0);
  39694                     // VORR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
  39695                     vorr(al,
  39696                          kDataTypeValueNone,
  39697                          QRegister(rd),
  39698                          QRegister(rn),
  39699                          QRegister(rm));
  39700                     break;
  39701                   }
  39702                   case 0x00300000: {
  39703                     // 0xf2300150
  39704                     if (((instr >> 12) & 1) != 0) {
  39705                       UnallocatedA32(instr);
  39706                       return;
  39707                     }
  39708                     unsigned rd = ExtractQRegister(instr, 22, 12);
  39709                     if (((instr >> 16) & 1) != 0) {
  39710                       UnallocatedA32(instr);
  39711                       return;
  39712                     }
  39713                     unsigned rn = ExtractQRegister(instr, 7, 16);
  39714                     if ((instr & 1) != 0) {
  39715                       UnallocatedA32(instr);
  39716                       return;
  39717                     }
  39718                     unsigned rm = ExtractQRegister(instr, 5, 0);
  39719                     // VORN{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
  39720                     vorn(al,
  39721                          kDataTypeValueNone,
  39722                          QRegister(rd),
  39723                          QRegister(rn),
  39724                          QRegister(rm));
  39725                     break;
  39726                   }
  39727                   case 0x01000000: {
  39728                     // 0xf3000150
  39729                     if (((instr >> 12) & 1) != 0) {
  39730                       UnallocatedA32(instr);
  39731                       return;
  39732                     }
  39733                     unsigned rd = ExtractQRegister(instr, 22, 12);
  39734                     if (((instr >> 16) & 1) != 0) {
  39735                       UnallocatedA32(instr);
  39736                       return;
  39737                     }
  39738                     unsigned rn = ExtractQRegister(instr, 7, 16);
  39739                     if ((instr & 1) != 0) {
  39740                       UnallocatedA32(instr);
  39741                       return;
  39742                     }
  39743                     unsigned rm = ExtractQRegister(instr, 5, 0);
  39744                     // VEOR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
  39745                     veor(al,
  39746                          kDataTypeValueNone,
  39747                          QRegister(rd),
  39748                          QRegister(rn),
  39749                          QRegister(rm));
  39750                     break;
  39751                   }
  39752                   case 0x01100000: {
  39753                     // 0xf3100150
  39754                     if (((instr >> 12) & 1) != 0) {
  39755                       UnallocatedA32(instr);
  39756                       return;
  39757                     }
  39758                     unsigned rd = ExtractQRegister(instr, 22, 12);
  39759                     if (((instr >> 16) & 1) != 0) {
  39760                       UnallocatedA32(instr);
  39761                       return;
  39762                     }
  39763                     unsigned rn = ExtractQRegister(instr, 7, 16);
  39764                     if ((instr & 1) != 0) {
  39765                       UnallocatedA32(instr);
  39766                       return;
  39767                     }
  39768                     unsigned rm = ExtractQRegister(instr, 5, 0);
  39769                     // VBSL{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
  39770                     vbsl(al,
  39771                          kDataTypeValueNone,
  39772                          QRegister(rd),
  39773                          QRegister(rn),
  39774                          QRegister(rm));
  39775                     break;
  39776                   }
  39777                   case 0x01200000: {
  39778                     // 0xf3200150
  39779                     if (((instr >> 12) & 1) != 0) {
  39780                       UnallocatedA32(instr);
  39781                       return;
  39782                     }
  39783                     unsigned rd = ExtractQRegister(instr, 22, 12);
  39784                     if (((instr >> 16) & 1) != 0) {
  39785                       UnallocatedA32(instr);
  39786                       return;
  39787                     }
  39788                     unsigned rn = ExtractQRegister(instr, 7, 16);
  39789                     if ((instr & 1) != 0) {
  39790                       UnallocatedA32(instr);
  39791                       return;
  39792                     }
  39793                     unsigned rm = ExtractQRegister(instr, 5, 0);
  39794                     // VBIT{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
  39795                     vbit(al,
  39796                          kDataTypeValueNone,
  39797                          QRegister(rd),
  39798                          QRegister(rn),
  39799                          QRegister(rm));
  39800                     break;
  39801                   }
  39802                   case 0x01300000: {
  39803                     // 0xf3300150
  39804                     if (((instr >> 12) & 1) != 0) {
  39805                       UnallocatedA32(instr);
  39806                       return;
  39807                     }
  39808                     unsigned rd = ExtractQRegister(instr, 22, 12);
  39809                     if (((instr >> 16) & 1) != 0) {
  39810                       UnallocatedA32(instr);
  39811                       return;
  39812                     }
  39813                     unsigned rn = ExtractQRegister(instr, 7, 16);
  39814                     if ((instr & 1) != 0) {
  39815                       UnallocatedA32(instr);
  39816                       return;
  39817                     }
  39818                     unsigned rm = ExtractQRegister(instr, 5, 0);
  39819                     // VBIF{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1
  39820                     vbif(al,
  39821                          kDataTypeValueNone,
  39822                          QRegister(rd),
  39823                          QRegister(rn),
  39824                          QRegister(rm));
  39825                     break;
  39826                   }
  39827                 }
  39828                 break;
  39829               }
  39830               case 0x00000200: {
  39831                 // 0xf2000210
  39832                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
  39833                                                  ((instr >> 22) & 0x4));
  39834                 if (dt.Is(kDataTypeValueInvalid)) {
  39835                   UnallocatedA32(instr);
  39836                   return;
  39837                 }
  39838                 unsigned rd = ExtractDRegister(instr, 22, 12);
  39839                 unsigned rn = ExtractDRegister(instr, 7, 16);
  39840                 unsigned rm = ExtractDRegister(instr, 5, 0);
  39841                 // VQSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  39842                 vqsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  39843                 break;
  39844               }
  39845               case 0x00000240: {
  39846                 // 0xf2000250
  39847                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
  39848                                                  ((instr >> 22) & 0x4));
  39849                 if (dt.Is(kDataTypeValueInvalid)) {
  39850                   UnallocatedA32(instr);
  39851                   return;
  39852                 }
  39853                 if (((instr >> 12) & 1) != 0) {
  39854                   UnallocatedA32(instr);
  39855                   return;
  39856                 }
  39857                 unsigned rd = ExtractQRegister(instr, 22, 12);
  39858                 if (((instr >> 16) & 1) != 0) {
  39859                   UnallocatedA32(instr);
  39860                   return;
  39861                 }
  39862                 unsigned rn = ExtractQRegister(instr, 7, 16);
  39863                 if ((instr & 1) != 0) {
  39864                   UnallocatedA32(instr);
  39865                   return;
  39866                 }
  39867                 unsigned rm = ExtractQRegister(instr, 5, 0);
  39868                 // VQSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
  39869                 vqsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  39870                 break;
  39871               }
  39872               case 0x00000300: {
  39873                 // 0xf2000310
  39874                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  39875                                                  ((instr >> 22) & 0x4));
  39876                 if (dt.Is(kDataTypeValueInvalid)) {
  39877                   UnallocatedA32(instr);
  39878                   return;
  39879                 }
  39880                 unsigned rd = ExtractDRegister(instr, 22, 12);
  39881                 unsigned rn = ExtractDRegister(instr, 7, 16);
  39882                 unsigned rm = ExtractDRegister(instr, 5, 0);
  39883                 // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  39884                 vcge(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  39885                 break;
  39886               }
  39887               case 0x00000340: {
  39888                 // 0xf2000350
  39889                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  39890                                                  ((instr >> 22) & 0x4));
  39891                 if (dt.Is(kDataTypeValueInvalid)) {
  39892                   UnallocatedA32(instr);
  39893                   return;
  39894                 }
  39895                 if (((instr >> 12) & 1) != 0) {
  39896                   UnallocatedA32(instr);
  39897                   return;
  39898                 }
  39899                 unsigned rd = ExtractQRegister(instr, 22, 12);
  39900                 if (((instr >> 16) & 1) != 0) {
  39901                   UnallocatedA32(instr);
  39902                   return;
  39903                 }
  39904                 unsigned rn = ExtractQRegister(instr, 7, 16);
  39905                 if ((instr & 1) != 0) {
  39906                   UnallocatedA32(instr);
  39907                   return;
  39908                 }
  39909                 unsigned rm = ExtractQRegister(instr, 5, 0);
  39910                 // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
  39911                 vcge(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  39912                 break;
  39913               }
  39914               case 0x00000400: {
  39915                 // 0xf2000410
  39916                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
  39917                                                  ((instr >> 22) & 0x4));
  39918                 if (dt.Is(kDataTypeValueInvalid)) {
  39919                   UnallocatedA32(instr);
  39920                   return;
  39921                 }
  39922                 unsigned rd = ExtractDRegister(instr, 22, 12);
  39923                 unsigned rm = ExtractDRegister(instr, 5, 0);
  39924                 unsigned rn = ExtractDRegister(instr, 7, 16);
  39925                 // VQSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
  39926                 vqshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
  39927                 break;
  39928               }
  39929               case 0x00000440: {
  39930                 // 0xf2000450
  39931                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
  39932                                                  ((instr >> 22) & 0x4));
  39933                 if (dt.Is(kDataTypeValueInvalid)) {
  39934                   UnallocatedA32(instr);
  39935                   return;
  39936                 }
  39937                 if (((instr >> 12) & 1) != 0) {
  39938                   UnallocatedA32(instr);
  39939                   return;
  39940                 }
  39941                 unsigned rd = ExtractQRegister(instr, 22, 12);
  39942                 if ((instr & 1) != 0) {
  39943                   UnallocatedA32(instr);
  39944                   return;
  39945                 }
  39946                 unsigned rm = ExtractQRegister(instr, 5, 0);
  39947                 if (((instr >> 16) & 1) != 0) {
  39948                   UnallocatedA32(instr);
  39949                   return;
  39950                 }
  39951                 unsigned rn = ExtractQRegister(instr, 7, 16);
  39952                 // VQSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
  39953                 vqshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
  39954                 break;
  39955               }
  39956               case 0x00000500: {
  39957                 // 0xf2000510
  39958                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
  39959                                                  ((instr >> 22) & 0x4));
  39960                 if (dt.Is(kDataTypeValueInvalid)) {
  39961                   UnallocatedA32(instr);
  39962                   return;
  39963                 }
  39964                 unsigned rd = ExtractDRegister(instr, 22, 12);
  39965                 unsigned rm = ExtractDRegister(instr, 5, 0);
  39966                 unsigned rn = ExtractDRegister(instr, 7, 16);
  39967                 // VQRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1
  39968                 vqrshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn));
  39969                 break;
  39970               }
  39971               case 0x00000540: {
  39972                 // 0xf2000550
  39973                 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) |
  39974                                                  ((instr >> 22) & 0x4));
  39975                 if (dt.Is(kDataTypeValueInvalid)) {
  39976                   UnallocatedA32(instr);
  39977                   return;
  39978                 }
  39979                 if (((instr >> 12) & 1) != 0) {
  39980                   UnallocatedA32(instr);
  39981                   return;
  39982                 }
  39983                 unsigned rd = ExtractQRegister(instr, 22, 12);
  39984                 if ((instr & 1) != 0) {
  39985                   UnallocatedA32(instr);
  39986                   return;
  39987                 }
  39988                 unsigned rm = ExtractQRegister(instr, 5, 0);
  39989                 if (((instr >> 16) & 1) != 0) {
  39990                   UnallocatedA32(instr);
  39991                   return;
  39992                 }
  39993                 unsigned rn = ExtractQRegister(instr, 7, 16);
  39994                 // VQRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1
  39995                 vqrshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn));
  39996                 break;
  39997               }
  39998               case 0x00000600: {
  39999                 // 0xf2000610
  40000                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  40001                                                  ((instr >> 22) & 0x4));
  40002                 if (dt.Is(kDataTypeValueInvalid)) {
  40003                   UnallocatedA32(instr);
  40004                   return;
  40005                 }
  40006                 unsigned rd = ExtractDRegister(instr, 22, 12);
  40007                 unsigned rn = ExtractDRegister(instr, 7, 16);
  40008                 unsigned rm = ExtractDRegister(instr, 5, 0);
  40009                 // VMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  40010                 vmin(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  40011                 break;
  40012               }
  40013               case 0x00000640: {
  40014                 // 0xf2000650
  40015                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  40016                                                  ((instr >> 22) & 0x4));
  40017                 if (dt.Is(kDataTypeValueInvalid)) {
  40018                   UnallocatedA32(instr);
  40019                   return;
  40020                 }
  40021                 if (((instr >> 12) & 1) != 0) {
  40022                   UnallocatedA32(instr);
  40023                   return;
  40024                 }
  40025                 unsigned rd = ExtractQRegister(instr, 22, 12);
  40026                 if (((instr >> 16) & 1) != 0) {
  40027                   UnallocatedA32(instr);
  40028                   return;
  40029                 }
  40030                 unsigned rn = ExtractQRegister(instr, 7, 16);
  40031                 if ((instr & 1) != 0) {
  40032                   UnallocatedA32(instr);
  40033                   return;
  40034                 }
  40035                 unsigned rm = ExtractQRegister(instr, 5, 0);
  40036                 // VMIN{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
  40037                 vmin(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  40038                 break;
  40039               }
  40040               case 0x00000700: {
  40041                 // 0xf2000710
  40042                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  40043                                                  ((instr >> 22) & 0x4));
  40044                 if (dt.Is(kDataTypeValueInvalid)) {
  40045                   UnallocatedA32(instr);
  40046                   return;
  40047                 }
  40048                 unsigned rd = ExtractDRegister(instr, 22, 12);
  40049                 unsigned rn = ExtractDRegister(instr, 7, 16);
  40050                 unsigned rm = ExtractDRegister(instr, 5, 0);
  40051                 // VABA{<c>}{<q>}.<dt> <Dd>, <Dn>, <Dm> ; A1
  40052                 vaba(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  40053                 break;
  40054               }
  40055               case 0x00000740: {
  40056                 // 0xf2000750
  40057                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  40058                                                  ((instr >> 22) & 0x4));
  40059                 if (dt.Is(kDataTypeValueInvalid)) {
  40060                   UnallocatedA32(instr);
  40061                   return;
  40062                 }
  40063                 if (((instr >> 12) & 1) != 0) {
  40064                   UnallocatedA32(instr);
  40065                   return;
  40066                 }
  40067                 unsigned rd = ExtractQRegister(instr, 22, 12);
  40068                 if (((instr >> 16) & 1) != 0) {
  40069                   UnallocatedA32(instr);
  40070                   return;
  40071                 }
  40072                 unsigned rn = ExtractQRegister(instr, 7, 16);
  40073                 if ((instr & 1) != 0) {
  40074                   UnallocatedA32(instr);
  40075                   return;
  40076                 }
  40077                 unsigned rm = ExtractQRegister(instr, 5, 0);
  40078                 // VABA{<c>}{<q>}.<dt> <Qd>, <Qn>, <Qm> ; A1
  40079                 vaba(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  40080                 break;
  40081               }
  40082               case 0x00000800: {
  40083                 // 0xf2000810
  40084                 switch (instr & 0x01000000) {
  40085                   case 0x00000000: {
  40086                     // 0xf2000810
  40087                     DataType dt = Dt_size_7_Decode((instr >> 20) & 0x3);
  40088                     if (dt.Is(kDataTypeValueInvalid)) {
  40089                       UnallocatedA32(instr);
  40090                       return;
  40091                     }
  40092                     unsigned rd = ExtractDRegister(instr, 22, 12);
  40093                     unsigned rn = ExtractDRegister(instr, 7, 16);
  40094                     unsigned rm = ExtractDRegister(instr, 5, 0);
  40095                     // VTST{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  40096                     vtst(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  40097                     break;
  40098                   }
  40099                   case 0x01000000: {
  40100                     // 0xf3000810
  40101                     DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
  40102                     if (dt.Is(kDataTypeValueInvalid)) {
  40103                       UnallocatedA32(instr);
  40104                       return;
  40105                     }
  40106                     unsigned rd = ExtractDRegister(instr, 22, 12);
  40107                     unsigned rn = ExtractDRegister(instr, 7, 16);
  40108                     unsigned rm = ExtractDRegister(instr, 5, 0);
  40109                     // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  40110                     vceq(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  40111                     break;
  40112                   }
  40113                 }
  40114                 break;
  40115               }
  40116               case 0x00000840: {
  40117                 // 0xf2000850
  40118                 switch (instr & 0x01000000) {
  40119                   case 0x00000000: {
  40120                     // 0xf2000850
  40121                     DataType dt = Dt_size_7_Decode((instr >> 20) & 0x3);
  40122                     if (dt.Is(kDataTypeValueInvalid)) {
  40123                       UnallocatedA32(instr);
  40124                       return;
  40125                     }
  40126                     if (((instr >> 12) & 1) != 0) {
  40127                       UnallocatedA32(instr);
  40128                       return;
  40129                     }
  40130                     unsigned rd = ExtractQRegister(instr, 22, 12);
  40131                     if (((instr >> 16) & 1) != 0) {
  40132                       UnallocatedA32(instr);
  40133                       return;
  40134                     }
  40135                     unsigned rn = ExtractQRegister(instr, 7, 16);
  40136                     if ((instr & 1) != 0) {
  40137                       UnallocatedA32(instr);
  40138                       return;
  40139                     }
  40140                     unsigned rm = ExtractQRegister(instr, 5, 0);
  40141                     // VTST{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
  40142                     vtst(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  40143                     break;
  40144                   }
  40145                   case 0x01000000: {
  40146                     // 0xf3000850
  40147                     DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
  40148                     if (dt.Is(kDataTypeValueInvalid)) {
  40149                       UnallocatedA32(instr);
  40150                       return;
  40151                     }
  40152                     if (((instr >> 12) & 1) != 0) {
  40153                       UnallocatedA32(instr);
  40154                       return;
  40155                     }
  40156                     unsigned rd = ExtractQRegister(instr, 22, 12);
  40157                     if (((instr >> 16) & 1) != 0) {
  40158                       UnallocatedA32(instr);
  40159                       return;
  40160                     }
  40161                     unsigned rn = ExtractQRegister(instr, 7, 16);
  40162                     if ((instr & 1) != 0) {
  40163                       UnallocatedA32(instr);
  40164                       return;
  40165                     }
  40166                     unsigned rm = ExtractQRegister(instr, 5, 0);
  40167                     // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
  40168                     vceq(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  40169                     break;
  40170                   }
  40171                 }
  40172                 break;
  40173               }
  40174               case 0x00000900: {
  40175                 // 0xf2000910
  40176                 DataType dt = Dt_op_size_1_Decode(((instr >> 20) & 0x3) |
  40177                                                   ((instr >> 22) & 0x4));
  40178                 if (dt.Is(kDataTypeValueInvalid)) {
  40179                   UnallocatedA32(instr);
  40180                   return;
  40181                 }
  40182                 unsigned rd = ExtractDRegister(instr, 22, 12);
  40183                 unsigned rn = ExtractDRegister(instr, 7, 16);
  40184                 unsigned rm = ExtractDRegister(instr, 5, 0);
  40185                 // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  40186                 vmul(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  40187                 break;
  40188               }
  40189               case 0x00000940: {
  40190                 // 0xf2000950
  40191                 DataType dt = Dt_op_size_1_Decode(((instr >> 20) & 0x3) |
  40192                                                   ((instr >> 22) & 0x4));
  40193                 if (dt.Is(kDataTypeValueInvalid)) {
  40194                   UnallocatedA32(instr);
  40195                   return;
  40196                 }
  40197                 if (((instr >> 12) & 1) != 0) {
  40198                   UnallocatedA32(instr);
  40199                   return;
  40200                 }
  40201                 unsigned rd = ExtractQRegister(instr, 22, 12);
  40202                 if (((instr >> 16) & 1) != 0) {
  40203                   UnallocatedA32(instr);
  40204                   return;
  40205                 }
  40206                 unsigned rn = ExtractQRegister(instr, 7, 16);
  40207                 if ((instr & 1) != 0) {
  40208                   UnallocatedA32(instr);
  40209                   return;
  40210                 }
  40211                 unsigned rm = ExtractQRegister(instr, 5, 0);
  40212                 // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1
  40213                 vmul(al, dt, QRegister(rd), QRegister(rn), QRegister(rm));
  40214                 break;
  40215               }
  40216               case 0x00000a00: {
  40217                 // 0xf2000a10
  40218                 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  40219                                                  ((instr >> 22) & 0x4));
  40220                 if (dt.Is(kDataTypeValueInvalid)) {
  40221                   UnallocatedA32(instr);
  40222                   return;
  40223                 }
  40224                 unsigned rd = ExtractDRegister(instr, 22, 12);
  40225                 unsigned rn = ExtractDRegister(instr, 7, 16);
  40226                 unsigned rm = ExtractDRegister(instr, 5, 0);
  40227                 // VPMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  40228                 vpmin(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  40229                 break;
  40230               }
  40231               case 0x00000b00: {
  40232                 // 0xf2000b10
  40233                 if ((instr & 0x01000000) == 0x00000000) {
  40234                   DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3);
  40235                   if (dt.Is(kDataTypeValueInvalid)) {
  40236                     UnallocatedA32(instr);
  40237                     return;
  40238                   }
  40239                   unsigned rd = ExtractDRegister(instr, 22, 12);
  40240                   unsigned rn = ExtractDRegister(instr, 7, 16);
  40241                   unsigned rm = ExtractDRegister(instr, 5, 0);
  40242                   // VPADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1
  40243                   vpadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm));
  40244                 } else {
  40245                   UnallocatedA32(instr);
  40246                 }
  40247                 break;
  40248               }
  40249               case 0x00000c00: {
  40250                 // 0xf2000c10
  40251                 switch (instr & 0x01300000) {
  40252                   case 0x00000000: {
  40253                     // 0xf2000c10
  40254                     unsigned rd = ExtractDRegister(instr, 22, 12);
  40255                     unsigned rn = ExtractDRegister(instr, 7, 16);
  40256                     unsigned rm = ExtractDRegister(instr, 5, 0);
  40257                     // VFMA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
  40258                     vfma(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
  40259                     break;
  40260                   }
  40261                   case 0x00200000: {
  40262                     // 0xf2200c10
  40263                     unsigned rd = ExtractDRegister(instr, 22, 12);
  40264                     unsigned rn = ExtractDRegister(instr, 7, 16);
  40265                     unsigned rm = ExtractDRegister(instr, 5, 0);
  40266                     // VFMS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
  40267                     vfms(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
  40268                     break;
  40269                   }
  40270                   default:
  40271                     UnallocatedA32(instr);
  40272                     break;
  40273                 }
  40274                 break;
  40275               }
  40276               case 0x00000c40: {
  40277                 // 0xf2000c50
  40278                 switch (instr & 0x01300000) {
  40279                   case 0x00000000: {
  40280                     // 0xf2000c50
  40281                     if (((instr >> 12) & 1) != 0) {
  40282                       UnallocatedA32(instr);
  40283                       return;
  40284                     }
  40285                     unsigned rd = ExtractQRegister(instr, 22, 12);
  40286                     if (((instr >> 16) & 1) != 0) {
  40287                       UnallocatedA32(instr);
  40288                       return;
  40289                     }
  40290                     unsigned rn = ExtractQRegister(instr, 7, 16);
  40291                     if ((instr & 1) != 0) {
  40292                       UnallocatedA32(instr);
  40293                       return;
  40294                     }
  40295                     unsigned rm = ExtractQRegister(instr, 5, 0);
  40296                     // VFMA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
  40297                     vfma(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
  40298                     break;
  40299                   }
  40300                   case 0x00200000: {
  40301                     // 0xf2200c50
  40302                     if (((instr >> 12) & 1) != 0) {
  40303                       UnallocatedA32(instr);
  40304                       return;
  40305                     }
  40306                     unsigned rd = ExtractQRegister(instr, 22, 12);
  40307                     if (((instr >> 16) & 1) != 0) {
  40308                       UnallocatedA32(instr);
  40309                       return;
  40310                     }
  40311                     unsigned rn = ExtractQRegister(instr, 7, 16);
  40312                     if ((instr & 1) != 0) {
  40313                       UnallocatedA32(instr);
  40314                       return;
  40315                     }
  40316                     unsigned rm = ExtractQRegister(instr, 5, 0);
  40317                     // VFMS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
  40318                     vfms(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
  40319                     break;
  40320                   }
  40321                   default:
  40322                     UnallocatedA32(instr);
  40323                     break;
  40324                 }
  40325                 break;
  40326               }
  40327               case 0x00000d00: {
  40328                 // 0xf2000d10
  40329                 switch (instr & 0x01300000) {
  40330                   case 0x00000000: {
  40331                     // 0xf2000d10
  40332                     unsigned rd = ExtractDRegister(instr, 22, 12);
  40333                     unsigned rn = ExtractDRegister(instr, 7, 16);
  40334                     unsigned rm = ExtractDRegister(instr, 5, 0);
  40335                     // VMLA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
  40336                     vmla(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
  40337                     break;
  40338                   }
  40339                   case 0x00200000: {
  40340                     // 0xf2200d10
  40341                     unsigned rd = ExtractDRegister(instr, 22, 12);
  40342                     unsigned rn = ExtractDRegister(instr, 7, 16);
  40343                     unsigned rm = ExtractDRegister(instr, 5, 0);
  40344                     // VMLS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
  40345                     vmls(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
  40346                     break;
  40347                   }
  40348                   case 0x01000000: {
  40349                     // 0xf3000d10
  40350                     unsigned rd = ExtractDRegister(instr, 22, 12);
  40351                     unsigned rn = ExtractDRegister(instr, 7, 16);
  40352                     unsigned rm = ExtractDRegister(instr, 5, 0);
  40353                     // VMUL{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
  40354                     vmul(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
  40355                     break;
  40356                   }
  40357                   default:
  40358                     UnallocatedA32(instr);
  40359                     break;
  40360                 }
  40361                 break;
  40362               }
  40363               case 0x00000d40: {
  40364                 // 0xf2000d50
  40365                 switch (instr & 0x01300000) {
  40366                   case 0x00000000: {
  40367                     // 0xf2000d50
  40368                     if (((instr >> 12) & 1) != 0) {
  40369                       UnallocatedA32(instr);
  40370                       return;
  40371                     }
  40372                     unsigned rd = ExtractQRegister(instr, 22, 12);
  40373                     if (((instr >> 16) & 1) != 0) {
  40374                       UnallocatedA32(instr);
  40375                       return;
  40376                     }
  40377                     unsigned rn = ExtractQRegister(instr, 7, 16);
  40378                     if ((instr & 1) != 0) {
  40379                       UnallocatedA32(instr);
  40380                       return;
  40381                     }
  40382                     unsigned rm = ExtractQRegister(instr, 5, 0);
  40383                     // VMLA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
  40384                     vmla(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
  40385                     break;
  40386                   }
  40387                   case 0x00200000: {
  40388                     // 0xf2200d50
  40389                     if (((instr >> 12) & 1) != 0) {
  40390                       UnallocatedA32(instr);
  40391                       return;
  40392                     }
  40393                     unsigned rd = ExtractQRegister(instr, 22, 12);
  40394                     if (((instr >> 16) & 1) != 0) {
  40395                       UnallocatedA32(instr);
  40396                       return;
  40397                     }
  40398                     unsigned rn = ExtractQRegister(instr, 7, 16);
  40399                     if ((instr & 1) != 0) {
  40400                       UnallocatedA32(instr);
  40401                       return;
  40402                     }
  40403                     unsigned rm = ExtractQRegister(instr, 5, 0);
  40404                     // VMLS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
  40405                     vmls(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
  40406                     break;
  40407                   }
  40408                   case 0x01000000: {
  40409                     // 0xf3000d50
  40410                     if (((instr >> 12) & 1) != 0) {
  40411                       UnallocatedA32(instr);
  40412                       return;
  40413                     }
  40414                     unsigned rd = ExtractQRegister(instr, 22, 12);
  40415                     if (((instr >> 16) & 1) != 0) {
  40416                       UnallocatedA32(instr);
  40417                       return;
  40418                     }
  40419                     unsigned rn = ExtractQRegister(instr, 7, 16);
  40420                     if ((instr & 1) != 0) {
  40421                       UnallocatedA32(instr);
  40422                       return;
  40423                     }
  40424                     unsigned rm = ExtractQRegister(instr, 5, 0);
  40425                     // VMUL{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
  40426                     vmul(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
  40427                     break;
  40428                   }
  40429                   default:
  40430                     UnallocatedA32(instr);
  40431                     break;
  40432                 }
  40433                 break;
  40434               }
  40435               case 0x00000e00: {
  40436                 // 0xf2000e10
  40437                 switch (instr & 0x01300000) {
  40438                   case 0x01000000: {
  40439                     // 0xf3000e10
  40440                     unsigned rd = ExtractDRegister(instr, 22, 12);
  40441                     unsigned rn = ExtractDRegister(instr, 7, 16);
  40442                     unsigned rm = ExtractDRegister(instr, 5, 0);
  40443                     // VACGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
  40444                     vacge(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
  40445                     break;
  40446                   }
  40447                   case 0x01200000: {
  40448                     // 0xf3200e10
  40449                     unsigned rd = ExtractDRegister(instr, 22, 12);
  40450                     unsigned rn = ExtractDRegister(instr, 7, 16);
  40451                     unsigned rm = ExtractDRegister(instr, 5, 0);
  40452                     // VACGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
  40453                     vacgt(al, F32, DRegister(rd), DRegister(rn), DRegister(rm));
  40454                     break;
  40455                   }
  40456                   default:
  40457                     UnallocatedA32(instr);
  40458                     break;
  40459                 }
  40460                 break;
  40461               }
  40462               case 0x00000e40: {
  40463                 // 0xf2000e50
  40464                 switch (instr & 0x01300000) {
  40465                   case 0x01000000: {
  40466                     // 0xf3000e50
  40467                     if (((instr >> 12) & 1) != 0) {
  40468                       UnallocatedA32(instr);
  40469                       return;
  40470                     }
  40471                     unsigned rd = ExtractQRegister(instr, 22, 12);
  40472                     if (((instr >> 16) & 1) != 0) {
  40473                       UnallocatedA32(instr);
  40474                       return;
  40475                     }
  40476                     unsigned rn = ExtractQRegister(instr, 7, 16);
  40477                     if ((instr & 1) != 0) {
  40478                       UnallocatedA32(instr);
  40479                       return;
  40480                     }
  40481                     unsigned rm = ExtractQRegister(instr, 5, 0);
  40482                     // VACGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
  40483                     vacge(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
  40484                     break;
  40485                   }
  40486                   case 0x01200000: {
  40487                     // 0xf3200e50
  40488                     if (((instr >> 12) & 1) != 0) {
  40489                       UnallocatedA32(instr);
  40490                       return;
  40491                     }
  40492                     unsigned rd = ExtractQRegister(instr, 22, 12);
  40493                     if (((instr >> 16) & 1) != 0) {
  40494                       UnallocatedA32(instr);
  40495                       return;
  40496                     }
  40497                     unsigned rn = ExtractQRegister(instr, 7, 16);
  40498                     if ((instr & 1) != 0) {
  40499                       UnallocatedA32(instr);
  40500                       return;
  40501                     }
  40502                     unsigned rm = ExtractQRegister(instr, 5, 0);
  40503                     // VACGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
  40504                     vacgt(al, F32, QRegister(rd), QRegister(rn), QRegister(rm));
  40505                     break;
  40506                   }
  40507                   default:
  40508                     UnallocatedA32(instr);
  40509                     break;
  40510                 }
  40511                 break;
  40512               }
  40513               case 0x00000f00: {
  40514                 // 0xf2000f10
  40515                 switch (instr & 0x01300000) {
  40516                   case 0x00000000: {
  40517                     // 0xf2000f10
  40518                     unsigned rd = ExtractDRegister(instr, 22, 12);
  40519                     unsigned rn = ExtractDRegister(instr, 7, 16);
  40520                     unsigned rm = ExtractDRegister(instr, 5, 0);
  40521                     // VRECPS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
  40522                     vrecps(al,
  40523                            F32,
  40524                            DRegister(rd),
  40525                            DRegister(rn),
  40526                            DRegister(rm));
  40527                     break;
  40528                   }
  40529                   case 0x00200000: {
  40530                     // 0xf2200f10
  40531                     unsigned rd = ExtractDRegister(instr, 22, 12);
  40532                     unsigned rn = ExtractDRegister(instr, 7, 16);
  40533                     unsigned rm = ExtractDRegister(instr, 5, 0);
  40534                     // VRSQRTS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1
  40535                     vrsqrts(al,
  40536                             F32,
  40537                             DRegister(rd),
  40538                             DRegister(rn),
  40539                             DRegister(rm));
  40540                     break;
  40541                   }
  40542                   case 0x01000000: {
  40543                     // 0xf3000f10
  40544                     unsigned rd = ExtractDRegister(instr, 22, 12);
  40545                     unsigned rn = ExtractDRegister(instr, 7, 16);
  40546                     unsigned rm = ExtractDRegister(instr, 5, 0);
  40547                     // VMAXNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
  40548                     vmaxnm(F32, DRegister(rd), DRegister(rn), DRegister(rm));
  40549                     break;
  40550                   }
  40551                   case 0x01200000: {
  40552                     // 0xf3200f10
  40553                     unsigned rd = ExtractDRegister(instr, 22, 12);
  40554                     unsigned rn = ExtractDRegister(instr, 7, 16);
  40555                     unsigned rm = ExtractDRegister(instr, 5, 0);
  40556                     // VMINNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1
  40557                     vminnm(F32, DRegister(rd), DRegister(rn), DRegister(rm));
  40558                     break;
  40559                   }
  40560                   default:
  40561                     UnallocatedA32(instr);
  40562                     break;
  40563                 }
  40564                 break;
  40565               }
  40566               case 0x00000f40: {
  40567                 // 0xf2000f50
  40568                 switch (instr & 0x01300000) {
  40569                   case 0x00000000: {
  40570                     // 0xf2000f50
  40571                     if (((instr >> 12) & 1) != 0) {
  40572                       UnallocatedA32(instr);
  40573                       return;
  40574                     }
  40575                     unsigned rd = ExtractQRegister(instr, 22, 12);
  40576                     if (((instr >> 16) & 1) != 0) {
  40577                       UnallocatedA32(instr);
  40578                       return;
  40579                     }
  40580                     unsigned rn = ExtractQRegister(instr, 7, 16);
  40581                     if ((instr & 1) != 0) {
  40582                       UnallocatedA32(instr);
  40583                       return;
  40584                     }
  40585                     unsigned rm = ExtractQRegister(instr, 5, 0);
  40586                     // VRECPS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
  40587                     vrecps(al,
  40588                            F32,
  40589                            QRegister(rd),
  40590                            QRegister(rn),
  40591                            QRegister(rm));
  40592                     break;
  40593                   }
  40594                   case 0x00200000: {
  40595                     // 0xf2200f50
  40596                     if (((instr >> 12) & 1) != 0) {
  40597                       UnallocatedA32(instr);
  40598                       return;
  40599                     }
  40600                     unsigned rd = ExtractQRegister(instr, 22, 12);
  40601                     if (((instr >> 16) & 1) != 0) {
  40602                       UnallocatedA32(instr);
  40603                       return;
  40604                     }
  40605                     unsigned rn = ExtractQRegister(instr, 7, 16);
  40606                     if ((instr & 1) != 0) {
  40607                       UnallocatedA32(instr);
  40608                       return;
  40609                     }
  40610                     unsigned rm = ExtractQRegister(instr, 5, 0);
  40611                     // VRSQRTS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1
  40612                     vrsqrts(al,
  40613                             F32,
  40614                             QRegister(rd),
  40615                             QRegister(rn),
  40616                             QRegister(rm));
  40617                     break;
  40618                   }
  40619                   case 0x01000000: {
  40620                     // 0xf3000f50
  40621                     if (((instr >> 12) & 1) != 0) {
  40622                       UnallocatedA32(instr);
  40623                       return;
  40624                     }
  40625                     unsigned rd = ExtractQRegister(instr, 22, 12);
  40626                     if (((instr >> 16) & 1) != 0) {
  40627                       UnallocatedA32(instr);
  40628                       return;
  40629                     }
  40630                     unsigned rn = ExtractQRegister(instr, 7, 16);
  40631                     if ((instr & 1) != 0) {
  40632                       UnallocatedA32(instr);
  40633                       return;
  40634                     }
  40635                     unsigned rm = ExtractQRegister(instr, 5, 0);
  40636                     // VMAXNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
  40637                     vmaxnm(F32, QRegister(rd), QRegister(rn), QRegister(rm));
  40638                     break;
  40639                   }
  40640                   case 0x01200000: {
  40641                     // 0xf3200f50
  40642                     if (((instr >> 12) & 1) != 0) {
  40643                       UnallocatedA32(instr);
  40644                       return;
  40645                     }
  40646                     unsigned rd = ExtractQRegister(instr, 22, 12);
  40647                     if (((instr >> 16) & 1) != 0) {
  40648                       UnallocatedA32(instr);
  40649                       return;
  40650                     }
  40651                     unsigned rn = ExtractQRegister(instr, 7, 16);
  40652                     if ((instr & 1) != 0) {
  40653                       UnallocatedA32(instr);
  40654                       return;
  40655                     }
  40656                     unsigned rm = ExtractQRegister(instr, 5, 0);
  40657                     // VMINNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1
  40658                     vminnm(F32, QRegister(rd), QRegister(rn), QRegister(rm));
  40659                     break;
  40660                   }
  40661                   default:
  40662                     UnallocatedA32(instr);
  40663                     break;
  40664                 }
  40665                 break;
  40666               }
  40667               default:
  40668                 UnallocatedA32(instr);
  40669                 break;
  40670             }
  40671             break;
  40672           }
  40673           case 0x00800000: {
  40674             // 0xf2800000
  40675             switch (instr & 0x00300000) {
  40676               case 0x00300000: {
  40677                 // 0xf2b00000
  40678                 switch (instr & 0x01000000) {
  40679                   case 0x00000000: {
  40680                     // 0xf2b00000
  40681                     switch (instr & 0x00000040) {
  40682                       case 0x00000000: {
  40683                         // 0xf2b00000
  40684                         if (((instr & 0x800) == 0x800)) {
  40685                           UnallocatedA32(instr);
  40686                           return;
  40687                         }
  40688                         unsigned rd = ExtractDRegister(instr, 22, 12);
  40689                         unsigned rn = ExtractDRegister(instr, 7, 16);
  40690                         unsigned rm = ExtractDRegister(instr, 5, 0);
  40691                         uint32_t imm = (instr >> 8) & 0xf;
  40692                         // VEXT{<c>}{<q>}.8 {<Dd>}, <Dn>, <Dm>, #<imm> ; A1
  40693                         vext(al,
  40694                              Untyped8,
  40695                              DRegister(rd),
  40696                              DRegister(rn),
  40697                              DRegister(rm),
  40698                              imm);
  40699                         break;
  40700                       }
  40701                       case 0x00000040: {
  40702                         // 0xf2b00040
  40703                         if (((instr >> 12) & 1) != 0) {
  40704                           UnallocatedA32(instr);
  40705                           return;
  40706                         }
  40707                         unsigned rd = ExtractQRegister(instr, 22, 12);
  40708                         if (((instr >> 16) & 1) != 0) {
  40709                           UnallocatedA32(instr);
  40710                           return;
  40711                         }
  40712                         unsigned rn = ExtractQRegister(instr, 7, 16);
  40713                         if ((instr & 1) != 0) {
  40714                           UnallocatedA32(instr);
  40715                           return;
  40716                         }
  40717                         unsigned rm = ExtractQRegister(instr, 5, 0);
  40718                         uint32_t imm = (instr >> 8) & 0xf;
  40719                         // VEXT{<c>}{<q>}.8 {<Qd>}, <Qn>, <Qm>, #<imm> ; A1
  40720                         vext(al,
  40721                              Untyped8,
  40722                              QRegister(rd),
  40723                              QRegister(rn),
  40724                              QRegister(rm),
  40725                              imm);
  40726                         break;
  40727                       }
  40728                     }
  40729                     break;
  40730                   }
  40731                   case 0x01000000: {
  40732                     // 0xf3b00000
  40733                     switch (instr & 0x00000800) {
  40734                       case 0x00000000: {
  40735                         // 0xf3b00000
  40736                         switch (instr & 0x00030200) {
  40737                           case 0x00000000: {
  40738                             // 0xf3b00000
  40739                             switch (instr & 0x000005c0) {
  40740                               case 0x00000000: {
  40741                                 // 0xf3b00000
  40742                                 DataType dt =
  40743                                     Dt_size_7_Decode((instr >> 18) & 0x3);
  40744                                 if (dt.Is(kDataTypeValueInvalid)) {
  40745                                   UnallocatedA32(instr);
  40746                                   return;
  40747                                 }
  40748                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  40749                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  40750                                 // VREV64{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
  40751                                 vrev64(al, dt, DRegister(rd), DRegister(rm));
  40752                                 break;
  40753                               }
  40754                               case 0x00000040: {
  40755                                 // 0xf3b00040
  40756                                 DataType dt =
  40757                                     Dt_size_7_Decode((instr >> 18) & 0x3);
  40758                                 if (dt.Is(kDataTypeValueInvalid)) {
  40759                                   UnallocatedA32(instr);
  40760                                   return;
  40761                                 }
  40762                                 if (((instr >> 12) & 1) != 0) {
  40763                                   UnallocatedA32(instr);
  40764                                   return;
  40765                                 }
  40766                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  40767                                 if ((instr & 1) != 0) {
  40768                                   UnallocatedA32(instr);
  40769                                   return;
  40770                                 }
  40771                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  40772                                 // VREV64{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
  40773                                 vrev64(al, dt, QRegister(rd), QRegister(rm));
  40774                                 break;
  40775                               }
  40776                               case 0x00000080: {
  40777                                 // 0xf3b00080
  40778                                 DataType dt =
  40779                                     Dt_size_15_Decode((instr >> 18) & 0x3);
  40780                                 if (dt.Is(kDataTypeValueInvalid)) {
  40781                                   UnallocatedA32(instr);
  40782                                   return;
  40783                                 }
  40784                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  40785                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  40786                                 // VREV32{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
  40787                                 vrev32(al, dt, DRegister(rd), DRegister(rm));
  40788                                 break;
  40789                               }
  40790                               case 0x000000c0: {
  40791                                 // 0xf3b000c0
  40792                                 DataType dt =
  40793                                     Dt_size_15_Decode((instr >> 18) & 0x3);
  40794                                 if (dt.Is(kDataTypeValueInvalid)) {
  40795                                   UnallocatedA32(instr);
  40796                                   return;
  40797                                 }
  40798                                 if (((instr >> 12) & 1) != 0) {
  40799                                   UnallocatedA32(instr);
  40800                                   return;
  40801                                 }
  40802                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  40803                                 if ((instr & 1) != 0) {
  40804                                   UnallocatedA32(instr);
  40805                                   return;
  40806                                 }
  40807                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  40808                                 // VREV32{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
  40809                                 vrev32(al, dt, QRegister(rd), QRegister(rm));
  40810                                 break;
  40811                               }
  40812                               case 0x00000100: {
  40813                                 // 0xf3b00100
  40814                                 DataType dt =
  40815                                     Dt_size_1_Decode((instr >> 18) & 0x3);
  40816                                 if (dt.Is(kDataTypeValueInvalid)) {
  40817                                   UnallocatedA32(instr);
  40818                                   return;
  40819                                 }
  40820                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  40821                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  40822                                 // VREV16{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
  40823                                 vrev16(al, dt, DRegister(rd), DRegister(rm));
  40824                                 break;
  40825                               }
  40826                               case 0x00000140: {
  40827                                 // 0xf3b00140
  40828                                 DataType dt =
  40829                                     Dt_size_1_Decode((instr >> 18) & 0x3);
  40830                                 if (dt.Is(kDataTypeValueInvalid)) {
  40831                                   UnallocatedA32(instr);
  40832                                   return;
  40833                                 }
  40834                                 if (((instr >> 12) & 1) != 0) {
  40835                                   UnallocatedA32(instr);
  40836                                   return;
  40837                                 }
  40838                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  40839                                 if ((instr & 1) != 0) {
  40840                                   UnallocatedA32(instr);
  40841                                   return;
  40842                                 }
  40843                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  40844                                 // VREV16{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
  40845                                 vrev16(al, dt, QRegister(rd), QRegister(rm));
  40846                                 break;
  40847                               }
  40848                               case 0x00000400: {
  40849                                 // 0xf3b00400
  40850                                 DataType dt =
  40851                                     Dt_size_5_Decode((instr >> 18) & 0x3);
  40852                                 if (dt.Is(kDataTypeValueInvalid)) {
  40853                                   UnallocatedA32(instr);
  40854                                   return;
  40855                                 }
  40856                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  40857                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  40858                                 // VCLS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
  40859                                 vcls(al, dt, DRegister(rd), DRegister(rm));
  40860                                 break;
  40861                               }
  40862                               case 0x00000440: {
  40863                                 // 0xf3b00440
  40864                                 DataType dt =
  40865                                     Dt_size_5_Decode((instr >> 18) & 0x3);
  40866                                 if (dt.Is(kDataTypeValueInvalid)) {
  40867                                   UnallocatedA32(instr);
  40868                                   return;
  40869                                 }
  40870                                 if (((instr >> 12) & 1) != 0) {
  40871                                   UnallocatedA32(instr);
  40872                                   return;
  40873                                 }
  40874                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  40875                                 if ((instr & 1) != 0) {
  40876                                   UnallocatedA32(instr);
  40877                                   return;
  40878                                 }
  40879                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  40880                                 // VCLS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
  40881                                 vcls(al, dt, QRegister(rd), QRegister(rm));
  40882                                 break;
  40883                               }
  40884                               case 0x00000480: {
  40885                                 // 0xf3b00480
  40886                                 DataType dt =
  40887                                     Dt_size_4_Decode((instr >> 18) & 0x3);
  40888                                 if (dt.Is(kDataTypeValueInvalid)) {
  40889                                   UnallocatedA32(instr);
  40890                                   return;
  40891                                 }
  40892                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  40893                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  40894                                 // VCLZ{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
  40895                                 vclz(al, dt, DRegister(rd), DRegister(rm));
  40896                                 break;
  40897                               }
  40898                               case 0x000004c0: {
  40899                                 // 0xf3b004c0
  40900                                 DataType dt =
  40901                                     Dt_size_4_Decode((instr >> 18) & 0x3);
  40902                                 if (dt.Is(kDataTypeValueInvalid)) {
  40903                                   UnallocatedA32(instr);
  40904                                   return;
  40905                                 }
  40906                                 if (((instr >> 12) & 1) != 0) {
  40907                                   UnallocatedA32(instr);
  40908                                   return;
  40909                                 }
  40910                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  40911                                 if ((instr & 1) != 0) {
  40912                                   UnallocatedA32(instr);
  40913                                   return;
  40914                                 }
  40915                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  40916                                 // VCLZ{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
  40917                                 vclz(al, dt, QRegister(rd), QRegister(rm));
  40918                                 break;
  40919                               }
  40920                               case 0x00000500: {
  40921                                 // 0xf3b00500
  40922                                 if ((instr & 0x000c0000) == 0x00000000) {
  40923                                   unsigned rd = ExtractDRegister(instr, 22, 12);
  40924                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  40925                                   // VCNT{<c>}{<q>}.8 <Dd>, <Dm> ; A1
  40926                                   vcnt(al,
  40927                                        Untyped8,
  40928                                        DRegister(rd),
  40929                                        DRegister(rm));
  40930                                 } else {
  40931                                   UnallocatedA32(instr);
  40932                                 }
  40933                                 break;
  40934                               }
  40935                               case 0x00000540: {
  40936                                 // 0xf3b00540
  40937                                 if ((instr & 0x000c0000) == 0x00000000) {
  40938                                   if (((instr >> 12) & 1) != 0) {
  40939                                     UnallocatedA32(instr);
  40940                                     return;
  40941                                   }
  40942                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  40943                                   if ((instr & 1) != 0) {
  40944                                     UnallocatedA32(instr);
  40945                                     return;
  40946                                   }
  40947                                   unsigned rm = ExtractQRegister(instr, 5, 0);
  40948                                   // VCNT{<c>}{<q>}.8 <Qd>, <Qm> ; A1
  40949                                   vcnt(al,
  40950                                        Untyped8,
  40951                                        QRegister(rd),
  40952                                        QRegister(rm));
  40953                                 } else {
  40954                                   UnallocatedA32(instr);
  40955                                 }
  40956                                 break;
  40957                               }
  40958                               case 0x00000580: {
  40959                                 // 0xf3b00580
  40960                                 if ((instr & 0x000c0000) == 0x00000000) {
  40961                                   unsigned rd = ExtractDRegister(instr, 22, 12);
  40962                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  40963                                   // VMVN{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
  40964                                   vmvn(al,
  40965                                        kDataTypeValueNone,
  40966                                        DRegister(rd),
  40967                                        DRegister(rm));
  40968                                 } else {
  40969                                   UnallocatedA32(instr);
  40970                                 }
  40971                                 break;
  40972                               }
  40973                               case 0x000005c0: {
  40974                                 // 0xf3b005c0
  40975                                 if ((instr & 0x000c0000) == 0x00000000) {
  40976                                   if (((instr >> 12) & 1) != 0) {
  40977                                     UnallocatedA32(instr);
  40978                                     return;
  40979                                   }
  40980                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  40981                                   if ((instr & 1) != 0) {
  40982                                     UnallocatedA32(instr);
  40983                                     return;
  40984                                   }
  40985                                   unsigned rm = ExtractQRegister(instr, 5, 0);
  40986                                   // VMVN{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
  40987                                   vmvn(al,
  40988                                        kDataTypeValueNone,
  40989                                        QRegister(rd),
  40990                                        QRegister(rm));
  40991                                 } else {
  40992                                   UnallocatedA32(instr);
  40993                                 }
  40994                                 break;
  40995                               }
  40996                               default:
  40997                                 UnallocatedA32(instr);
  40998                                 break;
  40999                             }
  41000                             break;
  41001                           }
  41002                           case 0x00000200: {
  41003                             // 0xf3b00200
  41004                             switch (instr & 0x00000540) {
  41005                               case 0x00000000: {
  41006                                 // 0xf3b00200
  41007                                 DataType dt =
  41008                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
  41009                                                         ((instr >> 5) & 0x4));
  41010                                 if (dt.Is(kDataTypeValueInvalid)) {
  41011                                   UnallocatedA32(instr);
  41012                                   return;
  41013                                 }
  41014                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  41015                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  41016                                 // VPADDL{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
  41017                                 vpaddl(al, dt, DRegister(rd), DRegister(rm));
  41018                                 break;
  41019                               }
  41020                               case 0x00000040: {
  41021                                 // 0xf3b00240
  41022                                 DataType dt =
  41023                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
  41024                                                         ((instr >> 5) & 0x4));
  41025                                 if (dt.Is(kDataTypeValueInvalid)) {
  41026                                   UnallocatedA32(instr);
  41027                                   return;
  41028                                 }
  41029                                 if (((instr >> 12) & 1) != 0) {
  41030                                   UnallocatedA32(instr);
  41031                                   return;
  41032                                 }
  41033                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  41034                                 if ((instr & 1) != 0) {
  41035                                   UnallocatedA32(instr);
  41036                                   return;
  41037                                 }
  41038                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  41039                                 // VPADDL{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
  41040                                 vpaddl(al, dt, QRegister(rd), QRegister(rm));
  41041                                 break;
  41042                               }
  41043                               case 0x00000100: {
  41044                                 // 0xf3b00300
  41045                                 switch (instr & 0x00000080) {
  41046                                   case 0x00000000: {
  41047                                     // 0xf3b00300
  41048                                     UnimplementedA32("AESE", instr);
  41049                                     break;
  41050                                   }
  41051                                   case 0x00000080: {
  41052                                     // 0xf3b00380
  41053                                     UnimplementedA32("AESMC", instr);
  41054                                     break;
  41055                                   }
  41056                                 }
  41057                                 break;
  41058                               }
  41059                               case 0x00000140: {
  41060                                 // 0xf3b00340
  41061                                 switch (instr & 0x00000080) {
  41062                                   case 0x00000000: {
  41063                                     // 0xf3b00340
  41064                                     UnimplementedA32("AESD", instr);
  41065                                     break;
  41066                                   }
  41067                                   case 0x00000080: {
  41068                                     // 0xf3b003c0
  41069                                     UnimplementedA32("AESIMC", instr);
  41070                                     break;
  41071                                   }
  41072                                 }
  41073                                 break;
  41074                               }
  41075                               case 0x00000400: {
  41076                                 // 0xf3b00600
  41077                                 DataType dt =
  41078                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
  41079                                                         ((instr >> 5) & 0x4));
  41080                                 if (dt.Is(kDataTypeValueInvalid)) {
  41081                                   UnallocatedA32(instr);
  41082                                   return;
  41083                                 }
  41084                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  41085                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  41086                                 // VPADAL{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
  41087                                 vpadal(al, dt, DRegister(rd), DRegister(rm));
  41088                                 break;
  41089                               }
  41090                               case 0x00000440: {
  41091                                 // 0xf3b00640
  41092                                 DataType dt =
  41093                                     Dt_op_size_2_Decode(((instr >> 18) & 0x3) |
  41094                                                         ((instr >> 5) & 0x4));
  41095                                 if (dt.Is(kDataTypeValueInvalid)) {
  41096                                   UnallocatedA32(instr);
  41097                                   return;
  41098                                 }
  41099                                 if (((instr >> 12) & 1) != 0) {
  41100                                   UnallocatedA32(instr);
  41101                                   return;
  41102                                 }
  41103                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  41104                                 if ((instr & 1) != 0) {
  41105                                   UnallocatedA32(instr);
  41106                                   return;
  41107                                 }
  41108                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  41109                                 // VPADAL{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
  41110                                 vpadal(al, dt, QRegister(rd), QRegister(rm));
  41111                                 break;
  41112                               }
  41113                               case 0x00000500: {
  41114                                 // 0xf3b00700
  41115                                 switch (instr & 0x00000080) {
  41116                                   case 0x00000000: {
  41117                                     // 0xf3b00700
  41118                                     DataType dt =
  41119                                         Dt_size_5_Decode((instr >> 18) & 0x3);
  41120                                     if (dt.Is(kDataTypeValueInvalid)) {
  41121                                       UnallocatedA32(instr);
  41122                                       return;
  41123                                     }
  41124                                     unsigned rd =
  41125                                         ExtractDRegister(instr, 22, 12);
  41126                                     unsigned rm = ExtractDRegister(instr, 5, 0);
  41127                                     // VQABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
  41128                                     vqabs(al, dt, DRegister(rd), DRegister(rm));
  41129                                     break;
  41130                                   }
  41131                                   case 0x00000080: {
  41132                                     // 0xf3b00780
  41133                                     DataType dt =
  41134                                         Dt_size_5_Decode((instr >> 18) & 0x3);
  41135                                     if (dt.Is(kDataTypeValueInvalid)) {
  41136                                       UnallocatedA32(instr);
  41137                                       return;
  41138                                     }
  41139                                     unsigned rd =
  41140                                         ExtractDRegister(instr, 22, 12);
  41141                                     unsigned rm = ExtractDRegister(instr, 5, 0);
  41142                                     // VQNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
  41143                                     vqneg(al, dt, DRegister(rd), DRegister(rm));
  41144                                     break;
  41145                                   }
  41146                                 }
  41147                                 break;
  41148                               }
  41149                               case 0x00000540: {
  41150                                 // 0xf3b00740
  41151                                 switch (instr & 0x00000080) {
  41152                                   case 0x00000000: {
  41153                                     // 0xf3b00740
  41154                                     DataType dt =
  41155                                         Dt_size_5_Decode((instr >> 18) & 0x3);
  41156                                     if (dt.Is(kDataTypeValueInvalid)) {
  41157                                       UnallocatedA32(instr);
  41158                                       return;
  41159                                     }
  41160                                     if (((instr >> 12) & 1) != 0) {
  41161                                       UnallocatedA32(instr);
  41162                                       return;
  41163                                     }
  41164                                     unsigned rd =
  41165                                         ExtractQRegister(instr, 22, 12);
  41166                                     if ((instr & 1) != 0) {
  41167                                       UnallocatedA32(instr);
  41168                                       return;
  41169                                     }
  41170                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  41171                                     // VQABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
  41172                                     vqabs(al, dt, QRegister(rd), QRegister(rm));
  41173                                     break;
  41174                                   }
  41175                                   case 0x00000080: {
  41176                                     // 0xf3b007c0
  41177                                     DataType dt =
  41178                                         Dt_size_5_Decode((instr >> 18) & 0x3);
  41179                                     if (dt.Is(kDataTypeValueInvalid)) {
  41180                                       UnallocatedA32(instr);
  41181                                       return;
  41182                                     }
  41183                                     if (((instr >> 12) & 1) != 0) {
  41184                                       UnallocatedA32(instr);
  41185                                       return;
  41186                                     }
  41187                                     unsigned rd =
  41188                                         ExtractQRegister(instr, 22, 12);
  41189                                     if ((instr & 1) != 0) {
  41190                                       UnallocatedA32(instr);
  41191                                       return;
  41192                                     }
  41193                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  41194                                     // VQNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
  41195                                     vqneg(al, dt, QRegister(rd), QRegister(rm));
  41196                                     break;
  41197                                   }
  41198                                 }
  41199                                 break;
  41200                               }
  41201                             }
  41202                             break;
  41203                           }
  41204                           case 0x00010000: {
  41205                             // 0xf3b10000
  41206                             switch (instr & 0x000001c0) {
  41207                               case 0x00000000: {
  41208                                 // 0xf3b10000
  41209                                 DataType dt =
  41210                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
  41211                                                        ((instr >> 8) & 0x4));
  41212                                 if (dt.Is(kDataTypeValueInvalid)) {
  41213                                   UnallocatedA32(instr);
  41214                                   return;
  41215                                 }
  41216                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  41217                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  41218                                 // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
  41219                                 vcgt(al,
  41220                                      dt,
  41221                                      DRegister(rd),
  41222                                      DRegister(rm),
  41223                                      UINT32_C(0));
  41224                                 break;
  41225                               }
  41226                               case 0x00000040: {
  41227                                 // 0xf3b10040
  41228                                 DataType dt =
  41229                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
  41230                                                        ((instr >> 8) & 0x4));
  41231                                 if (dt.Is(kDataTypeValueInvalid)) {
  41232                                   UnallocatedA32(instr);
  41233                                   return;
  41234                                 }
  41235                                 if (((instr >> 12) & 1) != 0) {
  41236                                   UnallocatedA32(instr);
  41237                                   return;
  41238                                 }
  41239                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  41240                                 if ((instr & 1) != 0) {
  41241                                   UnallocatedA32(instr);
  41242                                   return;
  41243                                 }
  41244                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  41245                                 // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
  41246                                 vcgt(al,
  41247                                      dt,
  41248                                      QRegister(rd),
  41249                                      QRegister(rm),
  41250                                      UINT32_C(0));
  41251                                 break;
  41252                               }
  41253                               case 0x00000080: {
  41254                                 // 0xf3b10080
  41255                                 DataType dt =
  41256                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
  41257                                                        ((instr >> 8) & 0x4));
  41258                                 if (dt.Is(kDataTypeValueInvalid)) {
  41259                                   UnallocatedA32(instr);
  41260                                   return;
  41261                                 }
  41262                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  41263                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  41264                                 // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
  41265                                 vcge(al,
  41266                                      dt,
  41267                                      DRegister(rd),
  41268                                      DRegister(rm),
  41269                                      UINT32_C(0));
  41270                                 break;
  41271                               }
  41272                               case 0x000000c0: {
  41273                                 // 0xf3b100c0
  41274                                 DataType dt =
  41275                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
  41276                                                        ((instr >> 8) & 0x4));
  41277                                 if (dt.Is(kDataTypeValueInvalid)) {
  41278                                   UnallocatedA32(instr);
  41279                                   return;
  41280                                 }
  41281                                 if (((instr >> 12) & 1) != 0) {
  41282                                   UnallocatedA32(instr);
  41283                                   return;
  41284                                 }
  41285                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  41286                                 if ((instr & 1) != 0) {
  41287                                   UnallocatedA32(instr);
  41288                                   return;
  41289                                 }
  41290                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  41291                                 // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
  41292                                 vcge(al,
  41293                                      dt,
  41294                                      QRegister(rd),
  41295                                      QRegister(rm),
  41296                                      UINT32_C(0));
  41297                                 break;
  41298                               }
  41299                               case 0x00000100: {
  41300                                 // 0xf3b10100
  41301                                 DataType dt =
  41302                                     Dt_F_size_2_Decode(((instr >> 18) & 0x3) |
  41303                                                        ((instr >> 8) & 0x4));
  41304                                 if (dt.Is(kDataTypeValueInvalid)) {
  41305                                   UnallocatedA32(instr);
  41306                                   return;
  41307                                 }
  41308                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  41309                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  41310                                 // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
  41311                                 vceq(al,
  41312                                      dt,
  41313                                      DRegister(rd),
  41314                                      DRegister(rm),
  41315                                      UINT32_C(0));
  41316                                 break;
  41317                               }
  41318                               case 0x00000140: {
  41319                                 // 0xf3b10140
  41320                                 DataType dt =
  41321                                     Dt_F_size_2_Decode(((instr >> 18) & 0x3) |
  41322                                                        ((instr >> 8) & 0x4));
  41323                                 if (dt.Is(kDataTypeValueInvalid)) {
  41324                                   UnallocatedA32(instr);
  41325                                   return;
  41326                                 }
  41327                                 if (((instr >> 12) & 1) != 0) {
  41328                                   UnallocatedA32(instr);
  41329                                   return;
  41330                                 }
  41331                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  41332                                 if ((instr & 1) != 0) {
  41333                                   UnallocatedA32(instr);
  41334                                   return;
  41335                                 }
  41336                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  41337                                 // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
  41338                                 vceq(al,
  41339                                      dt,
  41340                                      QRegister(rd),
  41341                                      QRegister(rm),
  41342                                      UINT32_C(0));
  41343                                 break;
  41344                               }
  41345                               case 0x00000180: {
  41346                                 // 0xf3b10180
  41347                                 DataType dt =
  41348                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
  41349                                                        ((instr >> 8) & 0x4));
  41350                                 if (dt.Is(kDataTypeValueInvalid)) {
  41351                                   UnallocatedA32(instr);
  41352                                   return;
  41353                                 }
  41354                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  41355                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  41356                                 // VCLE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
  41357                                 vcle(al,
  41358                                      dt,
  41359                                      DRegister(rd),
  41360                                      DRegister(rm),
  41361                                      UINT32_C(0));
  41362                                 break;
  41363                               }
  41364                               case 0x000001c0: {
  41365                                 // 0xf3b101c0
  41366                                 DataType dt =
  41367                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
  41368                                                        ((instr >> 8) & 0x4));
  41369                                 if (dt.Is(kDataTypeValueInvalid)) {
  41370                                   UnallocatedA32(instr);
  41371                                   return;
  41372                                 }
  41373                                 if (((instr >> 12) & 1) != 0) {
  41374                                   UnallocatedA32(instr);
  41375                                   return;
  41376                                 }
  41377                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  41378                                 if ((instr & 1) != 0) {
  41379                                   UnallocatedA32(instr);
  41380                                   return;
  41381                                 }
  41382                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  41383                                 // VCLE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
  41384                                 vcle(al,
  41385                                      dt,
  41386                                      QRegister(rd),
  41387                                      QRegister(rm),
  41388                                      UINT32_C(0));
  41389                                 break;
  41390                               }
  41391                             }
  41392                             break;
  41393                           }
  41394                           case 0x00010200: {
  41395                             // 0xf3b10200
  41396                             switch (instr & 0x000001c0) {
  41397                               case 0x00000000: {
  41398                                 // 0xf3b10200
  41399                                 DataType dt =
  41400                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
  41401                                                        ((instr >> 8) & 0x4));
  41402                                 if (dt.Is(kDataTypeValueInvalid)) {
  41403                                   UnallocatedA32(instr);
  41404                                   return;
  41405                                 }
  41406                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  41407                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  41408                                 // VCLT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1
  41409                                 vclt(al,
  41410                                      dt,
  41411                                      DRegister(rd),
  41412                                      DRegister(rm),
  41413                                      UINT32_C(0));
  41414                                 break;
  41415                               }
  41416                               case 0x00000040: {
  41417                                 // 0xf3b10240
  41418                                 DataType dt =
  41419                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
  41420                                                        ((instr >> 8) & 0x4));
  41421                                 if (dt.Is(kDataTypeValueInvalid)) {
  41422                                   UnallocatedA32(instr);
  41423                                   return;
  41424                                 }
  41425                                 if (((instr >> 12) & 1) != 0) {
  41426                                   UnallocatedA32(instr);
  41427                                   return;
  41428                                 }
  41429                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  41430                                 if ((instr & 1) != 0) {
  41431                                   UnallocatedA32(instr);
  41432                                   return;
  41433                                 }
  41434                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  41435                                 // VCLT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1
  41436                                 vclt(al,
  41437                                      dt,
  41438                                      QRegister(rd),
  41439                                      QRegister(rm),
  41440                                      UINT32_C(0));
  41441                                 break;
  41442                               }
  41443                               case 0x000000c0: {
  41444                                 // 0xf3b102c0
  41445                                 if ((instr & 0x000c0400) == 0x00080000) {
  41446                                   UnimplementedA32("SHA1H", instr);
  41447                                 } else {
  41448                                   UnallocatedA32(instr);
  41449                                 }
  41450                                 break;
  41451                               }
  41452                               case 0x00000100: {
  41453                                 // 0xf3b10300
  41454                                 DataType dt =
  41455                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
  41456                                                        ((instr >> 8) & 0x4));
  41457                                 if (dt.Is(kDataTypeValueInvalid)) {
  41458                                   UnallocatedA32(instr);
  41459                                   return;
  41460                                 }
  41461                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  41462                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  41463                                 // VABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
  41464                                 vabs(al, dt, DRegister(rd), DRegister(rm));
  41465                                 break;
  41466                               }
  41467                               case 0x00000140: {
  41468                                 // 0xf3b10340
  41469                                 DataType dt =
  41470                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
  41471                                                        ((instr >> 8) & 0x4));
  41472                                 if (dt.Is(kDataTypeValueInvalid)) {
  41473                                   UnallocatedA32(instr);
  41474                                   return;
  41475                                 }
  41476                                 if (((instr >> 12) & 1) != 0) {
  41477                                   UnallocatedA32(instr);
  41478                                   return;
  41479                                 }
  41480                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  41481                                 if ((instr & 1) != 0) {
  41482                                   UnallocatedA32(instr);
  41483                                   return;
  41484                                 }
  41485                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  41486                                 // VABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
  41487                                 vabs(al, dt, QRegister(rd), QRegister(rm));
  41488                                 break;
  41489                               }
  41490                               case 0x00000180: {
  41491                                 // 0xf3b10380
  41492                                 DataType dt =
  41493                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
  41494                                                        ((instr >> 8) & 0x4));
  41495                                 if (dt.Is(kDataTypeValueInvalid)) {
  41496                                   UnallocatedA32(instr);
  41497                                   return;
  41498                                 }
  41499                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  41500                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  41501                                 // VNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
  41502                                 vneg(al, dt, DRegister(rd), DRegister(rm));
  41503                                 break;
  41504                               }
  41505                               case 0x000001c0: {
  41506                                 // 0xf3b103c0
  41507                                 DataType dt =
  41508                                     Dt_F_size_1_Decode(((instr >> 18) & 0x3) |
  41509                                                        ((instr >> 8) & 0x4));
  41510                                 if (dt.Is(kDataTypeValueInvalid)) {
  41511                                   UnallocatedA32(instr);
  41512                                   return;
  41513                                 }
  41514                                 if (((instr >> 12) & 1) != 0) {
  41515                                   UnallocatedA32(instr);
  41516                                   return;
  41517                                 }
  41518                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  41519                                 if ((instr & 1) != 0) {
  41520                                   UnallocatedA32(instr);
  41521                                   return;
  41522                                 }
  41523                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  41524                                 // VNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
  41525                                 vneg(al, dt, QRegister(rd), QRegister(rm));
  41526                                 break;
  41527                               }
  41528                               default:
  41529                                 UnallocatedA32(instr);
  41530                                 break;
  41531                             }
  41532                             break;
  41533                           }
  41534                           case 0x00020000: {
  41535                             // 0xf3b20000
  41536                             switch (instr & 0x000005c0) {
  41537                               case 0x00000000: {
  41538                                 // 0xf3b20000
  41539                                 if ((instr & 0x000c0000) == 0x00000000) {
  41540                                   unsigned rd = ExtractDRegister(instr, 22, 12);
  41541                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  41542                                   // VSWP{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1
  41543                                   vswp(al,
  41544                                        kDataTypeValueNone,
  41545                                        DRegister(rd),
  41546                                        DRegister(rm));
  41547                                 } else {
  41548                                   UnallocatedA32(instr);
  41549                                 }
  41550                                 break;
  41551                               }
  41552                               case 0x00000040: {
  41553                                 // 0xf3b20040
  41554                                 if ((instr & 0x000c0000) == 0x00000000) {
  41555                                   if (((instr >> 12) & 1) != 0) {
  41556                                     UnallocatedA32(instr);
  41557                                     return;
  41558                                   }
  41559                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  41560                                   if ((instr & 1) != 0) {
  41561                                     UnallocatedA32(instr);
  41562                                     return;
  41563                                   }
  41564                                   unsigned rm = ExtractQRegister(instr, 5, 0);
  41565                                   // VSWP{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1
  41566                                   vswp(al,
  41567                                        kDataTypeValueNone,
  41568                                        QRegister(rd),
  41569                                        QRegister(rm));
  41570                                 } else {
  41571                                   UnallocatedA32(instr);
  41572                                 }
  41573                                 break;
  41574                               }
  41575                               case 0x00000080: {
  41576                                 // 0xf3b20080
  41577                                 DataType dt =
  41578                                     Dt_size_7_Decode((instr >> 18) & 0x3);
  41579                                 if (dt.Is(kDataTypeValueInvalid)) {
  41580                                   UnallocatedA32(instr);
  41581                                   return;
  41582                                 }
  41583                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  41584                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  41585                                 // VTRN{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
  41586                                 vtrn(al, dt, DRegister(rd), DRegister(rm));
  41587                                 break;
  41588                               }
  41589                               case 0x000000c0: {
  41590                                 // 0xf3b200c0
  41591                                 DataType dt =
  41592                                     Dt_size_7_Decode((instr >> 18) & 0x3);
  41593                                 if (dt.Is(kDataTypeValueInvalid)) {
  41594                                   UnallocatedA32(instr);
  41595                                   return;
  41596                                 }
  41597                                 if (((instr >> 12) & 1) != 0) {
  41598                                   UnallocatedA32(instr);
  41599                                   return;
  41600                                 }
  41601                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  41602                                 if ((instr & 1) != 0) {
  41603                                   UnallocatedA32(instr);
  41604                                   return;
  41605                                 }
  41606                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  41607                                 // VTRN{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
  41608                                 vtrn(al, dt, QRegister(rd), QRegister(rm));
  41609                                 break;
  41610                               }
  41611                               case 0x00000100: {
  41612                                 // 0xf3b20100
  41613                                 DataType dt =
  41614                                     Dt_size_15_Decode((instr >> 18) & 0x3);
  41615                                 if (dt.Is(kDataTypeValueInvalid)) {
  41616                                   UnallocatedA32(instr);
  41617                                   return;
  41618                                 }
  41619                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  41620                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  41621                                 // VUZP{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
  41622                                 vuzp(al, dt, DRegister(rd), DRegister(rm));
  41623                                 break;
  41624                               }
  41625                               case 0x00000140: {
  41626                                 // 0xf3b20140
  41627                                 DataType dt =
  41628                                     Dt_size_7_Decode((instr >> 18) & 0x3);
  41629                                 if (dt.Is(kDataTypeValueInvalid)) {
  41630                                   UnallocatedA32(instr);
  41631                                   return;
  41632                                 }
  41633                                 if (((instr >> 12) & 1) != 0) {
  41634                                   UnallocatedA32(instr);
  41635                                   return;
  41636                                 }
  41637                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  41638                                 if ((instr & 1) != 0) {
  41639                                   UnallocatedA32(instr);
  41640                                   return;
  41641                                 }
  41642                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  41643                                 // VUZP{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
  41644                                 vuzp(al, dt, QRegister(rd), QRegister(rm));
  41645                                 break;
  41646                               }
  41647                               case 0x00000180: {
  41648                                 // 0xf3b20180
  41649                                 DataType dt =
  41650                                     Dt_size_15_Decode((instr >> 18) & 0x3);
  41651                                 if (dt.Is(kDataTypeValueInvalid)) {
  41652                                   UnallocatedA32(instr);
  41653                                   return;
  41654                                 }
  41655                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  41656                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  41657                                 // VZIP{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
  41658                                 vzip(al, dt, DRegister(rd), DRegister(rm));
  41659                                 break;
  41660                               }
  41661                               case 0x000001c0: {
  41662                                 // 0xf3b201c0
  41663                                 DataType dt =
  41664                                     Dt_size_7_Decode((instr >> 18) & 0x3);
  41665                                 if (dt.Is(kDataTypeValueInvalid)) {
  41666                                   UnallocatedA32(instr);
  41667                                   return;
  41668                                 }
  41669                                 if (((instr >> 12) & 1) != 0) {
  41670                                   UnallocatedA32(instr);
  41671                                   return;
  41672                                 }
  41673                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  41674                                 if ((instr & 1) != 0) {
  41675                                   UnallocatedA32(instr);
  41676                                   return;
  41677                                 }
  41678                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  41679                                 // VZIP{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
  41680                                 vzip(al, dt, QRegister(rd), QRegister(rm));
  41681                                 break;
  41682                               }
  41683                               case 0x00000400: {
  41684                                 // 0xf3b20400
  41685                                 DataType dt =
  41686                                     Dt_size_16_Decode((instr >> 18) & 0x3);
  41687                                 if (dt.Is(kDataTypeValueInvalid)) {
  41688                                   UnallocatedA32(instr);
  41689                                   return;
  41690                                 }
  41691                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  41692                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  41693                                 // VRINTN{<q>}.<dt> <Dd>, <Dm> ; A1
  41694                                 vrintn(dt, DRegister(rd), DRegister(rm));
  41695                                 break;
  41696                               }
  41697                               case 0x00000440: {
  41698                                 // 0xf3b20440
  41699                                 DataType dt =
  41700                                     Dt_size_16_Decode((instr >> 18) & 0x3);
  41701                                 if (dt.Is(kDataTypeValueInvalid)) {
  41702                                   UnallocatedA32(instr);
  41703                                   return;
  41704                                 }
  41705                                 if (((instr >> 12) & 1) != 0) {
  41706                                   UnallocatedA32(instr);
  41707                                   return;
  41708                                 }
  41709                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  41710                                 if ((instr & 1) != 0) {
  41711                                   UnallocatedA32(instr);
  41712                                   return;
  41713                                 }
  41714                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  41715                                 // VRINTN{<q>}.<dt> <Qd>, <Qm> ; A1
  41716                                 vrintn(dt, QRegister(rd), QRegister(rm));
  41717                                 break;
  41718                               }
  41719                               case 0x00000480: {
  41720                                 // 0xf3b20480
  41721                                 DataType dt =
  41722                                     Dt_size_16_Decode((instr >> 18) & 0x3);
  41723                                 if (dt.Is(kDataTypeValueInvalid)) {
  41724                                   UnallocatedA32(instr);
  41725                                   return;
  41726                                 }
  41727                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  41728                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  41729                                 // VRINTX{<q>}.<dt> <Dd>, <Dm> ; A1
  41730                                 vrintx(al, dt, DRegister(rd), DRegister(rm));
  41731                                 break;
  41732                               }
  41733                               case 0x000004c0: {
  41734                                 // 0xf3b204c0
  41735                                 DataType dt =
  41736                                     Dt_size_16_Decode((instr >> 18) & 0x3);
  41737                                 if (dt.Is(kDataTypeValueInvalid)) {
  41738                                   UnallocatedA32(instr);
  41739                                   return;
  41740                                 }
  41741                                 if (((instr >> 12) & 1) != 0) {
  41742                                   UnallocatedA32(instr);
  41743                                   return;
  41744                                 }
  41745                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  41746                                 if ((instr & 1) != 0) {
  41747                                   UnallocatedA32(instr);
  41748                                   return;
  41749                                 }
  41750                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  41751                                 // VRINTX{<q>}.<dt> <Qd>, <Qm> ; A1
  41752                                 vrintx(dt, QRegister(rd), QRegister(rm));
  41753                                 break;
  41754                               }
  41755                               case 0x00000500: {
  41756                                 // 0xf3b20500
  41757                                 DataType dt =
  41758                                     Dt_size_16_Decode((instr >> 18) & 0x3);
  41759                                 if (dt.Is(kDataTypeValueInvalid)) {
  41760                                   UnallocatedA32(instr);
  41761                                   return;
  41762                                 }
  41763                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  41764                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  41765                                 // VRINTA{<q>}.<dt> <Dd>, <Dm> ; A1
  41766                                 vrinta(dt, DRegister(rd), DRegister(rm));
  41767                                 break;
  41768                               }
  41769                               case 0x00000540: {
  41770                                 // 0xf3b20540
  41771                                 DataType dt =
  41772                                     Dt_size_16_Decode((instr >> 18) & 0x3);
  41773                                 if (dt.Is(kDataTypeValueInvalid)) {
  41774                                   UnallocatedA32(instr);
  41775                                   return;
  41776                                 }
  41777                                 if (((instr >> 12) & 1) != 0) {
  41778                                   UnallocatedA32(instr);
  41779                                   return;
  41780                                 }
  41781                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  41782                                 if ((instr & 1) != 0) {
  41783                                   UnallocatedA32(instr);
  41784                                   return;
  41785                                 }
  41786                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  41787                                 // VRINTA{<q>}.<dt> <Qd>, <Qm> ; A1
  41788                                 vrinta(dt, QRegister(rd), QRegister(rm));
  41789                                 break;
  41790                               }
  41791                               case 0x00000580: {
  41792                                 // 0xf3b20580
  41793                                 DataType dt =
  41794                                     Dt_size_16_Decode((instr >> 18) & 0x3);
  41795                                 if (dt.Is(kDataTypeValueInvalid)) {
  41796                                   UnallocatedA32(instr);
  41797                                   return;
  41798                                 }
  41799                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  41800                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  41801                                 // VRINTZ{<q>}.<dt> <Dd>, <Dm> ; A1
  41802                                 vrintz(al, dt, DRegister(rd), DRegister(rm));
  41803                                 break;
  41804                               }
  41805                               case 0x000005c0: {
  41806                                 // 0xf3b205c0
  41807                                 DataType dt =
  41808                                     Dt_size_16_Decode((instr >> 18) & 0x3);
  41809                                 if (dt.Is(kDataTypeValueInvalid)) {
  41810                                   UnallocatedA32(instr);
  41811                                   return;
  41812                                 }
  41813                                 if (((instr >> 12) & 1) != 0) {
  41814                                   UnallocatedA32(instr);
  41815                                   return;
  41816                                 }
  41817                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  41818                                 if ((instr & 1) != 0) {
  41819                                   UnallocatedA32(instr);
  41820                                   return;
  41821                                 }
  41822                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  41823                                 // VRINTZ{<q>}.<dt> <Qd>, <Qm> ; A1
  41824                                 vrintz(dt, QRegister(rd), QRegister(rm));
  41825                                 break;
  41826                               }
  41827                             }
  41828                             break;
  41829                           }
  41830                           case 0x00020200: {
  41831                             // 0xf3b20200
  41832                             switch (instr & 0x00000580) {
  41833                               case 0x00000000: {
  41834                                 // 0xf3b20200
  41835                                 switch (instr & 0x00000040) {
  41836                                   case 0x00000000: {
  41837                                     // 0xf3b20200
  41838                                     DataType dt =
  41839                                         Dt_size_3_Decode((instr >> 18) & 0x3);
  41840                                     if (dt.Is(kDataTypeValueInvalid)) {
  41841                                       UnallocatedA32(instr);
  41842                                       return;
  41843                                     }
  41844                                     unsigned rd =
  41845                                         ExtractDRegister(instr, 22, 12);
  41846                                     if ((instr & 1) != 0) {
  41847                                       UnallocatedA32(instr);
  41848                                       return;
  41849                                     }
  41850                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  41851                                     // VMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
  41852                                     vmovn(al, dt, DRegister(rd), QRegister(rm));
  41853                                     break;
  41854                                   }
  41855                                   case 0x00000040: {
  41856                                     // 0xf3b20240
  41857                                     DataType dt =
  41858                                         Dt_size_14_Decode((instr >> 18) & 0x3);
  41859                                     if (dt.Is(kDataTypeValueInvalid)) {
  41860                                       UnallocatedA32(instr);
  41861                                       return;
  41862                                     }
  41863                                     unsigned rd =
  41864                                         ExtractDRegister(instr, 22, 12);
  41865                                     if ((instr & 1) != 0) {
  41866                                       UnallocatedA32(instr);
  41867                                       return;
  41868                                     }
  41869                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  41870                                     // VQMOVUN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
  41871                                     vqmovun(al,
  41872                                             dt,
  41873                                             DRegister(rd),
  41874                                             QRegister(rm));
  41875                                     break;
  41876                                   }
  41877                                 }
  41878                                 break;
  41879                               }
  41880                               case 0x00000080: {
  41881                                 // 0xf3b20280
  41882                                 DataType dt =
  41883                                     Dt_op_size_3_Decode(((instr >> 18) & 0x3) |
  41884                                                         ((instr >> 4) & 0x4));
  41885                                 if (dt.Is(kDataTypeValueInvalid)) {
  41886                                   UnallocatedA32(instr);
  41887                                   return;
  41888                                 }
  41889                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  41890                                 if ((instr & 1) != 0) {
  41891                                   UnallocatedA32(instr);
  41892                                   return;
  41893                                 }
  41894                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  41895                                 // VQMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1
  41896                                 vqmovn(al, dt, DRegister(rd), QRegister(rm));
  41897                                 break;
  41898                               }
  41899                               case 0x00000100: {
  41900                                 // 0xf3b20300
  41901                                 if ((instr & 0x00000040) == 0x00000000) {
  41902                                   DataType dt =
  41903                                       Dt_size_17_Decode((instr >> 18) & 0x3);
  41904                                   if (dt.Is(kDataTypeValueInvalid)) {
  41905                                     UnallocatedA32(instr);
  41906                                     return;
  41907                                   }
  41908                                   if (((instr >> 12) & 1) != 0) {
  41909                                     UnallocatedA32(instr);
  41910                                     return;
  41911                                   }
  41912                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  41913                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  41914                                   uint32_t imm = dt.GetSize();
  41915                                   // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A2 NOLINT(whitespace/line_length)
  41916                                   vshll(al,
  41917                                         dt,
  41918                                         QRegister(rd),
  41919                                         DRegister(rm),
  41920                                         imm);
  41921                                 } else {
  41922                                   UnallocatedA32(instr);
  41923                                 }
  41924                                 break;
  41925                               }
  41926                               case 0x00000180: {
  41927                                 // 0xf3b20380
  41928                                 switch (instr & 0x000c0040) {
  41929                                   case 0x00080000: {
  41930                                     // 0xf3ba0380
  41931                                     UnimplementedA32("SHA1SU1", instr);
  41932                                     break;
  41933                                   }
  41934                                   case 0x00080040: {
  41935                                     // 0xf3ba03c0
  41936                                     UnimplementedA32("SHA256SU0", instr);
  41937                                     break;
  41938                                   }
  41939                                   default:
  41940                                     UnallocatedA32(instr);
  41941                                     break;
  41942                                 }
  41943                                 break;
  41944                               }
  41945                               case 0x00000400: {
  41946                                 // 0xf3b20600
  41947                                 if ((instr & 0x000c0040) == 0x00040000) {
  41948                                   unsigned rd = ExtractDRegister(instr, 22, 12);
  41949                                   if ((instr & 1) != 0) {
  41950                                     UnallocatedA32(instr);
  41951                                     return;
  41952                                   }
  41953                                   unsigned rm = ExtractQRegister(instr, 5, 0);
  41954                                   // VCVT{<c>}{<q>}.F16.F32 <Dd>, <Qm> ; A1
  41955                                   vcvt(al,
  41956                                        F16,
  41957                                        F32,
  41958                                        DRegister(rd),
  41959                                        QRegister(rm));
  41960                                 } else {
  41961                                   UnallocatedA32(instr);
  41962                                 }
  41963                                 break;
  41964                               }
  41965                               case 0x00000480: {
  41966                                 // 0xf3b20680
  41967                                 switch (instr & 0x00000040) {
  41968                                   case 0x00000000: {
  41969                                     // 0xf3b20680
  41970                                     DataType dt =
  41971                                         Dt_size_16_Decode((instr >> 18) & 0x3);
  41972                                     if (dt.Is(kDataTypeValueInvalid)) {
  41973                                       UnallocatedA32(instr);
  41974                                       return;
  41975                                     }
  41976                                     unsigned rd =
  41977                                         ExtractDRegister(instr, 22, 12);
  41978                                     unsigned rm = ExtractDRegister(instr, 5, 0);
  41979                                     // VRINTM{<q>}.<dt> <Dd>, <Dm> ; A1
  41980                                     vrintm(dt, DRegister(rd), DRegister(rm));
  41981                                     break;
  41982                                   }
  41983                                   case 0x00000040: {
  41984                                     // 0xf3b206c0
  41985                                     DataType dt =
  41986                                         Dt_size_16_Decode((instr >> 18) & 0x3);
  41987                                     if (dt.Is(kDataTypeValueInvalid)) {
  41988                                       UnallocatedA32(instr);
  41989                                       return;
  41990                                     }
  41991                                     if (((instr >> 12) & 1) != 0) {
  41992                                       UnallocatedA32(instr);
  41993                                       return;
  41994                                     }
  41995                                     unsigned rd =
  41996                                         ExtractQRegister(instr, 22, 12);
  41997                                     if ((instr & 1) != 0) {
  41998                                       UnallocatedA32(instr);
  41999                                       return;
  42000                                     }
  42001                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  42002                                     // VRINTM{<q>}.<dt> <Qd>, <Qm> ; A1
  42003                                     vrintm(dt, QRegister(rd), QRegister(rm));
  42004                                     break;
  42005                                   }
  42006                                 }
  42007                                 break;
  42008                               }
  42009                               case 0x00000500: {
  42010                                 // 0xf3b20700
  42011                                 if ((instr & 0x000c0040) == 0x00040000) {
  42012                                   if (((instr >> 12) & 1) != 0) {
  42013                                     UnallocatedA32(instr);
  42014                                     return;
  42015                                   }
  42016                                   unsigned rd = ExtractQRegister(instr, 22, 12);
  42017                                   unsigned rm = ExtractDRegister(instr, 5, 0);
  42018                                   // VCVT{<c>}{<q>}.F32.F16 <Qd>, <Dm> ; A1
  42019                                   vcvt(al,
  42020                                        F32,
  42021                                        F16,
  42022                                        QRegister(rd),
  42023                                        DRegister(rm));
  42024                                 } else {
  42025                                   UnallocatedA32(instr);
  42026                                 }
  42027                                 break;
  42028                               }
  42029                               case 0x00000580: {
  42030                                 // 0xf3b20780
  42031                                 switch (instr & 0x00000040) {
  42032                                   case 0x00000000: {
  42033                                     // 0xf3b20780
  42034                                     DataType dt =
  42035                                         Dt_size_16_Decode((instr >> 18) & 0x3);
  42036                                     if (dt.Is(kDataTypeValueInvalid)) {
  42037                                       UnallocatedA32(instr);
  42038                                       return;
  42039                                     }
  42040                                     unsigned rd =
  42041                                         ExtractDRegister(instr, 22, 12);
  42042                                     unsigned rm = ExtractDRegister(instr, 5, 0);
  42043                                     // VRINTP{<q>}.<dt> <Dd>, <Dm> ; A1
  42044                                     vrintp(dt, DRegister(rd), DRegister(rm));
  42045                                     break;
  42046                                   }
  42047                                   case 0x00000040: {
  42048                                     // 0xf3b207c0
  42049                                     DataType dt =
  42050                                         Dt_size_16_Decode((instr >> 18) & 0x3);
  42051                                     if (dt.Is(kDataTypeValueInvalid)) {
  42052                                       UnallocatedA32(instr);
  42053                                       return;
  42054                                     }
  42055                                     if (((instr >> 12) & 1) != 0) {
  42056                                       UnallocatedA32(instr);
  42057                                       return;
  42058                                     }
  42059                                     unsigned rd =
  42060                                         ExtractQRegister(instr, 22, 12);
  42061                                     if ((instr & 1) != 0) {
  42062                                       UnallocatedA32(instr);
  42063                                       return;
  42064                                     }
  42065                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  42066                                     // VRINTP{<q>}.<dt> <Qd>, <Qm> ; A1
  42067                                     vrintp(dt, QRegister(rd), QRegister(rm));
  42068                                     break;
  42069                                   }
  42070                                 }
  42071                                 break;
  42072                               }
  42073                             }
  42074                             break;
  42075                           }
  42076                           case 0x00030000: {
  42077                             // 0xf3b30000
  42078                             switch (instr & 0x00000440) {
  42079                               case 0x00000000: {
  42080                                 // 0xf3b30000
  42081                                 switch (instr & 0x000c0100) {
  42082                                   case 0x00080000: {
  42083                                     // 0xf3bb0000
  42084                                     DataType dt =
  42085                                         Dt_op_3_Decode((instr >> 7) & 0x1);
  42086                                     if (dt.Is(kDataTypeValueInvalid)) {
  42087                                       UnallocatedA32(instr);
  42088                                       return;
  42089                                     }
  42090                                     unsigned rd =
  42091                                         ExtractDRegister(instr, 22, 12);
  42092                                     unsigned rm = ExtractDRegister(instr, 5, 0);
  42093                                     // VCVTA{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
  42094                                     vcvta(dt,
  42095                                           F32,
  42096                                           DRegister(rd),
  42097                                           DRegister(rm));
  42098                                     break;
  42099                                   }
  42100                                   case 0x00080100: {
  42101                                     // 0xf3bb0100
  42102                                     DataType dt =
  42103                                         Dt_op_3_Decode((instr >> 7) & 0x1);
  42104                                     if (dt.Is(kDataTypeValueInvalid)) {
  42105                                       UnallocatedA32(instr);
  42106                                       return;
  42107                                     }
  42108                                     unsigned rd =
  42109                                         ExtractDRegister(instr, 22, 12);
  42110                                     unsigned rm = ExtractDRegister(instr, 5, 0);
  42111                                     // VCVTN{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
  42112                                     vcvtn(dt,
  42113                                           F32,
  42114                                           DRegister(rd),
  42115                                           DRegister(rm));
  42116                                     break;
  42117                                   }
  42118                                   default:
  42119                                     UnallocatedA32(instr);
  42120                                     break;
  42121                                 }
  42122                                 break;
  42123                               }
  42124                               case 0x00000040: {
  42125                                 // 0xf3b30040
  42126                                 switch (instr & 0x000c0100) {
  42127                                   case 0x00080000: {
  42128                                     // 0xf3bb0040
  42129                                     DataType dt =
  42130                                         Dt_op_3_Decode((instr >> 7) & 0x1);
  42131                                     if (dt.Is(kDataTypeValueInvalid)) {
  42132                                       UnallocatedA32(instr);
  42133                                       return;
  42134                                     }
  42135                                     if (((instr >> 12) & 1) != 0) {
  42136                                       UnallocatedA32(instr);
  42137                                       return;
  42138                                     }
  42139                                     unsigned rd =
  42140                                         ExtractQRegister(instr, 22, 12);
  42141                                     if ((instr & 1) != 0) {
  42142                                       UnallocatedA32(instr);
  42143                                       return;
  42144                                     }
  42145                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  42146                                     // VCVTA{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
  42147                                     vcvta(dt,
  42148                                           F32,
  42149                                           QRegister(rd),
  42150                                           QRegister(rm));
  42151                                     break;
  42152                                   }
  42153                                   case 0x00080100: {
  42154                                     // 0xf3bb0140
  42155                                     DataType dt =
  42156                                         Dt_op_3_Decode((instr >> 7) & 0x1);
  42157                                     if (dt.Is(kDataTypeValueInvalid)) {
  42158                                       UnallocatedA32(instr);
  42159                                       return;
  42160                                     }
  42161                                     if (((instr >> 12) & 1) != 0) {
  42162                                       UnallocatedA32(instr);
  42163                                       return;
  42164                                     }
  42165                                     unsigned rd =
  42166                                         ExtractQRegister(instr, 22, 12);
  42167                                     if ((instr & 1) != 0) {
  42168                                       UnallocatedA32(instr);
  42169                                       return;
  42170                                     }
  42171                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  42172                                     // VCVTN{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
  42173                                     vcvtn(dt,
  42174                                           F32,
  42175                                           QRegister(rd),
  42176                                           QRegister(rm));
  42177                                     break;
  42178                                   }
  42179                                   default:
  42180                                     UnallocatedA32(instr);
  42181                                     break;
  42182                                 }
  42183                                 break;
  42184                               }
  42185                               case 0x00000400: {
  42186                                 // 0xf3b30400
  42187                                 switch (instr & 0x00000080) {
  42188                                   case 0x00000000: {
  42189                                     // 0xf3b30400
  42190                                     DataType dt = Dt_F_size_4_Decode(
  42191                                         ((instr >> 18) & 0x3) |
  42192                                         ((instr >> 6) & 0x4));
  42193                                     if (dt.Is(kDataTypeValueInvalid)) {
  42194                                       UnallocatedA32(instr);
  42195                                       return;
  42196                                     }
  42197                                     unsigned rd =
  42198                                         ExtractDRegister(instr, 22, 12);
  42199                                     unsigned rm = ExtractDRegister(instr, 5, 0);
  42200                                     // VRECPE{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
  42201                                     vrecpe(al,
  42202                                            dt,
  42203                                            DRegister(rd),
  42204                                            DRegister(rm));
  42205                                     break;
  42206                                   }
  42207                                   case 0x00000080: {
  42208                                     // 0xf3b30480
  42209                                     DataType dt = Dt_F_size_4_Decode(
  42210                                         ((instr >> 18) & 0x3) |
  42211                                         ((instr >> 6) & 0x4));
  42212                                     if (dt.Is(kDataTypeValueInvalid)) {
  42213                                       UnallocatedA32(instr);
  42214                                       return;
  42215                                     }
  42216                                     unsigned rd =
  42217                                         ExtractDRegister(instr, 22, 12);
  42218                                     unsigned rm = ExtractDRegister(instr, 5, 0);
  42219                                     // VRSQRTE{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1
  42220                                     vrsqrte(al,
  42221                                             dt,
  42222                                             DRegister(rd),
  42223                                             DRegister(rm));
  42224                                     break;
  42225                                   }
  42226                                 }
  42227                                 break;
  42228                               }
  42229                               case 0x00000440: {
  42230                                 // 0xf3b30440
  42231                                 switch (instr & 0x00000080) {
  42232                                   case 0x00000000: {
  42233                                     // 0xf3b30440
  42234                                     DataType dt = Dt_F_size_4_Decode(
  42235                                         ((instr >> 18) & 0x3) |
  42236                                         ((instr >> 6) & 0x4));
  42237                                     if (dt.Is(kDataTypeValueInvalid)) {
  42238                                       UnallocatedA32(instr);
  42239                                       return;
  42240                                     }
  42241                                     if (((instr >> 12) & 1) != 0) {
  42242                                       UnallocatedA32(instr);
  42243                                       return;
  42244                                     }
  42245                                     unsigned rd =
  42246                                         ExtractQRegister(instr, 22, 12);
  42247                                     if ((instr & 1) != 0) {
  42248                                       UnallocatedA32(instr);
  42249                                       return;
  42250                                     }
  42251                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  42252                                     // VRECPE{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
  42253                                     vrecpe(al,
  42254                                            dt,
  42255                                            QRegister(rd),
  42256                                            QRegister(rm));
  42257                                     break;
  42258                                   }
  42259                                   case 0x00000080: {
  42260                                     // 0xf3b304c0
  42261                                     DataType dt = Dt_F_size_4_Decode(
  42262                                         ((instr >> 18) & 0x3) |
  42263                                         ((instr >> 6) & 0x4));
  42264                                     if (dt.Is(kDataTypeValueInvalid)) {
  42265                                       UnallocatedA32(instr);
  42266                                       return;
  42267                                     }
  42268                                     if (((instr >> 12) & 1) != 0) {
  42269                                       UnallocatedA32(instr);
  42270                                       return;
  42271                                     }
  42272                                     unsigned rd =
  42273                                         ExtractQRegister(instr, 22, 12);
  42274                                     if ((instr & 1) != 0) {
  42275                                       UnallocatedA32(instr);
  42276                                       return;
  42277                                     }
  42278                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  42279                                     // VRSQRTE{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1
  42280                                     vrsqrte(al,
  42281                                             dt,
  42282                                             QRegister(rd),
  42283                                             QRegister(rm));
  42284                                     break;
  42285                                   }
  42286                                 }
  42287                                 break;
  42288                               }
  42289                             }
  42290                             break;
  42291                           }
  42292                           case 0x00030200: {
  42293                             // 0xf3b30200
  42294                             switch (instr & 0x000c0440) {
  42295                               case 0x00080000: {
  42296                                 // 0xf3bb0200
  42297                                 switch (instr & 0x00000100) {
  42298                                   case 0x00000000: {
  42299                                     // 0xf3bb0200
  42300                                     DataType dt =
  42301                                         Dt_op_3_Decode((instr >> 7) & 0x1);
  42302                                     if (dt.Is(kDataTypeValueInvalid)) {
  42303                                       UnallocatedA32(instr);
  42304                                       return;
  42305                                     }
  42306                                     unsigned rd =
  42307                                         ExtractDRegister(instr, 22, 12);
  42308                                     unsigned rm = ExtractDRegister(instr, 5, 0);
  42309                                     // VCVTP{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
  42310                                     vcvtp(dt,
  42311                                           F32,
  42312                                           DRegister(rd),
  42313                                           DRegister(rm));
  42314                                     break;
  42315                                   }
  42316                                   case 0x00000100: {
  42317                                     // 0xf3bb0300
  42318                                     DataType dt =
  42319                                         Dt_op_3_Decode((instr >> 7) & 0x1);
  42320                                     if (dt.Is(kDataTypeValueInvalid)) {
  42321                                       UnallocatedA32(instr);
  42322                                       return;
  42323                                     }
  42324                                     unsigned rd =
  42325                                         ExtractDRegister(instr, 22, 12);
  42326                                     unsigned rm = ExtractDRegister(instr, 5, 0);
  42327                                     // VCVTM{<q>}.<dt>.F32 <Dd>, <Dm> ; A1
  42328                                     vcvtm(dt,
  42329                                           F32,
  42330                                           DRegister(rd),
  42331                                           DRegister(rm));
  42332                                     break;
  42333                                   }
  42334                                 }
  42335                                 break;
  42336                               }
  42337                               case 0x00080040: {
  42338                                 // 0xf3bb0240
  42339                                 switch (instr & 0x00000100) {
  42340                                   case 0x00000000: {
  42341                                     // 0xf3bb0240
  42342                                     DataType dt =
  42343                                         Dt_op_3_Decode((instr >> 7) & 0x1);
  42344                                     if (dt.Is(kDataTypeValueInvalid)) {
  42345                                       UnallocatedA32(instr);
  42346                                       return;
  42347                                     }
  42348                                     if (((instr >> 12) & 1) != 0) {
  42349                                       UnallocatedA32(instr);
  42350                                       return;
  42351                                     }
  42352                                     unsigned rd =
  42353                                         ExtractQRegister(instr, 22, 12);
  42354                                     if ((instr & 1) != 0) {
  42355                                       UnallocatedA32(instr);
  42356                                       return;
  42357                                     }
  42358                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  42359                                     // VCVTP{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
  42360                                     vcvtp(dt,
  42361                                           F32,
  42362                                           QRegister(rd),
  42363                                           QRegister(rm));
  42364                                     break;
  42365                                   }
  42366                                   case 0x00000100: {
  42367                                     // 0xf3bb0340
  42368                                     DataType dt =
  42369                                         Dt_op_3_Decode((instr >> 7) & 0x1);
  42370                                     if (dt.Is(kDataTypeValueInvalid)) {
  42371                                       UnallocatedA32(instr);
  42372                                       return;
  42373                                     }
  42374                                     if (((instr >> 12) & 1) != 0) {
  42375                                       UnallocatedA32(instr);
  42376                                       return;
  42377                                     }
  42378                                     unsigned rd =
  42379                                         ExtractQRegister(instr, 22, 12);
  42380                                     if ((instr & 1) != 0) {
  42381                                       UnallocatedA32(instr);
  42382                                       return;
  42383                                     }
  42384                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  42385                                     // VCVTM{<q>}.<dt>.F32 <Qd>, <Qm> ; A1
  42386                                     vcvtm(dt,
  42387                                           F32,
  42388                                           QRegister(rd),
  42389                                           QRegister(rm));
  42390                                     break;
  42391                                   }
  42392                                 }
  42393                                 break;
  42394                               }
  42395                               case 0x00080400: {
  42396                                 // 0xf3bb0600
  42397                                 DataType dt1 =
  42398                                     Dt_op_1_Decode1((instr >> 7) & 0x3);
  42399                                 if (dt1.Is(kDataTypeValueInvalid)) {
  42400                                   UnallocatedA32(instr);
  42401                                   return;
  42402                                 }
  42403                                 DataType dt2 =
  42404                                     Dt_op_1_Decode2((instr >> 7) & 0x3);
  42405                                 if (dt2.Is(kDataTypeValueInvalid)) {
  42406                                   UnallocatedA32(instr);
  42407                                   return;
  42408                                 }
  42409                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  42410                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  42411                                 // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm> ; A1
  42412                                 vcvt(al,
  42413                                      dt1,
  42414                                      dt2,
  42415                                      DRegister(rd),
  42416                                      DRegister(rm));
  42417                                 break;
  42418                               }
  42419                               case 0x00080440: {
  42420                                 // 0xf3bb0640
  42421                                 DataType dt1 =
  42422                                     Dt_op_1_Decode1((instr >> 7) & 0x3);
  42423                                 if (dt1.Is(kDataTypeValueInvalid)) {
  42424                                   UnallocatedA32(instr);
  42425                                   return;
  42426                                 }
  42427                                 DataType dt2 =
  42428                                     Dt_op_1_Decode2((instr >> 7) & 0x3);
  42429                                 if (dt2.Is(kDataTypeValueInvalid)) {
  42430                                   UnallocatedA32(instr);
  42431                                   return;
  42432                                 }
  42433                                 if (((instr >> 12) & 1) != 0) {
  42434                                   UnallocatedA32(instr);
  42435                                   return;
  42436                                 }
  42437                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  42438                                 if ((instr & 1) != 0) {
  42439                                   UnallocatedA32(instr);
  42440                                   return;
  42441                                 }
  42442                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  42443                                 // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm> ; A1
  42444                                 vcvt(al,
  42445                                      dt1,
  42446                                      dt2,
  42447                                      QRegister(rd),
  42448                                      QRegister(rm));
  42449                                 break;
  42450                               }
  42451                               default:
  42452                                 UnallocatedA32(instr);
  42453                                 break;
  42454                             }
  42455                             break;
  42456                           }
  42457                         }
  42458                         break;
  42459                       }
  42460                       case 0x00000800: {
  42461                         // 0xf3b00800
  42462                         switch (instr & 0x00000440) {
  42463                           case 0x00000000: {
  42464                             // 0xf3b00800
  42465                             unsigned rd = ExtractDRegister(instr, 22, 12);
  42466                             unsigned first = ExtractDRegister(instr, 7, 16);
  42467                             unsigned length;
  42468                             SpacingType spacing = kSingle;
  42469                             switch ((instr >> 8) & 0x3) {
  42470                               default:
  42471                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  42472                               case 0x0:
  42473                                 length = 1;
  42474                                 break;
  42475                               case 0x1:
  42476                                 length = 2;
  42477                                 break;
  42478                               case 0x2:
  42479                                 length = 3;
  42480                                 break;
  42481                               case 0x3:
  42482                                 length = 4;
  42483                                 break;
  42484                             }
  42485                             unsigned last = first + length - 1;
  42486                             TransferType transfer = kMultipleLanes;
  42487                             unsigned rm = ExtractDRegister(instr, 5, 0);
  42488                             // VTBL{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; A1
  42489                             vtbl(al,
  42490                                  Untyped8,
  42491                                  DRegister(rd),
  42492                                  NeonRegisterList(DRegister(first),
  42493                                                   DRegister(last),
  42494                                                   spacing,
  42495                                                   transfer),
  42496                                  DRegister(rm));
  42497                             break;
  42498                           }
  42499                           case 0x00000040: {
  42500                             // 0xf3b00840
  42501                             unsigned rd = ExtractDRegister(instr, 22, 12);
  42502                             unsigned first = ExtractDRegister(instr, 7, 16);
  42503                             unsigned length;
  42504                             SpacingType spacing = kSingle;
  42505                             switch ((instr >> 8) & 0x3) {
  42506                               default:
  42507                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  42508                               case 0x0:
  42509                                 length = 1;
  42510                                 break;
  42511                               case 0x1:
  42512                                 length = 2;
  42513                                 break;
  42514                               case 0x2:
  42515                                 length = 3;
  42516                                 break;
  42517                               case 0x3:
  42518                                 length = 4;
  42519                                 break;
  42520                             }
  42521                             unsigned last = first + length - 1;
  42522                             TransferType transfer = kMultipleLanes;
  42523                             unsigned rm = ExtractDRegister(instr, 5, 0);
  42524                             // VTBX{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; A1
  42525                             vtbx(al,
  42526                                  Untyped8,
  42527                                  DRegister(rd),
  42528                                  NeonRegisterList(DRegister(first),
  42529                                                   DRegister(last),
  42530                                                   spacing,
  42531                                                   transfer),
  42532                                  DRegister(rm));
  42533                             break;
  42534                           }
  42535                           case 0x00000400: {
  42536                             // 0xf3b00c00
  42537                             if ((instr & 0x00000380) == 0x00000000) {
  42538                               unsigned lane;
  42539                               DataType dt =
  42540                                   Dt_imm4_1_Decode((instr >> 16) & 0xf, &lane);
  42541                               if (dt.Is(kDataTypeValueInvalid)) {
  42542                                 UnallocatedA32(instr);
  42543                                 return;
  42544                               }
  42545                               unsigned rd = ExtractDRegister(instr, 22, 12);
  42546                               unsigned rm = ExtractDRegister(instr, 5, 0);
  42547                               // VDUP{<c>}{<q>}.<dt> <Dd>, <Dm[x]> ; A1
  42548                               vdup(al,
  42549                                    dt,
  42550                                    DRegister(rd),
  42551                                    DRegisterLane(rm, lane));
  42552                             } else {
  42553                               UnallocatedA32(instr);
  42554                             }
  42555                             break;
  42556                           }
  42557                           case 0x00000440: {
  42558                             // 0xf3b00c40
  42559                             if ((instr & 0x00000380) == 0x00000000) {
  42560                               unsigned lane;
  42561                               DataType dt =
  42562                                   Dt_imm4_1_Decode((instr >> 16) & 0xf, &lane);
  42563                               if (dt.Is(kDataTypeValueInvalid)) {
  42564                                 UnallocatedA32(instr);
  42565                                 return;
  42566                               }
  42567                               if (((instr >> 12) & 1) != 0) {
  42568                                 UnallocatedA32(instr);
  42569                                 return;
  42570                               }
  42571                               unsigned rd = ExtractQRegister(instr, 22, 12);
  42572                               unsigned rm = ExtractDRegister(instr, 5, 0);
  42573                               // VDUP{<c>}{<q>}.<dt> <Qd>, <Dm[x]> ; A1
  42574                               vdup(al,
  42575                                    dt,
  42576                                    QRegister(rd),
  42577                                    DRegisterLane(rm, lane));
  42578                             } else {
  42579                               UnallocatedA32(instr);
  42580                             }
  42581                             break;
  42582                           }
  42583                         }
  42584                         break;
  42585                       }
  42586                     }
  42587                     break;
  42588                   }
  42589                 }
  42590                 break;
  42591               }
  42592               default: {
  42593                 switch (instr & 0x00000c40) {
  42594                   case 0x00000000: {
  42595                     // 0xf2800000
  42596                     switch (instr & 0x00000300) {
  42597                       case 0x00000000: {
  42598                         // 0xf2800000
  42599                         if (((instr & 0x300000) == 0x300000)) {
  42600                           UnallocatedA32(instr);
  42601                           return;
  42602                         }
  42603                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  42604                                                          ((instr >> 22) & 0x4));
  42605                         if (dt.Is(kDataTypeValueInvalid)) {
  42606                           UnallocatedA32(instr);
  42607                           return;
  42608                         }
  42609                         if (((instr >> 12) & 1) != 0) {
  42610                           UnallocatedA32(instr);
  42611                           return;
  42612                         }
  42613                         unsigned rd = ExtractQRegister(instr, 22, 12);
  42614                         unsigned rn = ExtractDRegister(instr, 7, 16);
  42615                         unsigned rm = ExtractDRegister(instr, 5, 0);
  42616                         // VADDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
  42617                         vaddl(al,
  42618                               dt,
  42619                               QRegister(rd),
  42620                               DRegister(rn),
  42621                               DRegister(rm));
  42622                         break;
  42623                       }
  42624                       case 0x00000100: {
  42625                         // 0xf2800100
  42626                         if (((instr & 0x300000) == 0x300000)) {
  42627                           UnallocatedA32(instr);
  42628                           return;
  42629                         }
  42630                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  42631                                                          ((instr >> 22) & 0x4));
  42632                         if (dt.Is(kDataTypeValueInvalid)) {
  42633                           UnallocatedA32(instr);
  42634                           return;
  42635                         }
  42636                         if (((instr >> 12) & 1) != 0) {
  42637                           UnallocatedA32(instr);
  42638                           return;
  42639                         }
  42640                         unsigned rd = ExtractQRegister(instr, 22, 12);
  42641                         if (((instr >> 16) & 1) != 0) {
  42642                           UnallocatedA32(instr);
  42643                           return;
  42644                         }
  42645                         unsigned rn = ExtractQRegister(instr, 7, 16);
  42646                         unsigned rm = ExtractDRegister(instr, 5, 0);
  42647                         // VADDW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; A1
  42648                         vaddw(al,
  42649                               dt,
  42650                               QRegister(rd),
  42651                               QRegister(rn),
  42652                               DRegister(rm));
  42653                         break;
  42654                       }
  42655                       case 0x00000200: {
  42656                         // 0xf2800200
  42657                         if (((instr & 0x300000) == 0x300000)) {
  42658                           UnallocatedA32(instr);
  42659                           return;
  42660                         }
  42661                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  42662                                                          ((instr >> 22) & 0x4));
  42663                         if (dt.Is(kDataTypeValueInvalid)) {
  42664                           UnallocatedA32(instr);
  42665                           return;
  42666                         }
  42667                         if (((instr >> 12) & 1) != 0) {
  42668                           UnallocatedA32(instr);
  42669                           return;
  42670                         }
  42671                         unsigned rd = ExtractQRegister(instr, 22, 12);
  42672                         unsigned rn = ExtractDRegister(instr, 7, 16);
  42673                         unsigned rm = ExtractDRegister(instr, 5, 0);
  42674                         // VSUBL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
  42675                         vsubl(al,
  42676                               dt,
  42677                               QRegister(rd),
  42678                               DRegister(rn),
  42679                               DRegister(rm));
  42680                         break;
  42681                       }
  42682                       case 0x00000300: {
  42683                         // 0xf2800300
  42684                         if (((instr & 0x300000) == 0x300000)) {
  42685                           UnallocatedA32(instr);
  42686                           return;
  42687                         }
  42688                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  42689                                                          ((instr >> 22) & 0x4));
  42690                         if (dt.Is(kDataTypeValueInvalid)) {
  42691                           UnallocatedA32(instr);
  42692                           return;
  42693                         }
  42694                         if (((instr >> 12) & 1) != 0) {
  42695                           UnallocatedA32(instr);
  42696                           return;
  42697                         }
  42698                         unsigned rd = ExtractQRegister(instr, 22, 12);
  42699                         if (((instr >> 16) & 1) != 0) {
  42700                           UnallocatedA32(instr);
  42701                           return;
  42702                         }
  42703                         unsigned rn = ExtractQRegister(instr, 7, 16);
  42704                         unsigned rm = ExtractDRegister(instr, 5, 0);
  42705                         // VSUBW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; A1
  42706                         vsubw(al,
  42707                               dt,
  42708                               QRegister(rd),
  42709                               QRegister(rn),
  42710                               DRegister(rm));
  42711                         break;
  42712                       }
  42713                     }
  42714                     break;
  42715                   }
  42716                   case 0x00000040: {
  42717                     // 0xf2800040
  42718                     switch (instr & 0x00000200) {
  42719                       case 0x00000000: {
  42720                         // 0xf2800040
  42721                         switch (instr & 0x01000000) {
  42722                           case 0x00000000: {
  42723                             // 0xf2800040
  42724                             if (((instr & 0x300000) == 0x300000)) {
  42725                               UnallocatedA32(instr);
  42726                               return;
  42727                             }
  42728                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
  42729                                                            (instr >> 8) & 0x1);
  42730                             if (dt.Is(kDataTypeValueInvalid)) {
  42731                               UnallocatedA32(instr);
  42732                               return;
  42733                             }
  42734                             unsigned rd = ExtractDRegister(instr, 22, 12);
  42735                             unsigned rn = ExtractDRegister(instr, 7, 16);
  42736                             int lane;
  42737                             unsigned rm =
  42738                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
  42739                             // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
  42740                             vmla(al,
  42741                                  dt,
  42742                                  DRegister(rd),
  42743                                  DRegister(rn),
  42744                                  DRegisterLane(rm, lane));
  42745                             break;
  42746                           }
  42747                           case 0x01000000: {
  42748                             // 0xf3800040
  42749                             if (((instr & 0x300000) == 0x300000)) {
  42750                               UnallocatedA32(instr);
  42751                               return;
  42752                             }
  42753                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
  42754                                                            (instr >> 8) & 0x1);
  42755                             if (dt.Is(kDataTypeValueInvalid)) {
  42756                               UnallocatedA32(instr);
  42757                               return;
  42758                             }
  42759                             if (((instr >> 12) & 1) != 0) {
  42760                               UnallocatedA32(instr);
  42761                               return;
  42762                             }
  42763                             unsigned rd = ExtractQRegister(instr, 22, 12);
  42764                             if (((instr >> 16) & 1) != 0) {
  42765                               UnallocatedA32(instr);
  42766                               return;
  42767                             }
  42768                             unsigned rn = ExtractQRegister(instr, 7, 16);
  42769                             int lane;
  42770                             unsigned rm =
  42771                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
  42772                             // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
  42773                             vmla(al,
  42774                                  dt,
  42775                                  QRegister(rd),
  42776                                  QRegister(rn),
  42777                                  DRegisterLane(rm, lane));
  42778                             break;
  42779                           }
  42780                         }
  42781                         break;
  42782                       }
  42783                       case 0x00000200: {
  42784                         // 0xf2800240
  42785                         switch (instr & 0x00000100) {
  42786                           case 0x00000000: {
  42787                             // 0xf2800240
  42788                             if (((instr & 0x300000) == 0x300000)) {
  42789                               UnallocatedA32(instr);
  42790                               return;
  42791                             }
  42792                             DataType dt =
  42793                                 Dt_size_11_Decode((instr >> 20) & 0x3,
  42794                                                   (instr >> 24) & 0x1);
  42795                             if (dt.Is(kDataTypeValueInvalid)) {
  42796                               UnallocatedA32(instr);
  42797                               return;
  42798                             }
  42799                             if (((instr >> 12) & 1) != 0) {
  42800                               UnallocatedA32(instr);
  42801                               return;
  42802                             }
  42803                             unsigned rd = ExtractQRegister(instr, 22, 12);
  42804                             unsigned rn = ExtractDRegister(instr, 7, 16);
  42805                             int lane;
  42806                             unsigned rm =
  42807                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
  42808                             // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
  42809                             vmlal(al,
  42810                                   dt,
  42811                                   QRegister(rd),
  42812                                   DRegister(rn),
  42813                                   DRegisterLane(rm, lane));
  42814                             break;
  42815                           }
  42816                           case 0x00000100: {
  42817                             // 0xf2800340
  42818                             if ((instr & 0x01000000) == 0x00000000) {
  42819                               if (((instr & 0x300000) == 0x300000)) {
  42820                                 UnallocatedA32(instr);
  42821                                 return;
  42822                               }
  42823                               DataType dt =
  42824                                   Dt_size_13_Decode((instr >> 20) & 0x3);
  42825                               if (dt.Is(kDataTypeValueInvalid)) {
  42826                                 UnallocatedA32(instr);
  42827                                 return;
  42828                               }
  42829                               if (((instr >> 12) & 1) != 0) {
  42830                                 UnallocatedA32(instr);
  42831                                 return;
  42832                               }
  42833                               unsigned rd = ExtractQRegister(instr, 22, 12);
  42834                               unsigned rn = ExtractDRegister(instr, 7, 16);
  42835                               uint32_t mvm =
  42836                                   (instr & 0xf) | ((instr >> 1) & 0x10);
  42837                               uint32_t shift = 4;
  42838                               if (dt.Is(S16)) {
  42839                                 shift = 3;
  42840                               }
  42841                               uint32_t vm = mvm & ((1 << shift) - 1);
  42842                               uint32_t index = mvm >> shift;
  42843                               // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A2 NOLINT(whitespace/line_length)
  42844                               vqdmlal(al,
  42845                                       dt,
  42846                                       QRegister(rd),
  42847                                       DRegister(rn),
  42848                                       DRegister(vm),
  42849                                       index);
  42850                             } else {
  42851                               UnallocatedA32(instr);
  42852                             }
  42853                             break;
  42854                           }
  42855                         }
  42856                         break;
  42857                       }
  42858                     }
  42859                     break;
  42860                   }
  42861                   case 0x00000400: {
  42862                     // 0xf2800400
  42863                     switch (instr & 0x00000300) {
  42864                       case 0x00000000: {
  42865                         // 0xf2800400
  42866                         switch (instr & 0x01000000) {
  42867                           case 0x00000000: {
  42868                             // 0xf2800400
  42869                             if (((instr & 0x300000) == 0x300000)) {
  42870                               UnallocatedA32(instr);
  42871                               return;
  42872                             }
  42873                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
  42874                             if (dt.Is(kDataTypeValueInvalid)) {
  42875                               UnallocatedA32(instr);
  42876                               return;
  42877                             }
  42878                             unsigned rd = ExtractDRegister(instr, 22, 12);
  42879                             if (((instr >> 16) & 1) != 0) {
  42880                               UnallocatedA32(instr);
  42881                               return;
  42882                             }
  42883                             unsigned rn = ExtractQRegister(instr, 7, 16);
  42884                             if ((instr & 1) != 0) {
  42885                               UnallocatedA32(instr);
  42886                               return;
  42887                             }
  42888                             unsigned rm = ExtractQRegister(instr, 5, 0);
  42889                             // VADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
  42890                             vaddhn(al,
  42891                                    dt,
  42892                                    DRegister(rd),
  42893                                    QRegister(rn),
  42894                                    QRegister(rm));
  42895                             break;
  42896                           }
  42897                           case 0x01000000: {
  42898                             // 0xf3800400
  42899                             if (((instr & 0x300000) == 0x300000)) {
  42900                               UnallocatedA32(instr);
  42901                               return;
  42902                             }
  42903                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
  42904                             if (dt.Is(kDataTypeValueInvalid)) {
  42905                               UnallocatedA32(instr);
  42906                               return;
  42907                             }
  42908                             unsigned rd = ExtractDRegister(instr, 22, 12);
  42909                             if (((instr >> 16) & 1) != 0) {
  42910                               UnallocatedA32(instr);
  42911                               return;
  42912                             }
  42913                             unsigned rn = ExtractQRegister(instr, 7, 16);
  42914                             if ((instr & 1) != 0) {
  42915                               UnallocatedA32(instr);
  42916                               return;
  42917                             }
  42918                             unsigned rm = ExtractQRegister(instr, 5, 0);
  42919                             // VRADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
  42920                             vraddhn(al,
  42921                                     dt,
  42922                                     DRegister(rd),
  42923                                     QRegister(rn),
  42924                                     QRegister(rm));
  42925                             break;
  42926                           }
  42927                         }
  42928                         break;
  42929                       }
  42930                       case 0x00000100: {
  42931                         // 0xf2800500
  42932                         if (((instr & 0x300000) == 0x300000)) {
  42933                           UnallocatedA32(instr);
  42934                           return;
  42935                         }
  42936                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  42937                                                          ((instr >> 22) & 0x4));
  42938                         if (dt.Is(kDataTypeValueInvalid)) {
  42939                           UnallocatedA32(instr);
  42940                           return;
  42941                         }
  42942                         if (((instr >> 12) & 1) != 0) {
  42943                           UnallocatedA32(instr);
  42944                           return;
  42945                         }
  42946                         unsigned rd = ExtractQRegister(instr, 22, 12);
  42947                         unsigned rn = ExtractDRegister(instr, 7, 16);
  42948                         unsigned rm = ExtractDRegister(instr, 5, 0);
  42949                         // VABAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
  42950                         vabal(al,
  42951                               dt,
  42952                               QRegister(rd),
  42953                               DRegister(rn),
  42954                               DRegister(rm));
  42955                         break;
  42956                       }
  42957                       case 0x00000200: {
  42958                         // 0xf2800600
  42959                         switch (instr & 0x01000000) {
  42960                           case 0x00000000: {
  42961                             // 0xf2800600
  42962                             if (((instr & 0x300000) == 0x300000)) {
  42963                               UnallocatedA32(instr);
  42964                               return;
  42965                             }
  42966                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
  42967                             if (dt.Is(kDataTypeValueInvalid)) {
  42968                               UnallocatedA32(instr);
  42969                               return;
  42970                             }
  42971                             unsigned rd = ExtractDRegister(instr, 22, 12);
  42972                             if (((instr >> 16) & 1) != 0) {
  42973                               UnallocatedA32(instr);
  42974                               return;
  42975                             }
  42976                             unsigned rn = ExtractQRegister(instr, 7, 16);
  42977                             if ((instr & 1) != 0) {
  42978                               UnallocatedA32(instr);
  42979                               return;
  42980                             }
  42981                             unsigned rm = ExtractQRegister(instr, 5, 0);
  42982                             // VSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
  42983                             vsubhn(al,
  42984                                    dt,
  42985                                    DRegister(rd),
  42986                                    QRegister(rn),
  42987                                    QRegister(rm));
  42988                             break;
  42989                           }
  42990                           case 0x01000000: {
  42991                             // 0xf3800600
  42992                             if (((instr & 0x300000) == 0x300000)) {
  42993                               UnallocatedA32(instr);
  42994                               return;
  42995                             }
  42996                             DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3);
  42997                             if (dt.Is(kDataTypeValueInvalid)) {
  42998                               UnallocatedA32(instr);
  42999                               return;
  43000                             }
  43001                             unsigned rd = ExtractDRegister(instr, 22, 12);
  43002                             if (((instr >> 16) & 1) != 0) {
  43003                               UnallocatedA32(instr);
  43004                               return;
  43005                             }
  43006                             unsigned rn = ExtractQRegister(instr, 7, 16);
  43007                             if ((instr & 1) != 0) {
  43008                               UnallocatedA32(instr);
  43009                               return;
  43010                             }
  43011                             unsigned rm = ExtractQRegister(instr, 5, 0);
  43012                             // VRSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1
  43013                             vrsubhn(al,
  43014                                     dt,
  43015                                     DRegister(rd),
  43016                                     QRegister(rn),
  43017                                     QRegister(rm));
  43018                             break;
  43019                           }
  43020                         }
  43021                         break;
  43022                       }
  43023                       case 0x00000300: {
  43024                         // 0xf2800700
  43025                         if (((instr & 0x300000) == 0x300000)) {
  43026                           UnallocatedA32(instr);
  43027                           return;
  43028                         }
  43029                         DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) |
  43030                                                          ((instr >> 22) & 0x4));
  43031                         if (dt.Is(kDataTypeValueInvalid)) {
  43032                           UnallocatedA32(instr);
  43033                           return;
  43034                         }
  43035                         if (((instr >> 12) & 1) != 0) {
  43036                           UnallocatedA32(instr);
  43037                           return;
  43038                         }
  43039                         unsigned rd = ExtractQRegister(instr, 22, 12);
  43040                         unsigned rn = ExtractDRegister(instr, 7, 16);
  43041                         unsigned rm = ExtractDRegister(instr, 5, 0);
  43042                         // VABDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
  43043                         vabdl(al,
  43044                               dt,
  43045                               QRegister(rd),
  43046                               DRegister(rn),
  43047                               DRegister(rm));
  43048                         break;
  43049                       }
  43050                     }
  43051                     break;
  43052                   }
  43053                   case 0x00000440: {
  43054                     // 0xf2800440
  43055                     switch (instr & 0x00000200) {
  43056                       case 0x00000000: {
  43057                         // 0xf2800440
  43058                         switch (instr & 0x01000000) {
  43059                           case 0x00000000: {
  43060                             // 0xf2800440
  43061                             if (((instr & 0x300000) == 0x300000)) {
  43062                               UnallocatedA32(instr);
  43063                               return;
  43064                             }
  43065                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
  43066                                                            (instr >> 8) & 0x1);
  43067                             if (dt.Is(kDataTypeValueInvalid)) {
  43068                               UnallocatedA32(instr);
  43069                               return;
  43070                             }
  43071                             unsigned rd = ExtractDRegister(instr, 22, 12);
  43072                             unsigned rn = ExtractDRegister(instr, 7, 16);
  43073                             int lane;
  43074                             unsigned rm =
  43075                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
  43076                             // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
  43077                             vmls(al,
  43078                                  dt,
  43079                                  DRegister(rd),
  43080                                  DRegister(rn),
  43081                                  DRegisterLane(rm, lane));
  43082                             break;
  43083                           }
  43084                           case 0x01000000: {
  43085                             // 0xf3800440
  43086                             if (((instr & 0x300000) == 0x300000)) {
  43087                               UnallocatedA32(instr);
  43088                               return;
  43089                             }
  43090                             DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3,
  43091                                                            (instr >> 8) & 0x1);
  43092                             if (dt.Is(kDataTypeValueInvalid)) {
  43093                               UnallocatedA32(instr);
  43094                               return;
  43095                             }
  43096                             if (((instr >> 12) & 1) != 0) {
  43097                               UnallocatedA32(instr);
  43098                               return;
  43099                             }
  43100                             unsigned rd = ExtractQRegister(instr, 22, 12);
  43101                             if (((instr >> 16) & 1) != 0) {
  43102                               UnallocatedA32(instr);
  43103                               return;
  43104                             }
  43105                             unsigned rn = ExtractQRegister(instr, 7, 16);
  43106                             int lane;
  43107                             unsigned rm =
  43108                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
  43109                             // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
  43110                             vmls(al,
  43111                                  dt,
  43112                                  QRegister(rd),
  43113                                  QRegister(rn),
  43114                                  DRegisterLane(rm, lane));
  43115                             break;
  43116                           }
  43117                         }
  43118                         break;
  43119                       }
  43120                       case 0x00000200: {
  43121                         // 0xf2800640
  43122                         switch (instr & 0x00000100) {
  43123                           case 0x00000000: {
  43124                             // 0xf2800640
  43125                             if (((instr & 0x300000) == 0x300000)) {
  43126                               UnallocatedA32(instr);
  43127                               return;
  43128                             }
  43129                             DataType dt =
  43130                                 Dt_size_11_Decode((instr >> 20) & 0x3,
  43131                                                   (instr >> 24) & 0x1);
  43132                             if (dt.Is(kDataTypeValueInvalid)) {
  43133                               UnallocatedA32(instr);
  43134                               return;
  43135                             }
  43136                             if (((instr >> 12) & 1) != 0) {
  43137                               UnallocatedA32(instr);
  43138                               return;
  43139                             }
  43140                             unsigned rd = ExtractQRegister(instr, 22, 12);
  43141                             unsigned rn = ExtractDRegister(instr, 7, 16);
  43142                             int lane;
  43143                             unsigned rm =
  43144                                 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
  43145                             // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length)
  43146                             vmlsl(al,
  43147                                   dt,
  43148                                   QRegister(rd),
  43149                                   DRegister(rn),
  43150                                   DRegisterLane(rm, lane));
  43151                             break;
  43152                           }
  43153                           case 0x00000100: {
  43154                             // 0xf2800740
  43155                             if ((instr & 0x01000000) == 0x00000000) {
  43156                               if (((instr & 0x300000) == 0x300000)) {
  43157                                 UnallocatedA32(instr);
  43158                                 return;
  43159                               }
  43160                               DataType dt =
  43161                                   Dt_size_13_Decode((instr >> 20) & 0x3);
  43162                               if (dt.Is(kDataTypeValueInvalid)) {
  43163                                 UnallocatedA32(instr);
  43164                                 return;
  43165                               }
  43166                               if (((instr >> 12) & 1) != 0) {
  43167                                 UnallocatedA32(instr);
  43168                                 return;
  43169                               }
  43170                               unsigned rd = ExtractQRegister(instr, 22, 12);
  43171                               unsigned rn = ExtractDRegister(instr, 7, 16);
  43172                               uint32_t mvm =
  43173                                   (instr & 0xf) | ((instr >> 1) & 0x10);
  43174                               uint32_t shift = 4;
  43175                               if (dt.Is(S16)) {
  43176                                 shift = 3;
  43177                               }
  43178                               uint32_t vm = mvm & ((1 << shift) - 1);
  43179                               uint32_t index = mvm >> shift;
  43180                               // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A2 NOLINT(whitespace/line_length)
  43181                               vqdmlsl(al,
  43182                                       dt,
  43183                                       QRegister(rd),
  43184                                       DRegister(rn),
  43185                                       DRegister(vm),
  43186                                       index);
  43187                             } else {
  43188                               UnallocatedA32(instr);
  43189                             }
  43190                             break;
  43191                           }
  43192                         }
  43193                         break;
  43194                       }
  43195                     }
  43196                     break;
  43197                   }
  43198                   case 0x00000800: {
  43199                     // 0xf2800800
  43200                     switch (instr & 0x00000300) {
  43201                       case 0x00000000: {
  43202                         // 0xf2800800
  43203                         if (((instr & 0x300000) == 0x300000)) {
  43204                           UnallocatedA32(instr);
  43205                           return;
  43206                         }
  43207                         DataType dt = Dt_size_12_Decode((instr >> 20) & 0x3,
  43208                                                         (instr >> 24) & 0x1);
  43209                         if (dt.Is(kDataTypeValueInvalid)) {
  43210                           UnallocatedA32(instr);
  43211                           return;
  43212                         }
  43213                         if (((instr >> 12) & 1) != 0) {
  43214                           UnallocatedA32(instr);
  43215                           return;
  43216                         }
  43217                         unsigned rd = ExtractQRegister(instr, 22, 12);
  43218                         unsigned rn = ExtractDRegister(instr, 7, 16);
  43219                         unsigned rm = ExtractDRegister(instr, 5, 0);
  43220                         // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; A1
  43221                         vmlal(al,
  43222                               dt,
  43223                               QRegister(rd),
  43224                               DRegister(rn),
  43225                               DRegister(rm));
  43226                         break;
  43227                       }
  43228                       case 0x00000100: {
  43229                         // 0xf2800900
  43230                         if ((instr & 0x01000000) == 0x00000000) {
  43231                           if (((instr & 0x300000) == 0x300000)) {
  43232                             UnallocatedA32(instr);
  43233                             return;
  43234                           }
  43235                           DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
  43236                           if (dt.Is(kDataTypeValueInvalid)) {
  43237                             UnallocatedA32(instr);
  43238                             return;
  43239                           }
  43240                           if (((instr >> 12) & 1) != 0) {
  43241                             UnallocatedA32(instr);
  43242                             return;
  43243                           }
  43244                           unsigned rd = ExtractQRegister(instr, 22, 12);
  43245                           unsigned rn = ExtractDRegister(instr, 7, 16);
  43246                           unsigned rm = ExtractDRegister(instr, 5, 0);
  43247                           // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
  43248                           vqdmlal(al,
  43249                                   dt,
  43250                                   QRegister(rd),
  43251                                   DRegister(rn),
  43252                                   DRegister(rm));
  43253                         } else {
  43254                           UnallocatedA32(instr);
  43255                         }
  43256                         break;
  43257                       }
  43258                       case 0x00000200: {
  43259                         // 0xf2800a00
  43260                         if (((instr & 0x300000) == 0x300000)) {
  43261                           UnallocatedA32(instr);
  43262                           return;
  43263                         }
  43264                         DataType dt = Dt_size_12_Decode((instr >> 20) & 0x3,
  43265                                                         (instr >> 24) & 0x1);
  43266                         if (dt.Is(kDataTypeValueInvalid)) {
  43267                           UnallocatedA32(instr);
  43268                           return;
  43269                         }
  43270                         if (((instr >> 12) & 1) != 0) {
  43271                           UnallocatedA32(instr);
  43272                           return;
  43273                         }
  43274                         unsigned rd = ExtractQRegister(instr, 22, 12);
  43275                         unsigned rn = ExtractDRegister(instr, 7, 16);
  43276                         unsigned rm = ExtractDRegister(instr, 5, 0);
  43277                         // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; A1
  43278                         vmlsl(al,
  43279                               dt,
  43280                               QRegister(rd),
  43281                               DRegister(rn),
  43282                               DRegister(rm));
  43283                         break;
  43284                       }
  43285                       case 0x00000300: {
  43286                         // 0xf2800b00
  43287                         if ((instr & 0x01000000) == 0x00000000) {
  43288                           if (((instr & 0x300000) == 0x300000)) {
  43289                             UnallocatedA32(instr);
  43290                             return;
  43291                           }
  43292                           DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
  43293                           if (dt.Is(kDataTypeValueInvalid)) {
  43294                             UnallocatedA32(instr);
  43295                             return;
  43296                           }
  43297                           if (((instr >> 12) & 1) != 0) {
  43298                             UnallocatedA32(instr);
  43299                             return;
  43300                           }
  43301                           unsigned rd = ExtractQRegister(instr, 22, 12);
  43302                           unsigned rn = ExtractDRegister(instr, 7, 16);
  43303                           unsigned rm = ExtractDRegister(instr, 5, 0);
  43304                           // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
  43305                           vqdmlsl(al,
  43306                                   dt,
  43307                                   QRegister(rd),
  43308                                   DRegister(rn),
  43309                                   DRegister(rm));
  43310                         } else {
  43311                           UnallocatedA32(instr);
  43312                         }
  43313                         break;
  43314                       }
  43315                     }
  43316                     break;
  43317                   }
  43318                   case 0x00000840: {
  43319                     // 0xf2800840
  43320                     switch (instr & 0x00000200) {
  43321                       case 0x00000000: {
  43322                         // 0xf2800840
  43323                         switch (instr & 0x01000000) {
  43324                           case 0x00000000: {
  43325                             // 0xf2800840
  43326                             if (((instr & 0x300000) == 0x300000)) {
  43327                               UnallocatedA32(instr);
  43328                               return;
  43329                             }
  43330                             DataType dt = Dt_F_size_3_Decode(
  43331                                 ((instr >> 20) & 0x3) | ((instr >> 6) & 0x4));
  43332                             if (dt.Is(kDataTypeValueInvalid)) {
  43333                               UnallocatedA32(instr);
  43334                               return;
  43335                             }
  43336                             unsigned rd = ExtractDRegister(instr, 22, 12);
  43337                             unsigned rn = ExtractDRegister(instr, 7, 16);
  43338                             uint32_t mvm =
  43339                                 (instr & 0xf) | ((instr >> 1) & 0x10);
  43340                             uint32_t shift = 4;
  43341                             if (dt.Is(I16)) {
  43342                               shift = 3;
  43343                             }
  43344                             uint32_t vm = mvm & ((1 << shift) - 1);
  43345                             uint32_t index = mvm >> shift;
  43346                             // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
  43347                             vmul(al,
  43348                                  dt,
  43349                                  DRegister(rd),
  43350                                  DRegister(rn),
  43351                                  DRegister(vm),
  43352                                  index);
  43353                             break;
  43354                           }
  43355                           case 0x01000000: {
  43356                             // 0xf3800840
  43357                             if (((instr & 0x300000) == 0x300000)) {
  43358                               UnallocatedA32(instr);
  43359                               return;
  43360                             }
  43361                             DataType dt = Dt_F_size_3_Decode(
  43362                                 ((instr >> 20) & 0x3) | ((instr >> 6) & 0x4));
  43363                             if (dt.Is(kDataTypeValueInvalid)) {
  43364                               UnallocatedA32(instr);
  43365                               return;
  43366                             }
  43367                             if (((instr >> 12) & 1) != 0) {
  43368                               UnallocatedA32(instr);
  43369                               return;
  43370                             }
  43371                             unsigned rd = ExtractQRegister(instr, 22, 12);
  43372                             if (((instr >> 16) & 1) != 0) {
  43373                               UnallocatedA32(instr);
  43374                               return;
  43375                             }
  43376                             unsigned rn = ExtractQRegister(instr, 7, 16);
  43377                             uint32_t mvm =
  43378                                 (instr & 0xf) | ((instr >> 1) & 0x10);
  43379                             uint32_t shift = 4;
  43380                             if (dt.Is(I16)) {
  43381                               shift = 3;
  43382                             }
  43383                             uint32_t vm = mvm & ((1 << shift) - 1);
  43384                             uint32_t index = mvm >> shift;
  43385                             // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
  43386                             vmul(al,
  43387                                  dt,
  43388                                  QRegister(rd),
  43389                                  QRegister(rn),
  43390                                  DRegister(vm),
  43391                                  index);
  43392                             break;
  43393                           }
  43394                         }
  43395                         break;
  43396                       }
  43397                       case 0x00000200: {
  43398                         // 0xf2800a40
  43399                         switch (instr & 0x00000100) {
  43400                           case 0x00000000: {
  43401                             // 0xf2800a40
  43402                             if (((instr & 0x300000) == 0x300000)) {
  43403                               UnallocatedA32(instr);
  43404                               return;
  43405                             }
  43406                             DataType dt = Dt_U_size_2_Decode(
  43407                                 ((instr >> 20) & 0x3) | ((instr >> 22) & 0x4));
  43408                             if (dt.Is(kDataTypeValueInvalid)) {
  43409                               UnallocatedA32(instr);
  43410                               return;
  43411                             }
  43412                             if (((instr >> 12) & 1) != 0) {
  43413                               UnallocatedA32(instr);
  43414                               return;
  43415                             }
  43416                             unsigned rd = ExtractQRegister(instr, 22, 12);
  43417                             unsigned rn = ExtractDRegister(instr, 7, 16);
  43418                             uint32_t mvm =
  43419                                 (instr & 0xf) | ((instr >> 1) & 0x10);
  43420                             uint32_t shift = 4;
  43421                             if (dt.Is(S16) || dt.Is(U16)) {
  43422                               shift = 3;
  43423                             }
  43424                             uint32_t vm = mvm & ((1 << shift) - 1);
  43425                             uint32_t index = mvm >> shift;
  43426                             // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length)
  43427                             vmull(al,
  43428                                   dt,
  43429                                   QRegister(rd),
  43430                                   DRegister(rn),
  43431                                   DRegister(vm),
  43432                                   index);
  43433                             break;
  43434                           }
  43435                           case 0x00000100: {
  43436                             // 0xf2800b40
  43437                             if ((instr & 0x01000000) == 0x00000000) {
  43438                               if (((instr & 0x300000) == 0x300000)) {
  43439                                 UnallocatedA32(instr);
  43440                                 return;
  43441                               }
  43442                               DataType dt =
  43443                                   Dt_size_13_Decode((instr >> 20) & 0x3);
  43444                               if (dt.Is(kDataTypeValueInvalid)) {
  43445                                 UnallocatedA32(instr);
  43446                                 return;
  43447                               }
  43448                               if (((instr >> 12) & 1) != 0) {
  43449                                 UnallocatedA32(instr);
  43450                                 return;
  43451                               }
  43452                               unsigned rd = ExtractQRegister(instr, 22, 12);
  43453                               unsigned rn = ExtractDRegister(instr, 7, 16);
  43454                               int lane;
  43455                               unsigned rm = ExtractDRegisterAndLane(instr,
  43456                                                                     dt,
  43457                                                                     5,
  43458                                                                     0,
  43459                                                                     &lane);
  43460                               // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm[x]> ; A2
  43461                               vqdmull(al,
  43462                                       dt,
  43463                                       QRegister(rd),
  43464                                       DRegister(rn),
  43465                                       DRegisterLane(rm, lane));
  43466                             } else {
  43467                               UnallocatedA32(instr);
  43468                             }
  43469                             break;
  43470                           }
  43471                         }
  43472                         break;
  43473                       }
  43474                     }
  43475                     break;
  43476                   }
  43477                   case 0x00000c00: {
  43478                     // 0xf2800c00
  43479                     switch (instr & 0x00000100) {
  43480                       case 0x00000000: {
  43481                         // 0xf2800c00
  43482                         if (((instr & 0x300000) == 0x300000)) {
  43483                           UnallocatedA32(instr);
  43484                           return;
  43485                         }
  43486                         DataType dt = Dt_op_U_size_1_Decode(
  43487                             ((instr >> 20) & 0x3) | ((instr >> 22) & 0x4) |
  43488                             ((instr >> 6) & 0x8));
  43489                         if (dt.Is(kDataTypeValueInvalid)) {
  43490                           UnallocatedA32(instr);
  43491                           return;
  43492                         }
  43493                         if (((instr >> 12) & 1) != 0) {
  43494                           UnallocatedA32(instr);
  43495                           return;
  43496                         }
  43497                         unsigned rd = ExtractQRegister(instr, 22, 12);
  43498                         unsigned rn = ExtractDRegister(instr, 7, 16);
  43499                         unsigned rm = ExtractDRegister(instr, 5, 0);
  43500                         // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
  43501                         vmull(al,
  43502                               dt,
  43503                               QRegister(rd),
  43504                               DRegister(rn),
  43505                               DRegister(rm));
  43506                         break;
  43507                       }
  43508                       case 0x00000100: {
  43509                         // 0xf2800d00
  43510                         if ((instr & 0x01000200) == 0x00000000) {
  43511                           if (((instr & 0x300000) == 0x300000)) {
  43512                             UnallocatedA32(instr);
  43513                             return;
  43514                           }
  43515                           DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
  43516                           if (dt.Is(kDataTypeValueInvalid)) {
  43517                             UnallocatedA32(instr);
  43518                             return;
  43519                           }
  43520                           if (((instr >> 12) & 1) != 0) {
  43521                             UnallocatedA32(instr);
  43522                             return;
  43523                           }
  43524                           unsigned rd = ExtractQRegister(instr, 22, 12);
  43525                           unsigned rn = ExtractDRegister(instr, 7, 16);
  43526                           unsigned rm = ExtractDRegister(instr, 5, 0);
  43527                           // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1
  43528                           vqdmull(al,
  43529                                   dt,
  43530                                   QRegister(rd),
  43531                                   DRegister(rn),
  43532                                   DRegister(rm));
  43533                         } else {
  43534                           UnallocatedA32(instr);
  43535                         }
  43536                         break;
  43537                       }
  43538                     }
  43539                     break;
  43540                   }
  43541                   case 0x00000c40: {
  43542                     // 0xf2800c40
  43543                     switch (instr & 0x01000300) {
  43544                       case 0x00000000: {
  43545                         // 0xf2800c40
  43546                         if (((instr & 0x300000) == 0x300000)) {
  43547                           UnallocatedA32(instr);
  43548                           return;
  43549                         }
  43550                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
  43551                         if (dt.Is(kDataTypeValueInvalid)) {
  43552                           UnallocatedA32(instr);
  43553                           return;
  43554                         }
  43555                         unsigned rd = ExtractDRegister(instr, 22, 12);
  43556                         unsigned rn = ExtractDRegister(instr, 7, 16);
  43557                         int lane;
  43558                         unsigned rm =
  43559                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
  43560                         // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; A2
  43561                         vqdmulh(al,
  43562                                 dt,
  43563                                 DRegister(rd),
  43564                                 DRegister(rn),
  43565                                 DRegisterLane(rm, lane));
  43566                         break;
  43567                       }
  43568                       case 0x00000100: {
  43569                         // 0xf2800d40
  43570                         if (((instr & 0x300000) == 0x300000)) {
  43571                           UnallocatedA32(instr);
  43572                           return;
  43573                         }
  43574                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
  43575                         if (dt.Is(kDataTypeValueInvalid)) {
  43576                           UnallocatedA32(instr);
  43577                           return;
  43578                         }
  43579                         unsigned rd = ExtractDRegister(instr, 22, 12);
  43580                         unsigned rn = ExtractDRegister(instr, 7, 16);
  43581                         int lane;
  43582                         unsigned rm =
  43583                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
  43584                         // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; A2
  43585                         vqrdmulh(al,
  43586                                  dt,
  43587                                  DRegister(rd),
  43588                                  DRegister(rn),
  43589                                  DRegisterLane(rm, lane));
  43590                         break;
  43591                       }
  43592                       case 0x01000000: {
  43593                         // 0xf3800c40
  43594                         if (((instr & 0x300000) == 0x300000)) {
  43595                           UnallocatedA32(instr);
  43596                           return;
  43597                         }
  43598                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
  43599                         if (dt.Is(kDataTypeValueInvalid)) {
  43600                           UnallocatedA32(instr);
  43601                           return;
  43602                         }
  43603                         if (((instr >> 12) & 1) != 0) {
  43604                           UnallocatedA32(instr);
  43605                           return;
  43606                         }
  43607                         unsigned rd = ExtractQRegister(instr, 22, 12);
  43608                         if (((instr >> 16) & 1) != 0) {
  43609                           UnallocatedA32(instr);
  43610                           return;
  43611                         }
  43612                         unsigned rn = ExtractQRegister(instr, 7, 16);
  43613                         int lane;
  43614                         unsigned rm =
  43615                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
  43616                         // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; A2
  43617                         vqdmulh(al,
  43618                                 dt,
  43619                                 QRegister(rd),
  43620                                 QRegister(rn),
  43621                                 DRegisterLane(rm, lane));
  43622                         break;
  43623                       }
  43624                       case 0x01000100: {
  43625                         // 0xf3800d40
  43626                         if (((instr & 0x300000) == 0x300000)) {
  43627                           UnallocatedA32(instr);
  43628                           return;
  43629                         }
  43630                         DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3);
  43631                         if (dt.Is(kDataTypeValueInvalid)) {
  43632                           UnallocatedA32(instr);
  43633                           return;
  43634                         }
  43635                         if (((instr >> 12) & 1) != 0) {
  43636                           UnallocatedA32(instr);
  43637                           return;
  43638                         }
  43639                         unsigned rd = ExtractQRegister(instr, 22, 12);
  43640                         if (((instr >> 16) & 1) != 0) {
  43641                           UnallocatedA32(instr);
  43642                           return;
  43643                         }
  43644                         unsigned rn = ExtractQRegister(instr, 7, 16);
  43645                         int lane;
  43646                         unsigned rm =
  43647                             ExtractDRegisterAndLane(instr, dt, 5, 0, &lane);
  43648                         // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; A2
  43649                         vqrdmulh(al,
  43650                                  dt,
  43651                                  QRegister(rd),
  43652                                  QRegister(rn),
  43653                                  DRegisterLane(rm, lane));
  43654                         break;
  43655                       }
  43656                       default:
  43657                         UnallocatedA32(instr);
  43658                         break;
  43659                     }
  43660                     break;
  43661                   }
  43662                 }
  43663                 break;
  43664               }
  43665             }
  43666             break;
  43667           }
  43668           case 0x00800010: {
  43669             // 0xf2800010
  43670             switch (instr & 0x00000040) {
  43671               case 0x00000000: {
  43672                 // 0xf2800010
  43673                 switch (instr & 0x00000c00) {
  43674                   case 0x00000000: {
  43675                     // 0xf2800010
  43676                     switch (instr & 0x00380080) {
  43677                       case 0x00000000: {
  43678                         // 0xf2800010
  43679                         switch (instr & 0x00000100) {
  43680                           case 0x00000000: {
  43681                             // 0xf2800010
  43682                             switch (instr & 0x00000200) {
  43683                               default: {
  43684                                 switch (instr & 0x00000020) {
  43685                                   case 0x00000020: {
  43686                                     // 0xf2800030
  43687                                     if (((instr & 0xd00) == 0x100) ||
  43688                                         ((instr & 0xd00) == 0x500) ||
  43689                                         ((instr & 0xd00) == 0x900) ||
  43690                                         ((instr & 0xe00) == 0xe00)) {
  43691                                       UnallocatedA32(instr);
  43692                                       return;
  43693                                     }
  43694                                     unsigned cmode = (instr >> 8) & 0xf;
  43695                                     DataType dt =
  43696                                         ImmediateVmvn::DecodeDt(cmode);
  43697                                     if (dt.Is(kDataTypeValueInvalid)) {
  43698                                       UnallocatedA32(instr);
  43699                                       return;
  43700                                     }
  43701                                     unsigned rd =
  43702                                         ExtractDRegister(instr, 22, 12);
  43703                                     DOperand imm =
  43704                                         ImmediateVmvn::DecodeImmediate(
  43705                                             cmode,
  43706                                             (instr & 0xf) |
  43707                                                 ((instr >> 12) & 0x70) |
  43708                                                 ((instr >> 17) & 0x80));
  43709                                     // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
  43710                                     vmvn(al, dt, DRegister(rd), imm);
  43711                                     break;
  43712                                   }
  43713                                   default: {
  43714                                     if (((instr & 0x920) == 0x100) ||
  43715                                         ((instr & 0x520) == 0x100) ||
  43716                                         ((instr & 0x820) == 0x20) ||
  43717                                         ((instr & 0x420) == 0x20) ||
  43718                                         ((instr & 0x220) == 0x20) ||
  43719                                         ((instr & 0x120) == 0x120)) {
  43720                                       UnallocatedA32(instr);
  43721                                       return;
  43722                                     }
  43723                                     unsigned cmode = ((instr >> 8) & 0xf) |
  43724                                                      ((instr >> 1) & 0x10);
  43725                                     DataType dt =
  43726                                         ImmediateVmov::DecodeDt(cmode);
  43727                                     if (dt.Is(kDataTypeValueInvalid)) {
  43728                                       UnallocatedA32(instr);
  43729                                       return;
  43730                                     }
  43731                                     unsigned rd =
  43732                                         ExtractDRegister(instr, 22, 12);
  43733                                     DOperand imm =
  43734                                         ImmediateVmov::DecodeImmediate(
  43735                                             cmode,
  43736                                             (instr & 0xf) |
  43737                                                 ((instr >> 12) & 0x70) |
  43738                                                 ((instr >> 17) & 0x80));
  43739                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
  43740                                     vmov(al, dt, DRegister(rd), imm);
  43741                                     break;
  43742                                   }
  43743                                 }
  43744                                 break;
  43745                               }
  43746                             }
  43747                             break;
  43748                           }
  43749                           case 0x00000100: {
  43750                             // 0xf2800110
  43751                             switch (instr & 0x00000020) {
  43752                               case 0x00000000: {
  43753                                 // 0xf2800110
  43754                                 if (((instr & 0x100) == 0x0) ||
  43755                                     ((instr & 0xc00) == 0xc00)) {
  43756                                   UnallocatedA32(instr);
  43757                                   return;
  43758                                 }
  43759                                 unsigned cmode = (instr >> 8) & 0xf;
  43760                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
  43761                                 if (dt.Is(kDataTypeValueInvalid)) {
  43762                                   UnallocatedA32(instr);
  43763                                   return;
  43764                                 }
  43765                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  43766                                 DOperand imm = ImmediateVorr::DecodeImmediate(
  43767                                     cmode,
  43768                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
  43769                                         ((instr >> 17) & 0x80));
  43770                                 // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
  43771                                 vorr(al, dt, DRegister(rd), DRegister(rd), imm);
  43772                                 break;
  43773                               }
  43774                               case 0x00000020: {
  43775                                 // 0xf2800130
  43776                                 if (((instr & 0x100) == 0x0) ||
  43777                                     ((instr & 0xc00) == 0xc00)) {
  43778                                   UnallocatedA32(instr);
  43779                                   return;
  43780                                 }
  43781                                 unsigned cmode = (instr >> 8) & 0xf;
  43782                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
  43783                                 if (dt.Is(kDataTypeValueInvalid)) {
  43784                                   UnallocatedA32(instr);
  43785                                   return;
  43786                                 }
  43787                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  43788                                 DOperand imm = ImmediateVbic::DecodeImmediate(
  43789                                     cmode,
  43790                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
  43791                                         ((instr >> 17) & 0x80));
  43792                                 // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
  43793                                 vbic(al, dt, DRegister(rd), DRegister(rd), imm);
  43794                                 break;
  43795                               }
  43796                             }
  43797                             break;
  43798                           }
  43799                         }
  43800                         break;
  43801                       }
  43802                       default: {
  43803                         switch (instr & 0x00000300) {
  43804                           case 0x00000000: {
  43805                             // 0xf2800010
  43806                             if (((instr & 0x380080) == 0x0)) {
  43807                               UnallocatedA32(instr);
  43808                               return;
  43809                             }
  43810                             DataType dt =
  43811                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  43812                                                        ((instr >> 4) & 0x8),
  43813                                                    (instr >> 24) & 0x1);
  43814                             if (dt.Is(kDataTypeValueInvalid)) {
  43815                               UnallocatedA32(instr);
  43816                               return;
  43817                             }
  43818                             unsigned rd = ExtractDRegister(instr, 22, 12);
  43819                             unsigned rm = ExtractDRegister(instr, 5, 0);
  43820                             uint32_t imm6 = (instr >> 16) & 0x3f;
  43821                             uint32_t imm =
  43822                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
  43823                                 imm6;
  43824                             // VSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  43825                             vshr(al, dt, DRegister(rd), DRegister(rm), imm);
  43826                             break;
  43827                           }
  43828                           case 0x00000100: {
  43829                             // 0xf2800110
  43830                             if (((instr & 0x380080) == 0x0)) {
  43831                               UnallocatedA32(instr);
  43832                               return;
  43833                             }
  43834                             DataType dt =
  43835                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  43836                                                        ((instr >> 4) & 0x8),
  43837                                                    (instr >> 24) & 0x1);
  43838                             if (dt.Is(kDataTypeValueInvalid)) {
  43839                               UnallocatedA32(instr);
  43840                               return;
  43841                             }
  43842                             unsigned rd = ExtractDRegister(instr, 22, 12);
  43843                             unsigned rm = ExtractDRegister(instr, 5, 0);
  43844                             uint32_t imm6 = (instr >> 16) & 0x3f;
  43845                             uint32_t imm =
  43846                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
  43847                                 imm6;
  43848                             // VSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  43849                             vsra(al, dt, DRegister(rd), DRegister(rm), imm);
  43850                             break;
  43851                           }
  43852                           case 0x00000200: {
  43853                             // 0xf2800210
  43854                             if (((instr & 0x380080) == 0x0)) {
  43855                               UnallocatedA32(instr);
  43856                               return;
  43857                             }
  43858                             DataType dt =
  43859                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  43860                                                        ((instr >> 4) & 0x8),
  43861                                                    (instr >> 24) & 0x1);
  43862                             if (dt.Is(kDataTypeValueInvalid)) {
  43863                               UnallocatedA32(instr);
  43864                               return;
  43865                             }
  43866                             unsigned rd = ExtractDRegister(instr, 22, 12);
  43867                             unsigned rm = ExtractDRegister(instr, 5, 0);
  43868                             uint32_t imm6 = (instr >> 16) & 0x3f;
  43869                             uint32_t imm =
  43870                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
  43871                                 imm6;
  43872                             // VRSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  43873                             vrshr(al, dt, DRegister(rd), DRegister(rm), imm);
  43874                             break;
  43875                           }
  43876                           case 0x00000300: {
  43877                             // 0xf2800310
  43878                             if (((instr & 0x380080) == 0x0)) {
  43879                               UnallocatedA32(instr);
  43880                               return;
  43881                             }
  43882                             DataType dt =
  43883                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  43884                                                        ((instr >> 4) & 0x8),
  43885                                                    (instr >> 24) & 0x1);
  43886                             if (dt.Is(kDataTypeValueInvalid)) {
  43887                               UnallocatedA32(instr);
  43888                               return;
  43889                             }
  43890                             unsigned rd = ExtractDRegister(instr, 22, 12);
  43891                             unsigned rm = ExtractDRegister(instr, 5, 0);
  43892                             uint32_t imm6 = (instr >> 16) & 0x3f;
  43893                             uint32_t imm =
  43894                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
  43895                                 imm6;
  43896                             // VRSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  43897                             vrsra(al, dt, DRegister(rd), DRegister(rm), imm);
  43898                             break;
  43899                           }
  43900                         }
  43901                         break;
  43902                       }
  43903                     }
  43904                     break;
  43905                   }
  43906                   case 0x00000400: {
  43907                     // 0xf2800410
  43908                     switch (instr & 0x00380080) {
  43909                       case 0x00000000: {
  43910                         // 0xf2800410
  43911                         switch (instr & 0x00000100) {
  43912                           case 0x00000000: {
  43913                             // 0xf2800410
  43914                             switch (instr & 0x00000200) {
  43915                               default: {
  43916                                 switch (instr & 0x00000020) {
  43917                                   case 0x00000020: {
  43918                                     // 0xf2800430
  43919                                     if (((instr & 0xd00) == 0x100) ||
  43920                                         ((instr & 0xd00) == 0x500) ||
  43921                                         ((instr & 0xd00) == 0x900) ||
  43922                                         ((instr & 0xe00) == 0xe00)) {
  43923                                       UnallocatedA32(instr);
  43924                                       return;
  43925                                     }
  43926                                     unsigned cmode = (instr >> 8) & 0xf;
  43927                                     DataType dt =
  43928                                         ImmediateVmvn::DecodeDt(cmode);
  43929                                     if (dt.Is(kDataTypeValueInvalid)) {
  43930                                       UnallocatedA32(instr);
  43931                                       return;
  43932                                     }
  43933                                     unsigned rd =
  43934                                         ExtractDRegister(instr, 22, 12);
  43935                                     DOperand imm =
  43936                                         ImmediateVmvn::DecodeImmediate(
  43937                                             cmode,
  43938                                             (instr & 0xf) |
  43939                                                 ((instr >> 12) & 0x70) |
  43940                                                 ((instr >> 17) & 0x80));
  43941                                     // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
  43942                                     vmvn(al, dt, DRegister(rd), imm);
  43943                                     break;
  43944                                   }
  43945                                   default: {
  43946                                     if (((instr & 0x920) == 0x100) ||
  43947                                         ((instr & 0x520) == 0x100) ||
  43948                                         ((instr & 0x820) == 0x20) ||
  43949                                         ((instr & 0x420) == 0x20) ||
  43950                                         ((instr & 0x220) == 0x20) ||
  43951                                         ((instr & 0x120) == 0x120)) {
  43952                                       UnallocatedA32(instr);
  43953                                       return;
  43954                                     }
  43955                                     unsigned cmode = ((instr >> 8) & 0xf) |
  43956                                                      ((instr >> 1) & 0x10);
  43957                                     DataType dt =
  43958                                         ImmediateVmov::DecodeDt(cmode);
  43959                                     if (dt.Is(kDataTypeValueInvalid)) {
  43960                                       UnallocatedA32(instr);
  43961                                       return;
  43962                                     }
  43963                                     unsigned rd =
  43964                                         ExtractDRegister(instr, 22, 12);
  43965                                     DOperand imm =
  43966                                         ImmediateVmov::DecodeImmediate(
  43967                                             cmode,
  43968                                             (instr & 0xf) |
  43969                                                 ((instr >> 12) & 0x70) |
  43970                                                 ((instr >> 17) & 0x80));
  43971                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
  43972                                     vmov(al, dt, DRegister(rd), imm);
  43973                                     break;
  43974                                   }
  43975                                 }
  43976                                 break;
  43977                               }
  43978                             }
  43979                             break;
  43980                           }
  43981                           case 0x00000100: {
  43982                             // 0xf2800510
  43983                             switch (instr & 0x00000020) {
  43984                               case 0x00000000: {
  43985                                 // 0xf2800510
  43986                                 if (((instr & 0x100) == 0x0) ||
  43987                                     ((instr & 0xc00) == 0xc00)) {
  43988                                   UnallocatedA32(instr);
  43989                                   return;
  43990                                 }
  43991                                 unsigned cmode = (instr >> 8) & 0xf;
  43992                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
  43993                                 if (dt.Is(kDataTypeValueInvalid)) {
  43994                                   UnallocatedA32(instr);
  43995                                   return;
  43996                                 }
  43997                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  43998                                 DOperand imm = ImmediateVorr::DecodeImmediate(
  43999                                     cmode,
  44000                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
  44001                                         ((instr >> 17) & 0x80));
  44002                                 // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44003                                 vorr(al, dt, DRegister(rd), DRegister(rd), imm);
  44004                                 break;
  44005                               }
  44006                               case 0x00000020: {
  44007                                 // 0xf2800530
  44008                                 if (((instr & 0x100) == 0x0) ||
  44009                                     ((instr & 0xc00) == 0xc00)) {
  44010                                   UnallocatedA32(instr);
  44011                                   return;
  44012                                 }
  44013                                 unsigned cmode = (instr >> 8) & 0xf;
  44014                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
  44015                                 if (dt.Is(kDataTypeValueInvalid)) {
  44016                                   UnallocatedA32(instr);
  44017                                   return;
  44018                                 }
  44019                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  44020                                 DOperand imm = ImmediateVbic::DecodeImmediate(
  44021                                     cmode,
  44022                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
  44023                                         ((instr >> 17) & 0x80));
  44024                                 // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44025                                 vbic(al, dt, DRegister(rd), DRegister(rd), imm);
  44026                                 break;
  44027                               }
  44028                             }
  44029                             break;
  44030                           }
  44031                         }
  44032                         break;
  44033                       }
  44034                       default: {
  44035                         switch (instr & 0x00000300) {
  44036                           case 0x00000000: {
  44037                             // 0xf2800410
  44038                             if ((instr & 0x01000000) == 0x01000000) {
  44039                               if (((instr & 0x380080) == 0x0)) {
  44040                                 UnallocatedA32(instr);
  44041                                 return;
  44042                               }
  44043                               DataType dt = Dt_L_imm6_4_Decode(
  44044                                   ((instr >> 19) & 0x7) | ((instr >> 4) & 0x8));
  44045                               if (dt.Is(kDataTypeValueInvalid)) {
  44046                                 UnallocatedA32(instr);
  44047                                 return;
  44048                               }
  44049                               unsigned rd = ExtractDRegister(instr, 22, 12);
  44050                               unsigned rm = ExtractDRegister(instr, 5, 0);
  44051                               uint32_t imm6 = (instr >> 16) & 0x3f;
  44052                               uint32_t imm =
  44053                                   (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
  44054                                   imm6;
  44055                               // VSRI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; A1
  44056                               vsri(al, dt, DRegister(rd), DRegister(rm), imm);
  44057                             } else {
  44058                               UnallocatedA32(instr);
  44059                             }
  44060                             break;
  44061                           }
  44062                           case 0x00000100: {
  44063                             // 0xf2800510
  44064                             switch (instr & 0x01000000) {
  44065                               case 0x00000000: {
  44066                                 // 0xf2800510
  44067                                 if (((instr & 0x380080) == 0x0)) {
  44068                                   UnallocatedA32(instr);
  44069                                   return;
  44070                                 }
  44071                                 DataType dt =
  44072                                     Dt_L_imm6_3_Decode(((instr >> 19) & 0x7) |
  44073                                                        ((instr >> 4) & 0x8));
  44074                                 if (dt.Is(kDataTypeValueInvalid)) {
  44075                                   UnallocatedA32(instr);
  44076                                   return;
  44077                                 }
  44078                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  44079                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  44080                                 uint32_t imm6 = (instr >> 16) & 0x3f;
  44081                                 uint32_t imm =
  44082                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
  44083                                 // VSHL{<c>}{<q>}.I<size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44084                                 vshl(al, dt, DRegister(rd), DRegister(rm), imm);
  44085                                 break;
  44086                               }
  44087                               case 0x01000000: {
  44088                                 // 0xf3800510
  44089                                 if (((instr & 0x380080) == 0x0)) {
  44090                                   UnallocatedA32(instr);
  44091                                   return;
  44092                                 }
  44093                                 DataType dt =
  44094                                     Dt_L_imm6_4_Decode(((instr >> 19) & 0x7) |
  44095                                                        ((instr >> 4) & 0x8));
  44096                                 if (dt.Is(kDataTypeValueInvalid)) {
  44097                                   UnallocatedA32(instr);
  44098                                   return;
  44099                                 }
  44100                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  44101                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  44102                                 uint32_t imm6 = (instr >> 16) & 0x3f;
  44103                                 uint32_t imm =
  44104                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
  44105                                 // VSLI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; A1
  44106                                 vsli(al, dt, DRegister(rd), DRegister(rm), imm);
  44107                                 break;
  44108                               }
  44109                             }
  44110                             break;
  44111                           }
  44112                           case 0x00000200: {
  44113                             // 0xf2800610
  44114                             if (((instr & 0x380080) == 0x0)) {
  44115                               UnallocatedA32(instr);
  44116                               return;
  44117                             }
  44118                             DataType dt =
  44119                                 Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
  44120                                                        ((instr >> 4) & 0x8),
  44121                                                    (instr >> 24) & 0x1);
  44122                             if (dt.Is(kDataTypeValueInvalid)) {
  44123                               UnallocatedA32(instr);
  44124                               return;
  44125                             }
  44126                             unsigned rd = ExtractDRegister(instr, 22, 12);
  44127                             unsigned rm = ExtractDRegister(instr, 5, 0);
  44128                             uint32_t imm6 = (instr >> 16) & 0x3f;
  44129                             uint32_t imm =
  44130                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
  44131                             // VQSHLU{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44132                             vqshlu(al, dt, DRegister(rd), DRegister(rm), imm);
  44133                             break;
  44134                           }
  44135                           case 0x00000300: {
  44136                             // 0xf2800710
  44137                             if (((instr & 0x380080) == 0x0)) {
  44138                               UnallocatedA32(instr);
  44139                               return;
  44140                             }
  44141                             DataType dt =
  44142                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  44143                                                        ((instr >> 4) & 0x8),
  44144                                                    (instr >> 24) & 0x1);
  44145                             if (dt.Is(kDataTypeValueInvalid)) {
  44146                               UnallocatedA32(instr);
  44147                               return;
  44148                             }
  44149                             unsigned rd = ExtractDRegister(instr, 22, 12);
  44150                             unsigned rm = ExtractDRegister(instr, 5, 0);
  44151                             uint32_t imm6 = (instr >> 16) & 0x3f;
  44152                             uint32_t imm =
  44153                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
  44154                             // VQSHL{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44155                             vqshl(al, dt, DRegister(rd), DRegister(rm), imm);
  44156                             break;
  44157                           }
  44158                         }
  44159                         break;
  44160                       }
  44161                     }
  44162                     break;
  44163                   }
  44164                   case 0x00000800: {
  44165                     // 0xf2800810
  44166                     switch (instr & 0x00000080) {
  44167                       case 0x00000000: {
  44168                         // 0xf2800810
  44169                         switch (instr & 0x00380000) {
  44170                           case 0x00000000: {
  44171                             // 0xf2800810
  44172                             switch (instr & 0x00000100) {
  44173                               case 0x00000000: {
  44174                                 // 0xf2800810
  44175                                 switch (instr & 0x00000200) {
  44176                                   default: {
  44177                                     switch (instr & 0x00000020) {
  44178                                       case 0x00000020: {
  44179                                         // 0xf2800830
  44180                                         if (((instr & 0xd00) == 0x100) ||
  44181                                             ((instr & 0xd00) == 0x500) ||
  44182                                             ((instr & 0xd00) == 0x900) ||
  44183                                             ((instr & 0xe00) == 0xe00)) {
  44184                                           UnallocatedA32(instr);
  44185                                           return;
  44186                                         }
  44187                                         unsigned cmode = (instr >> 8) & 0xf;
  44188                                         DataType dt =
  44189                                             ImmediateVmvn::DecodeDt(cmode);
  44190                                         if (dt.Is(kDataTypeValueInvalid)) {
  44191                                           UnallocatedA32(instr);
  44192                                           return;
  44193                                         }
  44194                                         unsigned rd =
  44195                                             ExtractDRegister(instr, 22, 12);
  44196                                         DOperand imm =
  44197                                             ImmediateVmvn::DecodeImmediate(
  44198                                                 cmode,
  44199                                                 (instr & 0xf) |
  44200                                                     ((instr >> 12) & 0x70) |
  44201                                                     ((instr >> 17) & 0x80));
  44202                                         // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
  44203                                         vmvn(al, dt, DRegister(rd), imm);
  44204                                         break;
  44205                                       }
  44206                                       default: {
  44207                                         if (((instr & 0x920) == 0x100) ||
  44208                                             ((instr & 0x520) == 0x100) ||
  44209                                             ((instr & 0x820) == 0x20) ||
  44210                                             ((instr & 0x420) == 0x20) ||
  44211                                             ((instr & 0x220) == 0x20) ||
  44212                                             ((instr & 0x120) == 0x120)) {
  44213                                           UnallocatedA32(instr);
  44214                                           return;
  44215                                         }
  44216                                         unsigned cmode = ((instr >> 8) & 0xf) |
  44217                                                          ((instr >> 1) & 0x10);
  44218                                         DataType dt =
  44219                                             ImmediateVmov::DecodeDt(cmode);
  44220                                         if (dt.Is(kDataTypeValueInvalid)) {
  44221                                           UnallocatedA32(instr);
  44222                                           return;
  44223                                         }
  44224                                         unsigned rd =
  44225                                             ExtractDRegister(instr, 22, 12);
  44226                                         DOperand imm =
  44227                                             ImmediateVmov::DecodeImmediate(
  44228                                                 cmode,
  44229                                                 (instr & 0xf) |
  44230                                                     ((instr >> 12) & 0x70) |
  44231                                                     ((instr >> 17) & 0x80));
  44232                                         // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
  44233                                         vmov(al, dt, DRegister(rd), imm);
  44234                                         break;
  44235                                       }
  44236                                     }
  44237                                     break;
  44238                                   }
  44239                                 }
  44240                                 break;
  44241                               }
  44242                               case 0x00000100: {
  44243                                 // 0xf2800910
  44244                                 switch (instr & 0x00000020) {
  44245                                   case 0x00000000: {
  44246                                     // 0xf2800910
  44247                                     if (((instr & 0x100) == 0x0) ||
  44248                                         ((instr & 0xc00) == 0xc00)) {
  44249                                       UnallocatedA32(instr);
  44250                                       return;
  44251                                     }
  44252                                     unsigned cmode = (instr >> 8) & 0xf;
  44253                                     DataType dt =
  44254                                         ImmediateVorr::DecodeDt(cmode);
  44255                                     if (dt.Is(kDataTypeValueInvalid)) {
  44256                                       UnallocatedA32(instr);
  44257                                       return;
  44258                                     }
  44259                                     unsigned rd =
  44260                                         ExtractDRegister(instr, 22, 12);
  44261                                     DOperand imm =
  44262                                         ImmediateVorr::DecodeImmediate(
  44263                                             cmode,
  44264                                             (instr & 0xf) |
  44265                                                 ((instr >> 12) & 0x70) |
  44266                                                 ((instr >> 17) & 0x80));
  44267                                     // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44268                                     vorr(al,
  44269                                          dt,
  44270                                          DRegister(rd),
  44271                                          DRegister(rd),
  44272                                          imm);
  44273                                     break;
  44274                                   }
  44275                                   case 0x00000020: {
  44276                                     // 0xf2800930
  44277                                     if (((instr & 0x100) == 0x0) ||
  44278                                         ((instr & 0xc00) == 0xc00)) {
  44279                                       UnallocatedA32(instr);
  44280                                       return;
  44281                                     }
  44282                                     unsigned cmode = (instr >> 8) & 0xf;
  44283                                     DataType dt =
  44284                                         ImmediateVbic::DecodeDt(cmode);
  44285                                     if (dt.Is(kDataTypeValueInvalid)) {
  44286                                       UnallocatedA32(instr);
  44287                                       return;
  44288                                     }
  44289                                     unsigned rd =
  44290                                         ExtractDRegister(instr, 22, 12);
  44291                                     DOperand imm =
  44292                                         ImmediateVbic::DecodeImmediate(
  44293                                             cmode,
  44294                                             (instr & 0xf) |
  44295                                                 ((instr >> 12) & 0x70) |
  44296                                                 ((instr >> 17) & 0x80));
  44297                                     // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44298                                     vbic(al,
  44299                                          dt,
  44300                                          DRegister(rd),
  44301                                          DRegister(rd),
  44302                                          imm);
  44303                                     break;
  44304                                   }
  44305                                 }
  44306                                 break;
  44307                               }
  44308                             }
  44309                             break;
  44310                           }
  44311                           case 0x00180000: {
  44312                             // 0xf2980810
  44313                             switch (instr & 0x00000300) {
  44314                               case 0x00000000: {
  44315                                 // 0xf2980810
  44316                                 switch (instr & 0x01000000) {
  44317                                   case 0x00000000: {
  44318                                     // 0xf2980810
  44319                                     if (((instr & 0x380000) == 0x0)) {
  44320                                       UnallocatedA32(instr);
  44321                                       return;
  44322                                     }
  44323                                     DataType dt =
  44324                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
  44325                                     if (dt.Is(kDataTypeValueInvalid)) {
  44326                                       UnallocatedA32(instr);
  44327                                       return;
  44328                                     }
  44329                                     unsigned rd =
  44330                                         ExtractDRegister(instr, 22, 12);
  44331                                     if ((instr & 1) != 0) {
  44332                                       UnallocatedA32(instr);
  44333                                       return;
  44334                                     }
  44335                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  44336                                     uint32_t imm6 = (instr >> 16) & 0x3f;
  44337                                     uint32_t imm = dt.GetSize() - imm6;
  44338                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44339                                     vshrn(al,
  44340                                           dt,
  44341                                           DRegister(rd),
  44342                                           QRegister(rm),
  44343                                           imm);
  44344                                     break;
  44345                                   }
  44346                                   case 0x01000000: {
  44347                                     // 0xf3980810
  44348                                     if (((instr & 0x380000) == 0x0)) {
  44349                                       UnallocatedA32(instr);
  44350                                       return;
  44351                                     }
  44352                                     DataType dt =
  44353                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
  44354                                                          (instr >> 24) & 0x1);
  44355                                     if (dt.Is(kDataTypeValueInvalid)) {
  44356                                       UnallocatedA32(instr);
  44357                                       return;
  44358                                     }
  44359                                     unsigned rd =
  44360                                         ExtractDRegister(instr, 22, 12);
  44361                                     if ((instr & 1) != 0) {
  44362                                       UnallocatedA32(instr);
  44363                                       return;
  44364                                     }
  44365                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  44366                                     uint32_t imm6 = (instr >> 16) & 0x3f;
  44367                                     uint32_t imm = dt.GetSize() - imm6;
  44368                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44369                                     vqshrun(al,
  44370                                             dt,
  44371                                             DRegister(rd),
  44372                                             QRegister(rm),
  44373                                             imm);
  44374                                     break;
  44375                                   }
  44376                                 }
  44377                                 break;
  44378                               }
  44379                               case 0x00000100: {
  44380                                 // 0xf2980910
  44381                                 if (((instr & 0x380000) == 0x0)) {
  44382                                   UnallocatedA32(instr);
  44383                                   return;
  44384                                 }
  44385                                 DataType dt =
  44386                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
  44387                                                      (instr >> 24) & 0x1);
  44388                                 if (dt.Is(kDataTypeValueInvalid)) {
  44389                                   UnallocatedA32(instr);
  44390                                   return;
  44391                                 }
  44392                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  44393                                 if ((instr & 1) != 0) {
  44394                                   UnallocatedA32(instr);
  44395                                   return;
  44396                                 }
  44397                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  44398                                 uint32_t imm6 = (instr >> 16) & 0x3f;
  44399                                 uint32_t imm = dt.GetSize() - imm6;
  44400                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44401                                 vqshrn(al,
  44402                                        dt,
  44403                                        DRegister(rd),
  44404                                        QRegister(rm),
  44405                                        imm);
  44406                                 break;
  44407                               }
  44408                               case 0x00000200: {
  44409                                 // 0xf2980a10
  44410                                 if (((instr & 0x380000) == 0x0) ||
  44411                                     ((instr & 0x3f0000) == 0x80000) ||
  44412                                     ((instr & 0x3f0000) == 0x100000) ||
  44413                                     ((instr & 0x3f0000) == 0x200000)) {
  44414                                   UnallocatedA32(instr);
  44415                                   return;
  44416                                 }
  44417                                 DataType dt =
  44418                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
  44419                                                      (instr >> 24) & 0x1);
  44420                                 if (dt.Is(kDataTypeValueInvalid)) {
  44421                                   UnallocatedA32(instr);
  44422                                   return;
  44423                                 }
  44424                                 if (((instr >> 12) & 1) != 0) {
  44425                                   UnallocatedA32(instr);
  44426                                   return;
  44427                                 }
  44428                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  44429                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  44430                                 uint32_t imm6 = (instr >> 16) & 0x3f;
  44431                                 uint32_t imm = imm6 - dt.GetSize();
  44432                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44433                                 vshll(al,
  44434                                       dt,
  44435                                       QRegister(rd),
  44436                                       DRegister(rm),
  44437                                       imm);
  44438                                 break;
  44439                               }
  44440                               default:
  44441                                 UnallocatedA32(instr);
  44442                                 break;
  44443                             }
  44444                             break;
  44445                           }
  44446                           case 0x00280000: {
  44447                             // 0xf2a80810
  44448                             switch (instr & 0x00000300) {
  44449                               case 0x00000000: {
  44450                                 // 0xf2a80810
  44451                                 switch (instr & 0x01000000) {
  44452                                   case 0x00000000: {
  44453                                     // 0xf2a80810
  44454                                     if (((instr & 0x380000) == 0x0)) {
  44455                                       UnallocatedA32(instr);
  44456                                       return;
  44457                                     }
  44458                                     DataType dt =
  44459                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
  44460                                     if (dt.Is(kDataTypeValueInvalid)) {
  44461                                       UnallocatedA32(instr);
  44462                                       return;
  44463                                     }
  44464                                     unsigned rd =
  44465                                         ExtractDRegister(instr, 22, 12);
  44466                                     if ((instr & 1) != 0) {
  44467                                       UnallocatedA32(instr);
  44468                                       return;
  44469                                     }
  44470                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  44471                                     uint32_t imm6 = (instr >> 16) & 0x3f;
  44472                                     uint32_t imm = dt.GetSize() - imm6;
  44473                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44474                                     vshrn(al,
  44475                                           dt,
  44476                                           DRegister(rd),
  44477                                           QRegister(rm),
  44478                                           imm);
  44479                                     break;
  44480                                   }
  44481                                   case 0x01000000: {
  44482                                     // 0xf3a80810
  44483                                     if (((instr & 0x380000) == 0x0)) {
  44484                                       UnallocatedA32(instr);
  44485                                       return;
  44486                                     }
  44487                                     DataType dt =
  44488                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
  44489                                                          (instr >> 24) & 0x1);
  44490                                     if (dt.Is(kDataTypeValueInvalid)) {
  44491                                       UnallocatedA32(instr);
  44492                                       return;
  44493                                     }
  44494                                     unsigned rd =
  44495                                         ExtractDRegister(instr, 22, 12);
  44496                                     if ((instr & 1) != 0) {
  44497                                       UnallocatedA32(instr);
  44498                                       return;
  44499                                     }
  44500                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  44501                                     uint32_t imm6 = (instr >> 16) & 0x3f;
  44502                                     uint32_t imm = dt.GetSize() - imm6;
  44503                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44504                                     vqshrun(al,
  44505                                             dt,
  44506                                             DRegister(rd),
  44507                                             QRegister(rm),
  44508                                             imm);
  44509                                     break;
  44510                                   }
  44511                                 }
  44512                                 break;
  44513                               }
  44514                               case 0x00000100: {
  44515                                 // 0xf2a80910
  44516                                 if (((instr & 0x380000) == 0x0)) {
  44517                                   UnallocatedA32(instr);
  44518                                   return;
  44519                                 }
  44520                                 DataType dt =
  44521                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
  44522                                                      (instr >> 24) & 0x1);
  44523                                 if (dt.Is(kDataTypeValueInvalid)) {
  44524                                   UnallocatedA32(instr);
  44525                                   return;
  44526                                 }
  44527                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  44528                                 if ((instr & 1) != 0) {
  44529                                   UnallocatedA32(instr);
  44530                                   return;
  44531                                 }
  44532                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  44533                                 uint32_t imm6 = (instr >> 16) & 0x3f;
  44534                                 uint32_t imm = dt.GetSize() - imm6;
  44535                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44536                                 vqshrn(al,
  44537                                        dt,
  44538                                        DRegister(rd),
  44539                                        QRegister(rm),
  44540                                        imm);
  44541                                 break;
  44542                               }
  44543                               case 0x00000200: {
  44544                                 // 0xf2a80a10
  44545                                 if (((instr & 0x380000) == 0x0) ||
  44546                                     ((instr & 0x3f0000) == 0x80000) ||
  44547                                     ((instr & 0x3f0000) == 0x100000) ||
  44548                                     ((instr & 0x3f0000) == 0x200000)) {
  44549                                   UnallocatedA32(instr);
  44550                                   return;
  44551                                 }
  44552                                 DataType dt =
  44553                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
  44554                                                      (instr >> 24) & 0x1);
  44555                                 if (dt.Is(kDataTypeValueInvalid)) {
  44556                                   UnallocatedA32(instr);
  44557                                   return;
  44558                                 }
  44559                                 if (((instr >> 12) & 1) != 0) {
  44560                                   UnallocatedA32(instr);
  44561                                   return;
  44562                                 }
  44563                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  44564                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  44565                                 uint32_t imm6 = (instr >> 16) & 0x3f;
  44566                                 uint32_t imm = imm6 - dt.GetSize();
  44567                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44568                                 vshll(al,
  44569                                       dt,
  44570                                       QRegister(rd),
  44571                                       DRegister(rm),
  44572                                       imm);
  44573                                 break;
  44574                               }
  44575                               default:
  44576                                 UnallocatedA32(instr);
  44577                                 break;
  44578                             }
  44579                             break;
  44580                           }
  44581                           case 0x00300000: {
  44582                             // 0xf2b00810
  44583                             switch (instr & 0x00000300) {
  44584                               case 0x00000000: {
  44585                                 // 0xf2b00810
  44586                                 switch (instr & 0x01000000) {
  44587                                   case 0x00000000: {
  44588                                     // 0xf2b00810
  44589                                     if (((instr & 0x380000) == 0x0)) {
  44590                                       UnallocatedA32(instr);
  44591                                       return;
  44592                                     }
  44593                                     DataType dt =
  44594                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
  44595                                     if (dt.Is(kDataTypeValueInvalid)) {
  44596                                       UnallocatedA32(instr);
  44597                                       return;
  44598                                     }
  44599                                     unsigned rd =
  44600                                         ExtractDRegister(instr, 22, 12);
  44601                                     if ((instr & 1) != 0) {
  44602                                       UnallocatedA32(instr);
  44603                                       return;
  44604                                     }
  44605                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  44606                                     uint32_t imm6 = (instr >> 16) & 0x3f;
  44607                                     uint32_t imm = dt.GetSize() - imm6;
  44608                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44609                                     vshrn(al,
  44610                                           dt,
  44611                                           DRegister(rd),
  44612                                           QRegister(rm),
  44613                                           imm);
  44614                                     break;
  44615                                   }
  44616                                   case 0x01000000: {
  44617                                     // 0xf3b00810
  44618                                     if (((instr & 0x380000) == 0x0)) {
  44619                                       UnallocatedA32(instr);
  44620                                       return;
  44621                                     }
  44622                                     DataType dt =
  44623                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
  44624                                                          (instr >> 24) & 0x1);
  44625                                     if (dt.Is(kDataTypeValueInvalid)) {
  44626                                       UnallocatedA32(instr);
  44627                                       return;
  44628                                     }
  44629                                     unsigned rd =
  44630                                         ExtractDRegister(instr, 22, 12);
  44631                                     if ((instr & 1) != 0) {
  44632                                       UnallocatedA32(instr);
  44633                                       return;
  44634                                     }
  44635                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  44636                                     uint32_t imm6 = (instr >> 16) & 0x3f;
  44637                                     uint32_t imm = dt.GetSize() - imm6;
  44638                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44639                                     vqshrun(al,
  44640                                             dt,
  44641                                             DRegister(rd),
  44642                                             QRegister(rm),
  44643                                             imm);
  44644                                     break;
  44645                                   }
  44646                                 }
  44647                                 break;
  44648                               }
  44649                               case 0x00000100: {
  44650                                 // 0xf2b00910
  44651                                 if (((instr & 0x380000) == 0x0)) {
  44652                                   UnallocatedA32(instr);
  44653                                   return;
  44654                                 }
  44655                                 DataType dt =
  44656                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
  44657                                                      (instr >> 24) & 0x1);
  44658                                 if (dt.Is(kDataTypeValueInvalid)) {
  44659                                   UnallocatedA32(instr);
  44660                                   return;
  44661                                 }
  44662                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  44663                                 if ((instr & 1) != 0) {
  44664                                   UnallocatedA32(instr);
  44665                                   return;
  44666                                 }
  44667                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  44668                                 uint32_t imm6 = (instr >> 16) & 0x3f;
  44669                                 uint32_t imm = dt.GetSize() - imm6;
  44670                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44671                                 vqshrn(al,
  44672                                        dt,
  44673                                        DRegister(rd),
  44674                                        QRegister(rm),
  44675                                        imm);
  44676                                 break;
  44677                               }
  44678                               case 0x00000200: {
  44679                                 // 0xf2b00a10
  44680                                 if (((instr & 0x380000) == 0x0) ||
  44681                                     ((instr & 0x3f0000) == 0x80000) ||
  44682                                     ((instr & 0x3f0000) == 0x100000) ||
  44683                                     ((instr & 0x3f0000) == 0x200000)) {
  44684                                   UnallocatedA32(instr);
  44685                                   return;
  44686                                 }
  44687                                 DataType dt =
  44688                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
  44689                                                      (instr >> 24) & 0x1);
  44690                                 if (dt.Is(kDataTypeValueInvalid)) {
  44691                                   UnallocatedA32(instr);
  44692                                   return;
  44693                                 }
  44694                                 if (((instr >> 12) & 1) != 0) {
  44695                                   UnallocatedA32(instr);
  44696                                   return;
  44697                                 }
  44698                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  44699                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  44700                                 uint32_t imm6 = (instr >> 16) & 0x3f;
  44701                                 uint32_t imm = imm6 - dt.GetSize();
  44702                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44703                                 vshll(al,
  44704                                       dt,
  44705                                       QRegister(rd),
  44706                                       DRegister(rm),
  44707                                       imm);
  44708                                 break;
  44709                               }
  44710                               default:
  44711                                 UnallocatedA32(instr);
  44712                                 break;
  44713                             }
  44714                             break;
  44715                           }
  44716                           case 0x00380000: {
  44717                             // 0xf2b80810
  44718                             switch (instr & 0x00000300) {
  44719                               case 0x00000000: {
  44720                                 // 0xf2b80810
  44721                                 switch (instr & 0x01000000) {
  44722                                   case 0x00000000: {
  44723                                     // 0xf2b80810
  44724                                     if (((instr & 0x380000) == 0x0)) {
  44725                                       UnallocatedA32(instr);
  44726                                       return;
  44727                                     }
  44728                                     DataType dt =
  44729                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
  44730                                     if (dt.Is(kDataTypeValueInvalid)) {
  44731                                       UnallocatedA32(instr);
  44732                                       return;
  44733                                     }
  44734                                     unsigned rd =
  44735                                         ExtractDRegister(instr, 22, 12);
  44736                                     if ((instr & 1) != 0) {
  44737                                       UnallocatedA32(instr);
  44738                                       return;
  44739                                     }
  44740                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  44741                                     uint32_t imm6 = (instr >> 16) & 0x3f;
  44742                                     uint32_t imm = dt.GetSize() - imm6;
  44743                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44744                                     vshrn(al,
  44745                                           dt,
  44746                                           DRegister(rd),
  44747                                           QRegister(rm),
  44748                                           imm);
  44749                                     break;
  44750                                   }
  44751                                   case 0x01000000: {
  44752                                     // 0xf3b80810
  44753                                     if (((instr & 0x380000) == 0x0)) {
  44754                                       UnallocatedA32(instr);
  44755                                       return;
  44756                                     }
  44757                                     DataType dt =
  44758                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
  44759                                                          (instr >> 24) & 0x1);
  44760                                     if (dt.Is(kDataTypeValueInvalid)) {
  44761                                       UnallocatedA32(instr);
  44762                                       return;
  44763                                     }
  44764                                     unsigned rd =
  44765                                         ExtractDRegister(instr, 22, 12);
  44766                                     if ((instr & 1) != 0) {
  44767                                       UnallocatedA32(instr);
  44768                                       return;
  44769                                     }
  44770                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  44771                                     uint32_t imm6 = (instr >> 16) & 0x3f;
  44772                                     uint32_t imm = dt.GetSize() - imm6;
  44773                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44774                                     vqshrun(al,
  44775                                             dt,
  44776                                             DRegister(rd),
  44777                                             QRegister(rm),
  44778                                             imm);
  44779                                     break;
  44780                                   }
  44781                                 }
  44782                                 break;
  44783                               }
  44784                               case 0x00000100: {
  44785                                 // 0xf2b80910
  44786                                 if (((instr & 0x380000) == 0x0)) {
  44787                                   UnallocatedA32(instr);
  44788                                   return;
  44789                                 }
  44790                                 DataType dt =
  44791                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
  44792                                                      (instr >> 24) & 0x1);
  44793                                 if (dt.Is(kDataTypeValueInvalid)) {
  44794                                   UnallocatedA32(instr);
  44795                                   return;
  44796                                 }
  44797                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  44798                                 if ((instr & 1) != 0) {
  44799                                   UnallocatedA32(instr);
  44800                                   return;
  44801                                 }
  44802                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  44803                                 uint32_t imm6 = (instr >> 16) & 0x3f;
  44804                                 uint32_t imm = dt.GetSize() - imm6;
  44805                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44806                                 vqshrn(al,
  44807                                        dt,
  44808                                        DRegister(rd),
  44809                                        QRegister(rm),
  44810                                        imm);
  44811                                 break;
  44812                               }
  44813                               case 0x00000200: {
  44814                                 // 0xf2b80a10
  44815                                 if (((instr & 0x380000) == 0x0) ||
  44816                                     ((instr & 0x3f0000) == 0x80000) ||
  44817                                     ((instr & 0x3f0000) == 0x100000) ||
  44818                                     ((instr & 0x3f0000) == 0x200000)) {
  44819                                   UnallocatedA32(instr);
  44820                                   return;
  44821                                 }
  44822                                 DataType dt =
  44823                                     Dt_imm6_4_Decode((instr >> 19) & 0x7,
  44824                                                      (instr >> 24) & 0x1);
  44825                                 if (dt.Is(kDataTypeValueInvalid)) {
  44826                                   UnallocatedA32(instr);
  44827                                   return;
  44828                                 }
  44829                                 if (((instr >> 12) & 1) != 0) {
  44830                                   UnallocatedA32(instr);
  44831                                   return;
  44832                                 }
  44833                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  44834                                 unsigned rm = ExtractDRegister(instr, 5, 0);
  44835                                 uint32_t imm6 = (instr >> 16) & 0x3f;
  44836                                 uint32_t imm = imm6 - dt.GetSize();
  44837                                 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44838                                 vshll(al,
  44839                                       dt,
  44840                                       QRegister(rd),
  44841                                       DRegister(rm),
  44842                                       imm);
  44843                                 break;
  44844                               }
  44845                               default:
  44846                                 UnallocatedA32(instr);
  44847                                 break;
  44848                             }
  44849                             break;
  44850                           }
  44851                           default: {
  44852                             switch (instr & 0x00000300) {
  44853                               case 0x00000000: {
  44854                                 // 0xf2800810
  44855                                 switch (instr & 0x01000000) {
  44856                                   case 0x00000000: {
  44857                                     // 0xf2800810
  44858                                     if (((instr & 0x380000) == 0x0)) {
  44859                                       UnallocatedA32(instr);
  44860                                       return;
  44861                                     }
  44862                                     DataType dt =
  44863                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
  44864                                     if (dt.Is(kDataTypeValueInvalid)) {
  44865                                       UnallocatedA32(instr);
  44866                                       return;
  44867                                     }
  44868                                     unsigned rd =
  44869                                         ExtractDRegister(instr, 22, 12);
  44870                                     if ((instr & 1) != 0) {
  44871                                       UnallocatedA32(instr);
  44872                                       return;
  44873                                     }
  44874                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  44875                                     uint32_t imm6 = (instr >> 16) & 0x3f;
  44876                                     uint32_t imm = dt.GetSize() - imm6;
  44877                                     // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44878                                     vshrn(al,
  44879                                           dt,
  44880                                           DRegister(rd),
  44881                                           QRegister(rm),
  44882                                           imm);
  44883                                     break;
  44884                                   }
  44885                                   case 0x01000000: {
  44886                                     // 0xf3800810
  44887                                     if (((instr & 0x380000) == 0x0)) {
  44888                                       UnallocatedA32(instr);
  44889                                       return;
  44890                                     }
  44891                                     DataType dt =
  44892                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
  44893                                                          (instr >> 24) & 0x1);
  44894                                     if (dt.Is(kDataTypeValueInvalid)) {
  44895                                       UnallocatedA32(instr);
  44896                                       return;
  44897                                     }
  44898                                     unsigned rd =
  44899                                         ExtractDRegister(instr, 22, 12);
  44900                                     if ((instr & 1) != 0) {
  44901                                       UnallocatedA32(instr);
  44902                                       return;
  44903                                     }
  44904                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  44905                                     uint32_t imm6 = (instr >> 16) & 0x3f;
  44906                                     uint32_t imm = dt.GetSize() - imm6;
  44907                                     // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44908                                     vqshrun(al,
  44909                                             dt,
  44910                                             DRegister(rd),
  44911                                             QRegister(rm),
  44912                                             imm);
  44913                                     break;
  44914                                   }
  44915                                 }
  44916                                 break;
  44917                               }
  44918                               case 0x00000100: {
  44919                                 // 0xf2800910
  44920                                 if (((instr & 0x380000) == 0x0)) {
  44921                                   UnallocatedA32(instr);
  44922                                   return;
  44923                                 }
  44924                                 DataType dt =
  44925                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
  44926                                                      (instr >> 24) & 0x1);
  44927                                 if (dt.Is(kDataTypeValueInvalid)) {
  44928                                   UnallocatedA32(instr);
  44929                                   return;
  44930                                 }
  44931                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  44932                                 if ((instr & 1) != 0) {
  44933                                   UnallocatedA32(instr);
  44934                                   return;
  44935                                 }
  44936                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  44937                                 uint32_t imm6 = (instr >> 16) & 0x3f;
  44938                                 uint32_t imm = dt.GetSize() - imm6;
  44939                                 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  44940                                 vqshrn(al,
  44941                                        dt,
  44942                                        DRegister(rd),
  44943                                        QRegister(rm),
  44944                                        imm);
  44945                                 break;
  44946                               }
  44947                               case 0x00000200: {
  44948                                 // 0xf2800a10
  44949                                 switch (instr & 0x00070000) {
  44950                                   case 0x00000000: {
  44951                                     // 0xf2800a10
  44952                                     switch (instr & 0x003f0000) {
  44953                                       case 0x00080000: {
  44954                                         // 0xf2880a10
  44955                                         if (((instr & 0x380000) == 0x0) ||
  44956                                             ((instr & 0x380000) == 0x180000) ||
  44957                                             ((instr & 0x380000) == 0x280000) ||
  44958                                             ((instr & 0x380000) == 0x300000) ||
  44959                                             ((instr & 0x380000) == 0x380000)) {
  44960                                           UnallocatedA32(instr);
  44961                                           return;
  44962                                         }
  44963                                         DataType dt = Dt_U_imm3H_1_Decode(
  44964                                             ((instr >> 19) & 0x7) |
  44965                                             ((instr >> 21) & 0x8));
  44966                                         if (dt.Is(kDataTypeValueInvalid)) {
  44967                                           UnallocatedA32(instr);
  44968                                           return;
  44969                                         }
  44970                                         if (((instr >> 12) & 1) != 0) {
  44971                                           UnallocatedA32(instr);
  44972                                           return;
  44973                                         }
  44974                                         unsigned rd =
  44975                                             ExtractQRegister(instr, 22, 12);
  44976                                         unsigned rm =
  44977                                             ExtractDRegister(instr, 5, 0);
  44978                                         // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
  44979                                         vmovl(al,
  44980                                               dt,
  44981                                               QRegister(rd),
  44982                                               DRegister(rm));
  44983                                         break;
  44984                                       }
  44985                                       case 0x00090000: {
  44986                                         // 0xf2890a10
  44987                                         if (((instr & 0x380000) == 0x0) ||
  44988                                             ((instr & 0x3f0000) == 0x80000) ||
  44989                                             ((instr & 0x3f0000) == 0x100000) ||
  44990                                             ((instr & 0x3f0000) == 0x200000)) {
  44991                                           UnallocatedA32(instr);
  44992                                           return;
  44993                                         }
  44994                                         DataType dt =
  44995                                             Dt_imm6_4_Decode((instr >> 19) &
  44996                                                                  0x7,
  44997                                                              (instr >> 24) &
  44998                                                                  0x1);
  44999                                         if (dt.Is(kDataTypeValueInvalid)) {
  45000                                           UnallocatedA32(instr);
  45001                                           return;
  45002                                         }
  45003                                         if (((instr >> 12) & 1) != 0) {
  45004                                           UnallocatedA32(instr);
  45005                                           return;
  45006                                         }
  45007                                         unsigned rd =
  45008                                             ExtractQRegister(instr, 22, 12);
  45009                                         unsigned rm =
  45010                                             ExtractDRegister(instr, 5, 0);
  45011                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45012                                         uint32_t imm = imm6 - dt.GetSize();
  45013                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45014                                         vshll(al,
  45015                                               dt,
  45016                                               QRegister(rd),
  45017                                               DRegister(rm),
  45018                                               imm);
  45019                                         break;
  45020                                       }
  45021                                       case 0x000a0000: {
  45022                                         // 0xf28a0a10
  45023                                         if (((instr & 0x380000) == 0x0) ||
  45024                                             ((instr & 0x3f0000) == 0x80000) ||
  45025                                             ((instr & 0x3f0000) == 0x100000) ||
  45026                                             ((instr & 0x3f0000) == 0x200000)) {
  45027                                           UnallocatedA32(instr);
  45028                                           return;
  45029                                         }
  45030                                         DataType dt =
  45031                                             Dt_imm6_4_Decode((instr >> 19) &
  45032                                                                  0x7,
  45033                                                              (instr >> 24) &
  45034                                                                  0x1);
  45035                                         if (dt.Is(kDataTypeValueInvalid)) {
  45036                                           UnallocatedA32(instr);
  45037                                           return;
  45038                                         }
  45039                                         if (((instr >> 12) & 1) != 0) {
  45040                                           UnallocatedA32(instr);
  45041                                           return;
  45042                                         }
  45043                                         unsigned rd =
  45044                                             ExtractQRegister(instr, 22, 12);
  45045                                         unsigned rm =
  45046                                             ExtractDRegister(instr, 5, 0);
  45047                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45048                                         uint32_t imm = imm6 - dt.GetSize();
  45049                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45050                                         vshll(al,
  45051                                               dt,
  45052                                               QRegister(rd),
  45053                                               DRegister(rm),
  45054                                               imm);
  45055                                         break;
  45056                                       }
  45057                                       case 0x000b0000: {
  45058                                         // 0xf28b0a10
  45059                                         if (((instr & 0x380000) == 0x0) ||
  45060                                             ((instr & 0x3f0000) == 0x80000) ||
  45061                                             ((instr & 0x3f0000) == 0x100000) ||
  45062                                             ((instr & 0x3f0000) == 0x200000)) {
  45063                                           UnallocatedA32(instr);
  45064                                           return;
  45065                                         }
  45066                                         DataType dt =
  45067                                             Dt_imm6_4_Decode((instr >> 19) &
  45068                                                                  0x7,
  45069                                                              (instr >> 24) &
  45070                                                                  0x1);
  45071                                         if (dt.Is(kDataTypeValueInvalid)) {
  45072                                           UnallocatedA32(instr);
  45073                                           return;
  45074                                         }
  45075                                         if (((instr >> 12) & 1) != 0) {
  45076                                           UnallocatedA32(instr);
  45077                                           return;
  45078                                         }
  45079                                         unsigned rd =
  45080                                             ExtractQRegister(instr, 22, 12);
  45081                                         unsigned rm =
  45082                                             ExtractDRegister(instr, 5, 0);
  45083                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45084                                         uint32_t imm = imm6 - dt.GetSize();
  45085                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45086                                         vshll(al,
  45087                                               dt,
  45088                                               QRegister(rd),
  45089                                               DRegister(rm),
  45090                                               imm);
  45091                                         break;
  45092                                       }
  45093                                       case 0x000c0000: {
  45094                                         // 0xf28c0a10
  45095                                         if (((instr & 0x380000) == 0x0) ||
  45096                                             ((instr & 0x3f0000) == 0x80000) ||
  45097                                             ((instr & 0x3f0000) == 0x100000) ||
  45098                                             ((instr & 0x3f0000) == 0x200000)) {
  45099                                           UnallocatedA32(instr);
  45100                                           return;
  45101                                         }
  45102                                         DataType dt =
  45103                                             Dt_imm6_4_Decode((instr >> 19) &
  45104                                                                  0x7,
  45105                                                              (instr >> 24) &
  45106                                                                  0x1);
  45107                                         if (dt.Is(kDataTypeValueInvalid)) {
  45108                                           UnallocatedA32(instr);
  45109                                           return;
  45110                                         }
  45111                                         if (((instr >> 12) & 1) != 0) {
  45112                                           UnallocatedA32(instr);
  45113                                           return;
  45114                                         }
  45115                                         unsigned rd =
  45116                                             ExtractQRegister(instr, 22, 12);
  45117                                         unsigned rm =
  45118                                             ExtractDRegister(instr, 5, 0);
  45119                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45120                                         uint32_t imm = imm6 - dt.GetSize();
  45121                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45122                                         vshll(al,
  45123                                               dt,
  45124                                               QRegister(rd),
  45125                                               DRegister(rm),
  45126                                               imm);
  45127                                         break;
  45128                                       }
  45129                                       case 0x000d0000: {
  45130                                         // 0xf28d0a10
  45131                                         if (((instr & 0x380000) == 0x0) ||
  45132                                             ((instr & 0x3f0000) == 0x80000) ||
  45133                                             ((instr & 0x3f0000) == 0x100000) ||
  45134                                             ((instr & 0x3f0000) == 0x200000)) {
  45135                                           UnallocatedA32(instr);
  45136                                           return;
  45137                                         }
  45138                                         DataType dt =
  45139                                             Dt_imm6_4_Decode((instr >> 19) &
  45140                                                                  0x7,
  45141                                                              (instr >> 24) &
  45142                                                                  0x1);
  45143                                         if (dt.Is(kDataTypeValueInvalid)) {
  45144                                           UnallocatedA32(instr);
  45145                                           return;
  45146                                         }
  45147                                         if (((instr >> 12) & 1) != 0) {
  45148                                           UnallocatedA32(instr);
  45149                                           return;
  45150                                         }
  45151                                         unsigned rd =
  45152                                             ExtractQRegister(instr, 22, 12);
  45153                                         unsigned rm =
  45154                                             ExtractDRegister(instr, 5, 0);
  45155                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45156                                         uint32_t imm = imm6 - dt.GetSize();
  45157                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45158                                         vshll(al,
  45159                                               dt,
  45160                                               QRegister(rd),
  45161                                               DRegister(rm),
  45162                                               imm);
  45163                                         break;
  45164                                       }
  45165                                       case 0x000e0000: {
  45166                                         // 0xf28e0a10
  45167                                         if (((instr & 0x380000) == 0x0) ||
  45168                                             ((instr & 0x3f0000) == 0x80000) ||
  45169                                             ((instr & 0x3f0000) == 0x100000) ||
  45170                                             ((instr & 0x3f0000) == 0x200000)) {
  45171                                           UnallocatedA32(instr);
  45172                                           return;
  45173                                         }
  45174                                         DataType dt =
  45175                                             Dt_imm6_4_Decode((instr >> 19) &
  45176                                                                  0x7,
  45177                                                              (instr >> 24) &
  45178                                                                  0x1);
  45179                                         if (dt.Is(kDataTypeValueInvalid)) {
  45180                                           UnallocatedA32(instr);
  45181                                           return;
  45182                                         }
  45183                                         if (((instr >> 12) & 1) != 0) {
  45184                                           UnallocatedA32(instr);
  45185                                           return;
  45186                                         }
  45187                                         unsigned rd =
  45188                                             ExtractQRegister(instr, 22, 12);
  45189                                         unsigned rm =
  45190                                             ExtractDRegister(instr, 5, 0);
  45191                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45192                                         uint32_t imm = imm6 - dt.GetSize();
  45193                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45194                                         vshll(al,
  45195                                               dt,
  45196                                               QRegister(rd),
  45197                                               DRegister(rm),
  45198                                               imm);
  45199                                         break;
  45200                                       }
  45201                                       case 0x000f0000: {
  45202                                         // 0xf28f0a10
  45203                                         if (((instr & 0x380000) == 0x0) ||
  45204                                             ((instr & 0x3f0000) == 0x80000) ||
  45205                                             ((instr & 0x3f0000) == 0x100000) ||
  45206                                             ((instr & 0x3f0000) == 0x200000)) {
  45207                                           UnallocatedA32(instr);
  45208                                           return;
  45209                                         }
  45210                                         DataType dt =
  45211                                             Dt_imm6_4_Decode((instr >> 19) &
  45212                                                                  0x7,
  45213                                                              (instr >> 24) &
  45214                                                                  0x1);
  45215                                         if (dt.Is(kDataTypeValueInvalid)) {
  45216                                           UnallocatedA32(instr);
  45217                                           return;
  45218                                         }
  45219                                         if (((instr >> 12) & 1) != 0) {
  45220                                           UnallocatedA32(instr);
  45221                                           return;
  45222                                         }
  45223                                         unsigned rd =
  45224                                             ExtractQRegister(instr, 22, 12);
  45225                                         unsigned rm =
  45226                                             ExtractDRegister(instr, 5, 0);
  45227                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45228                                         uint32_t imm = imm6 - dt.GetSize();
  45229                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45230                                         vshll(al,
  45231                                               dt,
  45232                                               QRegister(rd),
  45233                                               DRegister(rm),
  45234                                               imm);
  45235                                         break;
  45236                                       }
  45237                                       case 0x00100000: {
  45238                                         // 0xf2900a10
  45239                                         if (((instr & 0x380000) == 0x0) ||
  45240                                             ((instr & 0x380000) == 0x180000) ||
  45241                                             ((instr & 0x380000) == 0x280000) ||
  45242                                             ((instr & 0x380000) == 0x300000) ||
  45243                                             ((instr & 0x380000) == 0x380000)) {
  45244                                           UnallocatedA32(instr);
  45245                                           return;
  45246                                         }
  45247                                         DataType dt = Dt_U_imm3H_1_Decode(
  45248                                             ((instr >> 19) & 0x7) |
  45249                                             ((instr >> 21) & 0x8));
  45250                                         if (dt.Is(kDataTypeValueInvalid)) {
  45251                                           UnallocatedA32(instr);
  45252                                           return;
  45253                                         }
  45254                                         if (((instr >> 12) & 1) != 0) {
  45255                                           UnallocatedA32(instr);
  45256                                           return;
  45257                                         }
  45258                                         unsigned rd =
  45259                                             ExtractQRegister(instr, 22, 12);
  45260                                         unsigned rm =
  45261                                             ExtractDRegister(instr, 5, 0);
  45262                                         // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
  45263                                         vmovl(al,
  45264                                               dt,
  45265                                               QRegister(rd),
  45266                                               DRegister(rm));
  45267                                         break;
  45268                                       }
  45269                                       case 0x00110000: {
  45270                                         // 0xf2910a10
  45271                                         if (((instr & 0x380000) == 0x0) ||
  45272                                             ((instr & 0x3f0000) == 0x80000) ||
  45273                                             ((instr & 0x3f0000) == 0x100000) ||
  45274                                             ((instr & 0x3f0000) == 0x200000)) {
  45275                                           UnallocatedA32(instr);
  45276                                           return;
  45277                                         }
  45278                                         DataType dt =
  45279                                             Dt_imm6_4_Decode((instr >> 19) &
  45280                                                                  0x7,
  45281                                                              (instr >> 24) &
  45282                                                                  0x1);
  45283                                         if (dt.Is(kDataTypeValueInvalid)) {
  45284                                           UnallocatedA32(instr);
  45285                                           return;
  45286                                         }
  45287                                         if (((instr >> 12) & 1) != 0) {
  45288                                           UnallocatedA32(instr);
  45289                                           return;
  45290                                         }
  45291                                         unsigned rd =
  45292                                             ExtractQRegister(instr, 22, 12);
  45293                                         unsigned rm =
  45294                                             ExtractDRegister(instr, 5, 0);
  45295                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45296                                         uint32_t imm = imm6 - dt.GetSize();
  45297                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45298                                         vshll(al,
  45299                                               dt,
  45300                                               QRegister(rd),
  45301                                               DRegister(rm),
  45302                                               imm);
  45303                                         break;
  45304                                       }
  45305                                       case 0x00120000: {
  45306                                         // 0xf2920a10
  45307                                         if (((instr & 0x380000) == 0x0) ||
  45308                                             ((instr & 0x3f0000) == 0x80000) ||
  45309                                             ((instr & 0x3f0000) == 0x100000) ||
  45310                                             ((instr & 0x3f0000) == 0x200000)) {
  45311                                           UnallocatedA32(instr);
  45312                                           return;
  45313                                         }
  45314                                         DataType dt =
  45315                                             Dt_imm6_4_Decode((instr >> 19) &
  45316                                                                  0x7,
  45317                                                              (instr >> 24) &
  45318                                                                  0x1);
  45319                                         if (dt.Is(kDataTypeValueInvalid)) {
  45320                                           UnallocatedA32(instr);
  45321                                           return;
  45322                                         }
  45323                                         if (((instr >> 12) & 1) != 0) {
  45324                                           UnallocatedA32(instr);
  45325                                           return;
  45326                                         }
  45327                                         unsigned rd =
  45328                                             ExtractQRegister(instr, 22, 12);
  45329                                         unsigned rm =
  45330                                             ExtractDRegister(instr, 5, 0);
  45331                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45332                                         uint32_t imm = imm6 - dt.GetSize();
  45333                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45334                                         vshll(al,
  45335                                               dt,
  45336                                               QRegister(rd),
  45337                                               DRegister(rm),
  45338                                               imm);
  45339                                         break;
  45340                                       }
  45341                                       case 0x00130000: {
  45342                                         // 0xf2930a10
  45343                                         if (((instr & 0x380000) == 0x0) ||
  45344                                             ((instr & 0x3f0000) == 0x80000) ||
  45345                                             ((instr & 0x3f0000) == 0x100000) ||
  45346                                             ((instr & 0x3f0000) == 0x200000)) {
  45347                                           UnallocatedA32(instr);
  45348                                           return;
  45349                                         }
  45350                                         DataType dt =
  45351                                             Dt_imm6_4_Decode((instr >> 19) &
  45352                                                                  0x7,
  45353                                                              (instr >> 24) &
  45354                                                                  0x1);
  45355                                         if (dt.Is(kDataTypeValueInvalid)) {
  45356                                           UnallocatedA32(instr);
  45357                                           return;
  45358                                         }
  45359                                         if (((instr >> 12) & 1) != 0) {
  45360                                           UnallocatedA32(instr);
  45361                                           return;
  45362                                         }
  45363                                         unsigned rd =
  45364                                             ExtractQRegister(instr, 22, 12);
  45365                                         unsigned rm =
  45366                                             ExtractDRegister(instr, 5, 0);
  45367                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45368                                         uint32_t imm = imm6 - dt.GetSize();
  45369                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45370                                         vshll(al,
  45371                                               dt,
  45372                                               QRegister(rd),
  45373                                               DRegister(rm),
  45374                                               imm);
  45375                                         break;
  45376                                       }
  45377                                       case 0x00140000: {
  45378                                         // 0xf2940a10
  45379                                         if (((instr & 0x380000) == 0x0) ||
  45380                                             ((instr & 0x3f0000) == 0x80000) ||
  45381                                             ((instr & 0x3f0000) == 0x100000) ||
  45382                                             ((instr & 0x3f0000) == 0x200000)) {
  45383                                           UnallocatedA32(instr);
  45384                                           return;
  45385                                         }
  45386                                         DataType dt =
  45387                                             Dt_imm6_4_Decode((instr >> 19) &
  45388                                                                  0x7,
  45389                                                              (instr >> 24) &
  45390                                                                  0x1);
  45391                                         if (dt.Is(kDataTypeValueInvalid)) {
  45392                                           UnallocatedA32(instr);
  45393                                           return;
  45394                                         }
  45395                                         if (((instr >> 12) & 1) != 0) {
  45396                                           UnallocatedA32(instr);
  45397                                           return;
  45398                                         }
  45399                                         unsigned rd =
  45400                                             ExtractQRegister(instr, 22, 12);
  45401                                         unsigned rm =
  45402                                             ExtractDRegister(instr, 5, 0);
  45403                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45404                                         uint32_t imm = imm6 - dt.GetSize();
  45405                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45406                                         vshll(al,
  45407                                               dt,
  45408                                               QRegister(rd),
  45409                                               DRegister(rm),
  45410                                               imm);
  45411                                         break;
  45412                                       }
  45413                                       case 0x00150000: {
  45414                                         // 0xf2950a10
  45415                                         if (((instr & 0x380000) == 0x0) ||
  45416                                             ((instr & 0x3f0000) == 0x80000) ||
  45417                                             ((instr & 0x3f0000) == 0x100000) ||
  45418                                             ((instr & 0x3f0000) == 0x200000)) {
  45419                                           UnallocatedA32(instr);
  45420                                           return;
  45421                                         }
  45422                                         DataType dt =
  45423                                             Dt_imm6_4_Decode((instr >> 19) &
  45424                                                                  0x7,
  45425                                                              (instr >> 24) &
  45426                                                                  0x1);
  45427                                         if (dt.Is(kDataTypeValueInvalid)) {
  45428                                           UnallocatedA32(instr);
  45429                                           return;
  45430                                         }
  45431                                         if (((instr >> 12) & 1) != 0) {
  45432                                           UnallocatedA32(instr);
  45433                                           return;
  45434                                         }
  45435                                         unsigned rd =
  45436                                             ExtractQRegister(instr, 22, 12);
  45437                                         unsigned rm =
  45438                                             ExtractDRegister(instr, 5, 0);
  45439                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45440                                         uint32_t imm = imm6 - dt.GetSize();
  45441                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45442                                         vshll(al,
  45443                                               dt,
  45444                                               QRegister(rd),
  45445                                               DRegister(rm),
  45446                                               imm);
  45447                                         break;
  45448                                       }
  45449                                       case 0x00160000: {
  45450                                         // 0xf2960a10
  45451                                         if (((instr & 0x380000) == 0x0) ||
  45452                                             ((instr & 0x3f0000) == 0x80000) ||
  45453                                             ((instr & 0x3f0000) == 0x100000) ||
  45454                                             ((instr & 0x3f0000) == 0x200000)) {
  45455                                           UnallocatedA32(instr);
  45456                                           return;
  45457                                         }
  45458                                         DataType dt =
  45459                                             Dt_imm6_4_Decode((instr >> 19) &
  45460                                                                  0x7,
  45461                                                              (instr >> 24) &
  45462                                                                  0x1);
  45463                                         if (dt.Is(kDataTypeValueInvalid)) {
  45464                                           UnallocatedA32(instr);
  45465                                           return;
  45466                                         }
  45467                                         if (((instr >> 12) & 1) != 0) {
  45468                                           UnallocatedA32(instr);
  45469                                           return;
  45470                                         }
  45471                                         unsigned rd =
  45472                                             ExtractQRegister(instr, 22, 12);
  45473                                         unsigned rm =
  45474                                             ExtractDRegister(instr, 5, 0);
  45475                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45476                                         uint32_t imm = imm6 - dt.GetSize();
  45477                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45478                                         vshll(al,
  45479                                               dt,
  45480                                               QRegister(rd),
  45481                                               DRegister(rm),
  45482                                               imm);
  45483                                         break;
  45484                                       }
  45485                                       case 0x00170000: {
  45486                                         // 0xf2970a10
  45487                                         if (((instr & 0x380000) == 0x0) ||
  45488                                             ((instr & 0x3f0000) == 0x80000) ||
  45489                                             ((instr & 0x3f0000) == 0x100000) ||
  45490                                             ((instr & 0x3f0000) == 0x200000)) {
  45491                                           UnallocatedA32(instr);
  45492                                           return;
  45493                                         }
  45494                                         DataType dt =
  45495                                             Dt_imm6_4_Decode((instr >> 19) &
  45496                                                                  0x7,
  45497                                                              (instr >> 24) &
  45498                                                                  0x1);
  45499                                         if (dt.Is(kDataTypeValueInvalid)) {
  45500                                           UnallocatedA32(instr);
  45501                                           return;
  45502                                         }
  45503                                         if (((instr >> 12) & 1) != 0) {
  45504                                           UnallocatedA32(instr);
  45505                                           return;
  45506                                         }
  45507                                         unsigned rd =
  45508                                             ExtractQRegister(instr, 22, 12);
  45509                                         unsigned rm =
  45510                                             ExtractDRegister(instr, 5, 0);
  45511                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45512                                         uint32_t imm = imm6 - dt.GetSize();
  45513                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45514                                         vshll(al,
  45515                                               dt,
  45516                                               QRegister(rd),
  45517                                               DRegister(rm),
  45518                                               imm);
  45519                                         break;
  45520                                       }
  45521                                       case 0x00180000: {
  45522                                         // 0xf2980a10
  45523                                         if (((instr & 0x380000) == 0x0) ||
  45524                                             ((instr & 0x3f0000) == 0x80000) ||
  45525                                             ((instr & 0x3f0000) == 0x100000) ||
  45526                                             ((instr & 0x3f0000) == 0x200000)) {
  45527                                           UnallocatedA32(instr);
  45528                                           return;
  45529                                         }
  45530                                         DataType dt =
  45531                                             Dt_imm6_4_Decode((instr >> 19) &
  45532                                                                  0x7,
  45533                                                              (instr >> 24) &
  45534                                                                  0x1);
  45535                                         if (dt.Is(kDataTypeValueInvalid)) {
  45536                                           UnallocatedA32(instr);
  45537                                           return;
  45538                                         }
  45539                                         if (((instr >> 12) & 1) != 0) {
  45540                                           UnallocatedA32(instr);
  45541                                           return;
  45542                                         }
  45543                                         unsigned rd =
  45544                                             ExtractQRegister(instr, 22, 12);
  45545                                         unsigned rm =
  45546                                             ExtractDRegister(instr, 5, 0);
  45547                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45548                                         uint32_t imm = imm6 - dt.GetSize();
  45549                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45550                                         vshll(al,
  45551                                               dt,
  45552                                               QRegister(rd),
  45553                                               DRegister(rm),
  45554                                               imm);
  45555                                         break;
  45556                                       }
  45557                                       case 0x00190000: {
  45558                                         // 0xf2990a10
  45559                                         if (((instr & 0x380000) == 0x0) ||
  45560                                             ((instr & 0x3f0000) == 0x80000) ||
  45561                                             ((instr & 0x3f0000) == 0x100000) ||
  45562                                             ((instr & 0x3f0000) == 0x200000)) {
  45563                                           UnallocatedA32(instr);
  45564                                           return;
  45565                                         }
  45566                                         DataType dt =
  45567                                             Dt_imm6_4_Decode((instr >> 19) &
  45568                                                                  0x7,
  45569                                                              (instr >> 24) &
  45570                                                                  0x1);
  45571                                         if (dt.Is(kDataTypeValueInvalid)) {
  45572                                           UnallocatedA32(instr);
  45573                                           return;
  45574                                         }
  45575                                         if (((instr >> 12) & 1) != 0) {
  45576                                           UnallocatedA32(instr);
  45577                                           return;
  45578                                         }
  45579                                         unsigned rd =
  45580                                             ExtractQRegister(instr, 22, 12);
  45581                                         unsigned rm =
  45582                                             ExtractDRegister(instr, 5, 0);
  45583                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45584                                         uint32_t imm = imm6 - dt.GetSize();
  45585                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45586                                         vshll(al,
  45587                                               dt,
  45588                                               QRegister(rd),
  45589                                               DRegister(rm),
  45590                                               imm);
  45591                                         break;
  45592                                       }
  45593                                       case 0x001a0000: {
  45594                                         // 0xf29a0a10
  45595                                         if (((instr & 0x380000) == 0x0) ||
  45596                                             ((instr & 0x3f0000) == 0x80000) ||
  45597                                             ((instr & 0x3f0000) == 0x100000) ||
  45598                                             ((instr & 0x3f0000) == 0x200000)) {
  45599                                           UnallocatedA32(instr);
  45600                                           return;
  45601                                         }
  45602                                         DataType dt =
  45603                                             Dt_imm6_4_Decode((instr >> 19) &
  45604                                                                  0x7,
  45605                                                              (instr >> 24) &
  45606                                                                  0x1);
  45607                                         if (dt.Is(kDataTypeValueInvalid)) {
  45608                                           UnallocatedA32(instr);
  45609                                           return;
  45610                                         }
  45611                                         if (((instr >> 12) & 1) != 0) {
  45612                                           UnallocatedA32(instr);
  45613                                           return;
  45614                                         }
  45615                                         unsigned rd =
  45616                                             ExtractQRegister(instr, 22, 12);
  45617                                         unsigned rm =
  45618                                             ExtractDRegister(instr, 5, 0);
  45619                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45620                                         uint32_t imm = imm6 - dt.GetSize();
  45621                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45622                                         vshll(al,
  45623                                               dt,
  45624                                               QRegister(rd),
  45625                                               DRegister(rm),
  45626                                               imm);
  45627                                         break;
  45628                                       }
  45629                                       case 0x001b0000: {
  45630                                         // 0xf29b0a10
  45631                                         if (((instr & 0x380000) == 0x0) ||
  45632                                             ((instr & 0x3f0000) == 0x80000) ||
  45633                                             ((instr & 0x3f0000) == 0x100000) ||
  45634                                             ((instr & 0x3f0000) == 0x200000)) {
  45635                                           UnallocatedA32(instr);
  45636                                           return;
  45637                                         }
  45638                                         DataType dt =
  45639                                             Dt_imm6_4_Decode((instr >> 19) &
  45640                                                                  0x7,
  45641                                                              (instr >> 24) &
  45642                                                                  0x1);
  45643                                         if (dt.Is(kDataTypeValueInvalid)) {
  45644                                           UnallocatedA32(instr);
  45645                                           return;
  45646                                         }
  45647                                         if (((instr >> 12) & 1) != 0) {
  45648                                           UnallocatedA32(instr);
  45649                                           return;
  45650                                         }
  45651                                         unsigned rd =
  45652                                             ExtractQRegister(instr, 22, 12);
  45653                                         unsigned rm =
  45654                                             ExtractDRegister(instr, 5, 0);
  45655                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45656                                         uint32_t imm = imm6 - dt.GetSize();
  45657                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45658                                         vshll(al,
  45659                                               dt,
  45660                                               QRegister(rd),
  45661                                               DRegister(rm),
  45662                                               imm);
  45663                                         break;
  45664                                       }
  45665                                       case 0x001c0000: {
  45666                                         // 0xf29c0a10
  45667                                         if (((instr & 0x380000) == 0x0) ||
  45668                                             ((instr & 0x3f0000) == 0x80000) ||
  45669                                             ((instr & 0x3f0000) == 0x100000) ||
  45670                                             ((instr & 0x3f0000) == 0x200000)) {
  45671                                           UnallocatedA32(instr);
  45672                                           return;
  45673                                         }
  45674                                         DataType dt =
  45675                                             Dt_imm6_4_Decode((instr >> 19) &
  45676                                                                  0x7,
  45677                                                              (instr >> 24) &
  45678                                                                  0x1);
  45679                                         if (dt.Is(kDataTypeValueInvalid)) {
  45680                                           UnallocatedA32(instr);
  45681                                           return;
  45682                                         }
  45683                                         if (((instr >> 12) & 1) != 0) {
  45684                                           UnallocatedA32(instr);
  45685                                           return;
  45686                                         }
  45687                                         unsigned rd =
  45688                                             ExtractQRegister(instr, 22, 12);
  45689                                         unsigned rm =
  45690                                             ExtractDRegister(instr, 5, 0);
  45691                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45692                                         uint32_t imm = imm6 - dt.GetSize();
  45693                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45694                                         vshll(al,
  45695                                               dt,
  45696                                               QRegister(rd),
  45697                                               DRegister(rm),
  45698                                               imm);
  45699                                         break;
  45700                                       }
  45701                                       case 0x001d0000: {
  45702                                         // 0xf29d0a10
  45703                                         if (((instr & 0x380000) == 0x0) ||
  45704                                             ((instr & 0x3f0000) == 0x80000) ||
  45705                                             ((instr & 0x3f0000) == 0x100000) ||
  45706                                             ((instr & 0x3f0000) == 0x200000)) {
  45707                                           UnallocatedA32(instr);
  45708                                           return;
  45709                                         }
  45710                                         DataType dt =
  45711                                             Dt_imm6_4_Decode((instr >> 19) &
  45712                                                                  0x7,
  45713                                                              (instr >> 24) &
  45714                                                                  0x1);
  45715                                         if (dt.Is(kDataTypeValueInvalid)) {
  45716                                           UnallocatedA32(instr);
  45717                                           return;
  45718                                         }
  45719                                         if (((instr >> 12) & 1) != 0) {
  45720                                           UnallocatedA32(instr);
  45721                                           return;
  45722                                         }
  45723                                         unsigned rd =
  45724                                             ExtractQRegister(instr, 22, 12);
  45725                                         unsigned rm =
  45726                                             ExtractDRegister(instr, 5, 0);
  45727                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45728                                         uint32_t imm = imm6 - dt.GetSize();
  45729                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45730                                         vshll(al,
  45731                                               dt,
  45732                                               QRegister(rd),
  45733                                               DRegister(rm),
  45734                                               imm);
  45735                                         break;
  45736                                       }
  45737                                       case 0x001e0000: {
  45738                                         // 0xf29e0a10
  45739                                         if (((instr & 0x380000) == 0x0) ||
  45740                                             ((instr & 0x3f0000) == 0x80000) ||
  45741                                             ((instr & 0x3f0000) == 0x100000) ||
  45742                                             ((instr & 0x3f0000) == 0x200000)) {
  45743                                           UnallocatedA32(instr);
  45744                                           return;
  45745                                         }
  45746                                         DataType dt =
  45747                                             Dt_imm6_4_Decode((instr >> 19) &
  45748                                                                  0x7,
  45749                                                              (instr >> 24) &
  45750                                                                  0x1);
  45751                                         if (dt.Is(kDataTypeValueInvalid)) {
  45752                                           UnallocatedA32(instr);
  45753                                           return;
  45754                                         }
  45755                                         if (((instr >> 12) & 1) != 0) {
  45756                                           UnallocatedA32(instr);
  45757                                           return;
  45758                                         }
  45759                                         unsigned rd =
  45760                                             ExtractQRegister(instr, 22, 12);
  45761                                         unsigned rm =
  45762                                             ExtractDRegister(instr, 5, 0);
  45763                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45764                                         uint32_t imm = imm6 - dt.GetSize();
  45765                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45766                                         vshll(al,
  45767                                               dt,
  45768                                               QRegister(rd),
  45769                                               DRegister(rm),
  45770                                               imm);
  45771                                         break;
  45772                                       }
  45773                                       case 0x001f0000: {
  45774                                         // 0xf29f0a10
  45775                                         if (((instr & 0x380000) == 0x0) ||
  45776                                             ((instr & 0x3f0000) == 0x80000) ||
  45777                                             ((instr & 0x3f0000) == 0x100000) ||
  45778                                             ((instr & 0x3f0000) == 0x200000)) {
  45779                                           UnallocatedA32(instr);
  45780                                           return;
  45781                                         }
  45782                                         DataType dt =
  45783                                             Dt_imm6_4_Decode((instr >> 19) &
  45784                                                                  0x7,
  45785                                                              (instr >> 24) &
  45786                                                                  0x1);
  45787                                         if (dt.Is(kDataTypeValueInvalid)) {
  45788                                           UnallocatedA32(instr);
  45789                                           return;
  45790                                         }
  45791                                         if (((instr >> 12) & 1) != 0) {
  45792                                           UnallocatedA32(instr);
  45793                                           return;
  45794                                         }
  45795                                         unsigned rd =
  45796                                             ExtractQRegister(instr, 22, 12);
  45797                                         unsigned rm =
  45798                                             ExtractDRegister(instr, 5, 0);
  45799                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45800                                         uint32_t imm = imm6 - dt.GetSize();
  45801                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45802                                         vshll(al,
  45803                                               dt,
  45804                                               QRegister(rd),
  45805                                               DRegister(rm),
  45806                                               imm);
  45807                                         break;
  45808                                       }
  45809                                       case 0x00200000: {
  45810                                         // 0xf2a00a10
  45811                                         if (((instr & 0x380000) == 0x0) ||
  45812                                             ((instr & 0x380000) == 0x180000) ||
  45813                                             ((instr & 0x380000) == 0x280000) ||
  45814                                             ((instr & 0x380000) == 0x300000) ||
  45815                                             ((instr & 0x380000) == 0x380000)) {
  45816                                           UnallocatedA32(instr);
  45817                                           return;
  45818                                         }
  45819                                         DataType dt = Dt_U_imm3H_1_Decode(
  45820                                             ((instr >> 19) & 0x7) |
  45821                                             ((instr >> 21) & 0x8));
  45822                                         if (dt.Is(kDataTypeValueInvalid)) {
  45823                                           UnallocatedA32(instr);
  45824                                           return;
  45825                                         }
  45826                                         if (((instr >> 12) & 1) != 0) {
  45827                                           UnallocatedA32(instr);
  45828                                           return;
  45829                                         }
  45830                                         unsigned rd =
  45831                                             ExtractQRegister(instr, 22, 12);
  45832                                         unsigned rm =
  45833                                             ExtractDRegister(instr, 5, 0);
  45834                                         // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1
  45835                                         vmovl(al,
  45836                                               dt,
  45837                                               QRegister(rd),
  45838                                               DRegister(rm));
  45839                                         break;
  45840                                       }
  45841                                       case 0x00210000: {
  45842                                         // 0xf2a10a10
  45843                                         if (((instr & 0x380000) == 0x0) ||
  45844                                             ((instr & 0x3f0000) == 0x80000) ||
  45845                                             ((instr & 0x3f0000) == 0x100000) ||
  45846                                             ((instr & 0x3f0000) == 0x200000)) {
  45847                                           UnallocatedA32(instr);
  45848                                           return;
  45849                                         }
  45850                                         DataType dt =
  45851                                             Dt_imm6_4_Decode((instr >> 19) &
  45852                                                                  0x7,
  45853                                                              (instr >> 24) &
  45854                                                                  0x1);
  45855                                         if (dt.Is(kDataTypeValueInvalid)) {
  45856                                           UnallocatedA32(instr);
  45857                                           return;
  45858                                         }
  45859                                         if (((instr >> 12) & 1) != 0) {
  45860                                           UnallocatedA32(instr);
  45861                                           return;
  45862                                         }
  45863                                         unsigned rd =
  45864                                             ExtractQRegister(instr, 22, 12);
  45865                                         unsigned rm =
  45866                                             ExtractDRegister(instr, 5, 0);
  45867                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45868                                         uint32_t imm = imm6 - dt.GetSize();
  45869                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45870                                         vshll(al,
  45871                                               dt,
  45872                                               QRegister(rd),
  45873                                               DRegister(rm),
  45874                                               imm);
  45875                                         break;
  45876                                       }
  45877                                       case 0x00220000: {
  45878                                         // 0xf2a20a10
  45879                                         if (((instr & 0x380000) == 0x0) ||
  45880                                             ((instr & 0x3f0000) == 0x80000) ||
  45881                                             ((instr & 0x3f0000) == 0x100000) ||
  45882                                             ((instr & 0x3f0000) == 0x200000)) {
  45883                                           UnallocatedA32(instr);
  45884                                           return;
  45885                                         }
  45886                                         DataType dt =
  45887                                             Dt_imm6_4_Decode((instr >> 19) &
  45888                                                                  0x7,
  45889                                                              (instr >> 24) &
  45890                                                                  0x1);
  45891                                         if (dt.Is(kDataTypeValueInvalid)) {
  45892                                           UnallocatedA32(instr);
  45893                                           return;
  45894                                         }
  45895                                         if (((instr >> 12) & 1) != 0) {
  45896                                           UnallocatedA32(instr);
  45897                                           return;
  45898                                         }
  45899                                         unsigned rd =
  45900                                             ExtractQRegister(instr, 22, 12);
  45901                                         unsigned rm =
  45902                                             ExtractDRegister(instr, 5, 0);
  45903                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45904                                         uint32_t imm = imm6 - dt.GetSize();
  45905                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45906                                         vshll(al,
  45907                                               dt,
  45908                                               QRegister(rd),
  45909                                               DRegister(rm),
  45910                                               imm);
  45911                                         break;
  45912                                       }
  45913                                       case 0x00230000: {
  45914                                         // 0xf2a30a10
  45915                                         if (((instr & 0x380000) == 0x0) ||
  45916                                             ((instr & 0x3f0000) == 0x80000) ||
  45917                                             ((instr & 0x3f0000) == 0x100000) ||
  45918                                             ((instr & 0x3f0000) == 0x200000)) {
  45919                                           UnallocatedA32(instr);
  45920                                           return;
  45921                                         }
  45922                                         DataType dt =
  45923                                             Dt_imm6_4_Decode((instr >> 19) &
  45924                                                                  0x7,
  45925                                                              (instr >> 24) &
  45926                                                                  0x1);
  45927                                         if (dt.Is(kDataTypeValueInvalid)) {
  45928                                           UnallocatedA32(instr);
  45929                                           return;
  45930                                         }
  45931                                         if (((instr >> 12) & 1) != 0) {
  45932                                           UnallocatedA32(instr);
  45933                                           return;
  45934                                         }
  45935                                         unsigned rd =
  45936                                             ExtractQRegister(instr, 22, 12);
  45937                                         unsigned rm =
  45938                                             ExtractDRegister(instr, 5, 0);
  45939                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45940                                         uint32_t imm = imm6 - dt.GetSize();
  45941                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45942                                         vshll(al,
  45943                                               dt,
  45944                                               QRegister(rd),
  45945                                               DRegister(rm),
  45946                                               imm);
  45947                                         break;
  45948                                       }
  45949                                       case 0x00240000: {
  45950                                         // 0xf2a40a10
  45951                                         if (((instr & 0x380000) == 0x0) ||
  45952                                             ((instr & 0x3f0000) == 0x80000) ||
  45953                                             ((instr & 0x3f0000) == 0x100000) ||
  45954                                             ((instr & 0x3f0000) == 0x200000)) {
  45955                                           UnallocatedA32(instr);
  45956                                           return;
  45957                                         }
  45958                                         DataType dt =
  45959                                             Dt_imm6_4_Decode((instr >> 19) &
  45960                                                                  0x7,
  45961                                                              (instr >> 24) &
  45962                                                                  0x1);
  45963                                         if (dt.Is(kDataTypeValueInvalid)) {
  45964                                           UnallocatedA32(instr);
  45965                                           return;
  45966                                         }
  45967                                         if (((instr >> 12) & 1) != 0) {
  45968                                           UnallocatedA32(instr);
  45969                                           return;
  45970                                         }
  45971                                         unsigned rd =
  45972                                             ExtractQRegister(instr, 22, 12);
  45973                                         unsigned rm =
  45974                                             ExtractDRegister(instr, 5, 0);
  45975                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  45976                                         uint32_t imm = imm6 - dt.GetSize();
  45977                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  45978                                         vshll(al,
  45979                                               dt,
  45980                                               QRegister(rd),
  45981                                               DRegister(rm),
  45982                                               imm);
  45983                                         break;
  45984                                       }
  45985                                       case 0x00250000: {
  45986                                         // 0xf2a50a10
  45987                                         if (((instr & 0x380000) == 0x0) ||
  45988                                             ((instr & 0x3f0000) == 0x80000) ||
  45989                                             ((instr & 0x3f0000) == 0x100000) ||
  45990                                             ((instr & 0x3f0000) == 0x200000)) {
  45991                                           UnallocatedA32(instr);
  45992                                           return;
  45993                                         }
  45994                                         DataType dt =
  45995                                             Dt_imm6_4_Decode((instr >> 19) &
  45996                                                                  0x7,
  45997                                                              (instr >> 24) &
  45998                                                                  0x1);
  45999                                         if (dt.Is(kDataTypeValueInvalid)) {
  46000                                           UnallocatedA32(instr);
  46001                                           return;
  46002                                         }
  46003                                         if (((instr >> 12) & 1) != 0) {
  46004                                           UnallocatedA32(instr);
  46005                                           return;
  46006                                         }
  46007                                         unsigned rd =
  46008                                             ExtractQRegister(instr, 22, 12);
  46009                                         unsigned rm =
  46010                                             ExtractDRegister(instr, 5, 0);
  46011                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46012                                         uint32_t imm = imm6 - dt.GetSize();
  46013                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46014                                         vshll(al,
  46015                                               dt,
  46016                                               QRegister(rd),
  46017                                               DRegister(rm),
  46018                                               imm);
  46019                                         break;
  46020                                       }
  46021                                       case 0x00260000: {
  46022                                         // 0xf2a60a10
  46023                                         if (((instr & 0x380000) == 0x0) ||
  46024                                             ((instr & 0x3f0000) == 0x80000) ||
  46025                                             ((instr & 0x3f0000) == 0x100000) ||
  46026                                             ((instr & 0x3f0000) == 0x200000)) {
  46027                                           UnallocatedA32(instr);
  46028                                           return;
  46029                                         }
  46030                                         DataType dt =
  46031                                             Dt_imm6_4_Decode((instr >> 19) &
  46032                                                                  0x7,
  46033                                                              (instr >> 24) &
  46034                                                                  0x1);
  46035                                         if (dt.Is(kDataTypeValueInvalid)) {
  46036                                           UnallocatedA32(instr);
  46037                                           return;
  46038                                         }
  46039                                         if (((instr >> 12) & 1) != 0) {
  46040                                           UnallocatedA32(instr);
  46041                                           return;
  46042                                         }
  46043                                         unsigned rd =
  46044                                             ExtractQRegister(instr, 22, 12);
  46045                                         unsigned rm =
  46046                                             ExtractDRegister(instr, 5, 0);
  46047                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46048                                         uint32_t imm = imm6 - dt.GetSize();
  46049                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46050                                         vshll(al,
  46051                                               dt,
  46052                                               QRegister(rd),
  46053                                               DRegister(rm),
  46054                                               imm);
  46055                                         break;
  46056                                       }
  46057                                       case 0x00270000: {
  46058                                         // 0xf2a70a10
  46059                                         if (((instr & 0x380000) == 0x0) ||
  46060                                             ((instr & 0x3f0000) == 0x80000) ||
  46061                                             ((instr & 0x3f0000) == 0x100000) ||
  46062                                             ((instr & 0x3f0000) == 0x200000)) {
  46063                                           UnallocatedA32(instr);
  46064                                           return;
  46065                                         }
  46066                                         DataType dt =
  46067                                             Dt_imm6_4_Decode((instr >> 19) &
  46068                                                                  0x7,
  46069                                                              (instr >> 24) &
  46070                                                                  0x1);
  46071                                         if (dt.Is(kDataTypeValueInvalid)) {
  46072                                           UnallocatedA32(instr);
  46073                                           return;
  46074                                         }
  46075                                         if (((instr >> 12) & 1) != 0) {
  46076                                           UnallocatedA32(instr);
  46077                                           return;
  46078                                         }
  46079                                         unsigned rd =
  46080                                             ExtractQRegister(instr, 22, 12);
  46081                                         unsigned rm =
  46082                                             ExtractDRegister(instr, 5, 0);
  46083                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46084                                         uint32_t imm = imm6 - dt.GetSize();
  46085                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46086                                         vshll(al,
  46087                                               dt,
  46088                                               QRegister(rd),
  46089                                               DRegister(rm),
  46090                                               imm);
  46091                                         break;
  46092                                       }
  46093                                       case 0x00280000: {
  46094                                         // 0xf2a80a10
  46095                                         if (((instr & 0x380000) == 0x0) ||
  46096                                             ((instr & 0x3f0000) == 0x80000) ||
  46097                                             ((instr & 0x3f0000) == 0x100000) ||
  46098                                             ((instr & 0x3f0000) == 0x200000)) {
  46099                                           UnallocatedA32(instr);
  46100                                           return;
  46101                                         }
  46102                                         DataType dt =
  46103                                             Dt_imm6_4_Decode((instr >> 19) &
  46104                                                                  0x7,
  46105                                                              (instr >> 24) &
  46106                                                                  0x1);
  46107                                         if (dt.Is(kDataTypeValueInvalid)) {
  46108                                           UnallocatedA32(instr);
  46109                                           return;
  46110                                         }
  46111                                         if (((instr >> 12) & 1) != 0) {
  46112                                           UnallocatedA32(instr);
  46113                                           return;
  46114                                         }
  46115                                         unsigned rd =
  46116                                             ExtractQRegister(instr, 22, 12);
  46117                                         unsigned rm =
  46118                                             ExtractDRegister(instr, 5, 0);
  46119                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46120                                         uint32_t imm = imm6 - dt.GetSize();
  46121                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46122                                         vshll(al,
  46123                                               dt,
  46124                                               QRegister(rd),
  46125                                               DRegister(rm),
  46126                                               imm);
  46127                                         break;
  46128                                       }
  46129                                       case 0x00290000: {
  46130                                         // 0xf2a90a10
  46131                                         if (((instr & 0x380000) == 0x0) ||
  46132                                             ((instr & 0x3f0000) == 0x80000) ||
  46133                                             ((instr & 0x3f0000) == 0x100000) ||
  46134                                             ((instr & 0x3f0000) == 0x200000)) {
  46135                                           UnallocatedA32(instr);
  46136                                           return;
  46137                                         }
  46138                                         DataType dt =
  46139                                             Dt_imm6_4_Decode((instr >> 19) &
  46140                                                                  0x7,
  46141                                                              (instr >> 24) &
  46142                                                                  0x1);
  46143                                         if (dt.Is(kDataTypeValueInvalid)) {
  46144                                           UnallocatedA32(instr);
  46145                                           return;
  46146                                         }
  46147                                         if (((instr >> 12) & 1) != 0) {
  46148                                           UnallocatedA32(instr);
  46149                                           return;
  46150                                         }
  46151                                         unsigned rd =
  46152                                             ExtractQRegister(instr, 22, 12);
  46153                                         unsigned rm =
  46154                                             ExtractDRegister(instr, 5, 0);
  46155                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46156                                         uint32_t imm = imm6 - dt.GetSize();
  46157                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46158                                         vshll(al,
  46159                                               dt,
  46160                                               QRegister(rd),
  46161                                               DRegister(rm),
  46162                                               imm);
  46163                                         break;
  46164                                       }
  46165                                       case 0x002a0000: {
  46166                                         // 0xf2aa0a10
  46167                                         if (((instr & 0x380000) == 0x0) ||
  46168                                             ((instr & 0x3f0000) == 0x80000) ||
  46169                                             ((instr & 0x3f0000) == 0x100000) ||
  46170                                             ((instr & 0x3f0000) == 0x200000)) {
  46171                                           UnallocatedA32(instr);
  46172                                           return;
  46173                                         }
  46174                                         DataType dt =
  46175                                             Dt_imm6_4_Decode((instr >> 19) &
  46176                                                                  0x7,
  46177                                                              (instr >> 24) &
  46178                                                                  0x1);
  46179                                         if (dt.Is(kDataTypeValueInvalid)) {
  46180                                           UnallocatedA32(instr);
  46181                                           return;
  46182                                         }
  46183                                         if (((instr >> 12) & 1) != 0) {
  46184                                           UnallocatedA32(instr);
  46185                                           return;
  46186                                         }
  46187                                         unsigned rd =
  46188                                             ExtractQRegister(instr, 22, 12);
  46189                                         unsigned rm =
  46190                                             ExtractDRegister(instr, 5, 0);
  46191                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46192                                         uint32_t imm = imm6 - dt.GetSize();
  46193                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46194                                         vshll(al,
  46195                                               dt,
  46196                                               QRegister(rd),
  46197                                               DRegister(rm),
  46198                                               imm);
  46199                                         break;
  46200                                       }
  46201                                       case 0x002b0000: {
  46202                                         // 0xf2ab0a10
  46203                                         if (((instr & 0x380000) == 0x0) ||
  46204                                             ((instr & 0x3f0000) == 0x80000) ||
  46205                                             ((instr & 0x3f0000) == 0x100000) ||
  46206                                             ((instr & 0x3f0000) == 0x200000)) {
  46207                                           UnallocatedA32(instr);
  46208                                           return;
  46209                                         }
  46210                                         DataType dt =
  46211                                             Dt_imm6_4_Decode((instr >> 19) &
  46212                                                                  0x7,
  46213                                                              (instr >> 24) &
  46214                                                                  0x1);
  46215                                         if (dt.Is(kDataTypeValueInvalid)) {
  46216                                           UnallocatedA32(instr);
  46217                                           return;
  46218                                         }
  46219                                         if (((instr >> 12) & 1) != 0) {
  46220                                           UnallocatedA32(instr);
  46221                                           return;
  46222                                         }
  46223                                         unsigned rd =
  46224                                             ExtractQRegister(instr, 22, 12);
  46225                                         unsigned rm =
  46226                                             ExtractDRegister(instr, 5, 0);
  46227                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46228                                         uint32_t imm = imm6 - dt.GetSize();
  46229                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46230                                         vshll(al,
  46231                                               dt,
  46232                                               QRegister(rd),
  46233                                               DRegister(rm),
  46234                                               imm);
  46235                                         break;
  46236                                       }
  46237                                       case 0x002c0000: {
  46238                                         // 0xf2ac0a10
  46239                                         if (((instr & 0x380000) == 0x0) ||
  46240                                             ((instr & 0x3f0000) == 0x80000) ||
  46241                                             ((instr & 0x3f0000) == 0x100000) ||
  46242                                             ((instr & 0x3f0000) == 0x200000)) {
  46243                                           UnallocatedA32(instr);
  46244                                           return;
  46245                                         }
  46246                                         DataType dt =
  46247                                             Dt_imm6_4_Decode((instr >> 19) &
  46248                                                                  0x7,
  46249                                                              (instr >> 24) &
  46250                                                                  0x1);
  46251                                         if (dt.Is(kDataTypeValueInvalid)) {
  46252                                           UnallocatedA32(instr);
  46253                                           return;
  46254                                         }
  46255                                         if (((instr >> 12) & 1) != 0) {
  46256                                           UnallocatedA32(instr);
  46257                                           return;
  46258                                         }
  46259                                         unsigned rd =
  46260                                             ExtractQRegister(instr, 22, 12);
  46261                                         unsigned rm =
  46262                                             ExtractDRegister(instr, 5, 0);
  46263                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46264                                         uint32_t imm = imm6 - dt.GetSize();
  46265                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46266                                         vshll(al,
  46267                                               dt,
  46268                                               QRegister(rd),
  46269                                               DRegister(rm),
  46270                                               imm);
  46271                                         break;
  46272                                       }
  46273                                       case 0x002d0000: {
  46274                                         // 0xf2ad0a10
  46275                                         if (((instr & 0x380000) == 0x0) ||
  46276                                             ((instr & 0x3f0000) == 0x80000) ||
  46277                                             ((instr & 0x3f0000) == 0x100000) ||
  46278                                             ((instr & 0x3f0000) == 0x200000)) {
  46279                                           UnallocatedA32(instr);
  46280                                           return;
  46281                                         }
  46282                                         DataType dt =
  46283                                             Dt_imm6_4_Decode((instr >> 19) &
  46284                                                                  0x7,
  46285                                                              (instr >> 24) &
  46286                                                                  0x1);
  46287                                         if (dt.Is(kDataTypeValueInvalid)) {
  46288                                           UnallocatedA32(instr);
  46289                                           return;
  46290                                         }
  46291                                         if (((instr >> 12) & 1) != 0) {
  46292                                           UnallocatedA32(instr);
  46293                                           return;
  46294                                         }
  46295                                         unsigned rd =
  46296                                             ExtractQRegister(instr, 22, 12);
  46297                                         unsigned rm =
  46298                                             ExtractDRegister(instr, 5, 0);
  46299                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46300                                         uint32_t imm = imm6 - dt.GetSize();
  46301                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46302                                         vshll(al,
  46303                                               dt,
  46304                                               QRegister(rd),
  46305                                               DRegister(rm),
  46306                                               imm);
  46307                                         break;
  46308                                       }
  46309                                       case 0x002e0000: {
  46310                                         // 0xf2ae0a10
  46311                                         if (((instr & 0x380000) == 0x0) ||
  46312                                             ((instr & 0x3f0000) == 0x80000) ||
  46313                                             ((instr & 0x3f0000) == 0x100000) ||
  46314                                             ((instr & 0x3f0000) == 0x200000)) {
  46315                                           UnallocatedA32(instr);
  46316                                           return;
  46317                                         }
  46318                                         DataType dt =
  46319                                             Dt_imm6_4_Decode((instr >> 19) &
  46320                                                                  0x7,
  46321                                                              (instr >> 24) &
  46322                                                                  0x1);
  46323                                         if (dt.Is(kDataTypeValueInvalid)) {
  46324                                           UnallocatedA32(instr);
  46325                                           return;
  46326                                         }
  46327                                         if (((instr >> 12) & 1) != 0) {
  46328                                           UnallocatedA32(instr);
  46329                                           return;
  46330                                         }
  46331                                         unsigned rd =
  46332                                             ExtractQRegister(instr, 22, 12);
  46333                                         unsigned rm =
  46334                                             ExtractDRegister(instr, 5, 0);
  46335                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46336                                         uint32_t imm = imm6 - dt.GetSize();
  46337                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46338                                         vshll(al,
  46339                                               dt,
  46340                                               QRegister(rd),
  46341                                               DRegister(rm),
  46342                                               imm);
  46343                                         break;
  46344                                       }
  46345                                       case 0x002f0000: {
  46346                                         // 0xf2af0a10
  46347                                         if (((instr & 0x380000) == 0x0) ||
  46348                                             ((instr & 0x3f0000) == 0x80000) ||
  46349                                             ((instr & 0x3f0000) == 0x100000) ||
  46350                                             ((instr & 0x3f0000) == 0x200000)) {
  46351                                           UnallocatedA32(instr);
  46352                                           return;
  46353                                         }
  46354                                         DataType dt =
  46355                                             Dt_imm6_4_Decode((instr >> 19) &
  46356                                                                  0x7,
  46357                                                              (instr >> 24) &
  46358                                                                  0x1);
  46359                                         if (dt.Is(kDataTypeValueInvalid)) {
  46360                                           UnallocatedA32(instr);
  46361                                           return;
  46362                                         }
  46363                                         if (((instr >> 12) & 1) != 0) {
  46364                                           UnallocatedA32(instr);
  46365                                           return;
  46366                                         }
  46367                                         unsigned rd =
  46368                                             ExtractQRegister(instr, 22, 12);
  46369                                         unsigned rm =
  46370                                             ExtractDRegister(instr, 5, 0);
  46371                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46372                                         uint32_t imm = imm6 - dt.GetSize();
  46373                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46374                                         vshll(al,
  46375                                               dt,
  46376                                               QRegister(rd),
  46377                                               DRegister(rm),
  46378                                               imm);
  46379                                         break;
  46380                                       }
  46381                                       case 0x00300000: {
  46382                                         // 0xf2b00a10
  46383                                         if (((instr & 0x380000) == 0x0) ||
  46384                                             ((instr & 0x3f0000) == 0x80000) ||
  46385                                             ((instr & 0x3f0000) == 0x100000) ||
  46386                                             ((instr & 0x3f0000) == 0x200000)) {
  46387                                           UnallocatedA32(instr);
  46388                                           return;
  46389                                         }
  46390                                         DataType dt =
  46391                                             Dt_imm6_4_Decode((instr >> 19) &
  46392                                                                  0x7,
  46393                                                              (instr >> 24) &
  46394                                                                  0x1);
  46395                                         if (dt.Is(kDataTypeValueInvalid)) {
  46396                                           UnallocatedA32(instr);
  46397                                           return;
  46398                                         }
  46399                                         if (((instr >> 12) & 1) != 0) {
  46400                                           UnallocatedA32(instr);
  46401                                           return;
  46402                                         }
  46403                                         unsigned rd =
  46404                                             ExtractQRegister(instr, 22, 12);
  46405                                         unsigned rm =
  46406                                             ExtractDRegister(instr, 5, 0);
  46407                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46408                                         uint32_t imm = imm6 - dt.GetSize();
  46409                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46410                                         vshll(al,
  46411                                               dt,
  46412                                               QRegister(rd),
  46413                                               DRegister(rm),
  46414                                               imm);
  46415                                         break;
  46416                                       }
  46417                                       case 0x00310000: {
  46418                                         // 0xf2b10a10
  46419                                         if (((instr & 0x380000) == 0x0) ||
  46420                                             ((instr & 0x3f0000) == 0x80000) ||
  46421                                             ((instr & 0x3f0000) == 0x100000) ||
  46422                                             ((instr & 0x3f0000) == 0x200000)) {
  46423                                           UnallocatedA32(instr);
  46424                                           return;
  46425                                         }
  46426                                         DataType dt =
  46427                                             Dt_imm6_4_Decode((instr >> 19) &
  46428                                                                  0x7,
  46429                                                              (instr >> 24) &
  46430                                                                  0x1);
  46431                                         if (dt.Is(kDataTypeValueInvalid)) {
  46432                                           UnallocatedA32(instr);
  46433                                           return;
  46434                                         }
  46435                                         if (((instr >> 12) & 1) != 0) {
  46436                                           UnallocatedA32(instr);
  46437                                           return;
  46438                                         }
  46439                                         unsigned rd =
  46440                                             ExtractQRegister(instr, 22, 12);
  46441                                         unsigned rm =
  46442                                             ExtractDRegister(instr, 5, 0);
  46443                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46444                                         uint32_t imm = imm6 - dt.GetSize();
  46445                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46446                                         vshll(al,
  46447                                               dt,
  46448                                               QRegister(rd),
  46449                                               DRegister(rm),
  46450                                               imm);
  46451                                         break;
  46452                                       }
  46453                                       case 0x00320000: {
  46454                                         // 0xf2b20a10
  46455                                         if (((instr & 0x380000) == 0x0) ||
  46456                                             ((instr & 0x3f0000) == 0x80000) ||
  46457                                             ((instr & 0x3f0000) == 0x100000) ||
  46458                                             ((instr & 0x3f0000) == 0x200000)) {
  46459                                           UnallocatedA32(instr);
  46460                                           return;
  46461                                         }
  46462                                         DataType dt =
  46463                                             Dt_imm6_4_Decode((instr >> 19) &
  46464                                                                  0x7,
  46465                                                              (instr >> 24) &
  46466                                                                  0x1);
  46467                                         if (dt.Is(kDataTypeValueInvalid)) {
  46468                                           UnallocatedA32(instr);
  46469                                           return;
  46470                                         }
  46471                                         if (((instr >> 12) & 1) != 0) {
  46472                                           UnallocatedA32(instr);
  46473                                           return;
  46474                                         }
  46475                                         unsigned rd =
  46476                                             ExtractQRegister(instr, 22, 12);
  46477                                         unsigned rm =
  46478                                             ExtractDRegister(instr, 5, 0);
  46479                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46480                                         uint32_t imm = imm6 - dt.GetSize();
  46481                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46482                                         vshll(al,
  46483                                               dt,
  46484                                               QRegister(rd),
  46485                                               DRegister(rm),
  46486                                               imm);
  46487                                         break;
  46488                                       }
  46489                                       case 0x00330000: {
  46490                                         // 0xf2b30a10
  46491                                         if (((instr & 0x380000) == 0x0) ||
  46492                                             ((instr & 0x3f0000) == 0x80000) ||
  46493                                             ((instr & 0x3f0000) == 0x100000) ||
  46494                                             ((instr & 0x3f0000) == 0x200000)) {
  46495                                           UnallocatedA32(instr);
  46496                                           return;
  46497                                         }
  46498                                         DataType dt =
  46499                                             Dt_imm6_4_Decode((instr >> 19) &
  46500                                                                  0x7,
  46501                                                              (instr >> 24) &
  46502                                                                  0x1);
  46503                                         if (dt.Is(kDataTypeValueInvalid)) {
  46504                                           UnallocatedA32(instr);
  46505                                           return;
  46506                                         }
  46507                                         if (((instr >> 12) & 1) != 0) {
  46508                                           UnallocatedA32(instr);
  46509                                           return;
  46510                                         }
  46511                                         unsigned rd =
  46512                                             ExtractQRegister(instr, 22, 12);
  46513                                         unsigned rm =
  46514                                             ExtractDRegister(instr, 5, 0);
  46515                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46516                                         uint32_t imm = imm6 - dt.GetSize();
  46517                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46518                                         vshll(al,
  46519                                               dt,
  46520                                               QRegister(rd),
  46521                                               DRegister(rm),
  46522                                               imm);
  46523                                         break;
  46524                                       }
  46525                                       case 0x00340000: {
  46526                                         // 0xf2b40a10
  46527                                         if (((instr & 0x380000) == 0x0) ||
  46528                                             ((instr & 0x3f0000) == 0x80000) ||
  46529                                             ((instr & 0x3f0000) == 0x100000) ||
  46530                                             ((instr & 0x3f0000) == 0x200000)) {
  46531                                           UnallocatedA32(instr);
  46532                                           return;
  46533                                         }
  46534                                         DataType dt =
  46535                                             Dt_imm6_4_Decode((instr >> 19) &
  46536                                                                  0x7,
  46537                                                              (instr >> 24) &
  46538                                                                  0x1);
  46539                                         if (dt.Is(kDataTypeValueInvalid)) {
  46540                                           UnallocatedA32(instr);
  46541                                           return;
  46542                                         }
  46543                                         if (((instr >> 12) & 1) != 0) {
  46544                                           UnallocatedA32(instr);
  46545                                           return;
  46546                                         }
  46547                                         unsigned rd =
  46548                                             ExtractQRegister(instr, 22, 12);
  46549                                         unsigned rm =
  46550                                             ExtractDRegister(instr, 5, 0);
  46551                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46552                                         uint32_t imm = imm6 - dt.GetSize();
  46553                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46554                                         vshll(al,
  46555                                               dt,
  46556                                               QRegister(rd),
  46557                                               DRegister(rm),
  46558                                               imm);
  46559                                         break;
  46560                                       }
  46561                                       case 0x00350000: {
  46562                                         // 0xf2b50a10
  46563                                         if (((instr & 0x380000) == 0x0) ||
  46564                                             ((instr & 0x3f0000) == 0x80000) ||
  46565                                             ((instr & 0x3f0000) == 0x100000) ||
  46566                                             ((instr & 0x3f0000) == 0x200000)) {
  46567                                           UnallocatedA32(instr);
  46568                                           return;
  46569                                         }
  46570                                         DataType dt =
  46571                                             Dt_imm6_4_Decode((instr >> 19) &
  46572                                                                  0x7,
  46573                                                              (instr >> 24) &
  46574                                                                  0x1);
  46575                                         if (dt.Is(kDataTypeValueInvalid)) {
  46576                                           UnallocatedA32(instr);
  46577                                           return;
  46578                                         }
  46579                                         if (((instr >> 12) & 1) != 0) {
  46580                                           UnallocatedA32(instr);
  46581                                           return;
  46582                                         }
  46583                                         unsigned rd =
  46584                                             ExtractQRegister(instr, 22, 12);
  46585                                         unsigned rm =
  46586                                             ExtractDRegister(instr, 5, 0);
  46587                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46588                                         uint32_t imm = imm6 - dt.GetSize();
  46589                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46590                                         vshll(al,
  46591                                               dt,
  46592                                               QRegister(rd),
  46593                                               DRegister(rm),
  46594                                               imm);
  46595                                         break;
  46596                                       }
  46597                                       case 0x00360000: {
  46598                                         // 0xf2b60a10
  46599                                         if (((instr & 0x380000) == 0x0) ||
  46600                                             ((instr & 0x3f0000) == 0x80000) ||
  46601                                             ((instr & 0x3f0000) == 0x100000) ||
  46602                                             ((instr & 0x3f0000) == 0x200000)) {
  46603                                           UnallocatedA32(instr);
  46604                                           return;
  46605                                         }
  46606                                         DataType dt =
  46607                                             Dt_imm6_4_Decode((instr >> 19) &
  46608                                                                  0x7,
  46609                                                              (instr >> 24) &
  46610                                                                  0x1);
  46611                                         if (dt.Is(kDataTypeValueInvalid)) {
  46612                                           UnallocatedA32(instr);
  46613                                           return;
  46614                                         }
  46615                                         if (((instr >> 12) & 1) != 0) {
  46616                                           UnallocatedA32(instr);
  46617                                           return;
  46618                                         }
  46619                                         unsigned rd =
  46620                                             ExtractQRegister(instr, 22, 12);
  46621                                         unsigned rm =
  46622                                             ExtractDRegister(instr, 5, 0);
  46623                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46624                                         uint32_t imm = imm6 - dt.GetSize();
  46625                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46626                                         vshll(al,
  46627                                               dt,
  46628                                               QRegister(rd),
  46629                                               DRegister(rm),
  46630                                               imm);
  46631                                         break;
  46632                                       }
  46633                                       case 0x00370000: {
  46634                                         // 0xf2b70a10
  46635                                         if (((instr & 0x380000) == 0x0) ||
  46636                                             ((instr & 0x3f0000) == 0x80000) ||
  46637                                             ((instr & 0x3f0000) == 0x100000) ||
  46638                                             ((instr & 0x3f0000) == 0x200000)) {
  46639                                           UnallocatedA32(instr);
  46640                                           return;
  46641                                         }
  46642                                         DataType dt =
  46643                                             Dt_imm6_4_Decode((instr >> 19) &
  46644                                                                  0x7,
  46645                                                              (instr >> 24) &
  46646                                                                  0x1);
  46647                                         if (dt.Is(kDataTypeValueInvalid)) {
  46648                                           UnallocatedA32(instr);
  46649                                           return;
  46650                                         }
  46651                                         if (((instr >> 12) & 1) != 0) {
  46652                                           UnallocatedA32(instr);
  46653                                           return;
  46654                                         }
  46655                                         unsigned rd =
  46656                                             ExtractQRegister(instr, 22, 12);
  46657                                         unsigned rm =
  46658                                             ExtractDRegister(instr, 5, 0);
  46659                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46660                                         uint32_t imm = imm6 - dt.GetSize();
  46661                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46662                                         vshll(al,
  46663                                               dt,
  46664                                               QRegister(rd),
  46665                                               DRegister(rm),
  46666                                               imm);
  46667                                         break;
  46668                                       }
  46669                                       case 0x00380000: {
  46670                                         // 0xf2b80a10
  46671                                         if (((instr & 0x380000) == 0x0) ||
  46672                                             ((instr & 0x3f0000) == 0x80000) ||
  46673                                             ((instr & 0x3f0000) == 0x100000) ||
  46674                                             ((instr & 0x3f0000) == 0x200000)) {
  46675                                           UnallocatedA32(instr);
  46676                                           return;
  46677                                         }
  46678                                         DataType dt =
  46679                                             Dt_imm6_4_Decode((instr >> 19) &
  46680                                                                  0x7,
  46681                                                              (instr >> 24) &
  46682                                                                  0x1);
  46683                                         if (dt.Is(kDataTypeValueInvalid)) {
  46684                                           UnallocatedA32(instr);
  46685                                           return;
  46686                                         }
  46687                                         if (((instr >> 12) & 1) != 0) {
  46688                                           UnallocatedA32(instr);
  46689                                           return;
  46690                                         }
  46691                                         unsigned rd =
  46692                                             ExtractQRegister(instr, 22, 12);
  46693                                         unsigned rm =
  46694                                             ExtractDRegister(instr, 5, 0);
  46695                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46696                                         uint32_t imm = imm6 - dt.GetSize();
  46697                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46698                                         vshll(al,
  46699                                               dt,
  46700                                               QRegister(rd),
  46701                                               DRegister(rm),
  46702                                               imm);
  46703                                         break;
  46704                                       }
  46705                                       case 0x00390000: {
  46706                                         // 0xf2b90a10
  46707                                         if (((instr & 0x380000) == 0x0) ||
  46708                                             ((instr & 0x3f0000) == 0x80000) ||
  46709                                             ((instr & 0x3f0000) == 0x100000) ||
  46710                                             ((instr & 0x3f0000) == 0x200000)) {
  46711                                           UnallocatedA32(instr);
  46712                                           return;
  46713                                         }
  46714                                         DataType dt =
  46715                                             Dt_imm6_4_Decode((instr >> 19) &
  46716                                                                  0x7,
  46717                                                              (instr >> 24) &
  46718                                                                  0x1);
  46719                                         if (dt.Is(kDataTypeValueInvalid)) {
  46720                                           UnallocatedA32(instr);
  46721                                           return;
  46722                                         }
  46723                                         if (((instr >> 12) & 1) != 0) {
  46724                                           UnallocatedA32(instr);
  46725                                           return;
  46726                                         }
  46727                                         unsigned rd =
  46728                                             ExtractQRegister(instr, 22, 12);
  46729                                         unsigned rm =
  46730                                             ExtractDRegister(instr, 5, 0);
  46731                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46732                                         uint32_t imm = imm6 - dt.GetSize();
  46733                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46734                                         vshll(al,
  46735                                               dt,
  46736                                               QRegister(rd),
  46737                                               DRegister(rm),
  46738                                               imm);
  46739                                         break;
  46740                                       }
  46741                                       case 0x003a0000: {
  46742                                         // 0xf2ba0a10
  46743                                         if (((instr & 0x380000) == 0x0) ||
  46744                                             ((instr & 0x3f0000) == 0x80000) ||
  46745                                             ((instr & 0x3f0000) == 0x100000) ||
  46746                                             ((instr & 0x3f0000) == 0x200000)) {
  46747                                           UnallocatedA32(instr);
  46748                                           return;
  46749                                         }
  46750                                         DataType dt =
  46751                                             Dt_imm6_4_Decode((instr >> 19) &
  46752                                                                  0x7,
  46753                                                              (instr >> 24) &
  46754                                                                  0x1);
  46755                                         if (dt.Is(kDataTypeValueInvalid)) {
  46756                                           UnallocatedA32(instr);
  46757                                           return;
  46758                                         }
  46759                                         if (((instr >> 12) & 1) != 0) {
  46760                                           UnallocatedA32(instr);
  46761                                           return;
  46762                                         }
  46763                                         unsigned rd =
  46764                                             ExtractQRegister(instr, 22, 12);
  46765                                         unsigned rm =
  46766                                             ExtractDRegister(instr, 5, 0);
  46767                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46768                                         uint32_t imm = imm6 - dt.GetSize();
  46769                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46770                                         vshll(al,
  46771                                               dt,
  46772                                               QRegister(rd),
  46773                                               DRegister(rm),
  46774                                               imm);
  46775                                         break;
  46776                                       }
  46777                                       case 0x003b0000: {
  46778                                         // 0xf2bb0a10
  46779                                         if (((instr & 0x380000) == 0x0) ||
  46780                                             ((instr & 0x3f0000) == 0x80000) ||
  46781                                             ((instr & 0x3f0000) == 0x100000) ||
  46782                                             ((instr & 0x3f0000) == 0x200000)) {
  46783                                           UnallocatedA32(instr);
  46784                                           return;
  46785                                         }
  46786                                         DataType dt =
  46787                                             Dt_imm6_4_Decode((instr >> 19) &
  46788                                                                  0x7,
  46789                                                              (instr >> 24) &
  46790                                                                  0x1);
  46791                                         if (dt.Is(kDataTypeValueInvalid)) {
  46792                                           UnallocatedA32(instr);
  46793                                           return;
  46794                                         }
  46795                                         if (((instr >> 12) & 1) != 0) {
  46796                                           UnallocatedA32(instr);
  46797                                           return;
  46798                                         }
  46799                                         unsigned rd =
  46800                                             ExtractQRegister(instr, 22, 12);
  46801                                         unsigned rm =
  46802                                             ExtractDRegister(instr, 5, 0);
  46803                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46804                                         uint32_t imm = imm6 - dt.GetSize();
  46805                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46806                                         vshll(al,
  46807                                               dt,
  46808                                               QRegister(rd),
  46809                                               DRegister(rm),
  46810                                               imm);
  46811                                         break;
  46812                                       }
  46813                                       case 0x003c0000: {
  46814                                         // 0xf2bc0a10
  46815                                         if (((instr & 0x380000) == 0x0) ||
  46816                                             ((instr & 0x3f0000) == 0x80000) ||
  46817                                             ((instr & 0x3f0000) == 0x100000) ||
  46818                                             ((instr & 0x3f0000) == 0x200000)) {
  46819                                           UnallocatedA32(instr);
  46820                                           return;
  46821                                         }
  46822                                         DataType dt =
  46823                                             Dt_imm6_4_Decode((instr >> 19) &
  46824                                                                  0x7,
  46825                                                              (instr >> 24) &
  46826                                                                  0x1);
  46827                                         if (dt.Is(kDataTypeValueInvalid)) {
  46828                                           UnallocatedA32(instr);
  46829                                           return;
  46830                                         }
  46831                                         if (((instr >> 12) & 1) != 0) {
  46832                                           UnallocatedA32(instr);
  46833                                           return;
  46834                                         }
  46835                                         unsigned rd =
  46836                                             ExtractQRegister(instr, 22, 12);
  46837                                         unsigned rm =
  46838                                             ExtractDRegister(instr, 5, 0);
  46839                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46840                                         uint32_t imm = imm6 - dt.GetSize();
  46841                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46842                                         vshll(al,
  46843                                               dt,
  46844                                               QRegister(rd),
  46845                                               DRegister(rm),
  46846                                               imm);
  46847                                         break;
  46848                                       }
  46849                                       case 0x003d0000: {
  46850                                         // 0xf2bd0a10
  46851                                         if (((instr & 0x380000) == 0x0) ||
  46852                                             ((instr & 0x3f0000) == 0x80000) ||
  46853                                             ((instr & 0x3f0000) == 0x100000) ||
  46854                                             ((instr & 0x3f0000) == 0x200000)) {
  46855                                           UnallocatedA32(instr);
  46856                                           return;
  46857                                         }
  46858                                         DataType dt =
  46859                                             Dt_imm6_4_Decode((instr >> 19) &
  46860                                                                  0x7,
  46861                                                              (instr >> 24) &
  46862                                                                  0x1);
  46863                                         if (dt.Is(kDataTypeValueInvalid)) {
  46864                                           UnallocatedA32(instr);
  46865                                           return;
  46866                                         }
  46867                                         if (((instr >> 12) & 1) != 0) {
  46868                                           UnallocatedA32(instr);
  46869                                           return;
  46870                                         }
  46871                                         unsigned rd =
  46872                                             ExtractQRegister(instr, 22, 12);
  46873                                         unsigned rm =
  46874                                             ExtractDRegister(instr, 5, 0);
  46875                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46876                                         uint32_t imm = imm6 - dt.GetSize();
  46877                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46878                                         vshll(al,
  46879                                               dt,
  46880                                               QRegister(rd),
  46881                                               DRegister(rm),
  46882                                               imm);
  46883                                         break;
  46884                                       }
  46885                                       case 0x003e0000: {
  46886                                         // 0xf2be0a10
  46887                                         if (((instr & 0x380000) == 0x0) ||
  46888                                             ((instr & 0x3f0000) == 0x80000) ||
  46889                                             ((instr & 0x3f0000) == 0x100000) ||
  46890                                             ((instr & 0x3f0000) == 0x200000)) {
  46891                                           UnallocatedA32(instr);
  46892                                           return;
  46893                                         }
  46894                                         DataType dt =
  46895                                             Dt_imm6_4_Decode((instr >> 19) &
  46896                                                                  0x7,
  46897                                                              (instr >> 24) &
  46898                                                                  0x1);
  46899                                         if (dt.Is(kDataTypeValueInvalid)) {
  46900                                           UnallocatedA32(instr);
  46901                                           return;
  46902                                         }
  46903                                         if (((instr >> 12) & 1) != 0) {
  46904                                           UnallocatedA32(instr);
  46905                                           return;
  46906                                         }
  46907                                         unsigned rd =
  46908                                             ExtractQRegister(instr, 22, 12);
  46909                                         unsigned rm =
  46910                                             ExtractDRegister(instr, 5, 0);
  46911                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46912                                         uint32_t imm = imm6 - dt.GetSize();
  46913                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46914                                         vshll(al,
  46915                                               dt,
  46916                                               QRegister(rd),
  46917                                               DRegister(rm),
  46918                                               imm);
  46919                                         break;
  46920                                       }
  46921                                       case 0x003f0000: {
  46922                                         // 0xf2bf0a10
  46923                                         if (((instr & 0x380000) == 0x0) ||
  46924                                             ((instr & 0x3f0000) == 0x80000) ||
  46925                                             ((instr & 0x3f0000) == 0x100000) ||
  46926                                             ((instr & 0x3f0000) == 0x200000)) {
  46927                                           UnallocatedA32(instr);
  46928                                           return;
  46929                                         }
  46930                                         DataType dt =
  46931                                             Dt_imm6_4_Decode((instr >> 19) &
  46932                                                                  0x7,
  46933                                                              (instr >> 24) &
  46934                                                                  0x1);
  46935                                         if (dt.Is(kDataTypeValueInvalid)) {
  46936                                           UnallocatedA32(instr);
  46937                                           return;
  46938                                         }
  46939                                         if (((instr >> 12) & 1) != 0) {
  46940                                           UnallocatedA32(instr);
  46941                                           return;
  46942                                         }
  46943                                         unsigned rd =
  46944                                             ExtractQRegister(instr, 22, 12);
  46945                                         unsigned rm =
  46946                                             ExtractDRegister(instr, 5, 0);
  46947                                         uint32_t imm6 = (instr >> 16) & 0x3f;
  46948                                         uint32_t imm = imm6 - dt.GetSize();
  46949                                         // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46950                                         vshll(al,
  46951                                               dt,
  46952                                               QRegister(rd),
  46953                                               DRegister(rm),
  46954                                               imm);
  46955                                         break;
  46956                                       }
  46957                                       default:
  46958                                         UnallocatedA32(instr);
  46959                                         break;
  46960                                     }
  46961                                     break;
  46962                                   }
  46963                                   default: {
  46964                                     if (((instr & 0x380000) == 0x0) ||
  46965                                         ((instr & 0x3f0000) == 0x80000) ||
  46966                                         ((instr & 0x3f0000) == 0x100000) ||
  46967                                         ((instr & 0x3f0000) == 0x200000)) {
  46968                                       UnallocatedA32(instr);
  46969                                       return;
  46970                                     }
  46971                                     DataType dt =
  46972                                         Dt_imm6_4_Decode((instr >> 19) & 0x7,
  46973                                                          (instr >> 24) & 0x1);
  46974                                     if (dt.Is(kDataTypeValueInvalid)) {
  46975                                       UnallocatedA32(instr);
  46976                                       return;
  46977                                     }
  46978                                     if (((instr >> 12) & 1) != 0) {
  46979                                       UnallocatedA32(instr);
  46980                                       return;
  46981                                     }
  46982                                     unsigned rd =
  46983                                         ExtractQRegister(instr, 22, 12);
  46984                                     unsigned rm = ExtractDRegister(instr, 5, 0);
  46985                                     uint32_t imm6 = (instr >> 16) & 0x3f;
  46986                                     uint32_t imm = imm6 - dt.GetSize();
  46987                                     // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  46988                                     vshll(al,
  46989                                           dt,
  46990                                           QRegister(rd),
  46991                                           DRegister(rm),
  46992                                           imm);
  46993                                     break;
  46994                                   }
  46995                                 }
  46996                                 break;
  46997                               }
  46998                               default:
  46999                                 UnallocatedA32(instr);
  47000                                 break;
  47001                             }
  47002                             break;
  47003                           }
  47004                         }
  47005                         break;
  47006                       }
  47007                       default:
  47008                         UnallocatedA32(instr);
  47009                         break;
  47010                     }
  47011                     break;
  47012                   }
  47013                   case 0x00000c00: {
  47014                     // 0xf2800c10
  47015                     switch (instr & 0x00000080) {
  47016                       case 0x00000000: {
  47017                         // 0xf2800c10
  47018                         switch (instr & 0x00200000) {
  47019                           case 0x00000000: {
  47020                             // 0xf2800c10
  47021                             switch (instr & 0x00180000) {
  47022                               case 0x00000000: {
  47023                                 // 0xf2800c10
  47024                                 switch (instr & 0x00000300) {
  47025                                   case 0x00000200: {
  47026                                     // 0xf2800e10
  47027                                     if (((instr & 0x920) == 0x100) ||
  47028                                         ((instr & 0x520) == 0x100) ||
  47029                                         ((instr & 0x820) == 0x20) ||
  47030                                         ((instr & 0x420) == 0x20) ||
  47031                                         ((instr & 0x220) == 0x20) ||
  47032                                         ((instr & 0x120) == 0x120)) {
  47033                                       UnallocatedA32(instr);
  47034                                       return;
  47035                                     }
  47036                                     unsigned cmode = ((instr >> 8) & 0xf) |
  47037                                                      ((instr >> 1) & 0x10);
  47038                                     DataType dt =
  47039                                         ImmediateVmov::DecodeDt(cmode);
  47040                                     if (dt.Is(kDataTypeValueInvalid)) {
  47041                                       UnallocatedA32(instr);
  47042                                       return;
  47043                                     }
  47044                                     unsigned rd =
  47045                                         ExtractDRegister(instr, 22, 12);
  47046                                     DOperand imm =
  47047                                         ImmediateVmov::DecodeImmediate(
  47048                                             cmode,
  47049                                             (instr & 0xf) |
  47050                                                 ((instr >> 12) & 0x70) |
  47051                                                 ((instr >> 17) & 0x80));
  47052                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
  47053                                     vmov(al, dt, DRegister(rd), imm);
  47054                                     break;
  47055                                   }
  47056                                   case 0x00000300: {
  47057                                     // 0xf2800f10
  47058                                     if (((instr & 0x920) == 0x100) ||
  47059                                         ((instr & 0x520) == 0x100) ||
  47060                                         ((instr & 0x820) == 0x20) ||
  47061                                         ((instr & 0x420) == 0x20) ||
  47062                                         ((instr & 0x220) == 0x20) ||
  47063                                         ((instr & 0x120) == 0x120)) {
  47064                                       UnallocatedA32(instr);
  47065                                       return;
  47066                                     }
  47067                                     unsigned cmode = ((instr >> 8) & 0xf) |
  47068                                                      ((instr >> 1) & 0x10);
  47069                                     DataType dt =
  47070                                         ImmediateVmov::DecodeDt(cmode);
  47071                                     if (dt.Is(kDataTypeValueInvalid)) {
  47072                                       UnallocatedA32(instr);
  47073                                       return;
  47074                                     }
  47075                                     unsigned rd =
  47076                                         ExtractDRegister(instr, 22, 12);
  47077                                     DOperand imm =
  47078                                         ImmediateVmov::DecodeImmediate(
  47079                                             cmode,
  47080                                             (instr & 0xf) |
  47081                                                 ((instr >> 12) & 0x70) |
  47082                                                 ((instr >> 17) & 0x80));
  47083                                     // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
  47084                                     vmov(al, dt, DRegister(rd), imm);
  47085                                     break;
  47086                                   }
  47087                                   default: {
  47088                                     switch (instr & 0x00000020) {
  47089                                       case 0x00000020: {
  47090                                         // 0xf2800c30
  47091                                         switch (instr & 0x00000f20) {
  47092                                           case 0x00000000: {
  47093                                             // 0xf2800c10
  47094                                             if (((instr & 0x920) == 0x100) ||
  47095                                                 ((instr & 0x520) == 0x100) ||
  47096                                                 ((instr & 0x820) == 0x20) ||
  47097                                                 ((instr & 0x420) == 0x20) ||
  47098                                                 ((instr & 0x220) == 0x20) ||
  47099                                                 ((instr & 0x120) == 0x120)) {
  47100                                               UnallocatedA32(instr);
  47101                                               return;
  47102                                             }
  47103                                             unsigned cmode =
  47104                                                 ((instr >> 8) & 0xf) |
  47105                                                 ((instr >> 1) & 0x10);
  47106                                             DataType dt =
  47107                                                 ImmediateVmov::DecodeDt(cmode);
  47108                                             if (dt.Is(kDataTypeValueInvalid)) {
  47109                                               UnallocatedA32(instr);
  47110                                               return;
  47111                                             }
  47112                                             unsigned rd =
  47113                                                 ExtractDRegister(instr, 22, 12);
  47114                                             DOperand imm =
  47115                                                 ImmediateVmov::DecodeImmediate(
  47116                                                     cmode,
  47117                                                     (instr & 0xf) |
  47118                                                         ((instr >> 12) & 0x70) |
  47119                                                         ((instr >> 17) & 0x80));
  47120                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47121                                             vmov(al, dt, DRegister(rd), imm);
  47122                                             break;
  47123                                           }
  47124                                           case 0x00000020: {
  47125                                             // 0xf2800c30
  47126                                             if (((instr & 0xd00) == 0x100) ||
  47127                                                 ((instr & 0xd00) == 0x500) ||
  47128                                                 ((instr & 0xd00) == 0x900) ||
  47129                                                 ((instr & 0xe00) == 0xe00)) {
  47130                                               UnallocatedA32(instr);
  47131                                               return;
  47132                                             }
  47133                                             unsigned cmode = (instr >> 8) & 0xf;
  47134                                             DataType dt =
  47135                                                 ImmediateVmvn::DecodeDt(cmode);
  47136                                             if (dt.Is(kDataTypeValueInvalid)) {
  47137                                               UnallocatedA32(instr);
  47138                                               return;
  47139                                             }
  47140                                             unsigned rd =
  47141                                                 ExtractDRegister(instr, 22, 12);
  47142                                             DOperand imm =
  47143                                                 ImmediateVmvn::DecodeImmediate(
  47144                                                     cmode,
  47145                                                     (instr & 0xf) |
  47146                                                         ((instr >> 12) & 0x70) |
  47147                                                         ((instr >> 17) & 0x80));
  47148                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47149                                             vmvn(al, dt, DRegister(rd), imm);
  47150                                             break;
  47151                                           }
  47152                                           case 0x00000200: {
  47153                                             // 0xf2800e10
  47154                                             if (((instr & 0x920) == 0x100) ||
  47155                                                 ((instr & 0x520) == 0x100) ||
  47156                                                 ((instr & 0x820) == 0x20) ||
  47157                                                 ((instr & 0x420) == 0x20) ||
  47158                                                 ((instr & 0x220) == 0x20) ||
  47159                                                 ((instr & 0x120) == 0x120)) {
  47160                                               UnallocatedA32(instr);
  47161                                               return;
  47162                                             }
  47163                                             unsigned cmode =
  47164                                                 ((instr >> 8) & 0xf) |
  47165                                                 ((instr >> 1) & 0x10);
  47166                                             DataType dt =
  47167                                                 ImmediateVmov::DecodeDt(cmode);
  47168                                             if (dt.Is(kDataTypeValueInvalid)) {
  47169                                               UnallocatedA32(instr);
  47170                                               return;
  47171                                             }
  47172                                             unsigned rd =
  47173                                                 ExtractDRegister(instr, 22, 12);
  47174                                             DOperand imm =
  47175                                                 ImmediateVmov::DecodeImmediate(
  47176                                                     cmode,
  47177                                                     (instr & 0xf) |
  47178                                                         ((instr >> 12) & 0x70) |
  47179                                                         ((instr >> 17) & 0x80));
  47180                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47181                                             vmov(al, dt, DRegister(rd), imm);
  47182                                             break;
  47183                                           }
  47184                                           case 0x00000220: {
  47185                                             // 0xf2800e30
  47186                                             if (((instr & 0xd00) == 0x100) ||
  47187                                                 ((instr & 0xd00) == 0x500) ||
  47188                                                 ((instr & 0xd00) == 0x900) ||
  47189                                                 ((instr & 0xe00) == 0xe00)) {
  47190                                               UnallocatedA32(instr);
  47191                                               return;
  47192                                             }
  47193                                             unsigned cmode = (instr >> 8) & 0xf;
  47194                                             DataType dt =
  47195                                                 ImmediateVmvn::DecodeDt(cmode);
  47196                                             if (dt.Is(kDataTypeValueInvalid)) {
  47197                                               UnallocatedA32(instr);
  47198                                               return;
  47199                                             }
  47200                                             unsigned rd =
  47201                                                 ExtractDRegister(instr, 22, 12);
  47202                                             DOperand imm =
  47203                                                 ImmediateVmvn::DecodeImmediate(
  47204                                                     cmode,
  47205                                                     (instr & 0xf) |
  47206                                                         ((instr >> 12) & 0x70) |
  47207                                                         ((instr >> 17) & 0x80));
  47208                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47209                                             vmvn(al, dt, DRegister(rd), imm);
  47210                                             break;
  47211                                           }
  47212                                           case 0x00000400: {
  47213                                             // 0xf2800c10
  47214                                             if (((instr & 0x920) == 0x100) ||
  47215                                                 ((instr & 0x520) == 0x100) ||
  47216                                                 ((instr & 0x820) == 0x20) ||
  47217                                                 ((instr & 0x420) == 0x20) ||
  47218                                                 ((instr & 0x220) == 0x20) ||
  47219                                                 ((instr & 0x120) == 0x120)) {
  47220                                               UnallocatedA32(instr);
  47221                                               return;
  47222                                             }
  47223                                             unsigned cmode =
  47224                                                 ((instr >> 8) & 0xf) |
  47225                                                 ((instr >> 1) & 0x10);
  47226                                             DataType dt =
  47227                                                 ImmediateVmov::DecodeDt(cmode);
  47228                                             if (dt.Is(kDataTypeValueInvalid)) {
  47229                                               UnallocatedA32(instr);
  47230                                               return;
  47231                                             }
  47232                                             unsigned rd =
  47233                                                 ExtractDRegister(instr, 22, 12);
  47234                                             DOperand imm =
  47235                                                 ImmediateVmov::DecodeImmediate(
  47236                                                     cmode,
  47237                                                     (instr & 0xf) |
  47238                                                         ((instr >> 12) & 0x70) |
  47239                                                         ((instr >> 17) & 0x80));
  47240                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47241                                             vmov(al, dt, DRegister(rd), imm);
  47242                                             break;
  47243                                           }
  47244                                           case 0x00000420: {
  47245                                             // 0xf2800c30
  47246                                             if (((instr & 0xd00) == 0x100) ||
  47247                                                 ((instr & 0xd00) == 0x500) ||
  47248                                                 ((instr & 0xd00) == 0x900) ||
  47249                                                 ((instr & 0xe00) == 0xe00)) {
  47250                                               UnallocatedA32(instr);
  47251                                               return;
  47252                                             }
  47253                                             unsigned cmode = (instr >> 8) & 0xf;
  47254                                             DataType dt =
  47255                                                 ImmediateVmvn::DecodeDt(cmode);
  47256                                             if (dt.Is(kDataTypeValueInvalid)) {
  47257                                               UnallocatedA32(instr);
  47258                                               return;
  47259                                             }
  47260                                             unsigned rd =
  47261                                                 ExtractDRegister(instr, 22, 12);
  47262                                             DOperand imm =
  47263                                                 ImmediateVmvn::DecodeImmediate(
  47264                                                     cmode,
  47265                                                     (instr & 0xf) |
  47266                                                         ((instr >> 12) & 0x70) |
  47267                                                         ((instr >> 17) & 0x80));
  47268                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47269                                             vmvn(al, dt, DRegister(rd), imm);
  47270                                             break;
  47271                                           }
  47272                                           case 0x00000600: {
  47273                                             // 0xf2800e10
  47274                                             if (((instr & 0x920) == 0x100) ||
  47275                                                 ((instr & 0x520) == 0x100) ||
  47276                                                 ((instr & 0x820) == 0x20) ||
  47277                                                 ((instr & 0x420) == 0x20) ||
  47278                                                 ((instr & 0x220) == 0x20) ||
  47279                                                 ((instr & 0x120) == 0x120)) {
  47280                                               UnallocatedA32(instr);
  47281                                               return;
  47282                                             }
  47283                                             unsigned cmode =
  47284                                                 ((instr >> 8) & 0xf) |
  47285                                                 ((instr >> 1) & 0x10);
  47286                                             DataType dt =
  47287                                                 ImmediateVmov::DecodeDt(cmode);
  47288                                             if (dt.Is(kDataTypeValueInvalid)) {
  47289                                               UnallocatedA32(instr);
  47290                                               return;
  47291                                             }
  47292                                             unsigned rd =
  47293                                                 ExtractDRegister(instr, 22, 12);
  47294                                             DOperand imm =
  47295                                                 ImmediateVmov::DecodeImmediate(
  47296                                                     cmode,
  47297                                                     (instr & 0xf) |
  47298                                                         ((instr >> 12) & 0x70) |
  47299                                                         ((instr >> 17) & 0x80));
  47300                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47301                                             vmov(al, dt, DRegister(rd), imm);
  47302                                             break;
  47303                                           }
  47304                                           case 0x00000620: {
  47305                                             // 0xf2800e30
  47306                                             if (((instr & 0xd00) == 0x100) ||
  47307                                                 ((instr & 0xd00) == 0x500) ||
  47308                                                 ((instr & 0xd00) == 0x900) ||
  47309                                                 ((instr & 0xe00) == 0xe00)) {
  47310                                               UnallocatedA32(instr);
  47311                                               return;
  47312                                             }
  47313                                             unsigned cmode = (instr >> 8) & 0xf;
  47314                                             DataType dt =
  47315                                                 ImmediateVmvn::DecodeDt(cmode);
  47316                                             if (dt.Is(kDataTypeValueInvalid)) {
  47317                                               UnallocatedA32(instr);
  47318                                               return;
  47319                                             }
  47320                                             unsigned rd =
  47321                                                 ExtractDRegister(instr, 22, 12);
  47322                                             DOperand imm =
  47323                                                 ImmediateVmvn::DecodeImmediate(
  47324                                                     cmode,
  47325                                                     (instr & 0xf) |
  47326                                                         ((instr >> 12) & 0x70) |
  47327                                                         ((instr >> 17) & 0x80));
  47328                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47329                                             vmvn(al, dt, DRegister(rd), imm);
  47330                                             break;
  47331                                           }
  47332                                           case 0x00000800: {
  47333                                             // 0xf2800c10
  47334                                             if (((instr & 0x920) == 0x100) ||
  47335                                                 ((instr & 0x520) == 0x100) ||
  47336                                                 ((instr & 0x820) == 0x20) ||
  47337                                                 ((instr & 0x420) == 0x20) ||
  47338                                                 ((instr & 0x220) == 0x20) ||
  47339                                                 ((instr & 0x120) == 0x120)) {
  47340                                               UnallocatedA32(instr);
  47341                                               return;
  47342                                             }
  47343                                             unsigned cmode =
  47344                                                 ((instr >> 8) & 0xf) |
  47345                                                 ((instr >> 1) & 0x10);
  47346                                             DataType dt =
  47347                                                 ImmediateVmov::DecodeDt(cmode);
  47348                                             if (dt.Is(kDataTypeValueInvalid)) {
  47349                                               UnallocatedA32(instr);
  47350                                               return;
  47351                                             }
  47352                                             unsigned rd =
  47353                                                 ExtractDRegister(instr, 22, 12);
  47354                                             DOperand imm =
  47355                                                 ImmediateVmov::DecodeImmediate(
  47356                                                     cmode,
  47357                                                     (instr & 0xf) |
  47358                                                         ((instr >> 12) & 0x70) |
  47359                                                         ((instr >> 17) & 0x80));
  47360                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47361                                             vmov(al, dt, DRegister(rd), imm);
  47362                                             break;
  47363                                           }
  47364                                           case 0x00000820: {
  47365                                             // 0xf2800c30
  47366                                             if (((instr & 0xd00) == 0x100) ||
  47367                                                 ((instr & 0xd00) == 0x500) ||
  47368                                                 ((instr & 0xd00) == 0x900) ||
  47369                                                 ((instr & 0xe00) == 0xe00)) {
  47370                                               UnallocatedA32(instr);
  47371                                               return;
  47372                                             }
  47373                                             unsigned cmode = (instr >> 8) & 0xf;
  47374                                             DataType dt =
  47375                                                 ImmediateVmvn::DecodeDt(cmode);
  47376                                             if (dt.Is(kDataTypeValueInvalid)) {
  47377                                               UnallocatedA32(instr);
  47378                                               return;
  47379                                             }
  47380                                             unsigned rd =
  47381                                                 ExtractDRegister(instr, 22, 12);
  47382                                             DOperand imm =
  47383                                                 ImmediateVmvn::DecodeImmediate(
  47384                                                     cmode,
  47385                                                     (instr & 0xf) |
  47386                                                         ((instr >> 12) & 0x70) |
  47387                                                         ((instr >> 17) & 0x80));
  47388                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47389                                             vmvn(al, dt, DRegister(rd), imm);
  47390                                             break;
  47391                                           }
  47392                                           case 0x00000a00: {
  47393                                             // 0xf2800e10
  47394                                             if (((instr & 0x920) == 0x100) ||
  47395                                                 ((instr & 0x520) == 0x100) ||
  47396                                                 ((instr & 0x820) == 0x20) ||
  47397                                                 ((instr & 0x420) == 0x20) ||
  47398                                                 ((instr & 0x220) == 0x20) ||
  47399                                                 ((instr & 0x120) == 0x120)) {
  47400                                               UnallocatedA32(instr);
  47401                                               return;
  47402                                             }
  47403                                             unsigned cmode =
  47404                                                 ((instr >> 8) & 0xf) |
  47405                                                 ((instr >> 1) & 0x10);
  47406                                             DataType dt =
  47407                                                 ImmediateVmov::DecodeDt(cmode);
  47408                                             if (dt.Is(kDataTypeValueInvalid)) {
  47409                                               UnallocatedA32(instr);
  47410                                               return;
  47411                                             }
  47412                                             unsigned rd =
  47413                                                 ExtractDRegister(instr, 22, 12);
  47414                                             DOperand imm =
  47415                                                 ImmediateVmov::DecodeImmediate(
  47416                                                     cmode,
  47417                                                     (instr & 0xf) |
  47418                                                         ((instr >> 12) & 0x70) |
  47419                                                         ((instr >> 17) & 0x80));
  47420                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47421                                             vmov(al, dt, DRegister(rd), imm);
  47422                                             break;
  47423                                           }
  47424                                           case 0x00000a20: {
  47425                                             // 0xf2800e30
  47426                                             if (((instr & 0xd00) == 0x100) ||
  47427                                                 ((instr & 0xd00) == 0x500) ||
  47428                                                 ((instr & 0xd00) == 0x900) ||
  47429                                                 ((instr & 0xe00) == 0xe00)) {
  47430                                               UnallocatedA32(instr);
  47431                                               return;
  47432                                             }
  47433                                             unsigned cmode = (instr >> 8) & 0xf;
  47434                                             DataType dt =
  47435                                                 ImmediateVmvn::DecodeDt(cmode);
  47436                                             if (dt.Is(kDataTypeValueInvalid)) {
  47437                                               UnallocatedA32(instr);
  47438                                               return;
  47439                                             }
  47440                                             unsigned rd =
  47441                                                 ExtractDRegister(instr, 22, 12);
  47442                                             DOperand imm =
  47443                                                 ImmediateVmvn::DecodeImmediate(
  47444                                                     cmode,
  47445                                                     (instr & 0xf) |
  47446                                                         ((instr >> 12) & 0x70) |
  47447                                                         ((instr >> 17) & 0x80));
  47448                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47449                                             vmvn(al, dt, DRegister(rd), imm);
  47450                                             break;
  47451                                           }
  47452                                           case 0x00000c00: {
  47453                                             // 0xf2800c10
  47454                                             if (((instr & 0x920) == 0x100) ||
  47455                                                 ((instr & 0x520) == 0x100) ||
  47456                                                 ((instr & 0x820) == 0x20) ||
  47457                                                 ((instr & 0x420) == 0x20) ||
  47458                                                 ((instr & 0x220) == 0x20) ||
  47459                                                 ((instr & 0x120) == 0x120)) {
  47460                                               UnallocatedA32(instr);
  47461                                               return;
  47462                                             }
  47463                                             unsigned cmode =
  47464                                                 ((instr >> 8) & 0xf) |
  47465                                                 ((instr >> 1) & 0x10);
  47466                                             DataType dt =
  47467                                                 ImmediateVmov::DecodeDt(cmode);
  47468                                             if (dt.Is(kDataTypeValueInvalid)) {
  47469                                               UnallocatedA32(instr);
  47470                                               return;
  47471                                             }
  47472                                             unsigned rd =
  47473                                                 ExtractDRegister(instr, 22, 12);
  47474                                             DOperand imm =
  47475                                                 ImmediateVmov::DecodeImmediate(
  47476                                                     cmode,
  47477                                                     (instr & 0xf) |
  47478                                                         ((instr >> 12) & 0x70) |
  47479                                                         ((instr >> 17) & 0x80));
  47480                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47481                                             vmov(al, dt, DRegister(rd), imm);
  47482                                             break;
  47483                                           }
  47484                                           case 0x00000c20: {
  47485                                             // 0xf2800c30
  47486                                             if (((instr & 0xd00) == 0x100) ||
  47487                                                 ((instr & 0xd00) == 0x500) ||
  47488                                                 ((instr & 0xd00) == 0x900) ||
  47489                                                 ((instr & 0xe00) == 0xe00)) {
  47490                                               UnallocatedA32(instr);
  47491                                               return;
  47492                                             }
  47493                                             unsigned cmode = (instr >> 8) & 0xf;
  47494                                             DataType dt =
  47495                                                 ImmediateVmvn::DecodeDt(cmode);
  47496                                             if (dt.Is(kDataTypeValueInvalid)) {
  47497                                               UnallocatedA32(instr);
  47498                                               return;
  47499                                             }
  47500                                             unsigned rd =
  47501                                                 ExtractDRegister(instr, 22, 12);
  47502                                             DOperand imm =
  47503                                                 ImmediateVmvn::DecodeImmediate(
  47504                                                     cmode,
  47505                                                     (instr & 0xf) |
  47506                                                         ((instr >> 12) & 0x70) |
  47507                                                         ((instr >> 17) & 0x80));
  47508                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47509                                             vmvn(al, dt, DRegister(rd), imm);
  47510                                             break;
  47511                                           }
  47512                                           case 0x00000d00: {
  47513                                             // 0xf2800d10
  47514                                             if (((instr & 0x920) == 0x100) ||
  47515                                                 ((instr & 0x520) == 0x100) ||
  47516                                                 ((instr & 0x820) == 0x20) ||
  47517                                                 ((instr & 0x420) == 0x20) ||
  47518                                                 ((instr & 0x220) == 0x20) ||
  47519                                                 ((instr & 0x120) == 0x120)) {
  47520                                               UnallocatedA32(instr);
  47521                                               return;
  47522                                             }
  47523                                             unsigned cmode =
  47524                                                 ((instr >> 8) & 0xf) |
  47525                                                 ((instr >> 1) & 0x10);
  47526                                             DataType dt =
  47527                                                 ImmediateVmov::DecodeDt(cmode);
  47528                                             if (dt.Is(kDataTypeValueInvalid)) {
  47529                                               UnallocatedA32(instr);
  47530                                               return;
  47531                                             }
  47532                                             unsigned rd =
  47533                                                 ExtractDRegister(instr, 22, 12);
  47534                                             DOperand imm =
  47535                                                 ImmediateVmov::DecodeImmediate(
  47536                                                     cmode,
  47537                                                     (instr & 0xf) |
  47538                                                         ((instr >> 12) & 0x70) |
  47539                                                         ((instr >> 17) & 0x80));
  47540                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47541                                             vmov(al, dt, DRegister(rd), imm);
  47542                                             break;
  47543                                           }
  47544                                           case 0x00000d20: {
  47545                                             // 0xf2800d30
  47546                                             if (((instr & 0xd00) == 0x100) ||
  47547                                                 ((instr & 0xd00) == 0x500) ||
  47548                                                 ((instr & 0xd00) == 0x900) ||
  47549                                                 ((instr & 0xe00) == 0xe00)) {
  47550                                               UnallocatedA32(instr);
  47551                                               return;
  47552                                             }
  47553                                             unsigned cmode = (instr >> 8) & 0xf;
  47554                                             DataType dt =
  47555                                                 ImmediateVmvn::DecodeDt(cmode);
  47556                                             if (dt.Is(kDataTypeValueInvalid)) {
  47557                                               UnallocatedA32(instr);
  47558                                               return;
  47559                                             }
  47560                                             unsigned rd =
  47561                                                 ExtractDRegister(instr, 22, 12);
  47562                                             DOperand imm =
  47563                                                 ImmediateVmvn::DecodeImmediate(
  47564                                                     cmode,
  47565                                                     (instr & 0xf) |
  47566                                                         ((instr >> 12) & 0x70) |
  47567                                                         ((instr >> 17) & 0x80));
  47568                                             // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47569                                             vmvn(al, dt, DRegister(rd), imm);
  47570                                             break;
  47571                                           }
  47572                                           case 0x00000e00: {
  47573                                             // 0xf2800e10
  47574                                             if (((instr & 0x920) == 0x100) ||
  47575                                                 ((instr & 0x520) == 0x100) ||
  47576                                                 ((instr & 0x820) == 0x20) ||
  47577                                                 ((instr & 0x420) == 0x20) ||
  47578                                                 ((instr & 0x220) == 0x20) ||
  47579                                                 ((instr & 0x120) == 0x120)) {
  47580                                               UnallocatedA32(instr);
  47581                                               return;
  47582                                             }
  47583                                             unsigned cmode =
  47584                                                 ((instr >> 8) & 0xf) |
  47585                                                 ((instr >> 1) & 0x10);
  47586                                             DataType dt =
  47587                                                 ImmediateVmov::DecodeDt(cmode);
  47588                                             if (dt.Is(kDataTypeValueInvalid)) {
  47589                                               UnallocatedA32(instr);
  47590                                               return;
  47591                                             }
  47592                                             unsigned rd =
  47593                                                 ExtractDRegister(instr, 22, 12);
  47594                                             DOperand imm =
  47595                                                 ImmediateVmov::DecodeImmediate(
  47596                                                     cmode,
  47597                                                     (instr & 0xf) |
  47598                                                         ((instr >> 12) & 0x70) |
  47599                                                         ((instr >> 17) & 0x80));
  47600                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47601                                             vmov(al, dt, DRegister(rd), imm);
  47602                                             break;
  47603                                           }
  47604                                           case 0x00000e20: {
  47605                                             // 0xf2800e30
  47606                                             if (((instr & 0x920) == 0x100) ||
  47607                                                 ((instr & 0x520) == 0x100) ||
  47608                                                 ((instr & 0x820) == 0x20) ||
  47609                                                 ((instr & 0x420) == 0x20) ||
  47610                                                 ((instr & 0x220) == 0x20) ||
  47611                                                 ((instr & 0x120) == 0x120)) {
  47612                                               UnallocatedA32(instr);
  47613                                               return;
  47614                                             }
  47615                                             unsigned cmode =
  47616                                                 ((instr >> 8) & 0xf) |
  47617                                                 ((instr >> 1) & 0x10);
  47618                                             DataType dt =
  47619                                                 ImmediateVmov::DecodeDt(cmode);
  47620                                             if (dt.Is(kDataTypeValueInvalid)) {
  47621                                               UnallocatedA32(instr);
  47622                                               return;
  47623                                             }
  47624                                             unsigned rd =
  47625                                                 ExtractDRegister(instr, 22, 12);
  47626                                             DOperand imm =
  47627                                                 ImmediateVmov::DecodeImmediate(
  47628                                                     cmode,
  47629                                                     (instr & 0xf) |
  47630                                                         ((instr >> 12) & 0x70) |
  47631                                                         ((instr >> 17) & 0x80));
  47632                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47633                                             vmov(al, dt, DRegister(rd), imm);
  47634                                             break;
  47635                                           }
  47636                                           case 0x00000f00: {
  47637                                             // 0xf2800f10
  47638                                             if (((instr & 0x920) == 0x100) ||
  47639                                                 ((instr & 0x520) == 0x100) ||
  47640                                                 ((instr & 0x820) == 0x20) ||
  47641                                                 ((instr & 0x420) == 0x20) ||
  47642                                                 ((instr & 0x220) == 0x20) ||
  47643                                                 ((instr & 0x120) == 0x120)) {
  47644                                               UnallocatedA32(instr);
  47645                                               return;
  47646                                             }
  47647                                             unsigned cmode =
  47648                                                 ((instr >> 8) & 0xf) |
  47649                                                 ((instr >> 1) & 0x10);
  47650                                             DataType dt =
  47651                                                 ImmediateVmov::DecodeDt(cmode);
  47652                                             if (dt.Is(kDataTypeValueInvalid)) {
  47653                                               UnallocatedA32(instr);
  47654                                               return;
  47655                                             }
  47656                                             unsigned rd =
  47657                                                 ExtractDRegister(instr, 22, 12);
  47658                                             DOperand imm =
  47659                                                 ImmediateVmov::DecodeImmediate(
  47660                                                     cmode,
  47661                                                     (instr & 0xf) |
  47662                                                         ((instr >> 12) & 0x70) |
  47663                                                         ((instr >> 17) & 0x80));
  47664                                             // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47665                                             vmov(al, dt, DRegister(rd), imm);
  47666                                             break;
  47667                                           }
  47668                                           default:
  47669                                             UnallocatedA32(instr);
  47670                                             break;
  47671                                         }
  47672                                         break;
  47673                                       }
  47674                                       default: {
  47675                                         if (((instr & 0x920) == 0x100) ||
  47676                                             ((instr & 0x520) == 0x100) ||
  47677                                             ((instr & 0x820) == 0x20) ||
  47678                                             ((instr & 0x420) == 0x20) ||
  47679                                             ((instr & 0x220) == 0x20) ||
  47680                                             ((instr & 0x120) == 0x120)) {
  47681                                           UnallocatedA32(instr);
  47682                                           return;
  47683                                         }
  47684                                         unsigned cmode = ((instr >> 8) & 0xf) |
  47685                                                          ((instr >> 1) & 0x10);
  47686                                         DataType dt =
  47687                                             ImmediateVmov::DecodeDt(cmode);
  47688                                         if (dt.Is(kDataTypeValueInvalid)) {
  47689                                           UnallocatedA32(instr);
  47690                                           return;
  47691                                         }
  47692                                         unsigned rd =
  47693                                             ExtractDRegister(instr, 22, 12);
  47694                                         DOperand imm =
  47695                                             ImmediateVmov::DecodeImmediate(
  47696                                                 cmode,
  47697                                                 (instr & 0xf) |
  47698                                                     ((instr >> 12) & 0x70) |
  47699                                                     ((instr >> 17) & 0x80));
  47700                                         // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1
  47701                                         vmov(al, dt, DRegister(rd), imm);
  47702                                         break;
  47703                                       }
  47704                                     }
  47705                                     break;
  47706                                   }
  47707                                 }
  47708                                 break;
  47709                               }
  47710                               default:
  47711                                 UnallocatedA32(instr);
  47712                                 break;
  47713                             }
  47714                             break;
  47715                           }
  47716                           default: {
  47717                             if ((instr & 0x00000200) == 0x00000200) {
  47718                               if (((instr & 0x200000) == 0x0)) {
  47719                                 UnallocatedA32(instr);
  47720                                 return;
  47721                               }
  47722                               DataType dt1 = Dt_op_U_1_Decode1(
  47723                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
  47724                               if (dt1.Is(kDataTypeValueInvalid)) {
  47725                                 UnallocatedA32(instr);
  47726                                 return;
  47727                               }
  47728                               DataType dt2 = Dt_op_U_1_Decode2(
  47729                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
  47730                               if (dt2.Is(kDataTypeValueInvalid)) {
  47731                                 UnallocatedA32(instr);
  47732                                 return;
  47733                               }
  47734                               unsigned rd = ExtractDRegister(instr, 22, 12);
  47735                               unsigned rm = ExtractDRegister(instr, 5, 0);
  47736                               uint32_t fbits = 64 - ((instr >> 16) & 0x3f);
  47737                               // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
  47738                               vcvt(al,
  47739                                    dt1,
  47740                                    dt2,
  47741                                    DRegister(rd),
  47742                                    DRegister(rm),
  47743                                    fbits);
  47744                             } else {
  47745                               UnallocatedA32(instr);
  47746                             }
  47747                             break;
  47748                           }
  47749                         }
  47750                         break;
  47751                       }
  47752                       default:
  47753                         UnallocatedA32(instr);
  47754                         break;
  47755                     }
  47756                     break;
  47757                   }
  47758                 }
  47759                 break;
  47760               }
  47761               case 0x00000040: {
  47762                 // 0xf2800050
  47763                 switch (instr & 0x00000c00) {
  47764                   case 0x00000000: {
  47765                     // 0xf2800050
  47766                     switch (instr & 0x00380080) {
  47767                       case 0x00000000: {
  47768                         // 0xf2800050
  47769                         switch (instr & 0x00000100) {
  47770                           case 0x00000000: {
  47771                             // 0xf2800050
  47772                             switch (instr & 0x00000200) {
  47773                               default: {
  47774                                 switch (instr & 0x00000020) {
  47775                                   case 0x00000020: {
  47776                                     // 0xf2800070
  47777                                     if (((instr & 0xd00) == 0x100) ||
  47778                                         ((instr & 0xd00) == 0x500) ||
  47779                                         ((instr & 0xd00) == 0x900) ||
  47780                                         ((instr & 0xe00) == 0xe00)) {
  47781                                       UnallocatedA32(instr);
  47782                                       return;
  47783                                     }
  47784                                     unsigned cmode = (instr >> 8) & 0xf;
  47785                                     DataType dt =
  47786                                         ImmediateVmvn::DecodeDt(cmode);
  47787                                     if (dt.Is(kDataTypeValueInvalid)) {
  47788                                       UnallocatedA32(instr);
  47789                                       return;
  47790                                     }
  47791                                     if (((instr >> 12) & 1) != 0) {
  47792                                       UnallocatedA32(instr);
  47793                                       return;
  47794                                     }
  47795                                     unsigned rd =
  47796                                         ExtractQRegister(instr, 22, 12);
  47797                                     QOperand imm =
  47798                                         ImmediateVmvn::DecodeImmediate(
  47799                                             cmode,
  47800                                             (instr & 0xf) |
  47801                                                 ((instr >> 12) & 0x70) |
  47802                                                 ((instr >> 17) & 0x80));
  47803                                     // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
  47804                                     vmvn(al, dt, QRegister(rd), imm);
  47805                                     break;
  47806                                   }
  47807                                   default: {
  47808                                     if (((instr & 0x920) == 0x100) ||
  47809                                         ((instr & 0x520) == 0x100) ||
  47810                                         ((instr & 0x820) == 0x20) ||
  47811                                         ((instr & 0x420) == 0x20) ||
  47812                                         ((instr & 0x220) == 0x20) ||
  47813                                         ((instr & 0x120) == 0x120)) {
  47814                                       UnallocatedA32(instr);
  47815                                       return;
  47816                                     }
  47817                                     unsigned cmode = ((instr >> 8) & 0xf) |
  47818                                                      ((instr >> 1) & 0x10);
  47819                                     DataType dt =
  47820                                         ImmediateVmov::DecodeDt(cmode);
  47821                                     if (dt.Is(kDataTypeValueInvalid)) {
  47822                                       UnallocatedA32(instr);
  47823                                       return;
  47824                                     }
  47825                                     if (((instr >> 12) & 1) != 0) {
  47826                                       UnallocatedA32(instr);
  47827                                       return;
  47828                                     }
  47829                                     unsigned rd =
  47830                                         ExtractQRegister(instr, 22, 12);
  47831                                     QOperand imm =
  47832                                         ImmediateVmov::DecodeImmediate(
  47833                                             cmode,
  47834                                             (instr & 0xf) |
  47835                                                 ((instr >> 12) & 0x70) |
  47836                                                 ((instr >> 17) & 0x80));
  47837                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
  47838                                     vmov(al, dt, QRegister(rd), imm);
  47839                                     break;
  47840                                   }
  47841                                 }
  47842                                 break;
  47843                               }
  47844                             }
  47845                             break;
  47846                           }
  47847                           case 0x00000100: {
  47848                             // 0xf2800150
  47849                             switch (instr & 0x00000020) {
  47850                               case 0x00000000: {
  47851                                 // 0xf2800150
  47852                                 if (((instr & 0x100) == 0x0) ||
  47853                                     ((instr & 0xc00) == 0xc00)) {
  47854                                   UnallocatedA32(instr);
  47855                                   return;
  47856                                 }
  47857                                 unsigned cmode = (instr >> 8) & 0xf;
  47858                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
  47859                                 if (dt.Is(kDataTypeValueInvalid)) {
  47860                                   UnallocatedA32(instr);
  47861                                   return;
  47862                                 }
  47863                                 if (((instr >> 12) & 1) != 0) {
  47864                                   UnallocatedA32(instr);
  47865                                   return;
  47866                                 }
  47867                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  47868                                 QOperand imm = ImmediateVorr::DecodeImmediate(
  47869                                     cmode,
  47870                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
  47871                                         ((instr >> 17) & 0x80));
  47872                                 // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47873                                 vorr(al, dt, QRegister(rd), QRegister(rd), imm);
  47874                                 break;
  47875                               }
  47876                               case 0x00000020: {
  47877                                 // 0xf2800170
  47878                                 if (((instr & 0x100) == 0x0) ||
  47879                                     ((instr & 0xc00) == 0xc00)) {
  47880                                   UnallocatedA32(instr);
  47881                                   return;
  47882                                 }
  47883                                 unsigned cmode = (instr >> 8) & 0xf;
  47884                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
  47885                                 if (dt.Is(kDataTypeValueInvalid)) {
  47886                                   UnallocatedA32(instr);
  47887                                   return;
  47888                                 }
  47889                                 if (((instr >> 12) & 1) != 0) {
  47890                                   UnallocatedA32(instr);
  47891                                   return;
  47892                                 }
  47893                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  47894                                 QOperand imm = ImmediateVbic::DecodeImmediate(
  47895                                     cmode,
  47896                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
  47897                                         ((instr >> 17) & 0x80));
  47898                                 // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47899                                 vbic(al, dt, QRegister(rd), QRegister(rd), imm);
  47900                                 break;
  47901                               }
  47902                             }
  47903                             break;
  47904                           }
  47905                         }
  47906                         break;
  47907                       }
  47908                       default: {
  47909                         switch (instr & 0x00000300) {
  47910                           case 0x00000000: {
  47911                             // 0xf2800050
  47912                             if (((instr & 0x380080) == 0x0)) {
  47913                               UnallocatedA32(instr);
  47914                               return;
  47915                             }
  47916                             DataType dt =
  47917                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  47918                                                        ((instr >> 4) & 0x8),
  47919                                                    (instr >> 24) & 0x1);
  47920                             if (dt.Is(kDataTypeValueInvalid)) {
  47921                               UnallocatedA32(instr);
  47922                               return;
  47923                             }
  47924                             if (((instr >> 12) & 1) != 0) {
  47925                               UnallocatedA32(instr);
  47926                               return;
  47927                             }
  47928                             unsigned rd = ExtractQRegister(instr, 22, 12);
  47929                             if ((instr & 1) != 0) {
  47930                               UnallocatedA32(instr);
  47931                               return;
  47932                             }
  47933                             unsigned rm = ExtractQRegister(instr, 5, 0);
  47934                             uint32_t imm6 = (instr >> 16) & 0x3f;
  47935                             uint32_t imm =
  47936                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
  47937                                 imm6;
  47938                             // VSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47939                             vshr(al, dt, QRegister(rd), QRegister(rm), imm);
  47940                             break;
  47941                           }
  47942                           case 0x00000100: {
  47943                             // 0xf2800150
  47944                             if (((instr & 0x380080) == 0x0)) {
  47945                               UnallocatedA32(instr);
  47946                               return;
  47947                             }
  47948                             DataType dt =
  47949                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  47950                                                        ((instr >> 4) & 0x8),
  47951                                                    (instr >> 24) & 0x1);
  47952                             if (dt.Is(kDataTypeValueInvalid)) {
  47953                               UnallocatedA32(instr);
  47954                               return;
  47955                             }
  47956                             if (((instr >> 12) & 1) != 0) {
  47957                               UnallocatedA32(instr);
  47958                               return;
  47959                             }
  47960                             unsigned rd = ExtractQRegister(instr, 22, 12);
  47961                             if ((instr & 1) != 0) {
  47962                               UnallocatedA32(instr);
  47963                               return;
  47964                             }
  47965                             unsigned rm = ExtractQRegister(instr, 5, 0);
  47966                             uint32_t imm6 = (instr >> 16) & 0x3f;
  47967                             uint32_t imm =
  47968                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
  47969                                 imm6;
  47970                             // VSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  47971                             vsra(al, dt, QRegister(rd), QRegister(rm), imm);
  47972                             break;
  47973                           }
  47974                           case 0x00000200: {
  47975                             // 0xf2800250
  47976                             if (((instr & 0x380080) == 0x0)) {
  47977                               UnallocatedA32(instr);
  47978                               return;
  47979                             }
  47980                             DataType dt =
  47981                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  47982                                                        ((instr >> 4) & 0x8),
  47983                                                    (instr >> 24) & 0x1);
  47984                             if (dt.Is(kDataTypeValueInvalid)) {
  47985                               UnallocatedA32(instr);
  47986                               return;
  47987                             }
  47988                             if (((instr >> 12) & 1) != 0) {
  47989                               UnallocatedA32(instr);
  47990                               return;
  47991                             }
  47992                             unsigned rd = ExtractQRegister(instr, 22, 12);
  47993                             if ((instr & 1) != 0) {
  47994                               UnallocatedA32(instr);
  47995                               return;
  47996                             }
  47997                             unsigned rm = ExtractQRegister(instr, 5, 0);
  47998                             uint32_t imm6 = (instr >> 16) & 0x3f;
  47999                             uint32_t imm =
  48000                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
  48001                                 imm6;
  48002                             // VRSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48003                             vrshr(al, dt, QRegister(rd), QRegister(rm), imm);
  48004                             break;
  48005                           }
  48006                           case 0x00000300: {
  48007                             // 0xf2800350
  48008                             if (((instr & 0x380080) == 0x0)) {
  48009                               UnallocatedA32(instr);
  48010                               return;
  48011                             }
  48012                             DataType dt =
  48013                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  48014                                                        ((instr >> 4) & 0x8),
  48015                                                    (instr >> 24) & 0x1);
  48016                             if (dt.Is(kDataTypeValueInvalid)) {
  48017                               UnallocatedA32(instr);
  48018                               return;
  48019                             }
  48020                             if (((instr >> 12) & 1) != 0) {
  48021                               UnallocatedA32(instr);
  48022                               return;
  48023                             }
  48024                             unsigned rd = ExtractQRegister(instr, 22, 12);
  48025                             if ((instr & 1) != 0) {
  48026                               UnallocatedA32(instr);
  48027                               return;
  48028                             }
  48029                             unsigned rm = ExtractQRegister(instr, 5, 0);
  48030                             uint32_t imm6 = (instr >> 16) & 0x3f;
  48031                             uint32_t imm =
  48032                                 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
  48033                                 imm6;
  48034                             // VRSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48035                             vrsra(al, dt, QRegister(rd), QRegister(rm), imm);
  48036                             break;
  48037                           }
  48038                         }
  48039                         break;
  48040                       }
  48041                     }
  48042                     break;
  48043                   }
  48044                   case 0x00000400: {
  48045                     // 0xf2800450
  48046                     switch (instr & 0x00380080) {
  48047                       case 0x00000000: {
  48048                         // 0xf2800450
  48049                         switch (instr & 0x00000100) {
  48050                           case 0x00000000: {
  48051                             // 0xf2800450
  48052                             switch (instr & 0x00000200) {
  48053                               default: {
  48054                                 switch (instr & 0x00000020) {
  48055                                   case 0x00000020: {
  48056                                     // 0xf2800470
  48057                                     if (((instr & 0xd00) == 0x100) ||
  48058                                         ((instr & 0xd00) == 0x500) ||
  48059                                         ((instr & 0xd00) == 0x900) ||
  48060                                         ((instr & 0xe00) == 0xe00)) {
  48061                                       UnallocatedA32(instr);
  48062                                       return;
  48063                                     }
  48064                                     unsigned cmode = (instr >> 8) & 0xf;
  48065                                     DataType dt =
  48066                                         ImmediateVmvn::DecodeDt(cmode);
  48067                                     if (dt.Is(kDataTypeValueInvalid)) {
  48068                                       UnallocatedA32(instr);
  48069                                       return;
  48070                                     }
  48071                                     if (((instr >> 12) & 1) != 0) {
  48072                                       UnallocatedA32(instr);
  48073                                       return;
  48074                                     }
  48075                                     unsigned rd =
  48076                                         ExtractQRegister(instr, 22, 12);
  48077                                     QOperand imm =
  48078                                         ImmediateVmvn::DecodeImmediate(
  48079                                             cmode,
  48080                                             (instr & 0xf) |
  48081                                                 ((instr >> 12) & 0x70) |
  48082                                                 ((instr >> 17) & 0x80));
  48083                                     // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
  48084                                     vmvn(al, dt, QRegister(rd), imm);
  48085                                     break;
  48086                                   }
  48087                                   default: {
  48088                                     if (((instr & 0x920) == 0x100) ||
  48089                                         ((instr & 0x520) == 0x100) ||
  48090                                         ((instr & 0x820) == 0x20) ||
  48091                                         ((instr & 0x420) == 0x20) ||
  48092                                         ((instr & 0x220) == 0x20) ||
  48093                                         ((instr & 0x120) == 0x120)) {
  48094                                       UnallocatedA32(instr);
  48095                                       return;
  48096                                     }
  48097                                     unsigned cmode = ((instr >> 8) & 0xf) |
  48098                                                      ((instr >> 1) & 0x10);
  48099                                     DataType dt =
  48100                                         ImmediateVmov::DecodeDt(cmode);
  48101                                     if (dt.Is(kDataTypeValueInvalid)) {
  48102                                       UnallocatedA32(instr);
  48103                                       return;
  48104                                     }
  48105                                     if (((instr >> 12) & 1) != 0) {
  48106                                       UnallocatedA32(instr);
  48107                                       return;
  48108                                     }
  48109                                     unsigned rd =
  48110                                         ExtractQRegister(instr, 22, 12);
  48111                                     QOperand imm =
  48112                                         ImmediateVmov::DecodeImmediate(
  48113                                             cmode,
  48114                                             (instr & 0xf) |
  48115                                                 ((instr >> 12) & 0x70) |
  48116                                                 ((instr >> 17) & 0x80));
  48117                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
  48118                                     vmov(al, dt, QRegister(rd), imm);
  48119                                     break;
  48120                                   }
  48121                                 }
  48122                                 break;
  48123                               }
  48124                             }
  48125                             break;
  48126                           }
  48127                           case 0x00000100: {
  48128                             // 0xf2800550
  48129                             switch (instr & 0x00000020) {
  48130                               case 0x00000000: {
  48131                                 // 0xf2800550
  48132                                 if (((instr & 0x100) == 0x0) ||
  48133                                     ((instr & 0xc00) == 0xc00)) {
  48134                                   UnallocatedA32(instr);
  48135                                   return;
  48136                                 }
  48137                                 unsigned cmode = (instr >> 8) & 0xf;
  48138                                 DataType dt = ImmediateVorr::DecodeDt(cmode);
  48139                                 if (dt.Is(kDataTypeValueInvalid)) {
  48140                                   UnallocatedA32(instr);
  48141                                   return;
  48142                                 }
  48143                                 if (((instr >> 12) & 1) != 0) {
  48144                                   UnallocatedA32(instr);
  48145                                   return;
  48146                                 }
  48147                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  48148                                 QOperand imm = ImmediateVorr::DecodeImmediate(
  48149                                     cmode,
  48150                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
  48151                                         ((instr >> 17) & 0x80));
  48152                                 // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48153                                 vorr(al, dt, QRegister(rd), QRegister(rd), imm);
  48154                                 break;
  48155                               }
  48156                               case 0x00000020: {
  48157                                 // 0xf2800570
  48158                                 if (((instr & 0x100) == 0x0) ||
  48159                                     ((instr & 0xc00) == 0xc00)) {
  48160                                   UnallocatedA32(instr);
  48161                                   return;
  48162                                 }
  48163                                 unsigned cmode = (instr >> 8) & 0xf;
  48164                                 DataType dt = ImmediateVbic::DecodeDt(cmode);
  48165                                 if (dt.Is(kDataTypeValueInvalid)) {
  48166                                   UnallocatedA32(instr);
  48167                                   return;
  48168                                 }
  48169                                 if (((instr >> 12) & 1) != 0) {
  48170                                   UnallocatedA32(instr);
  48171                                   return;
  48172                                 }
  48173                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  48174                                 QOperand imm = ImmediateVbic::DecodeImmediate(
  48175                                     cmode,
  48176                                     (instr & 0xf) | ((instr >> 12) & 0x70) |
  48177                                         ((instr >> 17) & 0x80));
  48178                                 // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48179                                 vbic(al, dt, QRegister(rd), QRegister(rd), imm);
  48180                                 break;
  48181                               }
  48182                             }
  48183                             break;
  48184                           }
  48185                         }
  48186                         break;
  48187                       }
  48188                       default: {
  48189                         switch (instr & 0x00000300) {
  48190                           case 0x00000000: {
  48191                             // 0xf2800450
  48192                             if ((instr & 0x01000000) == 0x01000000) {
  48193                               if (((instr & 0x380080) == 0x0)) {
  48194                                 UnallocatedA32(instr);
  48195                                 return;
  48196                               }
  48197                               DataType dt = Dt_L_imm6_4_Decode(
  48198                                   ((instr >> 19) & 0x7) | ((instr >> 4) & 0x8));
  48199                               if (dt.Is(kDataTypeValueInvalid)) {
  48200                                 UnallocatedA32(instr);
  48201                                 return;
  48202                               }
  48203                               if (((instr >> 12) & 1) != 0) {
  48204                                 UnallocatedA32(instr);
  48205                                 return;
  48206                               }
  48207                               unsigned rd = ExtractQRegister(instr, 22, 12);
  48208                               if ((instr & 1) != 0) {
  48209                                 UnallocatedA32(instr);
  48210                                 return;
  48211                               }
  48212                               unsigned rm = ExtractQRegister(instr, 5, 0);
  48213                               uint32_t imm6 = (instr >> 16) & 0x3f;
  48214                               uint32_t imm =
  48215                                   (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) -
  48216                                   imm6;
  48217                               // VSRI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; A1
  48218                               vsri(al, dt, QRegister(rd), QRegister(rm), imm);
  48219                             } else {
  48220                               UnallocatedA32(instr);
  48221                             }
  48222                             break;
  48223                           }
  48224                           case 0x00000100: {
  48225                             // 0xf2800550
  48226                             switch (instr & 0x01000000) {
  48227                               case 0x00000000: {
  48228                                 // 0xf2800550
  48229                                 if (((instr & 0x380080) == 0x0)) {
  48230                                   UnallocatedA32(instr);
  48231                                   return;
  48232                                 }
  48233                                 DataType dt =
  48234                                     Dt_L_imm6_3_Decode(((instr >> 19) & 0x7) |
  48235                                                        ((instr >> 4) & 0x8));
  48236                                 if (dt.Is(kDataTypeValueInvalid)) {
  48237                                   UnallocatedA32(instr);
  48238                                   return;
  48239                                 }
  48240                                 if (((instr >> 12) & 1) != 0) {
  48241                                   UnallocatedA32(instr);
  48242                                   return;
  48243                                 }
  48244                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  48245                                 if ((instr & 1) != 0) {
  48246                                   UnallocatedA32(instr);
  48247                                   return;
  48248                                 }
  48249                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  48250                                 uint32_t imm6 = (instr >> 16) & 0x3f;
  48251                                 uint32_t imm =
  48252                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
  48253                                 // VSHL{<c>}{<q>}.I<size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48254                                 vshl(al, dt, QRegister(rd), QRegister(rm), imm);
  48255                                 break;
  48256                               }
  48257                               case 0x01000000: {
  48258                                 // 0xf3800550
  48259                                 if (((instr & 0x380080) == 0x0)) {
  48260                                   UnallocatedA32(instr);
  48261                                   return;
  48262                                 }
  48263                                 DataType dt =
  48264                                     Dt_L_imm6_4_Decode(((instr >> 19) & 0x7) |
  48265                                                        ((instr >> 4) & 0x8));
  48266                                 if (dt.Is(kDataTypeValueInvalid)) {
  48267                                   UnallocatedA32(instr);
  48268                                   return;
  48269                                 }
  48270                                 if (((instr >> 12) & 1) != 0) {
  48271                                   UnallocatedA32(instr);
  48272                                   return;
  48273                                 }
  48274                                 unsigned rd = ExtractQRegister(instr, 22, 12);
  48275                                 if ((instr & 1) != 0) {
  48276                                   UnallocatedA32(instr);
  48277                                   return;
  48278                                 }
  48279                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  48280                                 uint32_t imm6 = (instr >> 16) & 0x3f;
  48281                                 uint32_t imm =
  48282                                     imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
  48283                                 // VSLI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; A1
  48284                                 vsli(al, dt, QRegister(rd), QRegister(rm), imm);
  48285                                 break;
  48286                               }
  48287                             }
  48288                             break;
  48289                           }
  48290                           case 0x00000200: {
  48291                             // 0xf2800650
  48292                             if (((instr & 0x380080) == 0x0)) {
  48293                               UnallocatedA32(instr);
  48294                               return;
  48295                             }
  48296                             DataType dt =
  48297                                 Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) |
  48298                                                        ((instr >> 4) & 0x8),
  48299                                                    (instr >> 24) & 0x1);
  48300                             if (dt.Is(kDataTypeValueInvalid)) {
  48301                               UnallocatedA32(instr);
  48302                               return;
  48303                             }
  48304                             if (((instr >> 12) & 1) != 0) {
  48305                               UnallocatedA32(instr);
  48306                               return;
  48307                             }
  48308                             unsigned rd = ExtractQRegister(instr, 22, 12);
  48309                             if ((instr & 1) != 0) {
  48310                               UnallocatedA32(instr);
  48311                               return;
  48312                             }
  48313                             unsigned rm = ExtractQRegister(instr, 5, 0);
  48314                             uint32_t imm6 = (instr >> 16) & 0x3f;
  48315                             uint32_t imm =
  48316                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
  48317                             // VQSHLU{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48318                             vqshlu(al, dt, QRegister(rd), QRegister(rm), imm);
  48319                             break;
  48320                           }
  48321                           case 0x00000300: {
  48322                             // 0xf2800750
  48323                             if (((instr & 0x380080) == 0x0)) {
  48324                               UnallocatedA32(instr);
  48325                               return;
  48326                             }
  48327                             DataType dt =
  48328                                 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) |
  48329                                                        ((instr >> 4) & 0x8),
  48330                                                    (instr >> 24) & 0x1);
  48331                             if (dt.Is(kDataTypeValueInvalid)) {
  48332                               UnallocatedA32(instr);
  48333                               return;
  48334                             }
  48335                             if (((instr >> 12) & 1) != 0) {
  48336                               UnallocatedA32(instr);
  48337                               return;
  48338                             }
  48339                             unsigned rd = ExtractQRegister(instr, 22, 12);
  48340                             if ((instr & 1) != 0) {
  48341                               UnallocatedA32(instr);
  48342                               return;
  48343                             }
  48344                             unsigned rm = ExtractQRegister(instr, 5, 0);
  48345                             uint32_t imm6 = (instr >> 16) & 0x3f;
  48346                             uint32_t imm =
  48347                                 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize());
  48348                             // VQSHL{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48349                             vqshl(al, dt, QRegister(rd), QRegister(rm), imm);
  48350                             break;
  48351                           }
  48352                         }
  48353                         break;
  48354                       }
  48355                     }
  48356                     break;
  48357                   }
  48358                   case 0x00000800: {
  48359                     // 0xf2800850
  48360                     switch (instr & 0x00000080) {
  48361                       case 0x00000000: {
  48362                         // 0xf2800850
  48363                         switch (instr & 0x00380000) {
  48364                           case 0x00000000: {
  48365                             // 0xf2800850
  48366                             switch (instr & 0x00000100) {
  48367                               case 0x00000000: {
  48368                                 // 0xf2800850
  48369                                 switch (instr & 0x00000200) {
  48370                                   default: {
  48371                                     switch (instr & 0x00000020) {
  48372                                       case 0x00000020: {
  48373                                         // 0xf2800870
  48374                                         if (((instr & 0xd00) == 0x100) ||
  48375                                             ((instr & 0xd00) == 0x500) ||
  48376                                             ((instr & 0xd00) == 0x900) ||
  48377                                             ((instr & 0xe00) == 0xe00)) {
  48378                                           UnallocatedA32(instr);
  48379                                           return;
  48380                                         }
  48381                                         unsigned cmode = (instr >> 8) & 0xf;
  48382                                         DataType dt =
  48383                                             ImmediateVmvn::DecodeDt(cmode);
  48384                                         if (dt.Is(kDataTypeValueInvalid)) {
  48385                                           UnallocatedA32(instr);
  48386                                           return;
  48387                                         }
  48388                                         if (((instr >> 12) & 1) != 0) {
  48389                                           UnallocatedA32(instr);
  48390                                           return;
  48391                                         }
  48392                                         unsigned rd =
  48393                                             ExtractQRegister(instr, 22, 12);
  48394                                         QOperand imm =
  48395                                             ImmediateVmvn::DecodeImmediate(
  48396                                                 cmode,
  48397                                                 (instr & 0xf) |
  48398                                                     ((instr >> 12) & 0x70) |
  48399                                                     ((instr >> 17) & 0x80));
  48400                                         // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
  48401                                         vmvn(al, dt, QRegister(rd), imm);
  48402                                         break;
  48403                                       }
  48404                                       default: {
  48405                                         if (((instr & 0x920) == 0x100) ||
  48406                                             ((instr & 0x520) == 0x100) ||
  48407                                             ((instr & 0x820) == 0x20) ||
  48408                                             ((instr & 0x420) == 0x20) ||
  48409                                             ((instr & 0x220) == 0x20) ||
  48410                                             ((instr & 0x120) == 0x120)) {
  48411                                           UnallocatedA32(instr);
  48412                                           return;
  48413                                         }
  48414                                         unsigned cmode = ((instr >> 8) & 0xf) |
  48415                                                          ((instr >> 1) & 0x10);
  48416                                         DataType dt =
  48417                                             ImmediateVmov::DecodeDt(cmode);
  48418                                         if (dt.Is(kDataTypeValueInvalid)) {
  48419                                           UnallocatedA32(instr);
  48420                                           return;
  48421                                         }
  48422                                         if (((instr >> 12) & 1) != 0) {
  48423                                           UnallocatedA32(instr);
  48424                                           return;
  48425                                         }
  48426                                         unsigned rd =
  48427                                             ExtractQRegister(instr, 22, 12);
  48428                                         QOperand imm =
  48429                                             ImmediateVmov::DecodeImmediate(
  48430                                                 cmode,
  48431                                                 (instr & 0xf) |
  48432                                                     ((instr >> 12) & 0x70) |
  48433                                                     ((instr >> 17) & 0x80));
  48434                                         // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
  48435                                         vmov(al, dt, QRegister(rd), imm);
  48436                                         break;
  48437                                       }
  48438                                     }
  48439                                     break;
  48440                                   }
  48441                                 }
  48442                                 break;
  48443                               }
  48444                               case 0x00000100: {
  48445                                 // 0xf2800950
  48446                                 switch (instr & 0x00000020) {
  48447                                   case 0x00000000: {
  48448                                     // 0xf2800950
  48449                                     if (((instr & 0x100) == 0x0) ||
  48450                                         ((instr & 0xc00) == 0xc00)) {
  48451                                       UnallocatedA32(instr);
  48452                                       return;
  48453                                     }
  48454                                     unsigned cmode = (instr >> 8) & 0xf;
  48455                                     DataType dt =
  48456                                         ImmediateVorr::DecodeDt(cmode);
  48457                                     if (dt.Is(kDataTypeValueInvalid)) {
  48458                                       UnallocatedA32(instr);
  48459                                       return;
  48460                                     }
  48461                                     if (((instr >> 12) & 1) != 0) {
  48462                                       UnallocatedA32(instr);
  48463                                       return;
  48464                                     }
  48465                                     unsigned rd =
  48466                                         ExtractQRegister(instr, 22, 12);
  48467                                     QOperand imm =
  48468                                         ImmediateVorr::DecodeImmediate(
  48469                                             cmode,
  48470                                             (instr & 0xf) |
  48471                                                 ((instr >> 12) & 0x70) |
  48472                                                 ((instr >> 17) & 0x80));
  48473                                     // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48474                                     vorr(al,
  48475                                          dt,
  48476                                          QRegister(rd),
  48477                                          QRegister(rd),
  48478                                          imm);
  48479                                     break;
  48480                                   }
  48481                                   case 0x00000020: {
  48482                                     // 0xf2800970
  48483                                     if (((instr & 0x100) == 0x0) ||
  48484                                         ((instr & 0xc00) == 0xc00)) {
  48485                                       UnallocatedA32(instr);
  48486                                       return;
  48487                                     }
  48488                                     unsigned cmode = (instr >> 8) & 0xf;
  48489                                     DataType dt =
  48490                                         ImmediateVbic::DecodeDt(cmode);
  48491                                     if (dt.Is(kDataTypeValueInvalid)) {
  48492                                       UnallocatedA32(instr);
  48493                                       return;
  48494                                     }
  48495                                     if (((instr >> 12) & 1) != 0) {
  48496                                       UnallocatedA32(instr);
  48497                                       return;
  48498                                     }
  48499                                     unsigned rd =
  48500                                         ExtractQRegister(instr, 22, 12);
  48501                                     QOperand imm =
  48502                                         ImmediateVbic::DecodeImmediate(
  48503                                             cmode,
  48504                                             (instr & 0xf) |
  48505                                                 ((instr >> 12) & 0x70) |
  48506                                                 ((instr >> 17) & 0x80));
  48507                                     // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48508                                     vbic(al,
  48509                                          dt,
  48510                                          QRegister(rd),
  48511                                          QRegister(rd),
  48512                                          imm);
  48513                                     break;
  48514                                   }
  48515                                 }
  48516                                 break;
  48517                               }
  48518                             }
  48519                             break;
  48520                           }
  48521                           default: {
  48522                             switch (instr & 0x00000300) {
  48523                               case 0x00000000: {
  48524                                 // 0xf2800850
  48525                                 switch (instr & 0x01000000) {
  48526                                   case 0x00000000: {
  48527                                     // 0xf2800850
  48528                                     if (((instr & 0x380000) == 0x0)) {
  48529                                       UnallocatedA32(instr);
  48530                                       return;
  48531                                     }
  48532                                     DataType dt =
  48533                                         Dt_imm6_3_Decode((instr >> 19) & 0x7);
  48534                                     if (dt.Is(kDataTypeValueInvalid)) {
  48535                                       UnallocatedA32(instr);
  48536                                       return;
  48537                                     }
  48538                                     unsigned rd =
  48539                                         ExtractDRegister(instr, 22, 12);
  48540                                     if ((instr & 1) != 0) {
  48541                                       UnallocatedA32(instr);
  48542                                       return;
  48543                                     }
  48544                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  48545                                     uint32_t imm6 = (instr >> 16) & 0x3f;
  48546                                     uint32_t imm = dt.GetSize() - imm6;
  48547                                     // VRSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48548                                     vrshrn(al,
  48549                                            dt,
  48550                                            DRegister(rd),
  48551                                            QRegister(rm),
  48552                                            imm);
  48553                                     break;
  48554                                   }
  48555                                   case 0x01000000: {
  48556                                     // 0xf3800850
  48557                                     if (((instr & 0x380000) == 0x0)) {
  48558                                       UnallocatedA32(instr);
  48559                                       return;
  48560                                     }
  48561                                     DataType dt =
  48562                                         Dt_imm6_2_Decode((instr >> 19) & 0x7,
  48563                                                          (instr >> 24) & 0x1);
  48564                                     if (dt.Is(kDataTypeValueInvalid)) {
  48565                                       UnallocatedA32(instr);
  48566                                       return;
  48567                                     }
  48568                                     unsigned rd =
  48569                                         ExtractDRegister(instr, 22, 12);
  48570                                     if ((instr & 1) != 0) {
  48571                                       UnallocatedA32(instr);
  48572                                       return;
  48573                                     }
  48574                                     unsigned rm = ExtractQRegister(instr, 5, 0);
  48575                                     uint32_t imm6 = (instr >> 16) & 0x3f;
  48576                                     uint32_t imm = dt.GetSize() - imm6;
  48577                                     // VQRSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48578                                     vqrshrun(al,
  48579                                              dt,
  48580                                              DRegister(rd),
  48581                                              QRegister(rm),
  48582                                              imm);
  48583                                     break;
  48584                                   }
  48585                                 }
  48586                                 break;
  48587                               }
  48588                               case 0x00000100: {
  48589                                 // 0xf2800950
  48590                                 if (((instr & 0x380000) == 0x0)) {
  48591                                   UnallocatedA32(instr);
  48592                                   return;
  48593                                 }
  48594                                 DataType dt =
  48595                                     Dt_imm6_1_Decode((instr >> 19) & 0x7,
  48596                                                      (instr >> 24) & 0x1);
  48597                                 if (dt.Is(kDataTypeValueInvalid)) {
  48598                                   UnallocatedA32(instr);
  48599                                   return;
  48600                                 }
  48601                                 unsigned rd = ExtractDRegister(instr, 22, 12);
  48602                                 if ((instr & 1) != 0) {
  48603                                   UnallocatedA32(instr);
  48604                                   return;
  48605                                 }
  48606                                 unsigned rm = ExtractQRegister(instr, 5, 0);
  48607                                 uint32_t imm6 = (instr >> 16) & 0x3f;
  48608                                 uint32_t imm = dt.GetSize() - imm6;
  48609                                 // VQRSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48610                                 vqrshrn(al,
  48611                                         dt,
  48612                                         DRegister(rd),
  48613                                         QRegister(rm),
  48614                                         imm);
  48615                                 break;
  48616                               }
  48617                               default:
  48618                                 UnallocatedA32(instr);
  48619                                 break;
  48620                             }
  48621                             break;
  48622                           }
  48623                         }
  48624                         break;
  48625                       }
  48626                       default:
  48627                         UnallocatedA32(instr);
  48628                         break;
  48629                     }
  48630                     break;
  48631                   }
  48632                   case 0x00000c00: {
  48633                     // 0xf2800c50
  48634                     switch (instr & 0x00000080) {
  48635                       case 0x00000000: {
  48636                         // 0xf2800c50
  48637                         switch (instr & 0x00200000) {
  48638                           case 0x00000000: {
  48639                             // 0xf2800c50
  48640                             switch (instr & 0x00180000) {
  48641                               case 0x00000000: {
  48642                                 // 0xf2800c50
  48643                                 switch (instr & 0x00000300) {
  48644                                   case 0x00000200: {
  48645                                     // 0xf2800e50
  48646                                     if (((instr & 0x920) == 0x100) ||
  48647                                         ((instr & 0x520) == 0x100) ||
  48648                                         ((instr & 0x820) == 0x20) ||
  48649                                         ((instr & 0x420) == 0x20) ||
  48650                                         ((instr & 0x220) == 0x20) ||
  48651                                         ((instr & 0x120) == 0x120)) {
  48652                                       UnallocatedA32(instr);
  48653                                       return;
  48654                                     }
  48655                                     unsigned cmode = ((instr >> 8) & 0xf) |
  48656                                                      ((instr >> 1) & 0x10);
  48657                                     DataType dt =
  48658                                         ImmediateVmov::DecodeDt(cmode);
  48659                                     if (dt.Is(kDataTypeValueInvalid)) {
  48660                                       UnallocatedA32(instr);
  48661                                       return;
  48662                                     }
  48663                                     if (((instr >> 12) & 1) != 0) {
  48664                                       UnallocatedA32(instr);
  48665                                       return;
  48666                                     }
  48667                                     unsigned rd =
  48668                                         ExtractQRegister(instr, 22, 12);
  48669                                     QOperand imm =
  48670                                         ImmediateVmov::DecodeImmediate(
  48671                                             cmode,
  48672                                             (instr & 0xf) |
  48673                                                 ((instr >> 12) & 0x70) |
  48674                                                 ((instr >> 17) & 0x80));
  48675                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
  48676                                     vmov(al, dt, QRegister(rd), imm);
  48677                                     break;
  48678                                   }
  48679                                   case 0x00000300: {
  48680                                     // 0xf2800f50
  48681                                     if (((instr & 0x920) == 0x100) ||
  48682                                         ((instr & 0x520) == 0x100) ||
  48683                                         ((instr & 0x820) == 0x20) ||
  48684                                         ((instr & 0x420) == 0x20) ||
  48685                                         ((instr & 0x220) == 0x20) ||
  48686                                         ((instr & 0x120) == 0x120)) {
  48687                                       UnallocatedA32(instr);
  48688                                       return;
  48689                                     }
  48690                                     unsigned cmode = ((instr >> 8) & 0xf) |
  48691                                                      ((instr >> 1) & 0x10);
  48692                                     DataType dt =
  48693                                         ImmediateVmov::DecodeDt(cmode);
  48694                                     if (dt.Is(kDataTypeValueInvalid)) {
  48695                                       UnallocatedA32(instr);
  48696                                       return;
  48697                                     }
  48698                                     if (((instr >> 12) & 1) != 0) {
  48699                                       UnallocatedA32(instr);
  48700                                       return;
  48701                                     }
  48702                                     unsigned rd =
  48703                                         ExtractQRegister(instr, 22, 12);
  48704                                     QOperand imm =
  48705                                         ImmediateVmov::DecodeImmediate(
  48706                                             cmode,
  48707                                             (instr & 0xf) |
  48708                                                 ((instr >> 12) & 0x70) |
  48709                                                 ((instr >> 17) & 0x80));
  48710                                     // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
  48711                                     vmov(al, dt, QRegister(rd), imm);
  48712                                     break;
  48713                                   }
  48714                                   default: {
  48715                                     switch (instr & 0x00000020) {
  48716                                       case 0x00000020: {
  48717                                         // 0xf2800c70
  48718                                         switch (instr & 0x00000f20) {
  48719                                           case 0x00000000: {
  48720                                             // 0xf2800c50
  48721                                             if (((instr & 0x920) == 0x100) ||
  48722                                                 ((instr & 0x520) == 0x100) ||
  48723                                                 ((instr & 0x820) == 0x20) ||
  48724                                                 ((instr & 0x420) == 0x20) ||
  48725                                                 ((instr & 0x220) == 0x20) ||
  48726                                                 ((instr & 0x120) == 0x120)) {
  48727                                               UnallocatedA32(instr);
  48728                                               return;
  48729                                             }
  48730                                             unsigned cmode =
  48731                                                 ((instr >> 8) & 0xf) |
  48732                                                 ((instr >> 1) & 0x10);
  48733                                             DataType dt =
  48734                                                 ImmediateVmov::DecodeDt(cmode);
  48735                                             if (dt.Is(kDataTypeValueInvalid)) {
  48736                                               UnallocatedA32(instr);
  48737                                               return;
  48738                                             }
  48739                                             if (((instr >> 12) & 1) != 0) {
  48740                                               UnallocatedA32(instr);
  48741                                               return;
  48742                                             }
  48743                                             unsigned rd =
  48744                                                 ExtractQRegister(instr, 22, 12);
  48745                                             QOperand imm =
  48746                                                 ImmediateVmov::DecodeImmediate(
  48747                                                     cmode,
  48748                                                     (instr & 0xf) |
  48749                                                         ((instr >> 12) & 0x70) |
  48750                                                         ((instr >> 17) & 0x80));
  48751                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48752                                             vmov(al, dt, QRegister(rd), imm);
  48753                                             break;
  48754                                           }
  48755                                           case 0x00000020: {
  48756                                             // 0xf2800c70
  48757                                             if (((instr & 0xd00) == 0x100) ||
  48758                                                 ((instr & 0xd00) == 0x500) ||
  48759                                                 ((instr & 0xd00) == 0x900) ||
  48760                                                 ((instr & 0xe00) == 0xe00)) {
  48761                                               UnallocatedA32(instr);
  48762                                               return;
  48763                                             }
  48764                                             unsigned cmode = (instr >> 8) & 0xf;
  48765                                             DataType dt =
  48766                                                 ImmediateVmvn::DecodeDt(cmode);
  48767                                             if (dt.Is(kDataTypeValueInvalid)) {
  48768                                               UnallocatedA32(instr);
  48769                                               return;
  48770                                             }
  48771                                             if (((instr >> 12) & 1) != 0) {
  48772                                               UnallocatedA32(instr);
  48773                                               return;
  48774                                             }
  48775                                             unsigned rd =
  48776                                                 ExtractQRegister(instr, 22, 12);
  48777                                             QOperand imm =
  48778                                                 ImmediateVmvn::DecodeImmediate(
  48779                                                     cmode,
  48780                                                     (instr & 0xf) |
  48781                                                         ((instr >> 12) & 0x70) |
  48782                                                         ((instr >> 17) & 0x80));
  48783                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48784                                             vmvn(al, dt, QRegister(rd), imm);
  48785                                             break;
  48786                                           }
  48787                                           case 0x00000200: {
  48788                                             // 0xf2800e50
  48789                                             if (((instr & 0x920) == 0x100) ||
  48790                                                 ((instr & 0x520) == 0x100) ||
  48791                                                 ((instr & 0x820) == 0x20) ||
  48792                                                 ((instr & 0x420) == 0x20) ||
  48793                                                 ((instr & 0x220) == 0x20) ||
  48794                                                 ((instr & 0x120) == 0x120)) {
  48795                                               UnallocatedA32(instr);
  48796                                               return;
  48797                                             }
  48798                                             unsigned cmode =
  48799                                                 ((instr >> 8) & 0xf) |
  48800                                                 ((instr >> 1) & 0x10);
  48801                                             DataType dt =
  48802                                                 ImmediateVmov::DecodeDt(cmode);
  48803                                             if (dt.Is(kDataTypeValueInvalid)) {
  48804                                               UnallocatedA32(instr);
  48805                                               return;
  48806                                             }
  48807                                             if (((instr >> 12) & 1) != 0) {
  48808                                               UnallocatedA32(instr);
  48809                                               return;
  48810                                             }
  48811                                             unsigned rd =
  48812                                                 ExtractQRegister(instr, 22, 12);
  48813                                             QOperand imm =
  48814                                                 ImmediateVmov::DecodeImmediate(
  48815                                                     cmode,
  48816                                                     (instr & 0xf) |
  48817                                                         ((instr >> 12) & 0x70) |
  48818                                                         ((instr >> 17) & 0x80));
  48819                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48820                                             vmov(al, dt, QRegister(rd), imm);
  48821                                             break;
  48822                                           }
  48823                                           case 0x00000220: {
  48824                                             // 0xf2800e70
  48825                                             if (((instr & 0xd00) == 0x100) ||
  48826                                                 ((instr & 0xd00) == 0x500) ||
  48827                                                 ((instr & 0xd00) == 0x900) ||
  48828                                                 ((instr & 0xe00) == 0xe00)) {
  48829                                               UnallocatedA32(instr);
  48830                                               return;
  48831                                             }
  48832                                             unsigned cmode = (instr >> 8) & 0xf;
  48833                                             DataType dt =
  48834                                                 ImmediateVmvn::DecodeDt(cmode);
  48835                                             if (dt.Is(kDataTypeValueInvalid)) {
  48836                                               UnallocatedA32(instr);
  48837                                               return;
  48838                                             }
  48839                                             if (((instr >> 12) & 1) != 0) {
  48840                                               UnallocatedA32(instr);
  48841                                               return;
  48842                                             }
  48843                                             unsigned rd =
  48844                                                 ExtractQRegister(instr, 22, 12);
  48845                                             QOperand imm =
  48846                                                 ImmediateVmvn::DecodeImmediate(
  48847                                                     cmode,
  48848                                                     (instr & 0xf) |
  48849                                                         ((instr >> 12) & 0x70) |
  48850                                                         ((instr >> 17) & 0x80));
  48851                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48852                                             vmvn(al, dt, QRegister(rd), imm);
  48853                                             break;
  48854                                           }
  48855                                           case 0x00000400: {
  48856                                             // 0xf2800c50
  48857                                             if (((instr & 0x920) == 0x100) ||
  48858                                                 ((instr & 0x520) == 0x100) ||
  48859                                                 ((instr & 0x820) == 0x20) ||
  48860                                                 ((instr & 0x420) == 0x20) ||
  48861                                                 ((instr & 0x220) == 0x20) ||
  48862                                                 ((instr & 0x120) == 0x120)) {
  48863                                               UnallocatedA32(instr);
  48864                                               return;
  48865                                             }
  48866                                             unsigned cmode =
  48867                                                 ((instr >> 8) & 0xf) |
  48868                                                 ((instr >> 1) & 0x10);
  48869                                             DataType dt =
  48870                                                 ImmediateVmov::DecodeDt(cmode);
  48871                                             if (dt.Is(kDataTypeValueInvalid)) {
  48872                                               UnallocatedA32(instr);
  48873                                               return;
  48874                                             }
  48875                                             if (((instr >> 12) & 1) != 0) {
  48876                                               UnallocatedA32(instr);
  48877                                               return;
  48878                                             }
  48879                                             unsigned rd =
  48880                                                 ExtractQRegister(instr, 22, 12);
  48881                                             QOperand imm =
  48882                                                 ImmediateVmov::DecodeImmediate(
  48883                                                     cmode,
  48884                                                     (instr & 0xf) |
  48885                                                         ((instr >> 12) & 0x70) |
  48886                                                         ((instr >> 17) & 0x80));
  48887                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48888                                             vmov(al, dt, QRegister(rd), imm);
  48889                                             break;
  48890                                           }
  48891                                           case 0x00000420: {
  48892                                             // 0xf2800c70
  48893                                             if (((instr & 0xd00) == 0x100) ||
  48894                                                 ((instr & 0xd00) == 0x500) ||
  48895                                                 ((instr & 0xd00) == 0x900) ||
  48896                                                 ((instr & 0xe00) == 0xe00)) {
  48897                                               UnallocatedA32(instr);
  48898                                               return;
  48899                                             }
  48900                                             unsigned cmode = (instr >> 8) & 0xf;
  48901                                             DataType dt =
  48902                                                 ImmediateVmvn::DecodeDt(cmode);
  48903                                             if (dt.Is(kDataTypeValueInvalid)) {
  48904                                               UnallocatedA32(instr);
  48905                                               return;
  48906                                             }
  48907                                             if (((instr >> 12) & 1) != 0) {
  48908                                               UnallocatedA32(instr);
  48909                                               return;
  48910                                             }
  48911                                             unsigned rd =
  48912                                                 ExtractQRegister(instr, 22, 12);
  48913                                             QOperand imm =
  48914                                                 ImmediateVmvn::DecodeImmediate(
  48915                                                     cmode,
  48916                                                     (instr & 0xf) |
  48917                                                         ((instr >> 12) & 0x70) |
  48918                                                         ((instr >> 17) & 0x80));
  48919                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48920                                             vmvn(al, dt, QRegister(rd), imm);
  48921                                             break;
  48922                                           }
  48923                                           case 0x00000600: {
  48924                                             // 0xf2800e50
  48925                                             if (((instr & 0x920) == 0x100) ||
  48926                                                 ((instr & 0x520) == 0x100) ||
  48927                                                 ((instr & 0x820) == 0x20) ||
  48928                                                 ((instr & 0x420) == 0x20) ||
  48929                                                 ((instr & 0x220) == 0x20) ||
  48930                                                 ((instr & 0x120) == 0x120)) {
  48931                                               UnallocatedA32(instr);
  48932                                               return;
  48933                                             }
  48934                                             unsigned cmode =
  48935                                                 ((instr >> 8) & 0xf) |
  48936                                                 ((instr >> 1) & 0x10);
  48937                                             DataType dt =
  48938                                                 ImmediateVmov::DecodeDt(cmode);
  48939                                             if (dt.Is(kDataTypeValueInvalid)) {
  48940                                               UnallocatedA32(instr);
  48941                                               return;
  48942                                             }
  48943                                             if (((instr >> 12) & 1) != 0) {
  48944                                               UnallocatedA32(instr);
  48945                                               return;
  48946                                             }
  48947                                             unsigned rd =
  48948                                                 ExtractQRegister(instr, 22, 12);
  48949                                             QOperand imm =
  48950                                                 ImmediateVmov::DecodeImmediate(
  48951                                                     cmode,
  48952                                                     (instr & 0xf) |
  48953                                                         ((instr >> 12) & 0x70) |
  48954                                                         ((instr >> 17) & 0x80));
  48955                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48956                                             vmov(al, dt, QRegister(rd), imm);
  48957                                             break;
  48958                                           }
  48959                                           case 0x00000620: {
  48960                                             // 0xf2800e70
  48961                                             if (((instr & 0xd00) == 0x100) ||
  48962                                                 ((instr & 0xd00) == 0x500) ||
  48963                                                 ((instr & 0xd00) == 0x900) ||
  48964                                                 ((instr & 0xe00) == 0xe00)) {
  48965                                               UnallocatedA32(instr);
  48966                                               return;
  48967                                             }
  48968                                             unsigned cmode = (instr >> 8) & 0xf;
  48969                                             DataType dt =
  48970                                                 ImmediateVmvn::DecodeDt(cmode);
  48971                                             if (dt.Is(kDataTypeValueInvalid)) {
  48972                                               UnallocatedA32(instr);
  48973                                               return;
  48974                                             }
  48975                                             if (((instr >> 12) & 1) != 0) {
  48976                                               UnallocatedA32(instr);
  48977                                               return;
  48978                                             }
  48979                                             unsigned rd =
  48980                                                 ExtractQRegister(instr, 22, 12);
  48981                                             QOperand imm =
  48982                                                 ImmediateVmvn::DecodeImmediate(
  48983                                                     cmode,
  48984                                                     (instr & 0xf) |
  48985                                                         ((instr >> 12) & 0x70) |
  48986                                                         ((instr >> 17) & 0x80));
  48987                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  48988                                             vmvn(al, dt, QRegister(rd), imm);
  48989                                             break;
  48990                                           }
  48991                                           case 0x00000800: {
  48992                                             // 0xf2800c50
  48993                                             if (((instr & 0x920) == 0x100) ||
  48994                                                 ((instr & 0x520) == 0x100) ||
  48995                                                 ((instr & 0x820) == 0x20) ||
  48996                                                 ((instr & 0x420) == 0x20) ||
  48997                                                 ((instr & 0x220) == 0x20) ||
  48998                                                 ((instr & 0x120) == 0x120)) {
  48999                                               UnallocatedA32(instr);
  49000                                               return;
  49001                                             }
  49002                                             unsigned cmode =
  49003                                                 ((instr >> 8) & 0xf) |
  49004                                                 ((instr >> 1) & 0x10);
  49005                                             DataType dt =
  49006                                                 ImmediateVmov::DecodeDt(cmode);
  49007                                             if (dt.Is(kDataTypeValueInvalid)) {
  49008                                               UnallocatedA32(instr);
  49009                                               return;
  49010                                             }
  49011                                             if (((instr >> 12) & 1) != 0) {
  49012                                               UnallocatedA32(instr);
  49013                                               return;
  49014                                             }
  49015                                             unsigned rd =
  49016                                                 ExtractQRegister(instr, 22, 12);
  49017                                             QOperand imm =
  49018                                                 ImmediateVmov::DecodeImmediate(
  49019                                                     cmode,
  49020                                                     (instr & 0xf) |
  49021                                                         ((instr >> 12) & 0x70) |
  49022                                                         ((instr >> 17) & 0x80));
  49023                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  49024                                             vmov(al, dt, QRegister(rd), imm);
  49025                                             break;
  49026                                           }
  49027                                           case 0x00000820: {
  49028                                             // 0xf2800c70
  49029                                             if (((instr & 0xd00) == 0x100) ||
  49030                                                 ((instr & 0xd00) == 0x500) ||
  49031                                                 ((instr & 0xd00) == 0x900) ||
  49032                                                 ((instr & 0xe00) == 0xe00)) {
  49033                                               UnallocatedA32(instr);
  49034                                               return;
  49035                                             }
  49036                                             unsigned cmode = (instr >> 8) & 0xf;
  49037                                             DataType dt =
  49038                                                 ImmediateVmvn::DecodeDt(cmode);
  49039                                             if (dt.Is(kDataTypeValueInvalid)) {
  49040                                               UnallocatedA32(instr);
  49041                                               return;
  49042                                             }
  49043                                             if (((instr >> 12) & 1) != 0) {
  49044                                               UnallocatedA32(instr);
  49045                                               return;
  49046                                             }
  49047                                             unsigned rd =
  49048                                                 ExtractQRegister(instr, 22, 12);
  49049                                             QOperand imm =
  49050                                                 ImmediateVmvn::DecodeImmediate(
  49051                                                     cmode,
  49052                                                     (instr & 0xf) |
  49053                                                         ((instr >> 12) & 0x70) |
  49054                                                         ((instr >> 17) & 0x80));
  49055                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  49056                                             vmvn(al, dt, QRegister(rd), imm);
  49057                                             break;
  49058                                           }
  49059                                           case 0x00000a00: {
  49060                                             // 0xf2800e50
  49061                                             if (((instr & 0x920) == 0x100) ||
  49062                                                 ((instr & 0x520) == 0x100) ||
  49063                                                 ((instr & 0x820) == 0x20) ||
  49064                                                 ((instr & 0x420) == 0x20) ||
  49065                                                 ((instr & 0x220) == 0x20) ||
  49066                                                 ((instr & 0x120) == 0x120)) {
  49067                                               UnallocatedA32(instr);
  49068                                               return;
  49069                                             }
  49070                                             unsigned cmode =
  49071                                                 ((instr >> 8) & 0xf) |
  49072                                                 ((instr >> 1) & 0x10);
  49073                                             DataType dt =
  49074                                                 ImmediateVmov::DecodeDt(cmode);
  49075                                             if (dt.Is(kDataTypeValueInvalid)) {
  49076                                               UnallocatedA32(instr);
  49077                                               return;
  49078                                             }
  49079                                             if (((instr >> 12) & 1) != 0) {
  49080                                               UnallocatedA32(instr);
  49081                                               return;
  49082                                             }
  49083                                             unsigned rd =
  49084                                                 ExtractQRegister(instr, 22, 12);
  49085                                             QOperand imm =
  49086                                                 ImmediateVmov::DecodeImmediate(
  49087                                                     cmode,
  49088                                                     (instr & 0xf) |
  49089                                                         ((instr >> 12) & 0x70) |
  49090                                                         ((instr >> 17) & 0x80));
  49091                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  49092                                             vmov(al, dt, QRegister(rd), imm);
  49093                                             break;
  49094                                           }
  49095                                           case 0x00000a20: {
  49096                                             // 0xf2800e70
  49097                                             if (((instr & 0xd00) == 0x100) ||
  49098                                                 ((instr & 0xd00) == 0x500) ||
  49099                                                 ((instr & 0xd00) == 0x900) ||
  49100                                                 ((instr & 0xe00) == 0xe00)) {
  49101                                               UnallocatedA32(instr);
  49102                                               return;
  49103                                             }
  49104                                             unsigned cmode = (instr >> 8) & 0xf;
  49105                                             DataType dt =
  49106                                                 ImmediateVmvn::DecodeDt(cmode);
  49107                                             if (dt.Is(kDataTypeValueInvalid)) {
  49108                                               UnallocatedA32(instr);
  49109                                               return;
  49110                                             }
  49111                                             if (((instr >> 12) & 1) != 0) {
  49112                                               UnallocatedA32(instr);
  49113                                               return;
  49114                                             }
  49115                                             unsigned rd =
  49116                                                 ExtractQRegister(instr, 22, 12);
  49117                                             QOperand imm =
  49118                                                 ImmediateVmvn::DecodeImmediate(
  49119                                                     cmode,
  49120                                                     (instr & 0xf) |
  49121                                                         ((instr >> 12) & 0x70) |
  49122                                                         ((instr >> 17) & 0x80));
  49123                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  49124                                             vmvn(al, dt, QRegister(rd), imm);
  49125                                             break;
  49126                                           }
  49127                                           case 0x00000c00: {
  49128                                             // 0xf2800c50
  49129                                             if (((instr & 0x920) == 0x100) ||
  49130                                                 ((instr & 0x520) == 0x100) ||
  49131                                                 ((instr & 0x820) == 0x20) ||
  49132                                                 ((instr & 0x420) == 0x20) ||
  49133                                                 ((instr & 0x220) == 0x20) ||
  49134                                                 ((instr & 0x120) == 0x120)) {
  49135                                               UnallocatedA32(instr);
  49136                                               return;
  49137                                             }
  49138                                             unsigned cmode =
  49139                                                 ((instr >> 8) & 0xf) |
  49140                                                 ((instr >> 1) & 0x10);
  49141                                             DataType dt =
  49142                                                 ImmediateVmov::DecodeDt(cmode);
  49143                                             if (dt.Is(kDataTypeValueInvalid)) {
  49144                                               UnallocatedA32(instr);
  49145                                               return;
  49146                                             }
  49147                                             if (((instr >> 12) & 1) != 0) {
  49148                                               UnallocatedA32(instr);
  49149                                               return;
  49150                                             }
  49151                                             unsigned rd =
  49152                                                 ExtractQRegister(instr, 22, 12);
  49153                                             QOperand imm =
  49154                                                 ImmediateVmov::DecodeImmediate(
  49155                                                     cmode,
  49156                                                     (instr & 0xf) |
  49157                                                         ((instr >> 12) & 0x70) |
  49158                                                         ((instr >> 17) & 0x80));
  49159                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  49160                                             vmov(al, dt, QRegister(rd), imm);
  49161                                             break;
  49162                                           }
  49163                                           case 0x00000c20: {
  49164                                             // 0xf2800c70
  49165                                             if (((instr & 0xd00) == 0x100) ||
  49166                                                 ((instr & 0xd00) == 0x500) ||
  49167                                                 ((instr & 0xd00) == 0x900) ||
  49168                                                 ((instr & 0xe00) == 0xe00)) {
  49169                                               UnallocatedA32(instr);
  49170                                               return;
  49171                                             }
  49172                                             unsigned cmode = (instr >> 8) & 0xf;
  49173                                             DataType dt =
  49174                                                 ImmediateVmvn::DecodeDt(cmode);
  49175                                             if (dt.Is(kDataTypeValueInvalid)) {
  49176                                               UnallocatedA32(instr);
  49177                                               return;
  49178                                             }
  49179                                             if (((instr >> 12) & 1) != 0) {
  49180                                               UnallocatedA32(instr);
  49181                                               return;
  49182                                             }
  49183                                             unsigned rd =
  49184                                                 ExtractQRegister(instr, 22, 12);
  49185                                             QOperand imm =
  49186                                                 ImmediateVmvn::DecodeImmediate(
  49187                                                     cmode,
  49188                                                     (instr & 0xf) |
  49189                                                         ((instr >> 12) & 0x70) |
  49190                                                         ((instr >> 17) & 0x80));
  49191                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  49192                                             vmvn(al, dt, QRegister(rd), imm);
  49193                                             break;
  49194                                           }
  49195                                           case 0x00000d00: {
  49196                                             // 0xf2800d50
  49197                                             if (((instr & 0x920) == 0x100) ||
  49198                                                 ((instr & 0x520) == 0x100) ||
  49199                                                 ((instr & 0x820) == 0x20) ||
  49200                                                 ((instr & 0x420) == 0x20) ||
  49201                                                 ((instr & 0x220) == 0x20) ||
  49202                                                 ((instr & 0x120) == 0x120)) {
  49203                                               UnallocatedA32(instr);
  49204                                               return;
  49205                                             }
  49206                                             unsigned cmode =
  49207                                                 ((instr >> 8) & 0xf) |
  49208                                                 ((instr >> 1) & 0x10);
  49209                                             DataType dt =
  49210                                                 ImmediateVmov::DecodeDt(cmode);
  49211                                             if (dt.Is(kDataTypeValueInvalid)) {
  49212                                               UnallocatedA32(instr);
  49213                                               return;
  49214                                             }
  49215                                             if (((instr >> 12) & 1) != 0) {
  49216                                               UnallocatedA32(instr);
  49217                                               return;
  49218                                             }
  49219                                             unsigned rd =
  49220                                                 ExtractQRegister(instr, 22, 12);
  49221                                             QOperand imm =
  49222                                                 ImmediateVmov::DecodeImmediate(
  49223                                                     cmode,
  49224                                                     (instr & 0xf) |
  49225                                                         ((instr >> 12) & 0x70) |
  49226                                                         ((instr >> 17) & 0x80));
  49227                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  49228                                             vmov(al, dt, QRegister(rd), imm);
  49229                                             break;
  49230                                           }
  49231                                           case 0x00000d20: {
  49232                                             // 0xf2800d70
  49233                                             if (((instr & 0xd00) == 0x100) ||
  49234                                                 ((instr & 0xd00) == 0x500) ||
  49235                                                 ((instr & 0xd00) == 0x900) ||
  49236                                                 ((instr & 0xe00) == 0xe00)) {
  49237                                               UnallocatedA32(instr);
  49238                                               return;
  49239                                             }
  49240                                             unsigned cmode = (instr >> 8) & 0xf;
  49241                                             DataType dt =
  49242                                                 ImmediateVmvn::DecodeDt(cmode);
  49243                                             if (dt.Is(kDataTypeValueInvalid)) {
  49244                                               UnallocatedA32(instr);
  49245                                               return;
  49246                                             }
  49247                                             if (((instr >> 12) & 1) != 0) {
  49248                                               UnallocatedA32(instr);
  49249                                               return;
  49250                                             }
  49251                                             unsigned rd =
  49252                                                 ExtractQRegister(instr, 22, 12);
  49253                                             QOperand imm =
  49254                                                 ImmediateVmvn::DecodeImmediate(
  49255                                                     cmode,
  49256                                                     (instr & 0xf) |
  49257                                                         ((instr >> 12) & 0x70) |
  49258                                                         ((instr >> 17) & 0x80));
  49259                                             // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  49260                                             vmvn(al, dt, QRegister(rd), imm);
  49261                                             break;
  49262                                           }
  49263                                           case 0x00000e00: {
  49264                                             // 0xf2800e50
  49265                                             if (((instr & 0x920) == 0x100) ||
  49266                                                 ((instr & 0x520) == 0x100) ||
  49267                                                 ((instr & 0x820) == 0x20) ||
  49268                                                 ((instr & 0x420) == 0x20) ||
  49269                                                 ((instr & 0x220) == 0x20) ||
  49270                                                 ((instr & 0x120) == 0x120)) {
  49271                                               UnallocatedA32(instr);
  49272                                               return;
  49273                                             }
  49274                                             unsigned cmode =
  49275                                                 ((instr >> 8) & 0xf) |
  49276                                                 ((instr >> 1) & 0x10);
  49277                                             DataType dt =
  49278                                                 ImmediateVmov::DecodeDt(cmode);
  49279                                             if (dt.Is(kDataTypeValueInvalid)) {
  49280                                               UnallocatedA32(instr);
  49281                                               return;
  49282                                             }
  49283                                             if (((instr >> 12) & 1) != 0) {
  49284                                               UnallocatedA32(instr);
  49285                                               return;
  49286                                             }
  49287                                             unsigned rd =
  49288                                                 ExtractQRegister(instr, 22, 12);
  49289                                             QOperand imm =
  49290                                                 ImmediateVmov::DecodeImmediate(
  49291                                                     cmode,
  49292                                                     (instr & 0xf) |
  49293                                                         ((instr >> 12) & 0x70) |
  49294                                                         ((instr >> 17) & 0x80));
  49295                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  49296                                             vmov(al, dt, QRegister(rd), imm);
  49297                                             break;
  49298                                           }
  49299                                           case 0x00000e20: {
  49300                                             // 0xf2800e70
  49301                                             if (((instr & 0x920) == 0x100) ||
  49302                                                 ((instr & 0x520) == 0x100) ||
  49303                                                 ((instr & 0x820) == 0x20) ||
  49304                                                 ((instr & 0x420) == 0x20) ||
  49305                                                 ((instr & 0x220) == 0x20) ||
  49306                                                 ((instr & 0x120) == 0x120)) {
  49307                                               UnallocatedA32(instr);
  49308                                               return;
  49309                                             }
  49310                                             unsigned cmode =
  49311                                                 ((instr >> 8) & 0xf) |
  49312                                                 ((instr >> 1) & 0x10);
  49313                                             DataType dt =
  49314                                                 ImmediateVmov::DecodeDt(cmode);
  49315                                             if (dt.Is(kDataTypeValueInvalid)) {
  49316                                               UnallocatedA32(instr);
  49317                                               return;
  49318                                             }
  49319                                             if (((instr >> 12) & 1) != 0) {
  49320                                               UnallocatedA32(instr);
  49321                                               return;
  49322                                             }
  49323                                             unsigned rd =
  49324                                                 ExtractQRegister(instr, 22, 12);
  49325                                             QOperand imm =
  49326                                                 ImmediateVmov::DecodeImmediate(
  49327                                                     cmode,
  49328                                                     (instr & 0xf) |
  49329                                                         ((instr >> 12) & 0x70) |
  49330                                                         ((instr >> 17) & 0x80));
  49331                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  49332                                             vmov(al, dt, QRegister(rd), imm);
  49333                                             break;
  49334                                           }
  49335                                           case 0x00000f00: {
  49336                                             // 0xf2800f50
  49337                                             if (((instr & 0x920) == 0x100) ||
  49338                                                 ((instr & 0x520) == 0x100) ||
  49339                                                 ((instr & 0x820) == 0x20) ||
  49340                                                 ((instr & 0x420) == 0x20) ||
  49341                                                 ((instr & 0x220) == 0x20) ||
  49342                                                 ((instr & 0x120) == 0x120)) {
  49343                                               UnallocatedA32(instr);
  49344                                               return;
  49345                                             }
  49346                                             unsigned cmode =
  49347                                                 ((instr >> 8) & 0xf) |
  49348                                                 ((instr >> 1) & 0x10);
  49349                                             DataType dt =
  49350                                                 ImmediateVmov::DecodeDt(cmode);
  49351                                             if (dt.Is(kDataTypeValueInvalid)) {
  49352                                               UnallocatedA32(instr);
  49353                                               return;
  49354                                             }
  49355                                             if (((instr >> 12) & 1) != 0) {
  49356                                               UnallocatedA32(instr);
  49357                                               return;
  49358                                             }
  49359                                             unsigned rd =
  49360                                                 ExtractQRegister(instr, 22, 12);
  49361                                             QOperand imm =
  49362                                                 ImmediateVmov::DecodeImmediate(
  49363                                                     cmode,
  49364                                                     (instr & 0xf) |
  49365                                                         ((instr >> 12) & 0x70) |
  49366                                                         ((instr >> 17) & 0x80));
  49367                                             // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length)
  49368                                             vmov(al, dt, QRegister(rd), imm);
  49369                                             break;
  49370                                           }
  49371                                           default:
  49372                                             UnallocatedA32(instr);
  49373                                             break;
  49374                                         }
  49375                                         break;
  49376                                       }
  49377                                       default: {
  49378                                         if (((instr & 0x920) == 0x100) ||
  49379                                             ((instr & 0x520) == 0x100) ||
  49380                                             ((instr & 0x820) == 0x20) ||
  49381                                             ((instr & 0x420) == 0x20) ||
  49382                                             ((instr & 0x220) == 0x20) ||
  49383                                             ((instr & 0x120) == 0x120)) {
  49384                                           UnallocatedA32(instr);
  49385                                           return;
  49386                                         }
  49387                                         unsigned cmode = ((instr >> 8) & 0xf) |
  49388                                                          ((instr >> 1) & 0x10);
  49389                                         DataType dt =
  49390                                             ImmediateVmov::DecodeDt(cmode);
  49391                                         if (dt.Is(kDataTypeValueInvalid)) {
  49392                                           UnallocatedA32(instr);
  49393                                           return;
  49394                                         }
  49395                                         if (((instr >> 12) & 1) != 0) {
  49396                                           UnallocatedA32(instr);
  49397                                           return;
  49398                                         }
  49399                                         unsigned rd =
  49400                                             ExtractQRegister(instr, 22, 12);
  49401                                         QOperand imm =
  49402                                             ImmediateVmov::DecodeImmediate(
  49403                                                 cmode,
  49404                                                 (instr & 0xf) |
  49405                                                     ((instr >> 12) & 0x70) |
  49406                                                     ((instr >> 17) & 0x80));
  49407                                         // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1
  49408                                         vmov(al, dt, QRegister(rd), imm);
  49409                                         break;
  49410                                       }
  49411                                     }
  49412                                     break;
  49413                                   }
  49414                                 }
  49415                                 break;
  49416                               }
  49417                               default:
  49418                                 UnallocatedA32(instr);
  49419                                 break;
  49420                             }
  49421                             break;
  49422                           }
  49423                           default: {
  49424                             if ((instr & 0x00000200) == 0x00000200) {
  49425                               if (((instr & 0x200000) == 0x0)) {
  49426                                 UnallocatedA32(instr);
  49427                                 return;
  49428                               }
  49429                               DataType dt1 = Dt_op_U_1_Decode1(
  49430                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
  49431                               if (dt1.Is(kDataTypeValueInvalid)) {
  49432                                 UnallocatedA32(instr);
  49433                                 return;
  49434                               }
  49435                               DataType dt2 = Dt_op_U_1_Decode2(
  49436                                   ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2));
  49437                               if (dt2.Is(kDataTypeValueInvalid)) {
  49438                                 UnallocatedA32(instr);
  49439                                 return;
  49440                               }
  49441                               if (((instr >> 12) & 1) != 0) {
  49442                                 UnallocatedA32(instr);
  49443                                 return;
  49444                               }
  49445                               unsigned rd = ExtractQRegister(instr, 22, 12);
  49446                               if ((instr & 1) != 0) {
  49447                                 UnallocatedA32(instr);
  49448                                 return;
  49449                               }
  49450                               unsigned rm = ExtractQRegister(instr, 5, 0);
  49451                               uint32_t fbits = 64 - ((instr >> 16) & 0x3f);
  49452                               // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm>, #<fbits> ; A1 NOLINT(whitespace/line_length)
  49453                               vcvt(al,
  49454                                    dt1,
  49455                                    dt2,
  49456                                    QRegister(rd),
  49457                                    QRegister(rm),
  49458                                    fbits);
  49459                             } else {
  49460                               UnallocatedA32(instr);
  49461                             }
  49462                             break;
  49463                           }
  49464                         }
  49465                         break;
  49466                       }
  49467                       default:
  49468                         UnallocatedA32(instr);
  49469                         break;
  49470                     }
  49471                     break;
  49472                   }
  49473                 }
  49474                 break;
  49475               }
  49476             }
  49477             break;
  49478           }
  49479         }
  49480         break;
  49481       }
  49482       case 0x04000000: {
  49483         // 0xf4000000
  49484         switch (instr & 0x01300000) {
  49485           case 0x00000000: {
  49486             // 0xf4000000
  49487             switch (instr & 0x00800000) {
  49488               case 0x00000000: {
  49489                 // 0xf4000000
  49490                 switch (instr & 0x0000000d) {
  49491                   case 0x0000000d: {
  49492                     // 0xf400000d
  49493                     switch (instr & 0x00000002) {
  49494                       case 0x00000000: {
  49495                         // 0xf400000d
  49496                         switch (instr & 0x00000f00) {
  49497                           case 0x00000000: {
  49498                             // 0xf400000d
  49499                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  49500                             if (dt.Is(kDataTypeValueInvalid)) {
  49501                               UnallocatedA32(instr);
  49502                               return;
  49503                             }
  49504                             Alignment align =
  49505                                 Align_align_4_Decode((instr >> 4) & 0x3);
  49506                             if (dt.Is(kDataTypeValueInvalid) ||
  49507                                 align.Is(kBadAlignment)) {
  49508                               UnallocatedA32(instr);
  49509                               return;
  49510                             }
  49511                             unsigned first = ExtractDRegister(instr, 22, 12);
  49512                             unsigned length;
  49513                             SpacingType spacing;
  49514                             switch ((instr >> 8) & 0xf) {
  49515                               default:
  49516                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  49517                               case 0x0:
  49518                                 length = 4;
  49519                                 spacing = kSingle;
  49520                                 break;
  49521                               case 0x1:
  49522                                 length = 4;
  49523                                 spacing = kDouble;
  49524                                 break;
  49525                             }
  49526                             unsigned last =
  49527                                 first +
  49528                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  49529                             TransferType transfer = kMultipleLanes;
  49530                             unsigned rn = (instr >> 16) & 0xf;
  49531                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  49532                             vst4(al,
  49533                                  dt,
  49534                                  NeonRegisterList(DRegister(first),
  49535                                                   DRegister(last),
  49536                                                   spacing,
  49537                                                   transfer),
  49538                                  AlignedMemOperand(Register(rn),
  49539                                                    align,
  49540                                                    PostIndex));
  49541                             break;
  49542                           }
  49543                           case 0x00000100: {
  49544                             // 0xf400010d
  49545                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  49546                             if (dt.Is(kDataTypeValueInvalid)) {
  49547                               UnallocatedA32(instr);
  49548                               return;
  49549                             }
  49550                             Alignment align =
  49551                                 Align_align_4_Decode((instr >> 4) & 0x3);
  49552                             if (dt.Is(kDataTypeValueInvalid) ||
  49553                                 align.Is(kBadAlignment)) {
  49554                               UnallocatedA32(instr);
  49555                               return;
  49556                             }
  49557                             unsigned first = ExtractDRegister(instr, 22, 12);
  49558                             unsigned length;
  49559                             SpacingType spacing;
  49560                             switch ((instr >> 8) & 0xf) {
  49561                               default:
  49562                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  49563                               case 0x0:
  49564                                 length = 4;
  49565                                 spacing = kSingle;
  49566                                 break;
  49567                               case 0x1:
  49568                                 length = 4;
  49569                                 spacing = kDouble;
  49570                                 break;
  49571                             }
  49572                             unsigned last =
  49573                                 first +
  49574                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  49575                             TransferType transfer = kMultipleLanes;
  49576                             unsigned rn = (instr >> 16) & 0xf;
  49577                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  49578                             vst4(al,
  49579                                  dt,
  49580                                  NeonRegisterList(DRegister(first),
  49581                                                   DRegister(last),
  49582                                                   spacing,
  49583                                                   transfer),
  49584                                  AlignedMemOperand(Register(rn),
  49585                                                    align,
  49586                                                    PostIndex));
  49587                             break;
  49588                           }
  49589                           case 0x00000200: {
  49590                             // 0xf400020d
  49591                             if (((instr & 0xe20) == 0x620) ||
  49592                                 ((instr & 0xf30) == 0xa30)) {
  49593                               UnallocatedA32(instr);
  49594                               return;
  49595                             }
  49596                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  49597                             if (dt.Is(kDataTypeValueInvalid)) {
  49598                               UnallocatedA32(instr);
  49599                               return;
  49600                             }
  49601                             Alignment align =
  49602                                 Align_align_5_Decode((instr >> 4) & 0x3);
  49603                             if (dt.Is(kDataTypeValueInvalid) ||
  49604                                 align.Is(kBadAlignment)) {
  49605                               UnallocatedA32(instr);
  49606                               return;
  49607                             }
  49608                             unsigned first = ExtractDRegister(instr, 22, 12);
  49609                             unsigned length;
  49610                             SpacingType spacing = kSingle;
  49611                             switch ((instr >> 8) & 0xf) {
  49612                               default:
  49613                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  49614                               case 0x7:
  49615                                 length = 1;
  49616                                 break;
  49617                               case 0xa:
  49618                                 length = 2;
  49619                                 break;
  49620                               case 0x6:
  49621                                 length = 3;
  49622                                 break;
  49623                               case 0x2:
  49624                                 length = 4;
  49625                                 break;
  49626                             }
  49627                             unsigned last = first + length - 1;
  49628                             TransferType transfer = kMultipleLanes;
  49629                             unsigned rn = (instr >> 16) & 0xf;
  49630                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  49631                             vst1(al,
  49632                                  dt,
  49633                                  NeonRegisterList(DRegister(first),
  49634                                                   DRegister(last),
  49635                                                   spacing,
  49636                                                   transfer),
  49637                                  AlignedMemOperand(Register(rn),
  49638                                                    align,
  49639                                                    PostIndex));
  49640                             break;
  49641                           }
  49642                           case 0x00000300: {
  49643                             // 0xf400030d
  49644                             if (((instr & 0xe30) == 0x830)) {
  49645                               UnallocatedA32(instr);
  49646                               return;
  49647                             }
  49648                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  49649                             if (dt.Is(kDataTypeValueInvalid)) {
  49650                               UnallocatedA32(instr);
  49651                               return;
  49652                             }
  49653                             Alignment align =
  49654                                 Align_align_2_Decode((instr >> 4) & 0x3);
  49655                             if (dt.Is(kDataTypeValueInvalid) ||
  49656                                 align.Is(kBadAlignment)) {
  49657                               UnallocatedA32(instr);
  49658                               return;
  49659                             }
  49660                             unsigned first = ExtractDRegister(instr, 22, 12);
  49661                             unsigned length;
  49662                             SpacingType spacing;
  49663                             switch ((instr >> 8) & 0xf) {
  49664                               default:
  49665                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  49666                               case 0x8:
  49667                                 length = 2;
  49668                                 spacing = kSingle;
  49669                                 break;
  49670                               case 0x9:
  49671                                 length = 2;
  49672                                 spacing = kDouble;
  49673                                 break;
  49674                               case 0x3:
  49675                                 length = 4;
  49676                                 spacing = kSingle;
  49677                                 break;
  49678                             }
  49679                             unsigned last =
  49680                                 first +
  49681                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  49682                             TransferType transfer = kMultipleLanes;
  49683                             unsigned rn = (instr >> 16) & 0xf;
  49684                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  49685                             vst2(al,
  49686                                  dt,
  49687                                  NeonRegisterList(DRegister(first),
  49688                                                   DRegister(last),
  49689                                                   spacing,
  49690                                                   transfer),
  49691                                  AlignedMemOperand(Register(rn),
  49692                                                    align,
  49693                                                    PostIndex));
  49694                             break;
  49695                           }
  49696                           case 0x00000400: {
  49697                             // 0xf400040d
  49698                             if (((instr & 0x20) == 0x20)) {
  49699                               UnallocatedA32(instr);
  49700                               return;
  49701                             }
  49702                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  49703                             if (dt.Is(kDataTypeValueInvalid)) {
  49704                               UnallocatedA32(instr);
  49705                               return;
  49706                             }
  49707                             Alignment align =
  49708                                 Align_align_3_Decode((instr >> 4) & 0x3);
  49709                             if (dt.Is(kDataTypeValueInvalid) ||
  49710                                 align.Is(kBadAlignment)) {
  49711                               UnallocatedA32(instr);
  49712                               return;
  49713                             }
  49714                             unsigned first = ExtractDRegister(instr, 22, 12);
  49715                             unsigned length;
  49716                             SpacingType spacing;
  49717                             switch ((instr >> 8) & 0xf) {
  49718                               default:
  49719                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  49720                               case 0x4:
  49721                                 length = 3;
  49722                                 spacing = kSingle;
  49723                                 break;
  49724                               case 0x5:
  49725                                 length = 3;
  49726                                 spacing = kDouble;
  49727                                 break;
  49728                             }
  49729                             unsigned last =
  49730                                 first +
  49731                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  49732                             TransferType transfer = kMultipleLanes;
  49733                             unsigned rn = (instr >> 16) & 0xf;
  49734                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  49735                             vst3(al,
  49736                                  dt,
  49737                                  NeonRegisterList(DRegister(first),
  49738                                                   DRegister(last),
  49739                                                   spacing,
  49740                                                   transfer),
  49741                                  AlignedMemOperand(Register(rn),
  49742                                                    align,
  49743                                                    PostIndex));
  49744                             break;
  49745                           }
  49746                           case 0x00000500: {
  49747                             // 0xf400050d
  49748                             if (((instr & 0x20) == 0x20)) {
  49749                               UnallocatedA32(instr);
  49750                               return;
  49751                             }
  49752                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  49753                             if (dt.Is(kDataTypeValueInvalid)) {
  49754                               UnallocatedA32(instr);
  49755                               return;
  49756                             }
  49757                             Alignment align =
  49758                                 Align_align_3_Decode((instr >> 4) & 0x3);
  49759                             if (dt.Is(kDataTypeValueInvalid) ||
  49760                                 align.Is(kBadAlignment)) {
  49761                               UnallocatedA32(instr);
  49762                               return;
  49763                             }
  49764                             unsigned first = ExtractDRegister(instr, 22, 12);
  49765                             unsigned length;
  49766                             SpacingType spacing;
  49767                             switch ((instr >> 8) & 0xf) {
  49768                               default:
  49769                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  49770                               case 0x4:
  49771                                 length = 3;
  49772                                 spacing = kSingle;
  49773                                 break;
  49774                               case 0x5:
  49775                                 length = 3;
  49776                                 spacing = kDouble;
  49777                                 break;
  49778                             }
  49779                             unsigned last =
  49780                                 first +
  49781                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  49782                             TransferType transfer = kMultipleLanes;
  49783                             unsigned rn = (instr >> 16) & 0xf;
  49784                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  49785                             vst3(al,
  49786                                  dt,
  49787                                  NeonRegisterList(DRegister(first),
  49788                                                   DRegister(last),
  49789                                                   spacing,
  49790                                                   transfer),
  49791                                  AlignedMemOperand(Register(rn),
  49792                                                    align,
  49793                                                    PostIndex));
  49794                             break;
  49795                           }
  49796                           case 0x00000600: {
  49797                             // 0xf400060d
  49798                             if (((instr & 0xe20) == 0x620) ||
  49799                                 ((instr & 0xf30) == 0xa30)) {
  49800                               UnallocatedA32(instr);
  49801                               return;
  49802                             }
  49803                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  49804                             if (dt.Is(kDataTypeValueInvalid)) {
  49805                               UnallocatedA32(instr);
  49806                               return;
  49807                             }
  49808                             Alignment align =
  49809                                 Align_align_5_Decode((instr >> 4) & 0x3);
  49810                             if (dt.Is(kDataTypeValueInvalid) ||
  49811                                 align.Is(kBadAlignment)) {
  49812                               UnallocatedA32(instr);
  49813                               return;
  49814                             }
  49815                             unsigned first = ExtractDRegister(instr, 22, 12);
  49816                             unsigned length;
  49817                             SpacingType spacing = kSingle;
  49818                             switch ((instr >> 8) & 0xf) {
  49819                               default:
  49820                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  49821                               case 0x7:
  49822                                 length = 1;
  49823                                 break;
  49824                               case 0xa:
  49825                                 length = 2;
  49826                                 break;
  49827                               case 0x6:
  49828                                 length = 3;
  49829                                 break;
  49830                               case 0x2:
  49831                                 length = 4;
  49832                                 break;
  49833                             }
  49834                             unsigned last = first + length - 1;
  49835                             TransferType transfer = kMultipleLanes;
  49836                             unsigned rn = (instr >> 16) & 0xf;
  49837                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  49838                             vst1(al,
  49839                                  dt,
  49840                                  NeonRegisterList(DRegister(first),
  49841                                                   DRegister(last),
  49842                                                   spacing,
  49843                                                   transfer),
  49844                                  AlignedMemOperand(Register(rn),
  49845                                                    align,
  49846                                                    PostIndex));
  49847                             break;
  49848                           }
  49849                           case 0x00000700: {
  49850                             // 0xf400070d
  49851                             if (((instr & 0xe20) == 0x620) ||
  49852                                 ((instr & 0xf30) == 0xa30)) {
  49853                               UnallocatedA32(instr);
  49854                               return;
  49855                             }
  49856                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  49857                             if (dt.Is(kDataTypeValueInvalid)) {
  49858                               UnallocatedA32(instr);
  49859                               return;
  49860                             }
  49861                             Alignment align =
  49862                                 Align_align_5_Decode((instr >> 4) & 0x3);
  49863                             if (dt.Is(kDataTypeValueInvalid) ||
  49864                                 align.Is(kBadAlignment)) {
  49865                               UnallocatedA32(instr);
  49866                               return;
  49867                             }
  49868                             unsigned first = ExtractDRegister(instr, 22, 12);
  49869                             unsigned length;
  49870                             SpacingType spacing = kSingle;
  49871                             switch ((instr >> 8) & 0xf) {
  49872                               default:
  49873                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  49874                               case 0x7:
  49875                                 length = 1;
  49876                                 break;
  49877                               case 0xa:
  49878                                 length = 2;
  49879                                 break;
  49880                               case 0x6:
  49881                                 length = 3;
  49882                                 break;
  49883                               case 0x2:
  49884                                 length = 4;
  49885                                 break;
  49886                             }
  49887                             unsigned last = first + length - 1;
  49888                             TransferType transfer = kMultipleLanes;
  49889                             unsigned rn = (instr >> 16) & 0xf;
  49890                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  49891                             vst1(al,
  49892                                  dt,
  49893                                  NeonRegisterList(DRegister(first),
  49894                                                   DRegister(last),
  49895                                                   spacing,
  49896                                                   transfer),
  49897                                  AlignedMemOperand(Register(rn),
  49898                                                    align,
  49899                                                    PostIndex));
  49900                             break;
  49901                           }
  49902                           case 0x00000800: {
  49903                             // 0xf400080d
  49904                             if (((instr & 0xe30) == 0x830)) {
  49905                               UnallocatedA32(instr);
  49906                               return;
  49907                             }
  49908                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  49909                             if (dt.Is(kDataTypeValueInvalid)) {
  49910                               UnallocatedA32(instr);
  49911                               return;
  49912                             }
  49913                             Alignment align =
  49914                                 Align_align_2_Decode((instr >> 4) & 0x3);
  49915                             if (dt.Is(kDataTypeValueInvalid) ||
  49916                                 align.Is(kBadAlignment)) {
  49917                               UnallocatedA32(instr);
  49918                               return;
  49919                             }
  49920                             unsigned first = ExtractDRegister(instr, 22, 12);
  49921                             unsigned length;
  49922                             SpacingType spacing;
  49923                             switch ((instr >> 8) & 0xf) {
  49924                               default:
  49925                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  49926                               case 0x8:
  49927                                 length = 2;
  49928                                 spacing = kSingle;
  49929                                 break;
  49930                               case 0x9:
  49931                                 length = 2;
  49932                                 spacing = kDouble;
  49933                                 break;
  49934                               case 0x3:
  49935                                 length = 4;
  49936                                 spacing = kSingle;
  49937                                 break;
  49938                             }
  49939                             unsigned last =
  49940                                 first +
  49941                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  49942                             TransferType transfer = kMultipleLanes;
  49943                             unsigned rn = (instr >> 16) & 0xf;
  49944                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  49945                             vst2(al,
  49946                                  dt,
  49947                                  NeonRegisterList(DRegister(first),
  49948                                                   DRegister(last),
  49949                                                   spacing,
  49950                                                   transfer),
  49951                                  AlignedMemOperand(Register(rn),
  49952                                                    align,
  49953                                                    PostIndex));
  49954                             break;
  49955                           }
  49956                           case 0x00000900: {
  49957                             // 0xf400090d
  49958                             if (((instr & 0xe30) == 0x830)) {
  49959                               UnallocatedA32(instr);
  49960                               return;
  49961                             }
  49962                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  49963                             if (dt.Is(kDataTypeValueInvalid)) {
  49964                               UnallocatedA32(instr);
  49965                               return;
  49966                             }
  49967                             Alignment align =
  49968                                 Align_align_2_Decode((instr >> 4) & 0x3);
  49969                             if (dt.Is(kDataTypeValueInvalid) ||
  49970                                 align.Is(kBadAlignment)) {
  49971                               UnallocatedA32(instr);
  49972                               return;
  49973                             }
  49974                             unsigned first = ExtractDRegister(instr, 22, 12);
  49975                             unsigned length;
  49976                             SpacingType spacing;
  49977                             switch ((instr >> 8) & 0xf) {
  49978                               default:
  49979                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  49980                               case 0x8:
  49981                                 length = 2;
  49982                                 spacing = kSingle;
  49983                                 break;
  49984                               case 0x9:
  49985                                 length = 2;
  49986                                 spacing = kDouble;
  49987                                 break;
  49988                               case 0x3:
  49989                                 length = 4;
  49990                                 spacing = kSingle;
  49991                                 break;
  49992                             }
  49993                             unsigned last =
  49994                                 first +
  49995                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  49996                             TransferType transfer = kMultipleLanes;
  49997                             unsigned rn = (instr >> 16) & 0xf;
  49998                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  49999                             vst2(al,
  50000                                  dt,
  50001                                  NeonRegisterList(DRegister(first),
  50002                                                   DRegister(last),
  50003                                                   spacing,
  50004                                                   transfer),
  50005                                  AlignedMemOperand(Register(rn),
  50006                                                    align,
  50007                                                    PostIndex));
  50008                             break;
  50009                           }
  50010                           case 0x00000a00: {
  50011                             // 0xf4000a0d
  50012                             if (((instr & 0xe20) == 0x620) ||
  50013                                 ((instr & 0xf30) == 0xa30)) {
  50014                               UnallocatedA32(instr);
  50015                               return;
  50016                             }
  50017                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  50018                             if (dt.Is(kDataTypeValueInvalid)) {
  50019                               UnallocatedA32(instr);
  50020                               return;
  50021                             }
  50022                             Alignment align =
  50023                                 Align_align_5_Decode((instr >> 4) & 0x3);
  50024                             if (dt.Is(kDataTypeValueInvalid) ||
  50025                                 align.Is(kBadAlignment)) {
  50026                               UnallocatedA32(instr);
  50027                               return;
  50028                             }
  50029                             unsigned first = ExtractDRegister(instr, 22, 12);
  50030                             unsigned length;
  50031                             SpacingType spacing = kSingle;
  50032                             switch ((instr >> 8) & 0xf) {
  50033                               default:
  50034                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50035                               case 0x7:
  50036                                 length = 1;
  50037                                 break;
  50038                               case 0xa:
  50039                                 length = 2;
  50040                                 break;
  50041                               case 0x6:
  50042                                 length = 3;
  50043                                 break;
  50044                               case 0x2:
  50045                                 length = 4;
  50046                                 break;
  50047                             }
  50048                             unsigned last = first + length - 1;
  50049                             TransferType transfer = kMultipleLanes;
  50050                             unsigned rn = (instr >> 16) & 0xf;
  50051                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  50052                             vst1(al,
  50053                                  dt,
  50054                                  NeonRegisterList(DRegister(first),
  50055                                                   DRegister(last),
  50056                                                   spacing,
  50057                                                   transfer),
  50058                                  AlignedMemOperand(Register(rn),
  50059                                                    align,
  50060                                                    PostIndex));
  50061                             break;
  50062                           }
  50063                           default:
  50064                             UnallocatedA32(instr);
  50065                             break;
  50066                         }
  50067                         break;
  50068                       }
  50069                       case 0x00000002: {
  50070                         // 0xf400000f
  50071                         switch (instr & 0x00000f00) {
  50072                           case 0x00000000: {
  50073                             // 0xf400000d
  50074                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  50075                             if (dt.Is(kDataTypeValueInvalid)) {
  50076                               UnallocatedA32(instr);
  50077                               return;
  50078                             }
  50079                             Alignment align =
  50080                                 Align_align_4_Decode((instr >> 4) & 0x3);
  50081                             if (dt.Is(kDataTypeValueInvalid) ||
  50082                                 align.Is(kBadAlignment)) {
  50083                               UnallocatedA32(instr);
  50084                               return;
  50085                             }
  50086                             unsigned first = ExtractDRegister(instr, 22, 12);
  50087                             unsigned length;
  50088                             SpacingType spacing;
  50089                             switch ((instr >> 8) & 0xf) {
  50090                               default:
  50091                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50092                               case 0x0:
  50093                                 length = 4;
  50094                                 spacing = kSingle;
  50095                                 break;
  50096                               case 0x1:
  50097                                 length = 4;
  50098                                 spacing = kDouble;
  50099                                 break;
  50100                             }
  50101                             unsigned last =
  50102                                 first +
  50103                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  50104                             TransferType transfer = kMultipleLanes;
  50105                             unsigned rn = (instr >> 16) & 0xf;
  50106                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  50107                             vst4(al,
  50108                                  dt,
  50109                                  NeonRegisterList(DRegister(first),
  50110                                                   DRegister(last),
  50111                                                   spacing,
  50112                                                   transfer),
  50113                                  AlignedMemOperand(Register(rn),
  50114                                                    align,
  50115                                                    Offset));
  50116                             break;
  50117                           }
  50118                           case 0x00000100: {
  50119                             // 0xf400010d
  50120                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  50121                             if (dt.Is(kDataTypeValueInvalid)) {
  50122                               UnallocatedA32(instr);
  50123                               return;
  50124                             }
  50125                             Alignment align =
  50126                                 Align_align_4_Decode((instr >> 4) & 0x3);
  50127                             if (dt.Is(kDataTypeValueInvalid) ||
  50128                                 align.Is(kBadAlignment)) {
  50129                               UnallocatedA32(instr);
  50130                               return;
  50131                             }
  50132                             unsigned first = ExtractDRegister(instr, 22, 12);
  50133                             unsigned length;
  50134                             SpacingType spacing;
  50135                             switch ((instr >> 8) & 0xf) {
  50136                               default:
  50137                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50138                               case 0x0:
  50139                                 length = 4;
  50140                                 spacing = kSingle;
  50141                                 break;
  50142                               case 0x1:
  50143                                 length = 4;
  50144                                 spacing = kDouble;
  50145                                 break;
  50146                             }
  50147                             unsigned last =
  50148                                 first +
  50149                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  50150                             TransferType transfer = kMultipleLanes;
  50151                             unsigned rn = (instr >> 16) & 0xf;
  50152                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  50153                             vst4(al,
  50154                                  dt,
  50155                                  NeonRegisterList(DRegister(first),
  50156                                                   DRegister(last),
  50157                                                   spacing,
  50158                                                   transfer),
  50159                                  AlignedMemOperand(Register(rn),
  50160                                                    align,
  50161                                                    Offset));
  50162                             break;
  50163                           }
  50164                           case 0x00000200: {
  50165                             // 0xf400020d
  50166                             if (((instr & 0xe20) == 0x620) ||
  50167                                 ((instr & 0xf30) == 0xa30)) {
  50168                               UnallocatedA32(instr);
  50169                               return;
  50170                             }
  50171                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  50172                             if (dt.Is(kDataTypeValueInvalid)) {
  50173                               UnallocatedA32(instr);
  50174                               return;
  50175                             }
  50176                             Alignment align =
  50177                                 Align_align_5_Decode((instr >> 4) & 0x3);
  50178                             if (dt.Is(kDataTypeValueInvalid) ||
  50179                                 align.Is(kBadAlignment)) {
  50180                               UnallocatedA32(instr);
  50181                               return;
  50182                             }
  50183                             unsigned first = ExtractDRegister(instr, 22, 12);
  50184                             unsigned length;
  50185                             SpacingType spacing = kSingle;
  50186                             switch ((instr >> 8) & 0xf) {
  50187                               default:
  50188                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50189                               case 0x7:
  50190                                 length = 1;
  50191                                 break;
  50192                               case 0xa:
  50193                                 length = 2;
  50194                                 break;
  50195                               case 0x6:
  50196                                 length = 3;
  50197                                 break;
  50198                               case 0x2:
  50199                                 length = 4;
  50200                                 break;
  50201                             }
  50202                             unsigned last = first + length - 1;
  50203                             TransferType transfer = kMultipleLanes;
  50204                             unsigned rn = (instr >> 16) & 0xf;
  50205                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  50206                             vst1(al,
  50207                                  dt,
  50208                                  NeonRegisterList(DRegister(first),
  50209                                                   DRegister(last),
  50210                                                   spacing,
  50211                                                   transfer),
  50212                                  AlignedMemOperand(Register(rn),
  50213                                                    align,
  50214                                                    Offset));
  50215                             break;
  50216                           }
  50217                           case 0x00000300: {
  50218                             // 0xf400030d
  50219                             if (((instr & 0xe30) == 0x830)) {
  50220                               UnallocatedA32(instr);
  50221                               return;
  50222                             }
  50223                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  50224                             if (dt.Is(kDataTypeValueInvalid)) {
  50225                               UnallocatedA32(instr);
  50226                               return;
  50227                             }
  50228                             Alignment align =
  50229                                 Align_align_2_Decode((instr >> 4) & 0x3);
  50230                             if (dt.Is(kDataTypeValueInvalid) ||
  50231                                 align.Is(kBadAlignment)) {
  50232                               UnallocatedA32(instr);
  50233                               return;
  50234                             }
  50235                             unsigned first = ExtractDRegister(instr, 22, 12);
  50236                             unsigned length;
  50237                             SpacingType spacing;
  50238                             switch ((instr >> 8) & 0xf) {
  50239                               default:
  50240                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50241                               case 0x8:
  50242                                 length = 2;
  50243                                 spacing = kSingle;
  50244                                 break;
  50245                               case 0x9:
  50246                                 length = 2;
  50247                                 spacing = kDouble;
  50248                                 break;
  50249                               case 0x3:
  50250                                 length = 4;
  50251                                 spacing = kSingle;
  50252                                 break;
  50253                             }
  50254                             unsigned last =
  50255                                 first +
  50256                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  50257                             TransferType transfer = kMultipleLanes;
  50258                             unsigned rn = (instr >> 16) & 0xf;
  50259                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  50260                             vst2(al,
  50261                                  dt,
  50262                                  NeonRegisterList(DRegister(first),
  50263                                                   DRegister(last),
  50264                                                   spacing,
  50265                                                   transfer),
  50266                                  AlignedMemOperand(Register(rn),
  50267                                                    align,
  50268                                                    Offset));
  50269                             break;
  50270                           }
  50271                           case 0x00000400: {
  50272                             // 0xf400040d
  50273                             if (((instr & 0x20) == 0x20)) {
  50274                               UnallocatedA32(instr);
  50275                               return;
  50276                             }
  50277                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  50278                             if (dt.Is(kDataTypeValueInvalid)) {
  50279                               UnallocatedA32(instr);
  50280                               return;
  50281                             }
  50282                             Alignment align =
  50283                                 Align_align_3_Decode((instr >> 4) & 0x3);
  50284                             if (dt.Is(kDataTypeValueInvalid) ||
  50285                                 align.Is(kBadAlignment)) {
  50286                               UnallocatedA32(instr);
  50287                               return;
  50288                             }
  50289                             unsigned first = ExtractDRegister(instr, 22, 12);
  50290                             unsigned length;
  50291                             SpacingType spacing;
  50292                             switch ((instr >> 8) & 0xf) {
  50293                               default:
  50294                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50295                               case 0x4:
  50296                                 length = 3;
  50297                                 spacing = kSingle;
  50298                                 break;
  50299                               case 0x5:
  50300                                 length = 3;
  50301                                 spacing = kDouble;
  50302                                 break;
  50303                             }
  50304                             unsigned last =
  50305                                 first +
  50306                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  50307                             TransferType transfer = kMultipleLanes;
  50308                             unsigned rn = (instr >> 16) & 0xf;
  50309                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  50310                             vst3(al,
  50311                                  dt,
  50312                                  NeonRegisterList(DRegister(first),
  50313                                                   DRegister(last),
  50314                                                   spacing,
  50315                                                   transfer),
  50316                                  AlignedMemOperand(Register(rn),
  50317                                                    align,
  50318                                                    Offset));
  50319                             break;
  50320                           }
  50321                           case 0x00000500: {
  50322                             // 0xf400050d
  50323                             if (((instr & 0x20) == 0x20)) {
  50324                               UnallocatedA32(instr);
  50325                               return;
  50326                             }
  50327                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  50328                             if (dt.Is(kDataTypeValueInvalid)) {
  50329                               UnallocatedA32(instr);
  50330                               return;
  50331                             }
  50332                             Alignment align =
  50333                                 Align_align_3_Decode((instr >> 4) & 0x3);
  50334                             if (dt.Is(kDataTypeValueInvalid) ||
  50335                                 align.Is(kBadAlignment)) {
  50336                               UnallocatedA32(instr);
  50337                               return;
  50338                             }
  50339                             unsigned first = ExtractDRegister(instr, 22, 12);
  50340                             unsigned length;
  50341                             SpacingType spacing;
  50342                             switch ((instr >> 8) & 0xf) {
  50343                               default:
  50344                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50345                               case 0x4:
  50346                                 length = 3;
  50347                                 spacing = kSingle;
  50348                                 break;
  50349                               case 0x5:
  50350                                 length = 3;
  50351                                 spacing = kDouble;
  50352                                 break;
  50353                             }
  50354                             unsigned last =
  50355                                 first +
  50356                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  50357                             TransferType transfer = kMultipleLanes;
  50358                             unsigned rn = (instr >> 16) & 0xf;
  50359                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  50360                             vst3(al,
  50361                                  dt,
  50362                                  NeonRegisterList(DRegister(first),
  50363                                                   DRegister(last),
  50364                                                   spacing,
  50365                                                   transfer),
  50366                                  AlignedMemOperand(Register(rn),
  50367                                                    align,
  50368                                                    Offset));
  50369                             break;
  50370                           }
  50371                           case 0x00000600: {
  50372                             // 0xf400060d
  50373                             if (((instr & 0xe20) == 0x620) ||
  50374                                 ((instr & 0xf30) == 0xa30)) {
  50375                               UnallocatedA32(instr);
  50376                               return;
  50377                             }
  50378                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  50379                             if (dt.Is(kDataTypeValueInvalid)) {
  50380                               UnallocatedA32(instr);
  50381                               return;
  50382                             }
  50383                             Alignment align =
  50384                                 Align_align_5_Decode((instr >> 4) & 0x3);
  50385                             if (dt.Is(kDataTypeValueInvalid) ||
  50386                                 align.Is(kBadAlignment)) {
  50387                               UnallocatedA32(instr);
  50388                               return;
  50389                             }
  50390                             unsigned first = ExtractDRegister(instr, 22, 12);
  50391                             unsigned length;
  50392                             SpacingType spacing = kSingle;
  50393                             switch ((instr >> 8) & 0xf) {
  50394                               default:
  50395                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50396                               case 0x7:
  50397                                 length = 1;
  50398                                 break;
  50399                               case 0xa:
  50400                                 length = 2;
  50401                                 break;
  50402                               case 0x6:
  50403                                 length = 3;
  50404                                 break;
  50405                               case 0x2:
  50406                                 length = 4;
  50407                                 break;
  50408                             }
  50409                             unsigned last = first + length - 1;
  50410                             TransferType transfer = kMultipleLanes;
  50411                             unsigned rn = (instr >> 16) & 0xf;
  50412                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  50413                             vst1(al,
  50414                                  dt,
  50415                                  NeonRegisterList(DRegister(first),
  50416                                                   DRegister(last),
  50417                                                   spacing,
  50418                                                   transfer),
  50419                                  AlignedMemOperand(Register(rn),
  50420                                                    align,
  50421                                                    Offset));
  50422                             break;
  50423                           }
  50424                           case 0x00000700: {
  50425                             // 0xf400070d
  50426                             if (((instr & 0xe20) == 0x620) ||
  50427                                 ((instr & 0xf30) == 0xa30)) {
  50428                               UnallocatedA32(instr);
  50429                               return;
  50430                             }
  50431                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  50432                             if (dt.Is(kDataTypeValueInvalid)) {
  50433                               UnallocatedA32(instr);
  50434                               return;
  50435                             }
  50436                             Alignment align =
  50437                                 Align_align_5_Decode((instr >> 4) & 0x3);
  50438                             if (dt.Is(kDataTypeValueInvalid) ||
  50439                                 align.Is(kBadAlignment)) {
  50440                               UnallocatedA32(instr);
  50441                               return;
  50442                             }
  50443                             unsigned first = ExtractDRegister(instr, 22, 12);
  50444                             unsigned length;
  50445                             SpacingType spacing = kSingle;
  50446                             switch ((instr >> 8) & 0xf) {
  50447                               default:
  50448                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50449                               case 0x7:
  50450                                 length = 1;
  50451                                 break;
  50452                               case 0xa:
  50453                                 length = 2;
  50454                                 break;
  50455                               case 0x6:
  50456                                 length = 3;
  50457                                 break;
  50458                               case 0x2:
  50459                                 length = 4;
  50460                                 break;
  50461                             }
  50462                             unsigned last = first + length - 1;
  50463                             TransferType transfer = kMultipleLanes;
  50464                             unsigned rn = (instr >> 16) & 0xf;
  50465                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  50466                             vst1(al,
  50467                                  dt,
  50468                                  NeonRegisterList(DRegister(first),
  50469                                                   DRegister(last),
  50470                                                   spacing,
  50471                                                   transfer),
  50472                                  AlignedMemOperand(Register(rn),
  50473                                                    align,
  50474                                                    Offset));
  50475                             break;
  50476                           }
  50477                           case 0x00000800: {
  50478                             // 0xf400080d
  50479                             if (((instr & 0xe30) == 0x830)) {
  50480                               UnallocatedA32(instr);
  50481                               return;
  50482                             }
  50483                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  50484                             if (dt.Is(kDataTypeValueInvalid)) {
  50485                               UnallocatedA32(instr);
  50486                               return;
  50487                             }
  50488                             Alignment align =
  50489                                 Align_align_2_Decode((instr >> 4) & 0x3);
  50490                             if (dt.Is(kDataTypeValueInvalid) ||
  50491                                 align.Is(kBadAlignment)) {
  50492                               UnallocatedA32(instr);
  50493                               return;
  50494                             }
  50495                             unsigned first = ExtractDRegister(instr, 22, 12);
  50496                             unsigned length;
  50497                             SpacingType spacing;
  50498                             switch ((instr >> 8) & 0xf) {
  50499                               default:
  50500                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50501                               case 0x8:
  50502                                 length = 2;
  50503                                 spacing = kSingle;
  50504                                 break;
  50505                               case 0x9:
  50506                                 length = 2;
  50507                                 spacing = kDouble;
  50508                                 break;
  50509                               case 0x3:
  50510                                 length = 4;
  50511                                 spacing = kSingle;
  50512                                 break;
  50513                             }
  50514                             unsigned last =
  50515                                 first +
  50516                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  50517                             TransferType transfer = kMultipleLanes;
  50518                             unsigned rn = (instr >> 16) & 0xf;
  50519                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  50520                             vst2(al,
  50521                                  dt,
  50522                                  NeonRegisterList(DRegister(first),
  50523                                                   DRegister(last),
  50524                                                   spacing,
  50525                                                   transfer),
  50526                                  AlignedMemOperand(Register(rn),
  50527                                                    align,
  50528                                                    Offset));
  50529                             break;
  50530                           }
  50531                           case 0x00000900: {
  50532                             // 0xf400090d
  50533                             if (((instr & 0xe30) == 0x830)) {
  50534                               UnallocatedA32(instr);
  50535                               return;
  50536                             }
  50537                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  50538                             if (dt.Is(kDataTypeValueInvalid)) {
  50539                               UnallocatedA32(instr);
  50540                               return;
  50541                             }
  50542                             Alignment align =
  50543                                 Align_align_2_Decode((instr >> 4) & 0x3);
  50544                             if (dt.Is(kDataTypeValueInvalid) ||
  50545                                 align.Is(kBadAlignment)) {
  50546                               UnallocatedA32(instr);
  50547                               return;
  50548                             }
  50549                             unsigned first = ExtractDRegister(instr, 22, 12);
  50550                             unsigned length;
  50551                             SpacingType spacing;
  50552                             switch ((instr >> 8) & 0xf) {
  50553                               default:
  50554                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50555                               case 0x8:
  50556                                 length = 2;
  50557                                 spacing = kSingle;
  50558                                 break;
  50559                               case 0x9:
  50560                                 length = 2;
  50561                                 spacing = kDouble;
  50562                                 break;
  50563                               case 0x3:
  50564                                 length = 4;
  50565                                 spacing = kSingle;
  50566                                 break;
  50567                             }
  50568                             unsigned last =
  50569                                 first +
  50570                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  50571                             TransferType transfer = kMultipleLanes;
  50572                             unsigned rn = (instr >> 16) & 0xf;
  50573                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  50574                             vst2(al,
  50575                                  dt,
  50576                                  NeonRegisterList(DRegister(first),
  50577                                                   DRegister(last),
  50578                                                   spacing,
  50579                                                   transfer),
  50580                                  AlignedMemOperand(Register(rn),
  50581                                                    align,
  50582                                                    Offset));
  50583                             break;
  50584                           }
  50585                           case 0x00000a00: {
  50586                             // 0xf4000a0d
  50587                             if (((instr & 0xe20) == 0x620) ||
  50588                                 ((instr & 0xf30) == 0xa30)) {
  50589                               UnallocatedA32(instr);
  50590                               return;
  50591                             }
  50592                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  50593                             if (dt.Is(kDataTypeValueInvalid)) {
  50594                               UnallocatedA32(instr);
  50595                               return;
  50596                             }
  50597                             Alignment align =
  50598                                 Align_align_5_Decode((instr >> 4) & 0x3);
  50599                             if (dt.Is(kDataTypeValueInvalid) ||
  50600                                 align.Is(kBadAlignment)) {
  50601                               UnallocatedA32(instr);
  50602                               return;
  50603                             }
  50604                             unsigned first = ExtractDRegister(instr, 22, 12);
  50605                             unsigned length;
  50606                             SpacingType spacing = kSingle;
  50607                             switch ((instr >> 8) & 0xf) {
  50608                               default:
  50609                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50610                               case 0x7:
  50611                                 length = 1;
  50612                                 break;
  50613                               case 0xa:
  50614                                 length = 2;
  50615                                 break;
  50616                               case 0x6:
  50617                                 length = 3;
  50618                                 break;
  50619                               case 0x2:
  50620                                 length = 4;
  50621                                 break;
  50622                             }
  50623                             unsigned last = first + length - 1;
  50624                             TransferType transfer = kMultipleLanes;
  50625                             unsigned rn = (instr >> 16) & 0xf;
  50626                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  50627                             vst1(al,
  50628                                  dt,
  50629                                  NeonRegisterList(DRegister(first),
  50630                                                   DRegister(last),
  50631                                                   spacing,
  50632                                                   transfer),
  50633                                  AlignedMemOperand(Register(rn),
  50634                                                    align,
  50635                                                    Offset));
  50636                             break;
  50637                           }
  50638                           default:
  50639                             UnallocatedA32(instr);
  50640                             break;
  50641                         }
  50642                         break;
  50643                       }
  50644                     }
  50645                     break;
  50646                   }
  50647                   default: {
  50648                     switch (instr & 0x00000f00) {
  50649                       case 0x00000000: {
  50650                         // 0xf4000000
  50651                         if (((instr & 0xd) == 0xd)) {
  50652                           UnallocatedA32(instr);
  50653                           return;
  50654                         }
  50655                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  50656                         if (dt.Is(kDataTypeValueInvalid)) {
  50657                           UnallocatedA32(instr);
  50658                           return;
  50659                         }
  50660                         Alignment align =
  50661                             Align_align_4_Decode((instr >> 4) & 0x3);
  50662                         if (dt.Is(kDataTypeValueInvalid) ||
  50663                             align.Is(kBadAlignment)) {
  50664                           UnallocatedA32(instr);
  50665                           return;
  50666                         }
  50667                         unsigned first = ExtractDRegister(instr, 22, 12);
  50668                         unsigned length;
  50669                         SpacingType spacing;
  50670                         switch ((instr >> 8) & 0xf) {
  50671                           default:
  50672                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50673                           case 0x0:
  50674                             length = 4;
  50675                             spacing = kSingle;
  50676                             break;
  50677                           case 0x1:
  50678                             length = 4;
  50679                             spacing = kDouble;
  50680                             break;
  50681                         }
  50682                         unsigned last =
  50683                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
  50684                         TransferType transfer = kMultipleLanes;
  50685                         unsigned rn = (instr >> 16) & 0xf;
  50686                         unsigned rm = instr & 0xf;
  50687                         // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  50688                         vst4(al,
  50689                              dt,
  50690                              NeonRegisterList(DRegister(first),
  50691                                               DRegister(last),
  50692                                               spacing,
  50693                                               transfer),
  50694                              AlignedMemOperand(Register(rn),
  50695                                                align,
  50696                                                Register(rm),
  50697                                                PostIndex));
  50698                         break;
  50699                       }
  50700                       case 0x00000100: {
  50701                         // 0xf4000100
  50702                         if (((instr & 0xd) == 0xd)) {
  50703                           UnallocatedA32(instr);
  50704                           return;
  50705                         }
  50706                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  50707                         if (dt.Is(kDataTypeValueInvalid)) {
  50708                           UnallocatedA32(instr);
  50709                           return;
  50710                         }
  50711                         Alignment align =
  50712                             Align_align_4_Decode((instr >> 4) & 0x3);
  50713                         if (dt.Is(kDataTypeValueInvalid) ||
  50714                             align.Is(kBadAlignment)) {
  50715                           UnallocatedA32(instr);
  50716                           return;
  50717                         }
  50718                         unsigned first = ExtractDRegister(instr, 22, 12);
  50719                         unsigned length;
  50720                         SpacingType spacing;
  50721                         switch ((instr >> 8) & 0xf) {
  50722                           default:
  50723                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50724                           case 0x0:
  50725                             length = 4;
  50726                             spacing = kSingle;
  50727                             break;
  50728                           case 0x1:
  50729                             length = 4;
  50730                             spacing = kDouble;
  50731                             break;
  50732                         }
  50733                         unsigned last =
  50734                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
  50735                         TransferType transfer = kMultipleLanes;
  50736                         unsigned rn = (instr >> 16) & 0xf;
  50737                         unsigned rm = instr & 0xf;
  50738                         // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  50739                         vst4(al,
  50740                              dt,
  50741                              NeonRegisterList(DRegister(first),
  50742                                               DRegister(last),
  50743                                               spacing,
  50744                                               transfer),
  50745                              AlignedMemOperand(Register(rn),
  50746                                                align,
  50747                                                Register(rm),
  50748                                                PostIndex));
  50749                         break;
  50750                       }
  50751                       case 0x00000200: {
  50752                         // 0xf4000200
  50753                         if (((instr & 0xd) == 0xd) ||
  50754                             ((instr & 0xe20) == 0x620) ||
  50755                             ((instr & 0xf30) == 0xa30)) {
  50756                           UnallocatedA32(instr);
  50757                           return;
  50758                         }
  50759                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  50760                         if (dt.Is(kDataTypeValueInvalid)) {
  50761                           UnallocatedA32(instr);
  50762                           return;
  50763                         }
  50764                         Alignment align =
  50765                             Align_align_5_Decode((instr >> 4) & 0x3);
  50766                         if (dt.Is(kDataTypeValueInvalid) ||
  50767                             align.Is(kBadAlignment)) {
  50768                           UnallocatedA32(instr);
  50769                           return;
  50770                         }
  50771                         unsigned first = ExtractDRegister(instr, 22, 12);
  50772                         unsigned length;
  50773                         SpacingType spacing = kSingle;
  50774                         switch ((instr >> 8) & 0xf) {
  50775                           default:
  50776                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50777                           case 0x7:
  50778                             length = 1;
  50779                             break;
  50780                           case 0xa:
  50781                             length = 2;
  50782                             break;
  50783                           case 0x6:
  50784                             length = 3;
  50785                             break;
  50786                           case 0x2:
  50787                             length = 4;
  50788                             break;
  50789                         }
  50790                         unsigned last = first + length - 1;
  50791                         TransferType transfer = kMultipleLanes;
  50792                         unsigned rn = (instr >> 16) & 0xf;
  50793                         unsigned rm = instr & 0xf;
  50794                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  50795                         vst1(al,
  50796                              dt,
  50797                              NeonRegisterList(DRegister(first),
  50798                                               DRegister(last),
  50799                                               spacing,
  50800                                               transfer),
  50801                              AlignedMemOperand(Register(rn),
  50802                                                align,
  50803                                                Register(rm),
  50804                                                PostIndex));
  50805                         break;
  50806                       }
  50807                       case 0x00000300: {
  50808                         // 0xf4000300
  50809                         if (((instr & 0xd) == 0xd) ||
  50810                             ((instr & 0xe30) == 0x830)) {
  50811                           UnallocatedA32(instr);
  50812                           return;
  50813                         }
  50814                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  50815                         if (dt.Is(kDataTypeValueInvalid)) {
  50816                           UnallocatedA32(instr);
  50817                           return;
  50818                         }
  50819                         Alignment align =
  50820                             Align_align_2_Decode((instr >> 4) & 0x3);
  50821                         if (dt.Is(kDataTypeValueInvalid) ||
  50822                             align.Is(kBadAlignment)) {
  50823                           UnallocatedA32(instr);
  50824                           return;
  50825                         }
  50826                         unsigned first = ExtractDRegister(instr, 22, 12);
  50827                         unsigned length;
  50828                         SpacingType spacing;
  50829                         switch ((instr >> 8) & 0xf) {
  50830                           default:
  50831                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50832                           case 0x8:
  50833                             length = 2;
  50834                             spacing = kSingle;
  50835                             break;
  50836                           case 0x9:
  50837                             length = 2;
  50838                             spacing = kDouble;
  50839                             break;
  50840                           case 0x3:
  50841                             length = 4;
  50842                             spacing = kSingle;
  50843                             break;
  50844                         }
  50845                         unsigned last =
  50846                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
  50847                         TransferType transfer = kMultipleLanes;
  50848                         unsigned rn = (instr >> 16) & 0xf;
  50849                         unsigned rm = instr & 0xf;
  50850                         // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  50851                         vst2(al,
  50852                              dt,
  50853                              NeonRegisterList(DRegister(first),
  50854                                               DRegister(last),
  50855                                               spacing,
  50856                                               transfer),
  50857                              AlignedMemOperand(Register(rn),
  50858                                                align,
  50859                                                Register(rm),
  50860                                                PostIndex));
  50861                         break;
  50862                       }
  50863                       case 0x00000400: {
  50864                         // 0xf4000400
  50865                         if (((instr & 0xd) == 0xd) ||
  50866                             ((instr & 0x20) == 0x20)) {
  50867                           UnallocatedA32(instr);
  50868                           return;
  50869                         }
  50870                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  50871                         if (dt.Is(kDataTypeValueInvalid)) {
  50872                           UnallocatedA32(instr);
  50873                           return;
  50874                         }
  50875                         Alignment align =
  50876                             Align_align_3_Decode((instr >> 4) & 0x3);
  50877                         if (dt.Is(kDataTypeValueInvalid) ||
  50878                             align.Is(kBadAlignment)) {
  50879                           UnallocatedA32(instr);
  50880                           return;
  50881                         }
  50882                         unsigned first = ExtractDRegister(instr, 22, 12);
  50883                         unsigned length;
  50884                         SpacingType spacing;
  50885                         switch ((instr >> 8) & 0xf) {
  50886                           default:
  50887                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50888                           case 0x4:
  50889                             length = 3;
  50890                             spacing = kSingle;
  50891                             break;
  50892                           case 0x5:
  50893                             length = 3;
  50894                             spacing = kDouble;
  50895                             break;
  50896                         }
  50897                         unsigned last =
  50898                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
  50899                         TransferType transfer = kMultipleLanes;
  50900                         unsigned rn = (instr >> 16) & 0xf;
  50901                         unsigned rm = instr & 0xf;
  50902                         // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  50903                         vst3(al,
  50904                              dt,
  50905                              NeonRegisterList(DRegister(first),
  50906                                               DRegister(last),
  50907                                               spacing,
  50908                                               transfer),
  50909                              AlignedMemOperand(Register(rn),
  50910                                                align,
  50911                                                Register(rm),
  50912                                                PostIndex));
  50913                         break;
  50914                       }
  50915                       case 0x00000500: {
  50916                         // 0xf4000500
  50917                         if (((instr & 0xd) == 0xd) ||
  50918                             ((instr & 0x20) == 0x20)) {
  50919                           UnallocatedA32(instr);
  50920                           return;
  50921                         }
  50922                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  50923                         if (dt.Is(kDataTypeValueInvalid)) {
  50924                           UnallocatedA32(instr);
  50925                           return;
  50926                         }
  50927                         Alignment align =
  50928                             Align_align_3_Decode((instr >> 4) & 0x3);
  50929                         if (dt.Is(kDataTypeValueInvalid) ||
  50930                             align.Is(kBadAlignment)) {
  50931                           UnallocatedA32(instr);
  50932                           return;
  50933                         }
  50934                         unsigned first = ExtractDRegister(instr, 22, 12);
  50935                         unsigned length;
  50936                         SpacingType spacing;
  50937                         switch ((instr >> 8) & 0xf) {
  50938                           default:
  50939                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50940                           case 0x4:
  50941                             length = 3;
  50942                             spacing = kSingle;
  50943                             break;
  50944                           case 0x5:
  50945                             length = 3;
  50946                             spacing = kDouble;
  50947                             break;
  50948                         }
  50949                         unsigned last =
  50950                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
  50951                         TransferType transfer = kMultipleLanes;
  50952                         unsigned rn = (instr >> 16) & 0xf;
  50953                         unsigned rm = instr & 0xf;
  50954                         // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  50955                         vst3(al,
  50956                              dt,
  50957                              NeonRegisterList(DRegister(first),
  50958                                               DRegister(last),
  50959                                               spacing,
  50960                                               transfer),
  50961                              AlignedMemOperand(Register(rn),
  50962                                                align,
  50963                                                Register(rm),
  50964                                                PostIndex));
  50965                         break;
  50966                       }
  50967                       case 0x00000600: {
  50968                         // 0xf4000600
  50969                         if (((instr & 0xd) == 0xd) ||
  50970                             ((instr & 0xe20) == 0x620) ||
  50971                             ((instr & 0xf30) == 0xa30)) {
  50972                           UnallocatedA32(instr);
  50973                           return;
  50974                         }
  50975                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  50976                         if (dt.Is(kDataTypeValueInvalid)) {
  50977                           UnallocatedA32(instr);
  50978                           return;
  50979                         }
  50980                         Alignment align =
  50981                             Align_align_5_Decode((instr >> 4) & 0x3);
  50982                         if (dt.Is(kDataTypeValueInvalid) ||
  50983                             align.Is(kBadAlignment)) {
  50984                           UnallocatedA32(instr);
  50985                           return;
  50986                         }
  50987                         unsigned first = ExtractDRegister(instr, 22, 12);
  50988                         unsigned length;
  50989                         SpacingType spacing = kSingle;
  50990                         switch ((instr >> 8) & 0xf) {
  50991                           default:
  50992                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  50993                           case 0x7:
  50994                             length = 1;
  50995                             break;
  50996                           case 0xa:
  50997                             length = 2;
  50998                             break;
  50999                           case 0x6:
  51000                             length = 3;
  51001                             break;
  51002                           case 0x2:
  51003                             length = 4;
  51004                             break;
  51005                         }
  51006                         unsigned last = first + length - 1;
  51007                         TransferType transfer = kMultipleLanes;
  51008                         unsigned rn = (instr >> 16) & 0xf;
  51009                         unsigned rm = instr & 0xf;
  51010                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  51011                         vst1(al,
  51012                              dt,
  51013                              NeonRegisterList(DRegister(first),
  51014                                               DRegister(last),
  51015                                               spacing,
  51016                                               transfer),
  51017                              AlignedMemOperand(Register(rn),
  51018                                                align,
  51019                                                Register(rm),
  51020                                                PostIndex));
  51021                         break;
  51022                       }
  51023                       case 0x00000700: {
  51024                         // 0xf4000700
  51025                         if (((instr & 0xd) == 0xd) ||
  51026                             ((instr & 0xe20) == 0x620) ||
  51027                             ((instr & 0xf30) == 0xa30)) {
  51028                           UnallocatedA32(instr);
  51029                           return;
  51030                         }
  51031                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  51032                         if (dt.Is(kDataTypeValueInvalid)) {
  51033                           UnallocatedA32(instr);
  51034                           return;
  51035                         }
  51036                         Alignment align =
  51037                             Align_align_5_Decode((instr >> 4) & 0x3);
  51038                         if (dt.Is(kDataTypeValueInvalid) ||
  51039                             align.Is(kBadAlignment)) {
  51040                           UnallocatedA32(instr);
  51041                           return;
  51042                         }
  51043                         unsigned first = ExtractDRegister(instr, 22, 12);
  51044                         unsigned length;
  51045                         SpacingType spacing = kSingle;
  51046                         switch ((instr >> 8) & 0xf) {
  51047                           default:
  51048                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  51049                           case 0x7:
  51050                             length = 1;
  51051                             break;
  51052                           case 0xa:
  51053                             length = 2;
  51054                             break;
  51055                           case 0x6:
  51056                             length = 3;
  51057                             break;
  51058                           case 0x2:
  51059                             length = 4;
  51060                             break;
  51061                         }
  51062                         unsigned last = first + length - 1;
  51063                         TransferType transfer = kMultipleLanes;
  51064                         unsigned rn = (instr >> 16) & 0xf;
  51065                         unsigned rm = instr & 0xf;
  51066                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  51067                         vst1(al,
  51068                              dt,
  51069                              NeonRegisterList(DRegister(first),
  51070                                               DRegister(last),
  51071                                               spacing,
  51072                                               transfer),
  51073                              AlignedMemOperand(Register(rn),
  51074                                                align,
  51075                                                Register(rm),
  51076                                                PostIndex));
  51077                         break;
  51078                       }
  51079                       case 0x00000800: {
  51080                         // 0xf4000800
  51081                         if (((instr & 0xd) == 0xd) ||
  51082                             ((instr & 0xe30) == 0x830)) {
  51083                           UnallocatedA32(instr);
  51084                           return;
  51085                         }
  51086                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  51087                         if (dt.Is(kDataTypeValueInvalid)) {
  51088                           UnallocatedA32(instr);
  51089                           return;
  51090                         }
  51091                         Alignment align =
  51092                             Align_align_2_Decode((instr >> 4) & 0x3);
  51093                         if (dt.Is(kDataTypeValueInvalid) ||
  51094                             align.Is(kBadAlignment)) {
  51095                           UnallocatedA32(instr);
  51096                           return;
  51097                         }
  51098                         unsigned first = ExtractDRegister(instr, 22, 12);
  51099                         unsigned length;
  51100                         SpacingType spacing;
  51101                         switch ((instr >> 8) & 0xf) {
  51102                           default:
  51103                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  51104                           case 0x8:
  51105                             length = 2;
  51106                             spacing = kSingle;
  51107                             break;
  51108                           case 0x9:
  51109                             length = 2;
  51110                             spacing = kDouble;
  51111                             break;
  51112                           case 0x3:
  51113                             length = 4;
  51114                             spacing = kSingle;
  51115                             break;
  51116                         }
  51117                         unsigned last =
  51118                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
  51119                         TransferType transfer = kMultipleLanes;
  51120                         unsigned rn = (instr >> 16) & 0xf;
  51121                         unsigned rm = instr & 0xf;
  51122                         // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  51123                         vst2(al,
  51124                              dt,
  51125                              NeonRegisterList(DRegister(first),
  51126                                               DRegister(last),
  51127                                               spacing,
  51128                                               transfer),
  51129                              AlignedMemOperand(Register(rn),
  51130                                                align,
  51131                                                Register(rm),
  51132                                                PostIndex));
  51133                         break;
  51134                       }
  51135                       case 0x00000900: {
  51136                         // 0xf4000900
  51137                         if (((instr & 0xd) == 0xd) ||
  51138                             ((instr & 0xe30) == 0x830)) {
  51139                           UnallocatedA32(instr);
  51140                           return;
  51141                         }
  51142                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  51143                         if (dt.Is(kDataTypeValueInvalid)) {
  51144                           UnallocatedA32(instr);
  51145                           return;
  51146                         }
  51147                         Alignment align =
  51148                             Align_align_2_Decode((instr >> 4) & 0x3);
  51149                         if (dt.Is(kDataTypeValueInvalid) ||
  51150                             align.Is(kBadAlignment)) {
  51151                           UnallocatedA32(instr);
  51152                           return;
  51153                         }
  51154                         unsigned first = ExtractDRegister(instr, 22, 12);
  51155                         unsigned length;
  51156                         SpacingType spacing;
  51157                         switch ((instr >> 8) & 0xf) {
  51158                           default:
  51159                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  51160                           case 0x8:
  51161                             length = 2;
  51162                             spacing = kSingle;
  51163                             break;
  51164                           case 0x9:
  51165                             length = 2;
  51166                             spacing = kDouble;
  51167                             break;
  51168                           case 0x3:
  51169                             length = 4;
  51170                             spacing = kSingle;
  51171                             break;
  51172                         }
  51173                         unsigned last =
  51174                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
  51175                         TransferType transfer = kMultipleLanes;
  51176                         unsigned rn = (instr >> 16) & 0xf;
  51177                         unsigned rm = instr & 0xf;
  51178                         // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  51179                         vst2(al,
  51180                              dt,
  51181                              NeonRegisterList(DRegister(first),
  51182                                               DRegister(last),
  51183                                               spacing,
  51184                                               transfer),
  51185                              AlignedMemOperand(Register(rn),
  51186                                                align,
  51187                                                Register(rm),
  51188                                                PostIndex));
  51189                         break;
  51190                       }
  51191                       case 0x00000a00: {
  51192                         // 0xf4000a00
  51193                         if (((instr & 0xd) == 0xd) ||
  51194                             ((instr & 0xe20) == 0x620) ||
  51195                             ((instr & 0xf30) == 0xa30)) {
  51196                           UnallocatedA32(instr);
  51197                           return;
  51198                         }
  51199                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  51200                         if (dt.Is(kDataTypeValueInvalid)) {
  51201                           UnallocatedA32(instr);
  51202                           return;
  51203                         }
  51204                         Alignment align =
  51205                             Align_align_5_Decode((instr >> 4) & 0x3);
  51206                         if (dt.Is(kDataTypeValueInvalid) ||
  51207                             align.Is(kBadAlignment)) {
  51208                           UnallocatedA32(instr);
  51209                           return;
  51210                         }
  51211                         unsigned first = ExtractDRegister(instr, 22, 12);
  51212                         unsigned length;
  51213                         SpacingType spacing = kSingle;
  51214                         switch ((instr >> 8) & 0xf) {
  51215                           default:
  51216                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  51217                           case 0x7:
  51218                             length = 1;
  51219                             break;
  51220                           case 0xa:
  51221                             length = 2;
  51222                             break;
  51223                           case 0x6:
  51224                             length = 3;
  51225                             break;
  51226                           case 0x2:
  51227                             length = 4;
  51228                             break;
  51229                         }
  51230                         unsigned last = first + length - 1;
  51231                         TransferType transfer = kMultipleLanes;
  51232                         unsigned rn = (instr >> 16) & 0xf;
  51233                         unsigned rm = instr & 0xf;
  51234                         // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  51235                         vst1(al,
  51236                              dt,
  51237                              NeonRegisterList(DRegister(first),
  51238                                               DRegister(last),
  51239                                               spacing,
  51240                                               transfer),
  51241                              AlignedMemOperand(Register(rn),
  51242                                                align,
  51243                                                Register(rm),
  51244                                                PostIndex));
  51245                         break;
  51246                       }
  51247                       default:
  51248                         UnallocatedA32(instr);
  51249                         break;
  51250                     }
  51251                     break;
  51252                   }
  51253                 }
  51254                 break;
  51255               }
  51256               case 0x00800000: {
  51257                 // 0xf4800000
  51258                 switch (instr & 0x00000300) {
  51259                   case 0x00000000: {
  51260                     // 0xf4800000
  51261                     switch (instr & 0x00000c00) {
  51262                       case 0x00000c00: {
  51263                         // 0xf4800c00
  51264                         UnallocatedA32(instr);
  51265                         break;
  51266                       }
  51267                       default: {
  51268                         switch (instr & 0x0000000d) {
  51269                           case 0x0000000d: {
  51270                             // 0xf480000d
  51271                             switch (instr & 0x00000002) {
  51272                               case 0x00000000: {
  51273                                 // 0xf480000d
  51274                                 if (((instr & 0xc00) == 0xc00)) {
  51275                                   UnallocatedA32(instr);
  51276                                   return;
  51277                                 }
  51278                                 DataType dt =
  51279                                     Dt_size_7_Decode((instr >> 10) & 0x3);
  51280                                 if (dt.Is(kDataTypeValueInvalid)) {
  51281                                   UnallocatedA32(instr);
  51282                                   return;
  51283                                 }
  51284                                 DecodeNeonAndAlign decode_neon =
  51285                                     Align_index_align_1_Decode((instr >> 4) &
  51286                                                                    0xf,
  51287                                                                dt);
  51288                                 if (!decode_neon.IsValid()) {
  51289                                   UnallocatedA32(instr);
  51290                                   return;
  51291                                 }
  51292                                 Alignment align = decode_neon.GetAlign();
  51293                                 int lane = decode_neon.GetLane();
  51294                                 SpacingType spacing = decode_neon.GetSpacing();
  51295                                 unsigned first =
  51296                                     ExtractDRegister(instr, 22, 12);
  51297                                 unsigned length = 1;
  51298                                 unsigned last = first + length - 1;
  51299                                 unsigned rn = (instr >> 16) & 0xf;
  51300                                 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  51301                                 vst1(al,
  51302                                      dt,
  51303                                      NeonRegisterList(DRegister(first),
  51304                                                       DRegister(last),
  51305                                                       spacing,
  51306                                                       lane),
  51307                                      AlignedMemOperand(Register(rn),
  51308                                                        align,
  51309                                                        PostIndex));
  51310                                 break;
  51311                               }
  51312                               case 0x00000002: {
  51313                                 // 0xf480000f
  51314                                 if (((instr & 0xc00) == 0xc00)) {
  51315                                   UnallocatedA32(instr);
  51316                                   return;
  51317                                 }
  51318                                 DataType dt =
  51319                                     Dt_size_7_Decode((instr >> 10) & 0x3);
  51320                                 if (dt.Is(kDataTypeValueInvalid)) {
  51321                                   UnallocatedA32(instr);
  51322                                   return;
  51323                                 }
  51324                                 DecodeNeonAndAlign decode_neon =
  51325                                     Align_index_align_1_Decode((instr >> 4) &
  51326                                                                    0xf,
  51327                                                                dt);
  51328                                 if (!decode_neon.IsValid()) {
  51329                                   UnallocatedA32(instr);
  51330                                   return;
  51331                                 }
  51332                                 Alignment align = decode_neon.GetAlign();
  51333                                 int lane = decode_neon.GetLane();
  51334                                 SpacingType spacing = decode_neon.GetSpacing();
  51335                                 unsigned first =
  51336                                     ExtractDRegister(instr, 22, 12);
  51337                                 unsigned length = 1;
  51338                                 unsigned last = first + length - 1;
  51339                                 unsigned rn = (instr >> 16) & 0xf;
  51340                                 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
  51341                                 vst1(al,
  51342                                      dt,
  51343                                      NeonRegisterList(DRegister(first),
  51344                                                       DRegister(last),
  51345                                                       spacing,
  51346                                                       lane),
  51347                                      AlignedMemOperand(Register(rn),
  51348                                                        align,
  51349                                                        Offset));
  51350                                 break;
  51351                               }
  51352                             }
  51353                             break;
  51354                           }
  51355                           default: {
  51356                             if (((instr & 0xc00) == 0xc00) ||
  51357                                 ((instr & 0xd) == 0xd)) {
  51358                               UnallocatedA32(instr);
  51359                               return;
  51360                             }
  51361                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
  51362                             if (dt.Is(kDataTypeValueInvalid)) {
  51363                               UnallocatedA32(instr);
  51364                               return;
  51365                             }
  51366                             DecodeNeonAndAlign decode_neon =
  51367                                 Align_index_align_1_Decode((instr >> 4) & 0xf,
  51368                                                            dt);
  51369                             if (!decode_neon.IsValid()) {
  51370                               UnallocatedA32(instr);
  51371                               return;
  51372                             }
  51373                             Alignment align = decode_neon.GetAlign();
  51374                             int lane = decode_neon.GetLane();
  51375                             SpacingType spacing = decode_neon.GetSpacing();
  51376                             unsigned first = ExtractDRegister(instr, 22, 12);
  51377                             unsigned length = 1;
  51378                             unsigned last = first + length - 1;
  51379                             unsigned rn = (instr >> 16) & 0xf;
  51380                             unsigned rm = instr & 0xf;
  51381                             // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  51382                             vst1(al,
  51383                                  dt,
  51384                                  NeonRegisterList(DRegister(first),
  51385                                                   DRegister(last),
  51386                                                   spacing,
  51387                                                   lane),
  51388                                  AlignedMemOperand(Register(rn),
  51389                                                    align,
  51390                                                    Register(rm),
  51391                                                    PostIndex));
  51392                             break;
  51393                           }
  51394                         }
  51395                         break;
  51396                       }
  51397                     }
  51398                     break;
  51399                   }
  51400                   case 0x00000100: {
  51401                     // 0xf4800100
  51402                     switch (instr & 0x00000c00) {
  51403                       case 0x00000c00: {
  51404                         // 0xf4800d00
  51405                         UnallocatedA32(instr);
  51406                         break;
  51407                       }
  51408                       default: {
  51409                         switch (instr & 0x0000000d) {
  51410                           case 0x0000000d: {
  51411                             // 0xf480010d
  51412                             switch (instr & 0x00000002) {
  51413                               case 0x00000000: {
  51414                                 // 0xf480010d
  51415                                 if (((instr & 0xc00) == 0xc00)) {
  51416                                   UnallocatedA32(instr);
  51417                                   return;
  51418                                 }
  51419                                 DataType dt =
  51420                                     Dt_size_7_Decode((instr >> 10) & 0x3);
  51421                                 if (dt.Is(kDataTypeValueInvalid)) {
  51422                                   UnallocatedA32(instr);
  51423                                   return;
  51424                                 }
  51425                                 DecodeNeonAndAlign decode_neon =
  51426                                     Align_index_align_2_Decode((instr >> 4) &
  51427                                                                    0xf,
  51428                                                                dt);
  51429                                 if (!decode_neon.IsValid()) {
  51430                                   UnallocatedA32(instr);
  51431                                   return;
  51432                                 }
  51433                                 Alignment align = decode_neon.GetAlign();
  51434                                 int lane = decode_neon.GetLane();
  51435                                 SpacingType spacing = decode_neon.GetSpacing();
  51436                                 unsigned first =
  51437                                     ExtractDRegister(instr, 22, 12);
  51438                                 unsigned length = 2;
  51439                                 unsigned last =
  51440                                     first +
  51441                                     (length - 1) * (spacing == kSingle ? 1 : 2);
  51442                                 unsigned rn = (instr >> 16) & 0xf;
  51443                                 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  51444                                 vst2(al,
  51445                                      dt,
  51446                                      NeonRegisterList(DRegister(first),
  51447                                                       DRegister(last),
  51448                                                       spacing,
  51449                                                       lane),
  51450                                      AlignedMemOperand(Register(rn),
  51451                                                        align,
  51452                                                        PostIndex));
  51453                                 break;
  51454                               }
  51455                               case 0x00000002: {
  51456                                 // 0xf480010f
  51457                                 if (((instr & 0xc00) == 0xc00)) {
  51458                                   UnallocatedA32(instr);
  51459                                   return;
  51460                                 }
  51461                                 DataType dt =
  51462                                     Dt_size_7_Decode((instr >> 10) & 0x3);
  51463                                 if (dt.Is(kDataTypeValueInvalid)) {
  51464                                   UnallocatedA32(instr);
  51465                                   return;
  51466                                 }
  51467                                 DecodeNeonAndAlign decode_neon =
  51468                                     Align_index_align_2_Decode((instr >> 4) &
  51469                                                                    0xf,
  51470                                                                dt);
  51471                                 if (!decode_neon.IsValid()) {
  51472                                   UnallocatedA32(instr);
  51473                                   return;
  51474                                 }
  51475                                 Alignment align = decode_neon.GetAlign();
  51476                                 int lane = decode_neon.GetLane();
  51477                                 SpacingType spacing = decode_neon.GetSpacing();
  51478                                 unsigned first =
  51479                                     ExtractDRegister(instr, 22, 12);
  51480                                 unsigned length = 2;
  51481                                 unsigned last =
  51482                                     first +
  51483                                     (length - 1) * (spacing == kSingle ? 1 : 2);
  51484                                 unsigned rn = (instr >> 16) & 0xf;
  51485                                 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
  51486                                 vst2(al,
  51487                                      dt,
  51488                                      NeonRegisterList(DRegister(first),
  51489                                                       DRegister(last),
  51490                                                       spacing,
  51491                                                       lane),
  51492                                      AlignedMemOperand(Register(rn),
  51493                                                        align,
  51494                                                        Offset));
  51495                                 break;
  51496                               }
  51497                             }
  51498                             break;
  51499                           }
  51500                           default: {
  51501                             if (((instr & 0xc00) == 0xc00) ||
  51502                                 ((instr & 0xd) == 0xd)) {
  51503                               UnallocatedA32(instr);
  51504                               return;
  51505                             }
  51506                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
  51507                             if (dt.Is(kDataTypeValueInvalid)) {
  51508                               UnallocatedA32(instr);
  51509                               return;
  51510                             }
  51511                             DecodeNeonAndAlign decode_neon =
  51512                                 Align_index_align_2_Decode((instr >> 4) & 0xf,
  51513                                                            dt);
  51514                             if (!decode_neon.IsValid()) {
  51515                               UnallocatedA32(instr);
  51516                               return;
  51517                             }
  51518                             Alignment align = decode_neon.GetAlign();
  51519                             int lane = decode_neon.GetLane();
  51520                             SpacingType spacing = decode_neon.GetSpacing();
  51521                             unsigned first = ExtractDRegister(instr, 22, 12);
  51522                             unsigned length = 2;
  51523                             unsigned last =
  51524                                 first +
  51525                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  51526                             unsigned rn = (instr >> 16) & 0xf;
  51527                             unsigned rm = instr & 0xf;
  51528                             // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  51529                             vst2(al,
  51530                                  dt,
  51531                                  NeonRegisterList(DRegister(first),
  51532                                                   DRegister(last),
  51533                                                   spacing,
  51534                                                   lane),
  51535                                  AlignedMemOperand(Register(rn),
  51536                                                    align,
  51537                                                    Register(rm),
  51538                                                    PostIndex));
  51539                             break;
  51540                           }
  51541                         }
  51542                         break;
  51543                       }
  51544                     }
  51545                     break;
  51546                   }
  51547                   case 0x00000200: {
  51548                     // 0xf4800200
  51549                     switch (instr & 0x00000c30) {
  51550                       case 0x00000010: {
  51551                         // 0xf4800210
  51552                         UnallocatedA32(instr);
  51553                         break;
  51554                       }
  51555                       case 0x00000030: {
  51556                         // 0xf4800230
  51557                         UnallocatedA32(instr);
  51558                         break;
  51559                       }
  51560                       case 0x00000410: {
  51561                         // 0xf4800610
  51562                         UnallocatedA32(instr);
  51563                         break;
  51564                       }
  51565                       case 0x00000430: {
  51566                         // 0xf4800630
  51567                         UnallocatedA32(instr);
  51568                         break;
  51569                       }
  51570                       case 0x00000810: {
  51571                         // 0xf4800a10
  51572                         UnallocatedA32(instr);
  51573                         break;
  51574                       }
  51575                       case 0x00000820: {
  51576                         // 0xf4800a20
  51577                         UnallocatedA32(instr);
  51578                         break;
  51579                       }
  51580                       case 0x00000830: {
  51581                         // 0xf4800a30
  51582                         UnallocatedA32(instr);
  51583                         break;
  51584                       }
  51585                       case 0x00000c00: {
  51586                         // 0xf4800e00
  51587                         UnallocatedA32(instr);
  51588                         break;
  51589                       }
  51590                       case 0x00000c10: {
  51591                         // 0xf4800e10
  51592                         UnallocatedA32(instr);
  51593                         break;
  51594                       }
  51595                       case 0x00000c20: {
  51596                         // 0xf4800e20
  51597                         UnallocatedA32(instr);
  51598                         break;
  51599                       }
  51600                       case 0x00000c30: {
  51601                         // 0xf4800e30
  51602                         UnallocatedA32(instr);
  51603                         break;
  51604                       }
  51605                       default: {
  51606                         switch (instr & 0x0000000d) {
  51607                           case 0x0000000d: {
  51608                             // 0xf480020d
  51609                             switch (instr & 0x00000002) {
  51610                               case 0x00000000: {
  51611                                 // 0xf480020d
  51612                                 if (((instr & 0xc00) == 0xc00) ||
  51613                                     ((instr & 0x810) == 0x10) ||
  51614                                     ((instr & 0xc30) == 0x810) ||
  51615                                     ((instr & 0xc30) == 0x820) ||
  51616                                     ((instr & 0xc30) == 0x830)) {
  51617                                   UnallocatedA32(instr);
  51618                                   return;
  51619                                 }
  51620                                 DataType dt =
  51621                                     Dt_size_7_Decode((instr >> 10) & 0x3);
  51622                                 if (dt.Is(kDataTypeValueInvalid)) {
  51623                                   UnallocatedA32(instr);
  51624                                   return;
  51625                                 }
  51626                                 DecodeNeon decode_neon =
  51627                                     Index_1_Decode((instr >> 4) & 0xf, dt);
  51628                                 if (!decode_neon.IsValid()) {
  51629                                   UnallocatedA32(instr);
  51630                                   return;
  51631                                 }
  51632                                 int lane = decode_neon.GetLane();
  51633                                 SpacingType spacing = decode_neon.GetSpacing();
  51634                                 unsigned first =
  51635                                     ExtractDRegister(instr, 22, 12);
  51636                                 unsigned length = 3;
  51637                                 unsigned last =
  51638                                     first +
  51639                                     (length - 1) * (spacing == kSingle ? 1 : 2);
  51640                                 unsigned rn = (instr >> 16) & 0xf;
  51641                                 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
  51642                                 vst3(al,
  51643                                      dt,
  51644                                      NeonRegisterList(DRegister(first),
  51645                                                       DRegister(last),
  51646                                                       spacing,
  51647                                                       lane),
  51648                                      MemOperand(Register(rn), PostIndex));
  51649                                 break;
  51650                               }
  51651                               case 0x00000002: {
  51652                                 // 0xf480020f
  51653                                 if (((instr & 0xc00) == 0xc00) ||
  51654                                     ((instr & 0x810) == 0x10) ||
  51655                                     ((instr & 0xc30) == 0x810) ||
  51656                                     ((instr & 0xc30) == 0x820) ||
  51657                                     ((instr & 0xc30) == 0x830)) {
  51658                                   UnallocatedA32(instr);
  51659                                   return;
  51660                                 }
  51661                                 DataType dt =
  51662                                     Dt_size_7_Decode((instr >> 10) & 0x3);
  51663                                 if (dt.Is(kDataTypeValueInvalid)) {
  51664                                   UnallocatedA32(instr);
  51665                                   return;
  51666                                 }
  51667                                 DecodeNeon decode_neon =
  51668                                     Index_1_Decode((instr >> 4) & 0xf, dt);
  51669                                 if (!decode_neon.IsValid()) {
  51670                                   UnallocatedA32(instr);
  51671                                   return;
  51672                                 }
  51673                                 int lane = decode_neon.GetLane();
  51674                                 SpacingType spacing = decode_neon.GetSpacing();
  51675                                 unsigned first =
  51676                                     ExtractDRegister(instr, 22, 12);
  51677                                 unsigned length = 3;
  51678                                 unsigned last =
  51679                                     first +
  51680                                     (length - 1) * (spacing == kSingle ? 1 : 2);
  51681                                 unsigned rn = (instr >> 16) & 0xf;
  51682                                 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
  51683                                 vst3(al,
  51684                                      dt,
  51685                                      NeonRegisterList(DRegister(first),
  51686                                                       DRegister(last),
  51687                                                       spacing,
  51688                                                       lane),
  51689                                      MemOperand(Register(rn), Offset));
  51690                                 break;
  51691                               }
  51692                             }
  51693                             break;
  51694                           }
  51695                           default: {
  51696                             if (((instr & 0xc00) == 0xc00) ||
  51697                                 ((instr & 0xd) == 0xd) ||
  51698                                 ((instr & 0x810) == 0x10) ||
  51699                                 ((instr & 0xc30) == 0x810) ||
  51700                                 ((instr & 0xc30) == 0x820) ||
  51701                                 ((instr & 0xc30) == 0x830)) {
  51702                               UnallocatedA32(instr);
  51703                               return;
  51704                             }
  51705                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
  51706                             if (dt.Is(kDataTypeValueInvalid)) {
  51707                               UnallocatedA32(instr);
  51708                               return;
  51709                             }
  51710                             DecodeNeon decode_neon =
  51711                                 Index_1_Decode((instr >> 4) & 0xf, dt);
  51712                             if (!decode_neon.IsValid()) {
  51713                               UnallocatedA32(instr);
  51714                               return;
  51715                             }
  51716                             int lane = decode_neon.GetLane();
  51717                             SpacingType spacing = decode_neon.GetSpacing();
  51718                             unsigned first = ExtractDRegister(instr, 22, 12);
  51719                             unsigned length = 3;
  51720                             unsigned last =
  51721                                 first +
  51722                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  51723                             unsigned rn = (instr >> 16) & 0xf;
  51724                             Sign sign(plus);
  51725                             unsigned rm = instr & 0xf;
  51726                             // VST3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1
  51727                             vst3(al,
  51728                                  dt,
  51729                                  NeonRegisterList(DRegister(first),
  51730                                                   DRegister(last),
  51731                                                   spacing,
  51732                                                   lane),
  51733                                  MemOperand(Register(rn),
  51734                                             sign,
  51735                                             Register(rm),
  51736                                             PostIndex));
  51737                             break;
  51738                           }
  51739                         }
  51740                         break;
  51741                       }
  51742                     }
  51743                     break;
  51744                   }
  51745                   case 0x00000300: {
  51746                     // 0xf4800300
  51747                     switch (instr & 0x00000c00) {
  51748                       case 0x00000c00: {
  51749                         // 0xf4800f00
  51750                         UnallocatedA32(instr);
  51751                         break;
  51752                       }
  51753                       default: {
  51754                         switch (instr & 0x0000000d) {
  51755                           case 0x0000000d: {
  51756                             // 0xf480030d
  51757                             switch (instr & 0x00000002) {
  51758                               case 0x00000000: {
  51759                                 // 0xf480030d
  51760                                 if (((instr & 0xc00) == 0xc00)) {
  51761                                   UnallocatedA32(instr);
  51762                                   return;
  51763                                 }
  51764                                 DataType dt =
  51765                                     Dt_size_7_Decode((instr >> 10) & 0x3);
  51766                                 if (dt.Is(kDataTypeValueInvalid)) {
  51767                                   UnallocatedA32(instr);
  51768                                   return;
  51769                                 }
  51770                                 DecodeNeonAndAlign decode_neon =
  51771                                     Align_index_align_3_Decode((instr >> 4) &
  51772                                                                    0xf,
  51773                                                                dt);
  51774                                 if (!decode_neon.IsValid()) {
  51775                                   UnallocatedA32(instr);
  51776                                   return;
  51777                                 }
  51778                                 Alignment align = decode_neon.GetAlign();
  51779                                 int lane = decode_neon.GetLane();
  51780                                 SpacingType spacing = decode_neon.GetSpacing();
  51781                                 unsigned first =
  51782                                     ExtractDRegister(instr, 22, 12);
  51783                                 unsigned length = 4;
  51784                                 unsigned last =
  51785                                     first +
  51786                                     (length - 1) * (spacing == kSingle ? 1 : 2);
  51787                                 unsigned rn = (instr >> 16) & 0xf;
  51788                                 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  51789                                 vst4(al,
  51790                                      dt,
  51791                                      NeonRegisterList(DRegister(first),
  51792                                                       DRegister(last),
  51793                                                       spacing,
  51794                                                       lane),
  51795                                      AlignedMemOperand(Register(rn),
  51796                                                        align,
  51797                                                        PostIndex));
  51798                                 break;
  51799                               }
  51800                               case 0x00000002: {
  51801                                 // 0xf480030f
  51802                                 if (((instr & 0xc00) == 0xc00)) {
  51803                                   UnallocatedA32(instr);
  51804                                   return;
  51805                                 }
  51806                                 DataType dt =
  51807                                     Dt_size_7_Decode((instr >> 10) & 0x3);
  51808                                 if (dt.Is(kDataTypeValueInvalid)) {
  51809                                   UnallocatedA32(instr);
  51810                                   return;
  51811                                 }
  51812                                 DecodeNeonAndAlign decode_neon =
  51813                                     Align_index_align_3_Decode((instr >> 4) &
  51814                                                                    0xf,
  51815                                                                dt);
  51816                                 if (!decode_neon.IsValid()) {
  51817                                   UnallocatedA32(instr);
  51818                                   return;
  51819                                 }
  51820                                 Alignment align = decode_neon.GetAlign();
  51821                                 int lane = decode_neon.GetLane();
  51822                                 SpacingType spacing = decode_neon.GetSpacing();
  51823                                 unsigned first =
  51824                                     ExtractDRegister(instr, 22, 12);
  51825                                 unsigned length = 4;
  51826                                 unsigned last =
  51827                                     first +
  51828                                     (length - 1) * (spacing == kSingle ? 1 : 2);
  51829                                 unsigned rn = (instr >> 16) & 0xf;
  51830                                 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
  51831                                 vst4(al,
  51832                                      dt,
  51833                                      NeonRegisterList(DRegister(first),
  51834                                                       DRegister(last),
  51835                                                       spacing,
  51836                                                       lane),
  51837                                      AlignedMemOperand(Register(rn),
  51838                                                        align,
  51839                                                        Offset));
  51840                                 break;
  51841                               }
  51842                             }
  51843                             break;
  51844                           }
  51845                           default: {
  51846                             if (((instr & 0xc00) == 0xc00) ||
  51847                                 ((instr & 0xd) == 0xd)) {
  51848                               UnallocatedA32(instr);
  51849                               return;
  51850                             }
  51851                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
  51852                             if (dt.Is(kDataTypeValueInvalid)) {
  51853                               UnallocatedA32(instr);
  51854                               return;
  51855                             }
  51856                             DecodeNeonAndAlign decode_neon =
  51857                                 Align_index_align_3_Decode((instr >> 4) & 0xf,
  51858                                                            dt);
  51859                             if (!decode_neon.IsValid()) {
  51860                               UnallocatedA32(instr);
  51861                               return;
  51862                             }
  51863                             Alignment align = decode_neon.GetAlign();
  51864                             int lane = decode_neon.GetLane();
  51865                             SpacingType spacing = decode_neon.GetSpacing();
  51866                             unsigned first = ExtractDRegister(instr, 22, 12);
  51867                             unsigned length = 4;
  51868                             unsigned last =
  51869                                 first +
  51870                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  51871                             unsigned rn = (instr >> 16) & 0xf;
  51872                             unsigned rm = instr & 0xf;
  51873                             // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  51874                             vst4(al,
  51875                                  dt,
  51876                                  NeonRegisterList(DRegister(first),
  51877                                                   DRegister(last),
  51878                                                   spacing,
  51879                                                   lane),
  51880                                  AlignedMemOperand(Register(rn),
  51881                                                    align,
  51882                                                    Register(rm),
  51883                                                    PostIndex));
  51884                             break;
  51885                           }
  51886                         }
  51887                         break;
  51888                       }
  51889                     }
  51890                     break;
  51891                   }
  51892                 }
  51893                 break;
  51894               }
  51895             }
  51896             break;
  51897           }
  51898           case 0x00100000: {
  51899             // 0xf4100000
  51900             switch (instr & 0x00400000) {
  51901               case 0x00400000: {
  51902                 // 0xf4500000
  51903                 switch (instr & 0x000f0000) {
  51904                   case 0x000f0000: {
  51905                     // 0xf45f0000
  51906                     uint32_t U = (instr >> 23) & 0x1;
  51907                     int32_t imm = instr & 0xfff;
  51908                     if (U == 0) imm = -imm;
  51909                     bool minus_zero = (imm == 0) && (U == 0);
  51910                     Location location(imm, kA32PcDelta);
  51911                     // PLI{<c>}{<q>} <label> ; A1
  51912                     if (minus_zero) {
  51913                       pli(al, MemOperand(pc, minus, 0));
  51914                     } else {
  51915                       pli(al, &location);
  51916                     }
  51917                     if (((instr & 0xff7ff000) != 0xf45ff000)) {
  51918                       UnpredictableA32(instr);
  51919                     }
  51920                     break;
  51921                   }
  51922                   default: {
  51923                     if (((instr & 0xf0000) == 0xf0000)) {
  51924                       UnallocatedA32(instr);
  51925                       return;
  51926                     }
  51927                     unsigned rn = (instr >> 16) & 0xf;
  51928                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  51929                     int32_t offset = instr & 0xfff;
  51930                     // PLI{<c>}{<q>} [<Rn>{, #{+/-}<imm_3>}] ; A1
  51931                     pli(al, MemOperand(Register(rn), sign, offset, Offset));
  51932                     if (((instr & 0xff70f000) != 0xf450f000)) {
  51933                       UnpredictableA32(instr);
  51934                     }
  51935                     break;
  51936                   }
  51937                 }
  51938                 break;
  51939               }
  51940               default:
  51941                 UnallocatedA32(instr);
  51942                 break;
  51943             }
  51944             break;
  51945           }
  51946           case 0x00200000: {
  51947             // 0xf4200000
  51948             switch (instr & 0x00800000) {
  51949               case 0x00000000: {
  51950                 // 0xf4200000
  51951                 switch (instr & 0x0000000d) {
  51952                   case 0x0000000d: {
  51953                     // 0xf420000d
  51954                     switch (instr & 0x00000002) {
  51955                       case 0x00000000: {
  51956                         // 0xf420000d
  51957                         switch (instr & 0x00000f00) {
  51958                           case 0x00000000: {
  51959                             // 0xf420000d
  51960                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  51961                             if (dt.Is(kDataTypeValueInvalid)) {
  51962                               UnallocatedA32(instr);
  51963                               return;
  51964                             }
  51965                             Alignment align =
  51966                                 Align_align_4_Decode((instr >> 4) & 0x3);
  51967                             if (dt.Is(kDataTypeValueInvalid) ||
  51968                                 align.Is(kBadAlignment)) {
  51969                               UnallocatedA32(instr);
  51970                               return;
  51971                             }
  51972                             unsigned first = ExtractDRegister(instr, 22, 12);
  51973                             unsigned length;
  51974                             SpacingType spacing;
  51975                             switch ((instr >> 8) & 0xf) {
  51976                               default:
  51977                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  51978                               case 0x0:
  51979                                 length = 4;
  51980                                 spacing = kSingle;
  51981                                 break;
  51982                               case 0x1:
  51983                                 length = 4;
  51984                                 spacing = kDouble;
  51985                                 break;
  51986                             }
  51987                             unsigned last =
  51988                                 first +
  51989                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  51990                             TransferType transfer = kMultipleLanes;
  51991                             unsigned rn = (instr >> 16) & 0xf;
  51992                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  51993                             vld4(al,
  51994                                  dt,
  51995                                  NeonRegisterList(DRegister(first),
  51996                                                   DRegister(last),
  51997                                                   spacing,
  51998                                                   transfer),
  51999                                  AlignedMemOperand(Register(rn),
  52000                                                    align,
  52001                                                    PostIndex));
  52002                             break;
  52003                           }
  52004                           case 0x00000100: {
  52005                             // 0xf420010d
  52006                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  52007                             if (dt.Is(kDataTypeValueInvalid)) {
  52008                               UnallocatedA32(instr);
  52009                               return;
  52010                             }
  52011                             Alignment align =
  52012                                 Align_align_4_Decode((instr >> 4) & 0x3);
  52013                             if (dt.Is(kDataTypeValueInvalid) ||
  52014                                 align.Is(kBadAlignment)) {
  52015                               UnallocatedA32(instr);
  52016                               return;
  52017                             }
  52018                             unsigned first = ExtractDRegister(instr, 22, 12);
  52019                             unsigned length;
  52020                             SpacingType spacing;
  52021                             switch ((instr >> 8) & 0xf) {
  52022                               default:
  52023                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52024                               case 0x0:
  52025                                 length = 4;
  52026                                 spacing = kSingle;
  52027                                 break;
  52028                               case 0x1:
  52029                                 length = 4;
  52030                                 spacing = kDouble;
  52031                                 break;
  52032                             }
  52033                             unsigned last =
  52034                                 first +
  52035                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  52036                             TransferType transfer = kMultipleLanes;
  52037                             unsigned rn = (instr >> 16) & 0xf;
  52038                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  52039                             vld4(al,
  52040                                  dt,
  52041                                  NeonRegisterList(DRegister(first),
  52042                                                   DRegister(last),
  52043                                                   spacing,
  52044                                                   transfer),
  52045                                  AlignedMemOperand(Register(rn),
  52046                                                    align,
  52047                                                    PostIndex));
  52048                             break;
  52049                           }
  52050                           case 0x00000200: {
  52051                             // 0xf420020d
  52052                             if (((instr & 0xe20) == 0x620) ||
  52053                                 ((instr & 0xf30) == 0xa30)) {
  52054                               UnallocatedA32(instr);
  52055                               return;
  52056                             }
  52057                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  52058                             if (dt.Is(kDataTypeValueInvalid)) {
  52059                               UnallocatedA32(instr);
  52060                               return;
  52061                             }
  52062                             Alignment align =
  52063                                 Align_align_1_Decode((instr >> 4) & 0x3);
  52064                             if (dt.Is(kDataTypeValueInvalid) ||
  52065                                 align.Is(kBadAlignment)) {
  52066                               UnallocatedA32(instr);
  52067                               return;
  52068                             }
  52069                             unsigned first = ExtractDRegister(instr, 22, 12);
  52070                             unsigned length;
  52071                             SpacingType spacing = kSingle;
  52072                             switch ((instr >> 8) & 0xf) {
  52073                               default:
  52074                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52075                               case 0x7:
  52076                                 length = 1;
  52077                                 break;
  52078                               case 0xa:
  52079                                 length = 2;
  52080                                 break;
  52081                               case 0x6:
  52082                                 length = 3;
  52083                                 break;
  52084                               case 0x2:
  52085                                 length = 4;
  52086                                 break;
  52087                             }
  52088                             unsigned last = first + length - 1;
  52089                             TransferType transfer = kMultipleLanes;
  52090                             unsigned rn = (instr >> 16) & 0xf;
  52091                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  52092                             vld1(al,
  52093                                  dt,
  52094                                  NeonRegisterList(DRegister(first),
  52095                                                   DRegister(last),
  52096                                                   spacing,
  52097                                                   transfer),
  52098                                  AlignedMemOperand(Register(rn),
  52099                                                    align,
  52100                                                    PostIndex));
  52101                             break;
  52102                           }
  52103                           case 0x00000300: {
  52104                             // 0xf420030d
  52105                             if (((instr & 0xe30) == 0x830)) {
  52106                               UnallocatedA32(instr);
  52107                               return;
  52108                             }
  52109                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  52110                             if (dt.Is(kDataTypeValueInvalid)) {
  52111                               UnallocatedA32(instr);
  52112                               return;
  52113                             }
  52114                             Alignment align =
  52115                                 Align_align_2_Decode((instr >> 4) & 0x3);
  52116                             if (dt.Is(kDataTypeValueInvalid) ||
  52117                                 align.Is(kBadAlignment)) {
  52118                               UnallocatedA32(instr);
  52119                               return;
  52120                             }
  52121                             unsigned first = ExtractDRegister(instr, 22, 12);
  52122                             unsigned length;
  52123                             SpacingType spacing;
  52124                             switch ((instr >> 8) & 0xf) {
  52125                               default:
  52126                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52127                               case 0x8:
  52128                                 length = 2;
  52129                                 spacing = kSingle;
  52130                                 break;
  52131                               case 0x9:
  52132                                 length = 2;
  52133                                 spacing = kDouble;
  52134                                 break;
  52135                               case 0x3:
  52136                                 length = 4;
  52137                                 spacing = kSingle;
  52138                                 break;
  52139                             }
  52140                             unsigned last =
  52141                                 first +
  52142                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  52143                             TransferType transfer = kMultipleLanes;
  52144                             unsigned rn = (instr >> 16) & 0xf;
  52145                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  52146                             vld2(al,
  52147                                  dt,
  52148                                  NeonRegisterList(DRegister(first),
  52149                                                   DRegister(last),
  52150                                                   spacing,
  52151                                                   transfer),
  52152                                  AlignedMemOperand(Register(rn),
  52153                                                    align,
  52154                                                    PostIndex));
  52155                             break;
  52156                           }
  52157                           case 0x00000400: {
  52158                             // 0xf420040d
  52159                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  52160                             if (dt.Is(kDataTypeValueInvalid)) {
  52161                               UnallocatedA32(instr);
  52162                               return;
  52163                             }
  52164                             Alignment align =
  52165                                 Align_align_3_Decode((instr >> 4) & 0x3);
  52166                             if (dt.Is(kDataTypeValueInvalid) ||
  52167                                 align.Is(kBadAlignment)) {
  52168                               UnallocatedA32(instr);
  52169                               return;
  52170                             }
  52171                             unsigned first = ExtractDRegister(instr, 22, 12);
  52172                             unsigned length;
  52173                             SpacingType spacing;
  52174                             switch ((instr >> 8) & 0xf) {
  52175                               default:
  52176                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52177                               case 0x4:
  52178                                 length = 3;
  52179                                 spacing = kSingle;
  52180                                 break;
  52181                               case 0x5:
  52182                                 length = 3;
  52183                                 spacing = kDouble;
  52184                                 break;
  52185                             }
  52186                             unsigned last =
  52187                                 first +
  52188                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  52189                             TransferType transfer = kMultipleLanes;
  52190                             unsigned rn = (instr >> 16) & 0xf;
  52191                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  52192                             vld3(al,
  52193                                  dt,
  52194                                  NeonRegisterList(DRegister(first),
  52195                                                   DRegister(last),
  52196                                                   spacing,
  52197                                                   transfer),
  52198                                  AlignedMemOperand(Register(rn),
  52199                                                    align,
  52200                                                    PostIndex));
  52201                             break;
  52202                           }
  52203                           case 0x00000500: {
  52204                             // 0xf420050d
  52205                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  52206                             if (dt.Is(kDataTypeValueInvalid)) {
  52207                               UnallocatedA32(instr);
  52208                               return;
  52209                             }
  52210                             Alignment align =
  52211                                 Align_align_3_Decode((instr >> 4) & 0x3);
  52212                             if (dt.Is(kDataTypeValueInvalid) ||
  52213                                 align.Is(kBadAlignment)) {
  52214                               UnallocatedA32(instr);
  52215                               return;
  52216                             }
  52217                             unsigned first = ExtractDRegister(instr, 22, 12);
  52218                             unsigned length;
  52219                             SpacingType spacing;
  52220                             switch ((instr >> 8) & 0xf) {
  52221                               default:
  52222                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52223                               case 0x4:
  52224                                 length = 3;
  52225                                 spacing = kSingle;
  52226                                 break;
  52227                               case 0x5:
  52228                                 length = 3;
  52229                                 spacing = kDouble;
  52230                                 break;
  52231                             }
  52232                             unsigned last =
  52233                                 first +
  52234                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  52235                             TransferType transfer = kMultipleLanes;
  52236                             unsigned rn = (instr >> 16) & 0xf;
  52237                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  52238                             vld3(al,
  52239                                  dt,
  52240                                  NeonRegisterList(DRegister(first),
  52241                                                   DRegister(last),
  52242                                                   spacing,
  52243                                                   transfer),
  52244                                  AlignedMemOperand(Register(rn),
  52245                                                    align,
  52246                                                    PostIndex));
  52247                             break;
  52248                           }
  52249                           case 0x00000600: {
  52250                             // 0xf420060d
  52251                             if (((instr & 0xe20) == 0x620) ||
  52252                                 ((instr & 0xf30) == 0xa30)) {
  52253                               UnallocatedA32(instr);
  52254                               return;
  52255                             }
  52256                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  52257                             if (dt.Is(kDataTypeValueInvalid)) {
  52258                               UnallocatedA32(instr);
  52259                               return;
  52260                             }
  52261                             Alignment align =
  52262                                 Align_align_1_Decode((instr >> 4) & 0x3);
  52263                             if (dt.Is(kDataTypeValueInvalid) ||
  52264                                 align.Is(kBadAlignment)) {
  52265                               UnallocatedA32(instr);
  52266                               return;
  52267                             }
  52268                             unsigned first = ExtractDRegister(instr, 22, 12);
  52269                             unsigned length;
  52270                             SpacingType spacing = kSingle;
  52271                             switch ((instr >> 8) & 0xf) {
  52272                               default:
  52273                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52274                               case 0x7:
  52275                                 length = 1;
  52276                                 break;
  52277                               case 0xa:
  52278                                 length = 2;
  52279                                 break;
  52280                               case 0x6:
  52281                                 length = 3;
  52282                                 break;
  52283                               case 0x2:
  52284                                 length = 4;
  52285                                 break;
  52286                             }
  52287                             unsigned last = first + length - 1;
  52288                             TransferType transfer = kMultipleLanes;
  52289                             unsigned rn = (instr >> 16) & 0xf;
  52290                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  52291                             vld1(al,
  52292                                  dt,
  52293                                  NeonRegisterList(DRegister(first),
  52294                                                   DRegister(last),
  52295                                                   spacing,
  52296                                                   transfer),
  52297                                  AlignedMemOperand(Register(rn),
  52298                                                    align,
  52299                                                    PostIndex));
  52300                             break;
  52301                           }
  52302                           case 0x00000700: {
  52303                             // 0xf420070d
  52304                             if (((instr & 0xe20) == 0x620) ||
  52305                                 ((instr & 0xf30) == 0xa30)) {
  52306                               UnallocatedA32(instr);
  52307                               return;
  52308                             }
  52309                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  52310                             if (dt.Is(kDataTypeValueInvalid)) {
  52311                               UnallocatedA32(instr);
  52312                               return;
  52313                             }
  52314                             Alignment align =
  52315                                 Align_align_1_Decode((instr >> 4) & 0x3);
  52316                             if (dt.Is(kDataTypeValueInvalid) ||
  52317                                 align.Is(kBadAlignment)) {
  52318                               UnallocatedA32(instr);
  52319                               return;
  52320                             }
  52321                             unsigned first = ExtractDRegister(instr, 22, 12);
  52322                             unsigned length;
  52323                             SpacingType spacing = kSingle;
  52324                             switch ((instr >> 8) & 0xf) {
  52325                               default:
  52326                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52327                               case 0x7:
  52328                                 length = 1;
  52329                                 break;
  52330                               case 0xa:
  52331                                 length = 2;
  52332                                 break;
  52333                               case 0x6:
  52334                                 length = 3;
  52335                                 break;
  52336                               case 0x2:
  52337                                 length = 4;
  52338                                 break;
  52339                             }
  52340                             unsigned last = first + length - 1;
  52341                             TransferType transfer = kMultipleLanes;
  52342                             unsigned rn = (instr >> 16) & 0xf;
  52343                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  52344                             vld1(al,
  52345                                  dt,
  52346                                  NeonRegisterList(DRegister(first),
  52347                                                   DRegister(last),
  52348                                                   spacing,
  52349                                                   transfer),
  52350                                  AlignedMemOperand(Register(rn),
  52351                                                    align,
  52352                                                    PostIndex));
  52353                             break;
  52354                           }
  52355                           case 0x00000800: {
  52356                             // 0xf420080d
  52357                             if (((instr & 0xe30) == 0x830)) {
  52358                               UnallocatedA32(instr);
  52359                               return;
  52360                             }
  52361                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  52362                             if (dt.Is(kDataTypeValueInvalid)) {
  52363                               UnallocatedA32(instr);
  52364                               return;
  52365                             }
  52366                             Alignment align =
  52367                                 Align_align_2_Decode((instr >> 4) & 0x3);
  52368                             if (dt.Is(kDataTypeValueInvalid) ||
  52369                                 align.Is(kBadAlignment)) {
  52370                               UnallocatedA32(instr);
  52371                               return;
  52372                             }
  52373                             unsigned first = ExtractDRegister(instr, 22, 12);
  52374                             unsigned length;
  52375                             SpacingType spacing;
  52376                             switch ((instr >> 8) & 0xf) {
  52377                               default:
  52378                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52379                               case 0x8:
  52380                                 length = 2;
  52381                                 spacing = kSingle;
  52382                                 break;
  52383                               case 0x9:
  52384                                 length = 2;
  52385                                 spacing = kDouble;
  52386                                 break;
  52387                               case 0x3:
  52388                                 length = 4;
  52389                                 spacing = kSingle;
  52390                                 break;
  52391                             }
  52392                             unsigned last =
  52393                                 first +
  52394                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  52395                             TransferType transfer = kMultipleLanes;
  52396                             unsigned rn = (instr >> 16) & 0xf;
  52397                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  52398                             vld2(al,
  52399                                  dt,
  52400                                  NeonRegisterList(DRegister(first),
  52401                                                   DRegister(last),
  52402                                                   spacing,
  52403                                                   transfer),
  52404                                  AlignedMemOperand(Register(rn),
  52405                                                    align,
  52406                                                    PostIndex));
  52407                             break;
  52408                           }
  52409                           case 0x00000900: {
  52410                             // 0xf420090d
  52411                             if (((instr & 0xe30) == 0x830)) {
  52412                               UnallocatedA32(instr);
  52413                               return;
  52414                             }
  52415                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  52416                             if (dt.Is(kDataTypeValueInvalid)) {
  52417                               UnallocatedA32(instr);
  52418                               return;
  52419                             }
  52420                             Alignment align =
  52421                                 Align_align_2_Decode((instr >> 4) & 0x3);
  52422                             if (dt.Is(kDataTypeValueInvalid) ||
  52423                                 align.Is(kBadAlignment)) {
  52424                               UnallocatedA32(instr);
  52425                               return;
  52426                             }
  52427                             unsigned first = ExtractDRegister(instr, 22, 12);
  52428                             unsigned length;
  52429                             SpacingType spacing;
  52430                             switch ((instr >> 8) & 0xf) {
  52431                               default:
  52432                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52433                               case 0x8:
  52434                                 length = 2;
  52435                                 spacing = kSingle;
  52436                                 break;
  52437                               case 0x9:
  52438                                 length = 2;
  52439                                 spacing = kDouble;
  52440                                 break;
  52441                               case 0x3:
  52442                                 length = 4;
  52443                                 spacing = kSingle;
  52444                                 break;
  52445                             }
  52446                             unsigned last =
  52447                                 first +
  52448                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  52449                             TransferType transfer = kMultipleLanes;
  52450                             unsigned rn = (instr >> 16) & 0xf;
  52451                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  52452                             vld2(al,
  52453                                  dt,
  52454                                  NeonRegisterList(DRegister(first),
  52455                                                   DRegister(last),
  52456                                                   spacing,
  52457                                                   transfer),
  52458                                  AlignedMemOperand(Register(rn),
  52459                                                    align,
  52460                                                    PostIndex));
  52461                             break;
  52462                           }
  52463                           case 0x00000a00: {
  52464                             // 0xf4200a0d
  52465                             if (((instr & 0xe20) == 0x620) ||
  52466                                 ((instr & 0xf30) == 0xa30)) {
  52467                               UnallocatedA32(instr);
  52468                               return;
  52469                             }
  52470                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  52471                             if (dt.Is(kDataTypeValueInvalid)) {
  52472                               UnallocatedA32(instr);
  52473                               return;
  52474                             }
  52475                             Alignment align =
  52476                                 Align_align_1_Decode((instr >> 4) & 0x3);
  52477                             if (dt.Is(kDataTypeValueInvalid) ||
  52478                                 align.Is(kBadAlignment)) {
  52479                               UnallocatedA32(instr);
  52480                               return;
  52481                             }
  52482                             unsigned first = ExtractDRegister(instr, 22, 12);
  52483                             unsigned length;
  52484                             SpacingType spacing = kSingle;
  52485                             switch ((instr >> 8) & 0xf) {
  52486                               default:
  52487                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52488                               case 0x7:
  52489                                 length = 1;
  52490                                 break;
  52491                               case 0xa:
  52492                                 length = 2;
  52493                                 break;
  52494                               case 0x6:
  52495                                 length = 3;
  52496                                 break;
  52497                               case 0x2:
  52498                                 length = 4;
  52499                                 break;
  52500                             }
  52501                             unsigned last = first + length - 1;
  52502                             TransferType transfer = kMultipleLanes;
  52503                             unsigned rn = (instr >> 16) & 0xf;
  52504                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  52505                             vld1(al,
  52506                                  dt,
  52507                                  NeonRegisterList(DRegister(first),
  52508                                                   DRegister(last),
  52509                                                   spacing,
  52510                                                   transfer),
  52511                                  AlignedMemOperand(Register(rn),
  52512                                                    align,
  52513                                                    PostIndex));
  52514                             break;
  52515                           }
  52516                           default:
  52517                             UnallocatedA32(instr);
  52518                             break;
  52519                         }
  52520                         break;
  52521                       }
  52522                       case 0x00000002: {
  52523                         // 0xf420000f
  52524                         switch (instr & 0x00000f00) {
  52525                           case 0x00000000: {
  52526                             // 0xf420000d
  52527                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  52528                             if (dt.Is(kDataTypeValueInvalid)) {
  52529                               UnallocatedA32(instr);
  52530                               return;
  52531                             }
  52532                             Alignment align =
  52533                                 Align_align_4_Decode((instr >> 4) & 0x3);
  52534                             if (dt.Is(kDataTypeValueInvalid) ||
  52535                                 align.Is(kBadAlignment)) {
  52536                               UnallocatedA32(instr);
  52537                               return;
  52538                             }
  52539                             unsigned first = ExtractDRegister(instr, 22, 12);
  52540                             unsigned length;
  52541                             SpacingType spacing;
  52542                             switch ((instr >> 8) & 0xf) {
  52543                               default:
  52544                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52545                               case 0x0:
  52546                                 length = 4;
  52547                                 spacing = kSingle;
  52548                                 break;
  52549                               case 0x1:
  52550                                 length = 4;
  52551                                 spacing = kDouble;
  52552                                 break;
  52553                             }
  52554                             unsigned last =
  52555                                 first +
  52556                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  52557                             TransferType transfer = kMultipleLanes;
  52558                             unsigned rn = (instr >> 16) & 0xf;
  52559                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  52560                             vld4(al,
  52561                                  dt,
  52562                                  NeonRegisterList(DRegister(first),
  52563                                                   DRegister(last),
  52564                                                   spacing,
  52565                                                   transfer),
  52566                                  AlignedMemOperand(Register(rn),
  52567                                                    align,
  52568                                                    Offset));
  52569                             break;
  52570                           }
  52571                           case 0x00000100: {
  52572                             // 0xf420010d
  52573                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  52574                             if (dt.Is(kDataTypeValueInvalid)) {
  52575                               UnallocatedA32(instr);
  52576                               return;
  52577                             }
  52578                             Alignment align =
  52579                                 Align_align_4_Decode((instr >> 4) & 0x3);
  52580                             if (dt.Is(kDataTypeValueInvalid) ||
  52581                                 align.Is(kBadAlignment)) {
  52582                               UnallocatedA32(instr);
  52583                               return;
  52584                             }
  52585                             unsigned first = ExtractDRegister(instr, 22, 12);
  52586                             unsigned length;
  52587                             SpacingType spacing;
  52588                             switch ((instr >> 8) & 0xf) {
  52589                               default:
  52590                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52591                               case 0x0:
  52592                                 length = 4;
  52593                                 spacing = kSingle;
  52594                                 break;
  52595                               case 0x1:
  52596                                 length = 4;
  52597                                 spacing = kDouble;
  52598                                 break;
  52599                             }
  52600                             unsigned last =
  52601                                 first +
  52602                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  52603                             TransferType transfer = kMultipleLanes;
  52604                             unsigned rn = (instr >> 16) & 0xf;
  52605                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  52606                             vld4(al,
  52607                                  dt,
  52608                                  NeonRegisterList(DRegister(first),
  52609                                                   DRegister(last),
  52610                                                   spacing,
  52611                                                   transfer),
  52612                                  AlignedMemOperand(Register(rn),
  52613                                                    align,
  52614                                                    Offset));
  52615                             break;
  52616                           }
  52617                           case 0x00000200: {
  52618                             // 0xf420020d
  52619                             if (((instr & 0xe20) == 0x620) ||
  52620                                 ((instr & 0xf30) == 0xa30)) {
  52621                               UnallocatedA32(instr);
  52622                               return;
  52623                             }
  52624                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  52625                             if (dt.Is(kDataTypeValueInvalid)) {
  52626                               UnallocatedA32(instr);
  52627                               return;
  52628                             }
  52629                             Alignment align =
  52630                                 Align_align_1_Decode((instr >> 4) & 0x3);
  52631                             if (dt.Is(kDataTypeValueInvalid) ||
  52632                                 align.Is(kBadAlignment)) {
  52633                               UnallocatedA32(instr);
  52634                               return;
  52635                             }
  52636                             unsigned first = ExtractDRegister(instr, 22, 12);
  52637                             unsigned length;
  52638                             SpacingType spacing = kSingle;
  52639                             switch ((instr >> 8) & 0xf) {
  52640                               default:
  52641                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52642                               case 0x7:
  52643                                 length = 1;
  52644                                 break;
  52645                               case 0xa:
  52646                                 length = 2;
  52647                                 break;
  52648                               case 0x6:
  52649                                 length = 3;
  52650                                 break;
  52651                               case 0x2:
  52652                                 length = 4;
  52653                                 break;
  52654                             }
  52655                             unsigned last = first + length - 1;
  52656                             TransferType transfer = kMultipleLanes;
  52657                             unsigned rn = (instr >> 16) & 0xf;
  52658                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  52659                             vld1(al,
  52660                                  dt,
  52661                                  NeonRegisterList(DRegister(first),
  52662                                                   DRegister(last),
  52663                                                   spacing,
  52664                                                   transfer),
  52665                                  AlignedMemOperand(Register(rn),
  52666                                                    align,
  52667                                                    Offset));
  52668                             break;
  52669                           }
  52670                           case 0x00000300: {
  52671                             // 0xf420030d
  52672                             if (((instr & 0xe30) == 0x830)) {
  52673                               UnallocatedA32(instr);
  52674                               return;
  52675                             }
  52676                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  52677                             if (dt.Is(kDataTypeValueInvalid)) {
  52678                               UnallocatedA32(instr);
  52679                               return;
  52680                             }
  52681                             Alignment align =
  52682                                 Align_align_2_Decode((instr >> 4) & 0x3);
  52683                             if (dt.Is(kDataTypeValueInvalid) ||
  52684                                 align.Is(kBadAlignment)) {
  52685                               UnallocatedA32(instr);
  52686                               return;
  52687                             }
  52688                             unsigned first = ExtractDRegister(instr, 22, 12);
  52689                             unsigned length;
  52690                             SpacingType spacing;
  52691                             switch ((instr >> 8) & 0xf) {
  52692                               default:
  52693                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52694                               case 0x8:
  52695                                 length = 2;
  52696                                 spacing = kSingle;
  52697                                 break;
  52698                               case 0x9:
  52699                                 length = 2;
  52700                                 spacing = kDouble;
  52701                                 break;
  52702                               case 0x3:
  52703                                 length = 4;
  52704                                 spacing = kSingle;
  52705                                 break;
  52706                             }
  52707                             unsigned last =
  52708                                 first +
  52709                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  52710                             TransferType transfer = kMultipleLanes;
  52711                             unsigned rn = (instr >> 16) & 0xf;
  52712                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  52713                             vld2(al,
  52714                                  dt,
  52715                                  NeonRegisterList(DRegister(first),
  52716                                                   DRegister(last),
  52717                                                   spacing,
  52718                                                   transfer),
  52719                                  AlignedMemOperand(Register(rn),
  52720                                                    align,
  52721                                                    Offset));
  52722                             break;
  52723                           }
  52724                           case 0x00000400: {
  52725                             // 0xf420040d
  52726                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  52727                             if (dt.Is(kDataTypeValueInvalid)) {
  52728                               UnallocatedA32(instr);
  52729                               return;
  52730                             }
  52731                             Alignment align =
  52732                                 Align_align_3_Decode((instr >> 4) & 0x3);
  52733                             if (dt.Is(kDataTypeValueInvalid) ||
  52734                                 align.Is(kBadAlignment)) {
  52735                               UnallocatedA32(instr);
  52736                               return;
  52737                             }
  52738                             unsigned first = ExtractDRegister(instr, 22, 12);
  52739                             unsigned length;
  52740                             SpacingType spacing;
  52741                             switch ((instr >> 8) & 0xf) {
  52742                               default:
  52743                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52744                               case 0x4:
  52745                                 length = 3;
  52746                                 spacing = kSingle;
  52747                                 break;
  52748                               case 0x5:
  52749                                 length = 3;
  52750                                 spacing = kDouble;
  52751                                 break;
  52752                             }
  52753                             unsigned last =
  52754                                 first +
  52755                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  52756                             TransferType transfer = kMultipleLanes;
  52757                             unsigned rn = (instr >> 16) & 0xf;
  52758                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  52759                             vld3(al,
  52760                                  dt,
  52761                                  NeonRegisterList(DRegister(first),
  52762                                                   DRegister(last),
  52763                                                   spacing,
  52764                                                   transfer),
  52765                                  AlignedMemOperand(Register(rn),
  52766                                                    align,
  52767                                                    Offset));
  52768                             break;
  52769                           }
  52770                           case 0x00000500: {
  52771                             // 0xf420050d
  52772                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  52773                             if (dt.Is(kDataTypeValueInvalid)) {
  52774                               UnallocatedA32(instr);
  52775                               return;
  52776                             }
  52777                             Alignment align =
  52778                                 Align_align_3_Decode((instr >> 4) & 0x3);
  52779                             if (dt.Is(kDataTypeValueInvalid) ||
  52780                                 align.Is(kBadAlignment)) {
  52781                               UnallocatedA32(instr);
  52782                               return;
  52783                             }
  52784                             unsigned first = ExtractDRegister(instr, 22, 12);
  52785                             unsigned length;
  52786                             SpacingType spacing;
  52787                             switch ((instr >> 8) & 0xf) {
  52788                               default:
  52789                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52790                               case 0x4:
  52791                                 length = 3;
  52792                                 spacing = kSingle;
  52793                                 break;
  52794                               case 0x5:
  52795                                 length = 3;
  52796                                 spacing = kDouble;
  52797                                 break;
  52798                             }
  52799                             unsigned last =
  52800                                 first +
  52801                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  52802                             TransferType transfer = kMultipleLanes;
  52803                             unsigned rn = (instr >> 16) & 0xf;
  52804                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  52805                             vld3(al,
  52806                                  dt,
  52807                                  NeonRegisterList(DRegister(first),
  52808                                                   DRegister(last),
  52809                                                   spacing,
  52810                                                   transfer),
  52811                                  AlignedMemOperand(Register(rn),
  52812                                                    align,
  52813                                                    Offset));
  52814                             break;
  52815                           }
  52816                           case 0x00000600: {
  52817                             // 0xf420060d
  52818                             if (((instr & 0xe20) == 0x620) ||
  52819                                 ((instr & 0xf30) == 0xa30)) {
  52820                               UnallocatedA32(instr);
  52821                               return;
  52822                             }
  52823                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  52824                             if (dt.Is(kDataTypeValueInvalid)) {
  52825                               UnallocatedA32(instr);
  52826                               return;
  52827                             }
  52828                             Alignment align =
  52829                                 Align_align_1_Decode((instr >> 4) & 0x3);
  52830                             if (dt.Is(kDataTypeValueInvalid) ||
  52831                                 align.Is(kBadAlignment)) {
  52832                               UnallocatedA32(instr);
  52833                               return;
  52834                             }
  52835                             unsigned first = ExtractDRegister(instr, 22, 12);
  52836                             unsigned length;
  52837                             SpacingType spacing = kSingle;
  52838                             switch ((instr >> 8) & 0xf) {
  52839                               default:
  52840                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52841                               case 0x7:
  52842                                 length = 1;
  52843                                 break;
  52844                               case 0xa:
  52845                                 length = 2;
  52846                                 break;
  52847                               case 0x6:
  52848                                 length = 3;
  52849                                 break;
  52850                               case 0x2:
  52851                                 length = 4;
  52852                                 break;
  52853                             }
  52854                             unsigned last = first + length - 1;
  52855                             TransferType transfer = kMultipleLanes;
  52856                             unsigned rn = (instr >> 16) & 0xf;
  52857                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  52858                             vld1(al,
  52859                                  dt,
  52860                                  NeonRegisterList(DRegister(first),
  52861                                                   DRegister(last),
  52862                                                   spacing,
  52863                                                   transfer),
  52864                                  AlignedMemOperand(Register(rn),
  52865                                                    align,
  52866                                                    Offset));
  52867                             break;
  52868                           }
  52869                           case 0x00000700: {
  52870                             // 0xf420070d
  52871                             if (((instr & 0xe20) == 0x620) ||
  52872                                 ((instr & 0xf30) == 0xa30)) {
  52873                               UnallocatedA32(instr);
  52874                               return;
  52875                             }
  52876                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  52877                             if (dt.Is(kDataTypeValueInvalid)) {
  52878                               UnallocatedA32(instr);
  52879                               return;
  52880                             }
  52881                             Alignment align =
  52882                                 Align_align_1_Decode((instr >> 4) & 0x3);
  52883                             if (dt.Is(kDataTypeValueInvalid) ||
  52884                                 align.Is(kBadAlignment)) {
  52885                               UnallocatedA32(instr);
  52886                               return;
  52887                             }
  52888                             unsigned first = ExtractDRegister(instr, 22, 12);
  52889                             unsigned length;
  52890                             SpacingType spacing = kSingle;
  52891                             switch ((instr >> 8) & 0xf) {
  52892                               default:
  52893                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52894                               case 0x7:
  52895                                 length = 1;
  52896                                 break;
  52897                               case 0xa:
  52898                                 length = 2;
  52899                                 break;
  52900                               case 0x6:
  52901                                 length = 3;
  52902                                 break;
  52903                               case 0x2:
  52904                                 length = 4;
  52905                                 break;
  52906                             }
  52907                             unsigned last = first + length - 1;
  52908                             TransferType transfer = kMultipleLanes;
  52909                             unsigned rn = (instr >> 16) & 0xf;
  52910                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  52911                             vld1(al,
  52912                                  dt,
  52913                                  NeonRegisterList(DRegister(first),
  52914                                                   DRegister(last),
  52915                                                   spacing,
  52916                                                   transfer),
  52917                                  AlignedMemOperand(Register(rn),
  52918                                                    align,
  52919                                                    Offset));
  52920                             break;
  52921                           }
  52922                           case 0x00000800: {
  52923                             // 0xf420080d
  52924                             if (((instr & 0xe30) == 0x830)) {
  52925                               UnallocatedA32(instr);
  52926                               return;
  52927                             }
  52928                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  52929                             if (dt.Is(kDataTypeValueInvalid)) {
  52930                               UnallocatedA32(instr);
  52931                               return;
  52932                             }
  52933                             Alignment align =
  52934                                 Align_align_2_Decode((instr >> 4) & 0x3);
  52935                             if (dt.Is(kDataTypeValueInvalid) ||
  52936                                 align.Is(kBadAlignment)) {
  52937                               UnallocatedA32(instr);
  52938                               return;
  52939                             }
  52940                             unsigned first = ExtractDRegister(instr, 22, 12);
  52941                             unsigned length;
  52942                             SpacingType spacing;
  52943                             switch ((instr >> 8) & 0xf) {
  52944                               default:
  52945                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  52946                               case 0x8:
  52947                                 length = 2;
  52948                                 spacing = kSingle;
  52949                                 break;
  52950                               case 0x9:
  52951                                 length = 2;
  52952                                 spacing = kDouble;
  52953                                 break;
  52954                               case 0x3:
  52955                                 length = 4;
  52956                                 spacing = kSingle;
  52957                                 break;
  52958                             }
  52959                             unsigned last =
  52960                                 first +
  52961                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  52962                             TransferType transfer = kMultipleLanes;
  52963                             unsigned rn = (instr >> 16) & 0xf;
  52964                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  52965                             vld2(al,
  52966                                  dt,
  52967                                  NeonRegisterList(DRegister(first),
  52968                                                   DRegister(last),
  52969                                                   spacing,
  52970                                                   transfer),
  52971                                  AlignedMemOperand(Register(rn),
  52972                                                    align,
  52973                                                    Offset));
  52974                             break;
  52975                           }
  52976                           case 0x00000900: {
  52977                             // 0xf420090d
  52978                             if (((instr & 0xe30) == 0x830)) {
  52979                               UnallocatedA32(instr);
  52980                               return;
  52981                             }
  52982                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  52983                             if (dt.Is(kDataTypeValueInvalid)) {
  52984                               UnallocatedA32(instr);
  52985                               return;
  52986                             }
  52987                             Alignment align =
  52988                                 Align_align_2_Decode((instr >> 4) & 0x3);
  52989                             if (dt.Is(kDataTypeValueInvalid) ||
  52990                                 align.Is(kBadAlignment)) {
  52991                               UnallocatedA32(instr);
  52992                               return;
  52993                             }
  52994                             unsigned first = ExtractDRegister(instr, 22, 12);
  52995                             unsigned length;
  52996                             SpacingType spacing;
  52997                             switch ((instr >> 8) & 0xf) {
  52998                               default:
  52999                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  53000                               case 0x8:
  53001                                 length = 2;
  53002                                 spacing = kSingle;
  53003                                 break;
  53004                               case 0x9:
  53005                                 length = 2;
  53006                                 spacing = kDouble;
  53007                                 break;
  53008                               case 0x3:
  53009                                 length = 4;
  53010                                 spacing = kSingle;
  53011                                 break;
  53012                             }
  53013                             unsigned last =
  53014                                 first +
  53015                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  53016                             TransferType transfer = kMultipleLanes;
  53017                             unsigned rn = (instr >> 16) & 0xf;
  53018                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  53019                             vld2(al,
  53020                                  dt,
  53021                                  NeonRegisterList(DRegister(first),
  53022                                                   DRegister(last),
  53023                                                   spacing,
  53024                                                   transfer),
  53025                                  AlignedMemOperand(Register(rn),
  53026                                                    align,
  53027                                                    Offset));
  53028                             break;
  53029                           }
  53030                           case 0x00000a00: {
  53031                             // 0xf4200a0d
  53032                             if (((instr & 0xe20) == 0x620) ||
  53033                                 ((instr & 0xf30) == 0xa30)) {
  53034                               UnallocatedA32(instr);
  53035                               return;
  53036                             }
  53037                             DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  53038                             if (dt.Is(kDataTypeValueInvalid)) {
  53039                               UnallocatedA32(instr);
  53040                               return;
  53041                             }
  53042                             Alignment align =
  53043                                 Align_align_1_Decode((instr >> 4) & 0x3);
  53044                             if (dt.Is(kDataTypeValueInvalid) ||
  53045                                 align.Is(kBadAlignment)) {
  53046                               UnallocatedA32(instr);
  53047                               return;
  53048                             }
  53049                             unsigned first = ExtractDRegister(instr, 22, 12);
  53050                             unsigned length;
  53051                             SpacingType spacing = kSingle;
  53052                             switch ((instr >> 8) & 0xf) {
  53053                               default:
  53054                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  53055                               case 0x7:
  53056                                 length = 1;
  53057                                 break;
  53058                               case 0xa:
  53059                                 length = 2;
  53060                                 break;
  53061                               case 0x6:
  53062                                 length = 3;
  53063                                 break;
  53064                               case 0x2:
  53065                                 length = 4;
  53066                                 break;
  53067                             }
  53068                             unsigned last = first + length - 1;
  53069                             TransferType transfer = kMultipleLanes;
  53070                             unsigned rn = (instr >> 16) & 0xf;
  53071                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1
  53072                             vld1(al,
  53073                                  dt,
  53074                                  NeonRegisterList(DRegister(first),
  53075                                                   DRegister(last),
  53076                                                   spacing,
  53077                                                   transfer),
  53078                                  AlignedMemOperand(Register(rn),
  53079                                                    align,
  53080                                                    Offset));
  53081                             break;
  53082                           }
  53083                           default:
  53084                             UnallocatedA32(instr);
  53085                             break;
  53086                         }
  53087                         break;
  53088                       }
  53089                     }
  53090                     break;
  53091                   }
  53092                   default: {
  53093                     switch (instr & 0x00000f00) {
  53094                       case 0x00000000: {
  53095                         // 0xf4200000
  53096                         if (((instr & 0xd) == 0xd)) {
  53097                           UnallocatedA32(instr);
  53098                           return;
  53099                         }
  53100                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  53101                         if (dt.Is(kDataTypeValueInvalid)) {
  53102                           UnallocatedA32(instr);
  53103                           return;
  53104                         }
  53105                         Alignment align =
  53106                             Align_align_4_Decode((instr >> 4) & 0x3);
  53107                         if (dt.Is(kDataTypeValueInvalid) ||
  53108                             align.Is(kBadAlignment)) {
  53109                           UnallocatedA32(instr);
  53110                           return;
  53111                         }
  53112                         unsigned first = ExtractDRegister(instr, 22, 12);
  53113                         unsigned length;
  53114                         SpacingType spacing;
  53115                         switch ((instr >> 8) & 0xf) {
  53116                           default:
  53117                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  53118                           case 0x0:
  53119                             length = 4;
  53120                             spacing = kSingle;
  53121                             break;
  53122                           case 0x1:
  53123                             length = 4;
  53124                             spacing = kDouble;
  53125                             break;
  53126                         }
  53127                         unsigned last =
  53128                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
  53129                         TransferType transfer = kMultipleLanes;
  53130                         unsigned rn = (instr >> 16) & 0xf;
  53131                         unsigned rm = instr & 0xf;
  53132                         // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  53133                         vld4(al,
  53134                              dt,
  53135                              NeonRegisterList(DRegister(first),
  53136                                               DRegister(last),
  53137                                               spacing,
  53138                                               transfer),
  53139                              AlignedMemOperand(Register(rn),
  53140                                                align,
  53141                                                Register(rm),
  53142                                                PostIndex));
  53143                         break;
  53144                       }
  53145                       case 0x00000100: {
  53146                         // 0xf4200100
  53147                         if (((instr & 0xd) == 0xd)) {
  53148                           UnallocatedA32(instr);
  53149                           return;
  53150                         }
  53151                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  53152                         if (dt.Is(kDataTypeValueInvalid)) {
  53153                           UnallocatedA32(instr);
  53154                           return;
  53155                         }
  53156                         Alignment align =
  53157                             Align_align_4_Decode((instr >> 4) & 0x3);
  53158                         if (dt.Is(kDataTypeValueInvalid) ||
  53159                             align.Is(kBadAlignment)) {
  53160                           UnallocatedA32(instr);
  53161                           return;
  53162                         }
  53163                         unsigned first = ExtractDRegister(instr, 22, 12);
  53164                         unsigned length;
  53165                         SpacingType spacing;
  53166                         switch ((instr >> 8) & 0xf) {
  53167                           default:
  53168                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  53169                           case 0x0:
  53170                             length = 4;
  53171                             spacing = kSingle;
  53172                             break;
  53173                           case 0x1:
  53174                             length = 4;
  53175                             spacing = kDouble;
  53176                             break;
  53177                         }
  53178                         unsigned last =
  53179                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
  53180                         TransferType transfer = kMultipleLanes;
  53181                         unsigned rn = (instr >> 16) & 0xf;
  53182                         unsigned rm = instr & 0xf;
  53183                         // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  53184                         vld4(al,
  53185                              dt,
  53186                              NeonRegisterList(DRegister(first),
  53187                                               DRegister(last),
  53188                                               spacing,
  53189                                               transfer),
  53190                              AlignedMemOperand(Register(rn),
  53191                                                align,
  53192                                                Register(rm),
  53193                                                PostIndex));
  53194                         break;
  53195                       }
  53196                       case 0x00000200: {
  53197                         // 0xf4200200
  53198                         if (((instr & 0xd) == 0xd) ||
  53199                             ((instr & 0xe20) == 0x620) ||
  53200                             ((instr & 0xf30) == 0xa30)) {
  53201                           UnallocatedA32(instr);
  53202                           return;
  53203                         }
  53204                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  53205                         if (dt.Is(kDataTypeValueInvalid)) {
  53206                           UnallocatedA32(instr);
  53207                           return;
  53208                         }
  53209                         Alignment align =
  53210                             Align_align_1_Decode((instr >> 4) & 0x3);
  53211                         if (dt.Is(kDataTypeValueInvalid) ||
  53212                             align.Is(kBadAlignment)) {
  53213                           UnallocatedA32(instr);
  53214                           return;
  53215                         }
  53216                         unsigned first = ExtractDRegister(instr, 22, 12);
  53217                         unsigned length;
  53218                         SpacingType spacing = kSingle;
  53219                         switch ((instr >> 8) & 0xf) {
  53220                           default:
  53221                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  53222                           case 0x7:
  53223                             length = 1;
  53224                             break;
  53225                           case 0xa:
  53226                             length = 2;
  53227                             break;
  53228                           case 0x6:
  53229                             length = 3;
  53230                             break;
  53231                           case 0x2:
  53232                             length = 4;
  53233                             break;
  53234                         }
  53235                         unsigned last = first + length - 1;
  53236                         TransferType transfer = kMultipleLanes;
  53237                         unsigned rn = (instr >> 16) & 0xf;
  53238                         unsigned rm = instr & 0xf;
  53239                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  53240                         vld1(al,
  53241                              dt,
  53242                              NeonRegisterList(DRegister(first),
  53243                                               DRegister(last),
  53244                                               spacing,
  53245                                               transfer),
  53246                              AlignedMemOperand(Register(rn),
  53247                                                align,
  53248                                                Register(rm),
  53249                                                PostIndex));
  53250                         break;
  53251                       }
  53252                       case 0x00000300: {
  53253                         // 0xf4200300
  53254                         if (((instr & 0xd) == 0xd) ||
  53255                             ((instr & 0xe30) == 0x830)) {
  53256                           UnallocatedA32(instr);
  53257                           return;
  53258                         }
  53259                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  53260                         if (dt.Is(kDataTypeValueInvalid)) {
  53261                           UnallocatedA32(instr);
  53262                           return;
  53263                         }
  53264                         Alignment align =
  53265                             Align_align_2_Decode((instr >> 4) & 0x3);
  53266                         if (dt.Is(kDataTypeValueInvalid) ||
  53267                             align.Is(kBadAlignment)) {
  53268                           UnallocatedA32(instr);
  53269                           return;
  53270                         }
  53271                         unsigned first = ExtractDRegister(instr, 22, 12);
  53272                         unsigned length;
  53273                         SpacingType spacing;
  53274                         switch ((instr >> 8) & 0xf) {
  53275                           default:
  53276                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  53277                           case 0x8:
  53278                             length = 2;
  53279                             spacing = kSingle;
  53280                             break;
  53281                           case 0x9:
  53282                             length = 2;
  53283                             spacing = kDouble;
  53284                             break;
  53285                           case 0x3:
  53286                             length = 4;
  53287                             spacing = kSingle;
  53288                             break;
  53289                         }
  53290                         unsigned last =
  53291                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
  53292                         TransferType transfer = kMultipleLanes;
  53293                         unsigned rn = (instr >> 16) & 0xf;
  53294                         unsigned rm = instr & 0xf;
  53295                         // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  53296                         vld2(al,
  53297                              dt,
  53298                              NeonRegisterList(DRegister(first),
  53299                                               DRegister(last),
  53300                                               spacing,
  53301                                               transfer),
  53302                              AlignedMemOperand(Register(rn),
  53303                                                align,
  53304                                                Register(rm),
  53305                                                PostIndex));
  53306                         break;
  53307                       }
  53308                       case 0x00000400: {
  53309                         // 0xf4200400
  53310                         if (((instr & 0xd) == 0xd)) {
  53311                           UnallocatedA32(instr);
  53312                           return;
  53313                         }
  53314                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  53315                         if (dt.Is(kDataTypeValueInvalid)) {
  53316                           UnallocatedA32(instr);
  53317                           return;
  53318                         }
  53319                         Alignment align =
  53320                             Align_align_3_Decode((instr >> 4) & 0x3);
  53321                         if (dt.Is(kDataTypeValueInvalid) ||
  53322                             align.Is(kBadAlignment)) {
  53323                           UnallocatedA32(instr);
  53324                           return;
  53325                         }
  53326                         unsigned first = ExtractDRegister(instr, 22, 12);
  53327                         unsigned length;
  53328                         SpacingType spacing;
  53329                         switch ((instr >> 8) & 0xf) {
  53330                           default:
  53331                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  53332                           case 0x4:
  53333                             length = 3;
  53334                             spacing = kSingle;
  53335                             break;
  53336                           case 0x5:
  53337                             length = 3;
  53338                             spacing = kDouble;
  53339                             break;
  53340                         }
  53341                         unsigned last =
  53342                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
  53343                         TransferType transfer = kMultipleLanes;
  53344                         unsigned rn = (instr >> 16) & 0xf;
  53345                         unsigned rm = instr & 0xf;
  53346                         // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  53347                         vld3(al,
  53348                              dt,
  53349                              NeonRegisterList(DRegister(first),
  53350                                               DRegister(last),
  53351                                               spacing,
  53352                                               transfer),
  53353                              AlignedMemOperand(Register(rn),
  53354                                                align,
  53355                                                Register(rm),
  53356                                                PostIndex));
  53357                         break;
  53358                       }
  53359                       case 0x00000500: {
  53360                         // 0xf4200500
  53361                         if (((instr & 0xd) == 0xd)) {
  53362                           UnallocatedA32(instr);
  53363                           return;
  53364                         }
  53365                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  53366                         if (dt.Is(kDataTypeValueInvalid)) {
  53367                           UnallocatedA32(instr);
  53368                           return;
  53369                         }
  53370                         Alignment align =
  53371                             Align_align_3_Decode((instr >> 4) & 0x3);
  53372                         if (dt.Is(kDataTypeValueInvalid) ||
  53373                             align.Is(kBadAlignment)) {
  53374                           UnallocatedA32(instr);
  53375                           return;
  53376                         }
  53377                         unsigned first = ExtractDRegister(instr, 22, 12);
  53378                         unsigned length;
  53379                         SpacingType spacing;
  53380                         switch ((instr >> 8) & 0xf) {
  53381                           default:
  53382                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  53383                           case 0x4:
  53384                             length = 3;
  53385                             spacing = kSingle;
  53386                             break;
  53387                           case 0x5:
  53388                             length = 3;
  53389                             spacing = kDouble;
  53390                             break;
  53391                         }
  53392                         unsigned last =
  53393                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
  53394                         TransferType transfer = kMultipleLanes;
  53395                         unsigned rn = (instr >> 16) & 0xf;
  53396                         unsigned rm = instr & 0xf;
  53397                         // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  53398                         vld3(al,
  53399                              dt,
  53400                              NeonRegisterList(DRegister(first),
  53401                                               DRegister(last),
  53402                                               spacing,
  53403                                               transfer),
  53404                              AlignedMemOperand(Register(rn),
  53405                                                align,
  53406                                                Register(rm),
  53407                                                PostIndex));
  53408                         break;
  53409                       }
  53410                       case 0x00000600: {
  53411                         // 0xf4200600
  53412                         if (((instr & 0xd) == 0xd) ||
  53413                             ((instr & 0xe20) == 0x620) ||
  53414                             ((instr & 0xf30) == 0xa30)) {
  53415                           UnallocatedA32(instr);
  53416                           return;
  53417                         }
  53418                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  53419                         if (dt.Is(kDataTypeValueInvalid)) {
  53420                           UnallocatedA32(instr);
  53421                           return;
  53422                         }
  53423                         Alignment align =
  53424                             Align_align_1_Decode((instr >> 4) & 0x3);
  53425                         if (dt.Is(kDataTypeValueInvalid) ||
  53426                             align.Is(kBadAlignment)) {
  53427                           UnallocatedA32(instr);
  53428                           return;
  53429                         }
  53430                         unsigned first = ExtractDRegister(instr, 22, 12);
  53431                         unsigned length;
  53432                         SpacingType spacing = kSingle;
  53433                         switch ((instr >> 8) & 0xf) {
  53434                           default:
  53435                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  53436                           case 0x7:
  53437                             length = 1;
  53438                             break;
  53439                           case 0xa:
  53440                             length = 2;
  53441                             break;
  53442                           case 0x6:
  53443                             length = 3;
  53444                             break;
  53445                           case 0x2:
  53446                             length = 4;
  53447                             break;
  53448                         }
  53449                         unsigned last = first + length - 1;
  53450                         TransferType transfer = kMultipleLanes;
  53451                         unsigned rn = (instr >> 16) & 0xf;
  53452                         unsigned rm = instr & 0xf;
  53453                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  53454                         vld1(al,
  53455                              dt,
  53456                              NeonRegisterList(DRegister(first),
  53457                                               DRegister(last),
  53458                                               spacing,
  53459                                               transfer),
  53460                              AlignedMemOperand(Register(rn),
  53461                                                align,
  53462                                                Register(rm),
  53463                                                PostIndex));
  53464                         break;
  53465                       }
  53466                       case 0x00000700: {
  53467                         // 0xf4200700
  53468                         if (((instr & 0xd) == 0xd) ||
  53469                             ((instr & 0xe20) == 0x620) ||
  53470                             ((instr & 0xf30) == 0xa30)) {
  53471                           UnallocatedA32(instr);
  53472                           return;
  53473                         }
  53474                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  53475                         if (dt.Is(kDataTypeValueInvalid)) {
  53476                           UnallocatedA32(instr);
  53477                           return;
  53478                         }
  53479                         Alignment align =
  53480                             Align_align_1_Decode((instr >> 4) & 0x3);
  53481                         if (dt.Is(kDataTypeValueInvalid) ||
  53482                             align.Is(kBadAlignment)) {
  53483                           UnallocatedA32(instr);
  53484                           return;
  53485                         }
  53486                         unsigned first = ExtractDRegister(instr, 22, 12);
  53487                         unsigned length;
  53488                         SpacingType spacing = kSingle;
  53489                         switch ((instr >> 8) & 0xf) {
  53490                           default:
  53491                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  53492                           case 0x7:
  53493                             length = 1;
  53494                             break;
  53495                           case 0xa:
  53496                             length = 2;
  53497                             break;
  53498                           case 0x6:
  53499                             length = 3;
  53500                             break;
  53501                           case 0x2:
  53502                             length = 4;
  53503                             break;
  53504                         }
  53505                         unsigned last = first + length - 1;
  53506                         TransferType transfer = kMultipleLanes;
  53507                         unsigned rn = (instr >> 16) & 0xf;
  53508                         unsigned rm = instr & 0xf;
  53509                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  53510                         vld1(al,
  53511                              dt,
  53512                              NeonRegisterList(DRegister(first),
  53513                                               DRegister(last),
  53514                                               spacing,
  53515                                               transfer),
  53516                              AlignedMemOperand(Register(rn),
  53517                                                align,
  53518                                                Register(rm),
  53519                                                PostIndex));
  53520                         break;
  53521                       }
  53522                       case 0x00000800: {
  53523                         // 0xf4200800
  53524                         if (((instr & 0xd) == 0xd) ||
  53525                             ((instr & 0xe30) == 0x830)) {
  53526                           UnallocatedA32(instr);
  53527                           return;
  53528                         }
  53529                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  53530                         if (dt.Is(kDataTypeValueInvalid)) {
  53531                           UnallocatedA32(instr);
  53532                           return;
  53533                         }
  53534                         Alignment align =
  53535                             Align_align_2_Decode((instr >> 4) & 0x3);
  53536                         if (dt.Is(kDataTypeValueInvalid) ||
  53537                             align.Is(kBadAlignment)) {
  53538                           UnallocatedA32(instr);
  53539                           return;
  53540                         }
  53541                         unsigned first = ExtractDRegister(instr, 22, 12);
  53542                         unsigned length;
  53543                         SpacingType spacing;
  53544                         switch ((instr >> 8) & 0xf) {
  53545                           default:
  53546                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  53547                           case 0x8:
  53548                             length = 2;
  53549                             spacing = kSingle;
  53550                             break;
  53551                           case 0x9:
  53552                             length = 2;
  53553                             spacing = kDouble;
  53554                             break;
  53555                           case 0x3:
  53556                             length = 4;
  53557                             spacing = kSingle;
  53558                             break;
  53559                         }
  53560                         unsigned last =
  53561                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
  53562                         TransferType transfer = kMultipleLanes;
  53563                         unsigned rn = (instr >> 16) & 0xf;
  53564                         unsigned rm = instr & 0xf;
  53565                         // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  53566                         vld2(al,
  53567                              dt,
  53568                              NeonRegisterList(DRegister(first),
  53569                                               DRegister(last),
  53570                                               spacing,
  53571                                               transfer),
  53572                              AlignedMemOperand(Register(rn),
  53573                                                align,
  53574                                                Register(rm),
  53575                                                PostIndex));
  53576                         break;
  53577                       }
  53578                       case 0x00000900: {
  53579                         // 0xf4200900
  53580                         if (((instr & 0xd) == 0xd) ||
  53581                             ((instr & 0xe30) == 0x830)) {
  53582                           UnallocatedA32(instr);
  53583                           return;
  53584                         }
  53585                         DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  53586                         if (dt.Is(kDataTypeValueInvalid)) {
  53587                           UnallocatedA32(instr);
  53588                           return;
  53589                         }
  53590                         Alignment align =
  53591                             Align_align_2_Decode((instr >> 4) & 0x3);
  53592                         if (dt.Is(kDataTypeValueInvalid) ||
  53593                             align.Is(kBadAlignment)) {
  53594                           UnallocatedA32(instr);
  53595                           return;
  53596                         }
  53597                         unsigned first = ExtractDRegister(instr, 22, 12);
  53598                         unsigned length;
  53599                         SpacingType spacing;
  53600                         switch ((instr >> 8) & 0xf) {
  53601                           default:
  53602                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  53603                           case 0x8:
  53604                             length = 2;
  53605                             spacing = kSingle;
  53606                             break;
  53607                           case 0x9:
  53608                             length = 2;
  53609                             spacing = kDouble;
  53610                             break;
  53611                           case 0x3:
  53612                             length = 4;
  53613                             spacing = kSingle;
  53614                             break;
  53615                         }
  53616                         unsigned last =
  53617                             first + (length - 1) * (spacing == kSingle ? 1 : 2);
  53618                         TransferType transfer = kMultipleLanes;
  53619                         unsigned rn = (instr >> 16) & 0xf;
  53620                         unsigned rm = instr & 0xf;
  53621                         // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  53622                         vld2(al,
  53623                              dt,
  53624                              NeonRegisterList(DRegister(first),
  53625                                               DRegister(last),
  53626                                               spacing,
  53627                                               transfer),
  53628                              AlignedMemOperand(Register(rn),
  53629                                                align,
  53630                                                Register(rm),
  53631                                                PostIndex));
  53632                         break;
  53633                       }
  53634                       case 0x00000a00: {
  53635                         // 0xf4200a00
  53636                         if (((instr & 0xd) == 0xd) ||
  53637                             ((instr & 0xe20) == 0x620) ||
  53638                             ((instr & 0xf30) == 0xa30)) {
  53639                           UnallocatedA32(instr);
  53640                           return;
  53641                         }
  53642                         DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3);
  53643                         if (dt.Is(kDataTypeValueInvalid)) {
  53644                           UnallocatedA32(instr);
  53645                           return;
  53646                         }
  53647                         Alignment align =
  53648                             Align_align_1_Decode((instr >> 4) & 0x3);
  53649                         if (dt.Is(kDataTypeValueInvalid) ||
  53650                             align.Is(kBadAlignment)) {
  53651                           UnallocatedA32(instr);
  53652                           return;
  53653                         }
  53654                         unsigned first = ExtractDRegister(instr, 22, 12);
  53655                         unsigned length;
  53656                         SpacingType spacing = kSingle;
  53657                         switch ((instr >> 8) & 0xf) {
  53658                           default:
  53659                             VIXL_UNREACHABLE_OR_FALLTHROUGH();
  53660                           case 0x7:
  53661                             length = 1;
  53662                             break;
  53663                           case 0xa:
  53664                             length = 2;
  53665                             break;
  53666                           case 0x6:
  53667                             length = 3;
  53668                             break;
  53669                           case 0x2:
  53670                             length = 4;
  53671                             break;
  53672                         }
  53673                         unsigned last = first + length - 1;
  53674                         TransferType transfer = kMultipleLanes;
  53675                         unsigned rn = (instr >> 16) & 0xf;
  53676                         unsigned rm = instr & 0xf;
  53677                         // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  53678                         vld1(al,
  53679                              dt,
  53680                              NeonRegisterList(DRegister(first),
  53681                                               DRegister(last),
  53682                                               spacing,
  53683                                               transfer),
  53684                              AlignedMemOperand(Register(rn),
  53685                                                align,
  53686                                                Register(rm),
  53687                                                PostIndex));
  53688                         break;
  53689                       }
  53690                       default:
  53691                         UnallocatedA32(instr);
  53692                         break;
  53693                     }
  53694                     break;
  53695                   }
  53696                 }
  53697                 break;
  53698               }
  53699               case 0x00800000: {
  53700                 // 0xf4a00000
  53701                 switch (instr & 0x00000300) {
  53702                   case 0x00000000: {
  53703                     // 0xf4a00000
  53704                     switch (instr & 0x00000c00) {
  53705                       case 0x00000c00: {
  53706                         // 0xf4a00c00
  53707                         switch (instr & 0x0000000d) {
  53708                           case 0x0000000d: {
  53709                             // 0xf4a00c0d
  53710                             switch (instr & 0x00000002) {
  53711                               case 0x00000000: {
  53712                                 // 0xf4a00c0d
  53713                                 DataType dt =
  53714                                     Dt_size_7_Decode((instr >> 6) & 0x3);
  53715                                 if (dt.Is(kDataTypeValueInvalid)) {
  53716                                   UnallocatedA32(instr);
  53717                                   return;
  53718                                 }
  53719                                 Alignment align =
  53720                                     Align_a_1_Decode((instr >> 4) & 0x1, dt);
  53721                                 if (dt.Is(kDataTypeValueInvalid) ||
  53722                                     align.Is(kBadAlignment)) {
  53723                                   UnallocatedA32(instr);
  53724                                   return;
  53725                                 }
  53726                                 unsigned first =
  53727                                     ExtractDRegister(instr, 22, 12);
  53728                                 unsigned length;
  53729                                 SpacingType spacing = kSingle;
  53730                                 switch ((instr >> 5) & 0x1) {
  53731                                   default:
  53732                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
  53733                                   case 0x0:
  53734                                     length = 1;
  53735                                     break;
  53736                                   case 0x1:
  53737                                     length = 2;
  53738                                     break;
  53739                                 }
  53740                                 unsigned last = first + length - 1;
  53741                                 TransferType transfer = kAllLanes;
  53742                                 unsigned rn = (instr >> 16) & 0xf;
  53743                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  53744                                 vld1(al,
  53745                                      dt,
  53746                                      NeonRegisterList(DRegister(first),
  53747                                                       DRegister(last),
  53748                                                       spacing,
  53749                                                       transfer),
  53750                                      AlignedMemOperand(Register(rn),
  53751                                                        align,
  53752                                                        PostIndex));
  53753                                 break;
  53754                               }
  53755                               case 0x00000002: {
  53756                                 // 0xf4a00c0f
  53757                                 DataType dt =
  53758                                     Dt_size_7_Decode((instr >> 6) & 0x3);
  53759                                 if (dt.Is(kDataTypeValueInvalid)) {
  53760                                   UnallocatedA32(instr);
  53761                                   return;
  53762                                 }
  53763                                 Alignment align =
  53764                                     Align_a_1_Decode((instr >> 4) & 0x1, dt);
  53765                                 if (dt.Is(kDataTypeValueInvalid) ||
  53766                                     align.Is(kBadAlignment)) {
  53767                                   UnallocatedA32(instr);
  53768                                   return;
  53769                                 }
  53770                                 unsigned first =
  53771                                     ExtractDRegister(instr, 22, 12);
  53772                                 unsigned length;
  53773                                 SpacingType spacing = kSingle;
  53774                                 switch ((instr >> 5) & 0x1) {
  53775                                   default:
  53776                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
  53777                                   case 0x0:
  53778                                     length = 1;
  53779                                     break;
  53780                                   case 0x1:
  53781                                     length = 2;
  53782                                     break;
  53783                                 }
  53784                                 unsigned last = first + length - 1;
  53785                                 TransferType transfer = kAllLanes;
  53786                                 unsigned rn = (instr >> 16) & 0xf;
  53787                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
  53788                                 vld1(al,
  53789                                      dt,
  53790                                      NeonRegisterList(DRegister(first),
  53791                                                       DRegister(last),
  53792                                                       spacing,
  53793                                                       transfer),
  53794                                      AlignedMemOperand(Register(rn),
  53795                                                        align,
  53796                                                        Offset));
  53797                                 break;
  53798                               }
  53799                             }
  53800                             break;
  53801                           }
  53802                           default: {
  53803                             if (((instr & 0xd) == 0xd)) {
  53804                               UnallocatedA32(instr);
  53805                               return;
  53806                             }
  53807                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  53808                             if (dt.Is(kDataTypeValueInvalid)) {
  53809                               UnallocatedA32(instr);
  53810                               return;
  53811                             }
  53812                             Alignment align =
  53813                                 Align_a_1_Decode((instr >> 4) & 0x1, dt);
  53814                             if (dt.Is(kDataTypeValueInvalid) ||
  53815                                 align.Is(kBadAlignment)) {
  53816                               UnallocatedA32(instr);
  53817                               return;
  53818                             }
  53819                             unsigned first = ExtractDRegister(instr, 22, 12);
  53820                             unsigned length;
  53821                             SpacingType spacing = kSingle;
  53822                             switch ((instr >> 5) & 0x1) {
  53823                               default:
  53824                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  53825                               case 0x0:
  53826                                 length = 1;
  53827                                 break;
  53828                               case 0x1:
  53829                                 length = 2;
  53830                                 break;
  53831                             }
  53832                             unsigned last = first + length - 1;
  53833                             TransferType transfer = kAllLanes;
  53834                             unsigned rn = (instr >> 16) & 0xf;
  53835                             unsigned rm = instr & 0xf;
  53836                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  53837                             vld1(al,
  53838                                  dt,
  53839                                  NeonRegisterList(DRegister(first),
  53840                                                   DRegister(last),
  53841                                                   spacing,
  53842                                                   transfer),
  53843                                  AlignedMemOperand(Register(rn),
  53844                                                    align,
  53845                                                    Register(rm),
  53846                                                    PostIndex));
  53847                             break;
  53848                           }
  53849                         }
  53850                         break;
  53851                       }
  53852                       default: {
  53853                         switch (instr & 0x0000000d) {
  53854                           case 0x0000000d: {
  53855                             // 0xf4a0000d
  53856                             switch (instr & 0x00000002) {
  53857                               case 0x00000000: {
  53858                                 // 0xf4a0000d
  53859                                 if (((instr & 0xc00) == 0xc00)) {
  53860                                   UnallocatedA32(instr);
  53861                                   return;
  53862                                 }
  53863                                 DataType dt =
  53864                                     Dt_size_7_Decode((instr >> 10) & 0x3);
  53865                                 if (dt.Is(kDataTypeValueInvalid)) {
  53866                                   UnallocatedA32(instr);
  53867                                   return;
  53868                                 }
  53869                                 DecodeNeonAndAlign decode_neon =
  53870                                     Align_index_align_1_Decode((instr >> 4) &
  53871                                                                    0xf,
  53872                                                                dt);
  53873                                 if (!decode_neon.IsValid()) {
  53874                                   UnallocatedA32(instr);
  53875                                   return;
  53876                                 }
  53877                                 Alignment align = decode_neon.GetAlign();
  53878                                 int lane = decode_neon.GetLane();
  53879                                 SpacingType spacing = decode_neon.GetSpacing();
  53880                                 unsigned first =
  53881                                     ExtractDRegister(instr, 22, 12);
  53882                                 unsigned length = 1;
  53883                                 unsigned last = first + length - 1;
  53884                                 unsigned rn = (instr >> 16) & 0xf;
  53885                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  53886                                 vld1(al,
  53887                                      dt,
  53888                                      NeonRegisterList(DRegister(first),
  53889                                                       DRegister(last),
  53890                                                       spacing,
  53891                                                       lane),
  53892                                      AlignedMemOperand(Register(rn),
  53893                                                        align,
  53894                                                        PostIndex));
  53895                                 break;
  53896                               }
  53897                               case 0x00000002: {
  53898                                 // 0xf4a0000f
  53899                                 if (((instr & 0xc00) == 0xc00)) {
  53900                                   UnallocatedA32(instr);
  53901                                   return;
  53902                                 }
  53903                                 DataType dt =
  53904                                     Dt_size_7_Decode((instr >> 10) & 0x3);
  53905                                 if (dt.Is(kDataTypeValueInvalid)) {
  53906                                   UnallocatedA32(instr);
  53907                                   return;
  53908                                 }
  53909                                 DecodeNeonAndAlign decode_neon =
  53910                                     Align_index_align_1_Decode((instr >> 4) &
  53911                                                                    0xf,
  53912                                                                dt);
  53913                                 if (!decode_neon.IsValid()) {
  53914                                   UnallocatedA32(instr);
  53915                                   return;
  53916                                 }
  53917                                 Alignment align = decode_neon.GetAlign();
  53918                                 int lane = decode_neon.GetLane();
  53919                                 SpacingType spacing = decode_neon.GetSpacing();
  53920                                 unsigned first =
  53921                                     ExtractDRegister(instr, 22, 12);
  53922                                 unsigned length = 1;
  53923                                 unsigned last = first + length - 1;
  53924                                 unsigned rn = (instr >> 16) & 0xf;
  53925                                 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
  53926                                 vld1(al,
  53927                                      dt,
  53928                                      NeonRegisterList(DRegister(first),
  53929                                                       DRegister(last),
  53930                                                       spacing,
  53931                                                       lane),
  53932                                      AlignedMemOperand(Register(rn),
  53933                                                        align,
  53934                                                        Offset));
  53935                                 break;
  53936                               }
  53937                             }
  53938                             break;
  53939                           }
  53940                           default: {
  53941                             if (((instr & 0xc00) == 0xc00) ||
  53942                                 ((instr & 0xd) == 0xd)) {
  53943                               UnallocatedA32(instr);
  53944                               return;
  53945                             }
  53946                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
  53947                             if (dt.Is(kDataTypeValueInvalid)) {
  53948                               UnallocatedA32(instr);
  53949                               return;
  53950                             }
  53951                             DecodeNeonAndAlign decode_neon =
  53952                                 Align_index_align_1_Decode((instr >> 4) & 0xf,
  53953                                                            dt);
  53954                             if (!decode_neon.IsValid()) {
  53955                               UnallocatedA32(instr);
  53956                               return;
  53957                             }
  53958                             Alignment align = decode_neon.GetAlign();
  53959                             int lane = decode_neon.GetLane();
  53960                             SpacingType spacing = decode_neon.GetSpacing();
  53961                             unsigned first = ExtractDRegister(instr, 22, 12);
  53962                             unsigned length = 1;
  53963                             unsigned last = first + length - 1;
  53964                             unsigned rn = (instr >> 16) & 0xf;
  53965                             unsigned rm = instr & 0xf;
  53966                             // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  53967                             vld1(al,
  53968                                  dt,
  53969                                  NeonRegisterList(DRegister(first),
  53970                                                   DRegister(last),
  53971                                                   spacing,
  53972                                                   lane),
  53973                                  AlignedMemOperand(Register(rn),
  53974                                                    align,
  53975                                                    Register(rm),
  53976                                                    PostIndex));
  53977                             break;
  53978                           }
  53979                         }
  53980                         break;
  53981                       }
  53982                     }
  53983                     break;
  53984                   }
  53985                   case 0x00000100: {
  53986                     // 0xf4a00100
  53987                     switch (instr & 0x00000c00) {
  53988                       case 0x00000c00: {
  53989                         // 0xf4a00d00
  53990                         switch (instr & 0x0000000d) {
  53991                           case 0x0000000d: {
  53992                             // 0xf4a00d0d
  53993                             switch (instr & 0x00000002) {
  53994                               case 0x00000000: {
  53995                                 // 0xf4a00d0d
  53996                                 DataType dt =
  53997                                     Dt_size_7_Decode((instr >> 6) & 0x3);
  53998                                 if (dt.Is(kDataTypeValueInvalid)) {
  53999                                   UnallocatedA32(instr);
  54000                                   return;
  54001                                 }
  54002                                 Alignment align =
  54003                                     Align_a_2_Decode((instr >> 4) & 0x1, dt);
  54004                                 if (dt.Is(kDataTypeValueInvalid) ||
  54005                                     align.Is(kBadAlignment)) {
  54006                                   UnallocatedA32(instr);
  54007                                   return;
  54008                                 }
  54009                                 unsigned first =
  54010                                     ExtractDRegister(instr, 22, 12);
  54011                                 unsigned length;
  54012                                 SpacingType spacing;
  54013                                 switch ((instr >> 5) & 0x1) {
  54014                                   default:
  54015                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
  54016                                   case 0x0:
  54017                                     length = 2;
  54018                                     spacing = kSingle;
  54019                                     break;
  54020                                   case 0x1:
  54021                                     length = 2;
  54022                                     spacing = kDouble;
  54023                                     break;
  54024                                 }
  54025                                 unsigned last =
  54026                                     first +
  54027                                     (length - 1) * (spacing == kSingle ? 1 : 2);
  54028                                 TransferType transfer = kAllLanes;
  54029                                 unsigned rn = (instr >> 16) & 0xf;
  54030                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  54031                                 vld2(al,
  54032                                      dt,
  54033                                      NeonRegisterList(DRegister(first),
  54034                                                       DRegister(last),
  54035                                                       spacing,
  54036                                                       transfer),
  54037                                      AlignedMemOperand(Register(rn),
  54038                                                        align,
  54039                                                        PostIndex));
  54040                                 break;
  54041                               }
  54042                               case 0x00000002: {
  54043                                 // 0xf4a00d0f
  54044                                 DataType dt =
  54045                                     Dt_size_7_Decode((instr >> 6) & 0x3);
  54046                                 if (dt.Is(kDataTypeValueInvalid)) {
  54047                                   UnallocatedA32(instr);
  54048                                   return;
  54049                                 }
  54050                                 Alignment align =
  54051                                     Align_a_2_Decode((instr >> 4) & 0x1, dt);
  54052                                 if (dt.Is(kDataTypeValueInvalid) ||
  54053                                     align.Is(kBadAlignment)) {
  54054                                   UnallocatedA32(instr);
  54055                                   return;
  54056                                 }
  54057                                 unsigned first =
  54058                                     ExtractDRegister(instr, 22, 12);
  54059                                 unsigned length;
  54060                                 SpacingType spacing;
  54061                                 switch ((instr >> 5) & 0x1) {
  54062                                   default:
  54063                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
  54064                                   case 0x0:
  54065                                     length = 2;
  54066                                     spacing = kSingle;
  54067                                     break;
  54068                                   case 0x1:
  54069                                     length = 2;
  54070                                     spacing = kDouble;
  54071                                     break;
  54072                                 }
  54073                                 unsigned last =
  54074                                     first +
  54075                                     (length - 1) * (spacing == kSingle ? 1 : 2);
  54076                                 TransferType transfer = kAllLanes;
  54077                                 unsigned rn = (instr >> 16) & 0xf;
  54078                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
  54079                                 vld2(al,
  54080                                      dt,
  54081                                      NeonRegisterList(DRegister(first),
  54082                                                       DRegister(last),
  54083                                                       spacing,
  54084                                                       transfer),
  54085                                      AlignedMemOperand(Register(rn),
  54086                                                        align,
  54087                                                        Offset));
  54088                                 break;
  54089                               }
  54090                             }
  54091                             break;
  54092                           }
  54093                           default: {
  54094                             if (((instr & 0xd) == 0xd)) {
  54095                               UnallocatedA32(instr);
  54096                               return;
  54097                             }
  54098                             DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3);
  54099                             if (dt.Is(kDataTypeValueInvalid)) {
  54100                               UnallocatedA32(instr);
  54101                               return;
  54102                             }
  54103                             Alignment align =
  54104                                 Align_a_2_Decode((instr >> 4) & 0x1, dt);
  54105                             if (dt.Is(kDataTypeValueInvalid) ||
  54106                                 align.Is(kBadAlignment)) {
  54107                               UnallocatedA32(instr);
  54108                               return;
  54109                             }
  54110                             unsigned first = ExtractDRegister(instr, 22, 12);
  54111                             unsigned length;
  54112                             SpacingType spacing;
  54113                             switch ((instr >> 5) & 0x1) {
  54114                               default:
  54115                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  54116                               case 0x0:
  54117                                 length = 2;
  54118                                 spacing = kSingle;
  54119                                 break;
  54120                               case 0x1:
  54121                                 length = 2;
  54122                                 spacing = kDouble;
  54123                                 break;
  54124                             }
  54125                             unsigned last =
  54126                                 first +
  54127                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  54128                             TransferType transfer = kAllLanes;
  54129                             unsigned rn = (instr >> 16) & 0xf;
  54130                             unsigned rm = instr & 0xf;
  54131                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  54132                             vld2(al,
  54133                                  dt,
  54134                                  NeonRegisterList(DRegister(first),
  54135                                                   DRegister(last),
  54136                                                   spacing,
  54137                                                   transfer),
  54138                                  AlignedMemOperand(Register(rn),
  54139                                                    align,
  54140                                                    Register(rm),
  54141                                                    PostIndex));
  54142                             break;
  54143                           }
  54144                         }
  54145                         break;
  54146                       }
  54147                       default: {
  54148                         switch (instr & 0x0000000d) {
  54149                           case 0x0000000d: {
  54150                             // 0xf4a0010d
  54151                             switch (instr & 0x00000002) {
  54152                               case 0x00000000: {
  54153                                 // 0xf4a0010d
  54154                                 if (((instr & 0xc00) == 0xc00)) {
  54155                                   UnallocatedA32(instr);
  54156                                   return;
  54157                                 }
  54158                                 DataType dt =
  54159                                     Dt_size_7_Decode((instr >> 10) & 0x3);
  54160                                 if (dt.Is(kDataTypeValueInvalid)) {
  54161                                   UnallocatedA32(instr);
  54162                                   return;
  54163                                 }
  54164                                 DecodeNeonAndAlign decode_neon =
  54165                                     Align_index_align_2_Decode((instr >> 4) &
  54166                                                                    0xf,
  54167                                                                dt);
  54168                                 if (!decode_neon.IsValid()) {
  54169                                   UnallocatedA32(instr);
  54170                                   return;
  54171                                 }
  54172                                 Alignment align = decode_neon.GetAlign();
  54173                                 int lane = decode_neon.GetLane();
  54174                                 SpacingType spacing = decode_neon.GetSpacing();
  54175                                 unsigned first =
  54176                                     ExtractDRegister(instr, 22, 12);
  54177                                 unsigned length = 2;
  54178                                 unsigned last =
  54179                                     first +
  54180                                     (length - 1) * (spacing == kSingle ? 1 : 2);
  54181                                 unsigned rn = (instr >> 16) & 0xf;
  54182                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  54183                                 vld2(al,
  54184                                      dt,
  54185                                      NeonRegisterList(DRegister(first),
  54186                                                       DRegister(last),
  54187                                                       spacing,
  54188                                                       lane),
  54189                                      AlignedMemOperand(Register(rn),
  54190                                                        align,
  54191                                                        PostIndex));
  54192                                 break;
  54193                               }
  54194                               case 0x00000002: {
  54195                                 // 0xf4a0010f
  54196                                 if (((instr & 0xc00) == 0xc00)) {
  54197                                   UnallocatedA32(instr);
  54198                                   return;
  54199                                 }
  54200                                 DataType dt =
  54201                                     Dt_size_7_Decode((instr >> 10) & 0x3);
  54202                                 if (dt.Is(kDataTypeValueInvalid)) {
  54203                                   UnallocatedA32(instr);
  54204                                   return;
  54205                                 }
  54206                                 DecodeNeonAndAlign decode_neon =
  54207                                     Align_index_align_2_Decode((instr >> 4) &
  54208                                                                    0xf,
  54209                                                                dt);
  54210                                 if (!decode_neon.IsValid()) {
  54211                                   UnallocatedA32(instr);
  54212                                   return;
  54213                                 }
  54214                                 Alignment align = decode_neon.GetAlign();
  54215                                 int lane = decode_neon.GetLane();
  54216                                 SpacingType spacing = decode_neon.GetSpacing();
  54217                                 unsigned first =
  54218                                     ExtractDRegister(instr, 22, 12);
  54219                                 unsigned length = 2;
  54220                                 unsigned last =
  54221                                     first +
  54222                                     (length - 1) * (spacing == kSingle ? 1 : 2);
  54223                                 unsigned rn = (instr >> 16) & 0xf;
  54224                                 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
  54225                                 vld2(al,
  54226                                      dt,
  54227                                      NeonRegisterList(DRegister(first),
  54228                                                       DRegister(last),
  54229                                                       spacing,
  54230                                                       lane),
  54231                                      AlignedMemOperand(Register(rn),
  54232                                                        align,
  54233                                                        Offset));
  54234                                 break;
  54235                               }
  54236                             }
  54237                             break;
  54238                           }
  54239                           default: {
  54240                             if (((instr & 0xc00) == 0xc00) ||
  54241                                 ((instr & 0xd) == 0xd)) {
  54242                               UnallocatedA32(instr);
  54243                               return;
  54244                             }
  54245                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
  54246                             if (dt.Is(kDataTypeValueInvalid)) {
  54247                               UnallocatedA32(instr);
  54248                               return;
  54249                             }
  54250                             DecodeNeonAndAlign decode_neon =
  54251                                 Align_index_align_2_Decode((instr >> 4) & 0xf,
  54252                                                            dt);
  54253                             if (!decode_neon.IsValid()) {
  54254                               UnallocatedA32(instr);
  54255                               return;
  54256                             }
  54257                             Alignment align = decode_neon.GetAlign();
  54258                             int lane = decode_neon.GetLane();
  54259                             SpacingType spacing = decode_neon.GetSpacing();
  54260                             unsigned first = ExtractDRegister(instr, 22, 12);
  54261                             unsigned length = 2;
  54262                             unsigned last =
  54263                                 first +
  54264                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  54265                             unsigned rn = (instr >> 16) & 0xf;
  54266                             unsigned rm = instr & 0xf;
  54267                             // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  54268                             vld2(al,
  54269                                  dt,
  54270                                  NeonRegisterList(DRegister(first),
  54271                                                   DRegister(last),
  54272                                                   spacing,
  54273                                                   lane),
  54274                                  AlignedMemOperand(Register(rn),
  54275                                                    align,
  54276                                                    Register(rm),
  54277                                                    PostIndex));
  54278                             break;
  54279                           }
  54280                         }
  54281                         break;
  54282                       }
  54283                     }
  54284                     break;
  54285                   }
  54286                   case 0x00000200: {
  54287                     // 0xf4a00200
  54288                     switch (instr & 0x00000c00) {
  54289                       case 0x00000c00: {
  54290                         // 0xf4a00e00
  54291                         switch (instr & 0x00000010) {
  54292                           case 0x00000000: {
  54293                             // 0xf4a00e00
  54294                             switch (instr & 0x0000000d) {
  54295                               case 0x0000000d: {
  54296                                 // 0xf4a00e0d
  54297                                 switch (instr & 0x00000002) {
  54298                                   case 0x00000000: {
  54299                                     // 0xf4a00e0d
  54300                                     DataType dt =
  54301                                         Dt_size_7_Decode((instr >> 6) & 0x3);
  54302                                     if (dt.Is(kDataTypeValueInvalid)) {
  54303                                       UnallocatedA32(instr);
  54304                                       return;
  54305                                     }
  54306                                     unsigned first =
  54307                                         ExtractDRegister(instr, 22, 12);
  54308                                     unsigned length;
  54309                                     SpacingType spacing;
  54310                                     switch ((instr >> 5) & 0x1) {
  54311                                       default:
  54312                                         VIXL_UNREACHABLE_OR_FALLTHROUGH();
  54313                                       case 0x0:
  54314                                         length = 3;
  54315                                         spacing = kSingle;
  54316                                         break;
  54317                                       case 0x1:
  54318                                         length = 3;
  54319                                         spacing = kDouble;
  54320                                         break;
  54321                                     }
  54322                                     unsigned last =
  54323                                         first +
  54324                                         (length - 1) *
  54325                                             (spacing == kSingle ? 1 : 2);
  54326                                     TransferType transfer = kAllLanes;
  54327                                     unsigned rn = (instr >> 16) & 0xf;
  54328                                     // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
  54329                                     vld3(al,
  54330                                          dt,
  54331                                          NeonRegisterList(DRegister(first),
  54332                                                           DRegister(last),
  54333                                                           spacing,
  54334                                                           transfer),
  54335                                          MemOperand(Register(rn), PostIndex));
  54336                                     break;
  54337                                   }
  54338                                   case 0x00000002: {
  54339                                     // 0xf4a00e0f
  54340                                     DataType dt =
  54341                                         Dt_size_7_Decode((instr >> 6) & 0x3);
  54342                                     if (dt.Is(kDataTypeValueInvalid)) {
  54343                                       UnallocatedA32(instr);
  54344                                       return;
  54345                                     }
  54346                                     unsigned first =
  54347                                         ExtractDRegister(instr, 22, 12);
  54348                                     unsigned length;
  54349                                     SpacingType spacing;
  54350                                     switch ((instr >> 5) & 0x1) {
  54351                                       default:
  54352                                         VIXL_UNREACHABLE_OR_FALLTHROUGH();
  54353                                       case 0x0:
  54354                                         length = 3;
  54355                                         spacing = kSingle;
  54356                                         break;
  54357                                       case 0x1:
  54358                                         length = 3;
  54359                                         spacing = kDouble;
  54360                                         break;
  54361                                     }
  54362                                     unsigned last =
  54363                                         first +
  54364                                         (length - 1) *
  54365                                             (spacing == kSingle ? 1 : 2);
  54366                                     TransferType transfer = kAllLanes;
  54367                                     unsigned rn = (instr >> 16) & 0xf;
  54368                                     // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
  54369                                     vld3(al,
  54370                                          dt,
  54371                                          NeonRegisterList(DRegister(first),
  54372                                                           DRegister(last),
  54373                                                           spacing,
  54374                                                           transfer),
  54375                                          MemOperand(Register(rn), Offset));
  54376                                     break;
  54377                                   }
  54378                                 }
  54379                                 break;
  54380                               }
  54381                               default: {
  54382                                 if (((instr & 0xd) == 0xd)) {
  54383                                   UnallocatedA32(instr);
  54384                                   return;
  54385                                 }
  54386                                 DataType dt =
  54387                                     Dt_size_7_Decode((instr >> 6) & 0x3);
  54388                                 if (dt.Is(kDataTypeValueInvalid)) {
  54389                                   UnallocatedA32(instr);
  54390                                   return;
  54391                                 }
  54392                                 unsigned first =
  54393                                     ExtractDRegister(instr, 22, 12);
  54394                                 unsigned length;
  54395                                 SpacingType spacing;
  54396                                 switch ((instr >> 5) & 0x1) {
  54397                                   default:
  54398                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
  54399                                   case 0x0:
  54400                                     length = 3;
  54401                                     spacing = kSingle;
  54402                                     break;
  54403                                   case 0x1:
  54404                                     length = 3;
  54405                                     spacing = kDouble;
  54406                                     break;
  54407                                 }
  54408                                 unsigned last =
  54409                                     first +
  54410                                     (length - 1) * (spacing == kSingle ? 1 : 2);
  54411                                 TransferType transfer = kAllLanes;
  54412                                 unsigned rn = (instr >> 16) & 0xf;
  54413                                 Sign sign(plus);
  54414                                 unsigned rm = instr & 0xf;
  54415                                 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1 NOLINT(whitespace/line_length)
  54416                                 vld3(al,
  54417                                      dt,
  54418                                      NeonRegisterList(DRegister(first),
  54419                                                       DRegister(last),
  54420                                                       spacing,
  54421                                                       transfer),
  54422                                      MemOperand(Register(rn),
  54423                                                 sign,
  54424                                                 Register(rm),
  54425                                                 PostIndex));
  54426                                 break;
  54427                               }
  54428                             }
  54429                             break;
  54430                           }
  54431                           default:
  54432                             UnallocatedA32(instr);
  54433                             break;
  54434                         }
  54435                         break;
  54436                       }
  54437                       default: {
  54438                         switch (instr & 0x0000000d) {
  54439                           case 0x0000000d: {
  54440                             // 0xf4a0020d
  54441                             switch (instr & 0x00000002) {
  54442                               case 0x00000000: {
  54443                                 // 0xf4a0020d
  54444                                 if (((instr & 0xc00) == 0xc00)) {
  54445                                   UnallocatedA32(instr);
  54446                                   return;
  54447                                 }
  54448                                 DataType dt =
  54449                                     Dt_size_7_Decode((instr >> 10) & 0x3);
  54450                                 if (dt.Is(kDataTypeValueInvalid)) {
  54451                                   UnallocatedA32(instr);
  54452                                   return;
  54453                                 }
  54454                                 DecodeNeon decode_neon =
  54455                                     Index_1_Decode((instr >> 4) & 0xf, dt);
  54456                                 if (!decode_neon.IsValid()) {
  54457                                   UnallocatedA32(instr);
  54458                                   return;
  54459                                 }
  54460                                 int lane = decode_neon.GetLane();
  54461                                 SpacingType spacing = decode_neon.GetSpacing();
  54462                                 unsigned first =
  54463                                     ExtractDRegister(instr, 22, 12);
  54464                                 unsigned length = 3;
  54465                                 unsigned last =
  54466                                     first +
  54467                                     (length - 1) * (spacing == kSingle ? 1 : 2);
  54468                                 unsigned rn = (instr >> 16) & 0xf;
  54469                                 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1
  54470                                 vld3(al,
  54471                                      dt,
  54472                                      NeonRegisterList(DRegister(first),
  54473                                                       DRegister(last),
  54474                                                       spacing,
  54475                                                       lane),
  54476                                      MemOperand(Register(rn), PostIndex));
  54477                                 break;
  54478                               }
  54479                               case 0x00000002: {
  54480                                 // 0xf4a0020f
  54481                                 if (((instr & 0xc00) == 0xc00)) {
  54482                                   UnallocatedA32(instr);
  54483                                   return;
  54484                                 }
  54485                                 DataType dt =
  54486                                     Dt_size_7_Decode((instr >> 10) & 0x3);
  54487                                 if (dt.Is(kDataTypeValueInvalid)) {
  54488                                   UnallocatedA32(instr);
  54489                                   return;
  54490                                 }
  54491                                 DecodeNeon decode_neon =
  54492                                     Index_1_Decode((instr >> 4) & 0xf, dt);
  54493                                 if (!decode_neon.IsValid()) {
  54494                                   UnallocatedA32(instr);
  54495                                   return;
  54496                                 }
  54497                                 int lane = decode_neon.GetLane();
  54498                                 SpacingType spacing = decode_neon.GetSpacing();
  54499                                 unsigned first =
  54500                                     ExtractDRegister(instr, 22, 12);
  54501                                 unsigned length = 3;
  54502                                 unsigned last =
  54503                                     first +
  54504                                     (length - 1) * (spacing == kSingle ? 1 : 2);
  54505                                 unsigned rn = (instr >> 16) & 0xf;
  54506                                 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1
  54507                                 vld3(al,
  54508                                      dt,
  54509                                      NeonRegisterList(DRegister(first),
  54510                                                       DRegister(last),
  54511                                                       spacing,
  54512                                                       lane),
  54513                                      MemOperand(Register(rn), Offset));
  54514                                 break;
  54515                               }
  54516                             }
  54517                             break;
  54518                           }
  54519                           default: {
  54520                             if (((instr & 0xc00) == 0xc00) ||
  54521                                 ((instr & 0xd) == 0xd)) {
  54522                               UnallocatedA32(instr);
  54523                               return;
  54524                             }
  54525                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
  54526                             if (dt.Is(kDataTypeValueInvalid)) {
  54527                               UnallocatedA32(instr);
  54528                               return;
  54529                             }
  54530                             DecodeNeon decode_neon =
  54531                                 Index_1_Decode((instr >> 4) & 0xf, dt);
  54532                             if (!decode_neon.IsValid()) {
  54533                               UnallocatedA32(instr);
  54534                               return;
  54535                             }
  54536                             int lane = decode_neon.GetLane();
  54537                             SpacingType spacing = decode_neon.GetSpacing();
  54538                             unsigned first = ExtractDRegister(instr, 22, 12);
  54539                             unsigned length = 3;
  54540                             unsigned last =
  54541                                 first +
  54542                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  54543                             unsigned rn = (instr >> 16) & 0xf;
  54544                             Sign sign(plus);
  54545                             unsigned rm = instr & 0xf;
  54546                             // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1
  54547                             vld3(al,
  54548                                  dt,
  54549                                  NeonRegisterList(DRegister(first),
  54550                                                   DRegister(last),
  54551                                                   spacing,
  54552                                                   lane),
  54553                                  MemOperand(Register(rn),
  54554                                             sign,
  54555                                             Register(rm),
  54556                                             PostIndex));
  54557                             break;
  54558                           }
  54559                         }
  54560                         break;
  54561                       }
  54562                     }
  54563                     break;
  54564                   }
  54565                   case 0x00000300: {
  54566                     // 0xf4a00300
  54567                     switch (instr & 0x00000c00) {
  54568                       case 0x00000c00: {
  54569                         // 0xf4a00f00
  54570                         switch (instr & 0x0000000d) {
  54571                           case 0x0000000d: {
  54572                             // 0xf4a00f0d
  54573                             switch (instr & 0x00000002) {
  54574                               case 0x00000000: {
  54575                                 // 0xf4a00f0d
  54576                                 DataType dt =
  54577                                     Dt_size_8_Decode((instr >> 6) & 0x3);
  54578                                 if (dt.Is(kDataTypeValueInvalid)) {
  54579                                   UnallocatedA32(instr);
  54580                                   return;
  54581                                 }
  54582                                 Alignment align =
  54583                                     Align_a_3_Decode((instr >> 4) & 0x1,
  54584                                                      dt,
  54585                                                      (instr >> 6) & 0x3);
  54586                                 if (dt.Is(kDataTypeValueInvalid) ||
  54587                                     align.Is(kBadAlignment)) {
  54588                                   UnallocatedA32(instr);
  54589                                   return;
  54590                                 }
  54591                                 unsigned first =
  54592                                     ExtractDRegister(instr, 22, 12);
  54593                                 unsigned length;
  54594                                 SpacingType spacing;
  54595                                 switch ((instr >> 5) & 0x1) {
  54596                                   default:
  54597                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
  54598                                   case 0x0:
  54599                                     length = 4;
  54600                                     spacing = kSingle;
  54601                                     break;
  54602                                   case 0x1:
  54603                                     length = 4;
  54604                                     spacing = kDouble;
  54605                                     break;
  54606                                 }
  54607                                 unsigned last =
  54608                                     first +
  54609                                     (length - 1) * (spacing == kSingle ? 1 : 2);
  54610                                 TransferType transfer = kAllLanes;
  54611                                 unsigned rn = (instr >> 16) & 0xf;
  54612                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  54613                                 vld4(al,
  54614                                      dt,
  54615                                      NeonRegisterList(DRegister(first),
  54616                                                       DRegister(last),
  54617                                                       spacing,
  54618                                                       transfer),
  54619                                      AlignedMemOperand(Register(rn),
  54620                                                        align,
  54621                                                        PostIndex));
  54622                                 break;
  54623                               }
  54624                               case 0x00000002: {
  54625                                 // 0xf4a00f0f
  54626                                 DataType dt =
  54627                                     Dt_size_8_Decode((instr >> 6) & 0x3);
  54628                                 if (dt.Is(kDataTypeValueInvalid)) {
  54629                                   UnallocatedA32(instr);
  54630                                   return;
  54631                                 }
  54632                                 Alignment align =
  54633                                     Align_a_3_Decode((instr >> 4) & 0x1,
  54634                                                      dt,
  54635                                                      (instr >> 6) & 0x3);
  54636                                 if (dt.Is(kDataTypeValueInvalid) ||
  54637                                     align.Is(kBadAlignment)) {
  54638                                   UnallocatedA32(instr);
  54639                                   return;
  54640                                 }
  54641                                 unsigned first =
  54642                                     ExtractDRegister(instr, 22, 12);
  54643                                 unsigned length;
  54644                                 SpacingType spacing;
  54645                                 switch ((instr >> 5) & 0x1) {
  54646                                   default:
  54647                                     VIXL_UNREACHABLE_OR_FALLTHROUGH();
  54648                                   case 0x0:
  54649                                     length = 4;
  54650                                     spacing = kSingle;
  54651                                     break;
  54652                                   case 0x1:
  54653                                     length = 4;
  54654                                     spacing = kDouble;
  54655                                     break;
  54656                                 }
  54657                                 unsigned last =
  54658                                     first +
  54659                                     (length - 1) * (spacing == kSingle ? 1 : 2);
  54660                                 TransferType transfer = kAllLanes;
  54661                                 unsigned rn = (instr >> 16) & 0xf;
  54662                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
  54663                                 vld4(al,
  54664                                      dt,
  54665                                      NeonRegisterList(DRegister(first),
  54666                                                       DRegister(last),
  54667                                                       spacing,
  54668                                                       transfer),
  54669                                      AlignedMemOperand(Register(rn),
  54670                                                        align,
  54671                                                        Offset));
  54672                                 break;
  54673                               }
  54674                             }
  54675                             break;
  54676                           }
  54677                           default: {
  54678                             if (((instr & 0xd) == 0xd)) {
  54679                               UnallocatedA32(instr);
  54680                               return;
  54681                             }
  54682                             DataType dt = Dt_size_8_Decode((instr >> 6) & 0x3);
  54683                             if (dt.Is(kDataTypeValueInvalid)) {
  54684                               UnallocatedA32(instr);
  54685                               return;
  54686                             }
  54687                             Alignment align =
  54688                                 Align_a_3_Decode((instr >> 4) & 0x1,
  54689                                                  dt,
  54690                                                  (instr >> 6) & 0x3);
  54691                             if (dt.Is(kDataTypeValueInvalid) ||
  54692                                 align.Is(kBadAlignment)) {
  54693                               UnallocatedA32(instr);
  54694                               return;
  54695                             }
  54696                             unsigned first = ExtractDRegister(instr, 22, 12);
  54697                             unsigned length;
  54698                             SpacingType spacing;
  54699                             switch ((instr >> 5) & 0x1) {
  54700                               default:
  54701                                 VIXL_UNREACHABLE_OR_FALLTHROUGH();
  54702                               case 0x0:
  54703                                 length = 4;
  54704                                 spacing = kSingle;
  54705                                 break;
  54706                               case 0x1:
  54707                                 length = 4;
  54708                                 spacing = kDouble;
  54709                                 break;
  54710                             }
  54711                             unsigned last =
  54712                                 first +
  54713                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  54714                             TransferType transfer = kAllLanes;
  54715                             unsigned rn = (instr >> 16) & 0xf;
  54716                             unsigned rm = instr & 0xf;
  54717                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  54718                             vld4(al,
  54719                                  dt,
  54720                                  NeonRegisterList(DRegister(first),
  54721                                                   DRegister(last),
  54722                                                   spacing,
  54723                                                   transfer),
  54724                                  AlignedMemOperand(Register(rn),
  54725                                                    align,
  54726                                                    Register(rm),
  54727                                                    PostIndex));
  54728                             break;
  54729                           }
  54730                         }
  54731                         break;
  54732                       }
  54733                       default: {
  54734                         switch (instr & 0x0000000d) {
  54735                           case 0x0000000d: {
  54736                             // 0xf4a0030d
  54737                             switch (instr & 0x00000002) {
  54738                               case 0x00000000: {
  54739                                 // 0xf4a0030d
  54740                                 if (((instr & 0xc00) == 0xc00)) {
  54741                                   UnallocatedA32(instr);
  54742                                   return;
  54743                                 }
  54744                                 DataType dt =
  54745                                     Dt_size_7_Decode((instr >> 10) & 0x3);
  54746                                 if (dt.Is(kDataTypeValueInvalid)) {
  54747                                   UnallocatedA32(instr);
  54748                                   return;
  54749                                 }
  54750                                 DecodeNeonAndAlign decode_neon =
  54751                                     Align_index_align_3_Decode((instr >> 4) &
  54752                                                                    0xf,
  54753                                                                dt);
  54754                                 if (!decode_neon.IsValid()) {
  54755                                   UnallocatedA32(instr);
  54756                                   return;
  54757                                 }
  54758                                 Alignment align = decode_neon.GetAlign();
  54759                                 int lane = decode_neon.GetLane();
  54760                                 SpacingType spacing = decode_neon.GetSpacing();
  54761                                 unsigned first =
  54762                                     ExtractDRegister(instr, 22, 12);
  54763                                 unsigned length = 4;
  54764                                 unsigned last =
  54765                                     first +
  54766                                     (length - 1) * (spacing == kSingle ? 1 : 2);
  54767                                 unsigned rn = (instr >> 16) & 0xf;
  54768                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length)
  54769                                 vld4(al,
  54770                                      dt,
  54771                                      NeonRegisterList(DRegister(first),
  54772                                                       DRegister(last),
  54773                                                       spacing,
  54774                                                       lane),
  54775                                      AlignedMemOperand(Register(rn),
  54776                                                        align,
  54777                                                        PostIndex));
  54778                                 break;
  54779                               }
  54780                               case 0x00000002: {
  54781                                 // 0xf4a0030f
  54782                                 if (((instr & 0xc00) == 0xc00)) {
  54783                                   UnallocatedA32(instr);
  54784                                   return;
  54785                                 }
  54786                                 DataType dt =
  54787                                     Dt_size_7_Decode((instr >> 10) & 0x3);
  54788                                 if (dt.Is(kDataTypeValueInvalid)) {
  54789                                   UnallocatedA32(instr);
  54790                                   return;
  54791                                 }
  54792                                 DecodeNeonAndAlign decode_neon =
  54793                                     Align_index_align_3_Decode((instr >> 4) &
  54794                                                                    0xf,
  54795                                                                dt);
  54796                                 if (!decode_neon.IsValid()) {
  54797                                   UnallocatedA32(instr);
  54798                                   return;
  54799                                 }
  54800                                 Alignment align = decode_neon.GetAlign();
  54801                                 int lane = decode_neon.GetLane();
  54802                                 SpacingType spacing = decode_neon.GetSpacing();
  54803                                 unsigned first =
  54804                                     ExtractDRegister(instr, 22, 12);
  54805                                 unsigned length = 4;
  54806                                 unsigned last =
  54807                                     first +
  54808                                     (length - 1) * (spacing == kSingle ? 1 : 2);
  54809                                 unsigned rn = (instr >> 16) & 0xf;
  54810                                 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length)
  54811                                 vld4(al,
  54812                                      dt,
  54813                                      NeonRegisterList(DRegister(first),
  54814                                                       DRegister(last),
  54815                                                       spacing,
  54816                                                       lane),
  54817                                      AlignedMemOperand(Register(rn),
  54818                                                        align,
  54819                                                        Offset));
  54820                                 break;
  54821                               }
  54822                             }
  54823                             break;
  54824                           }
  54825                           default: {
  54826                             if (((instr & 0xc00) == 0xc00) ||
  54827                                 ((instr & 0xd) == 0xd)) {
  54828                               UnallocatedA32(instr);
  54829                               return;
  54830                             }
  54831                             DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3);
  54832                             if (dt.Is(kDataTypeValueInvalid)) {
  54833                               UnallocatedA32(instr);
  54834                               return;
  54835                             }
  54836                             DecodeNeonAndAlign decode_neon =
  54837                                 Align_index_align_3_Decode((instr >> 4) & 0xf,
  54838                                                            dt);
  54839                             if (!decode_neon.IsValid()) {
  54840                               UnallocatedA32(instr);
  54841                               return;
  54842                             }
  54843                             Alignment align = decode_neon.GetAlign();
  54844                             int lane = decode_neon.GetLane();
  54845                             SpacingType spacing = decode_neon.GetSpacing();
  54846                             unsigned first = ExtractDRegister(instr, 22, 12);
  54847                             unsigned length = 4;
  54848                             unsigned last =
  54849                                 first +
  54850                                 (length - 1) * (spacing == kSingle ? 1 : 2);
  54851                             unsigned rn = (instr >> 16) & 0xf;
  54852                             unsigned rm = instr & 0xf;
  54853                             // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length)
  54854                             vld4(al,
  54855                                  dt,
  54856                                  NeonRegisterList(DRegister(first),
  54857                                                   DRegister(last),
  54858                                                   spacing,
  54859                                                   lane),
  54860                                  AlignedMemOperand(Register(rn),
  54861                                                    align,
  54862                                                    Register(rm),
  54863                                                    PostIndex));
  54864                             break;
  54865                           }
  54866                         }
  54867                         break;
  54868                       }
  54869                     }
  54870                     break;
  54871                   }
  54872                 }
  54873                 break;
  54874               }
  54875             }
  54876             break;
  54877           }
  54878           case 0x01100000: {
  54879             // 0xf5100000
  54880             switch (instr & 0x000f0000) {
  54881               case 0x000f0000: {
  54882                 // 0xf51f0000
  54883                 uint32_t U = (instr >> 23) & 0x1;
  54884                 int32_t imm = instr & 0xfff;
  54885                 if (U == 0) imm = -imm;
  54886                 bool minus_zero = (imm == 0) && (U == 0);
  54887                 Location location(imm, kA32PcDelta);
  54888                 // PLD{<c>}{<q>} <label> ; A1
  54889                 if (minus_zero) {
  54890                   pld(al, MemOperand(pc, minus, 0));
  54891                 } else {
  54892                   pld(al, &location);
  54893                 }
  54894                 if (((instr & 0xff7ff000) != 0xf55ff000)) {
  54895                   UnpredictableA32(instr);
  54896                 }
  54897                 break;
  54898               }
  54899               default: {
  54900                 switch (instr & 0x00400000) {
  54901                   case 0x00000000: {
  54902                     // 0xf5100000
  54903                     if (((instr & 0xf0000) == 0xf0000)) {
  54904                       UnallocatedA32(instr);
  54905                       return;
  54906                     }
  54907                     unsigned rn = (instr >> 16) & 0xf;
  54908                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  54909                     int32_t offset = instr & 0xfff;
  54910                     // PLDW{<c>}{<q>} [<Rn>{, #{+/-}<imm_2>}] ; A1
  54911                     pldw(al, MemOperand(Register(rn), sign, offset, Offset));
  54912                     if (((instr & 0xff70f000) != 0xf510f000)) {
  54913                       UnpredictableA32(instr);
  54914                     }
  54915                     break;
  54916                   }
  54917                   case 0x00400000: {
  54918                     // 0xf5500000
  54919                     if (((instr & 0xf0000) == 0xf0000)) {
  54920                       UnallocatedA32(instr);
  54921                       return;
  54922                     }
  54923                     unsigned rn = (instr >> 16) & 0xf;
  54924                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  54925                     int32_t offset = instr & 0xfff;
  54926                     // PLD{<c>}{<q>} [<Rn>{, #{+/-}<imm_2>}] ; A1
  54927                     pld(al, MemOperand(Register(rn), sign, offset, Offset));
  54928                     if (((instr & 0xff70f000) != 0xf550f000)) {
  54929                       UnpredictableA32(instr);
  54930                     }
  54931                     break;
  54932                   }
  54933                 }
  54934                 break;
  54935               }
  54936             }
  54937             break;
  54938           }
  54939           case 0x01300000: {
  54940             // 0xf5300000
  54941             switch (instr & 0x00c000f0) {
  54942               case 0x00400010: {
  54943                 // 0xf5700010
  54944                 // CLREX{<c>}{<q>} ; A1
  54945                 clrex(al);
  54946                 if (((instr & 0xffffffff) != 0xf57ff01f)) {
  54947                   UnpredictableA32(instr);
  54948                 }
  54949                 break;
  54950               }
  54951               case 0x00400040: {
  54952                 // 0xf5700040
  54953                 MemoryBarrier option(instr & 0xf);
  54954                 // DSB{<c>}{<q>} {<option>} ; A1
  54955                 dsb(al, option);
  54956                 if (((instr & 0xfffffff0) != 0xf57ff040)) {
  54957                   UnpredictableA32(instr);
  54958                 }
  54959                 break;
  54960               }
  54961               case 0x00400050: {
  54962                 // 0xf5700050
  54963                 MemoryBarrier option(instr & 0xf);
  54964                 // DMB{<c>}{<q>} {<option>} ; A1
  54965                 dmb(al, option);
  54966                 if (((instr & 0xfffffff0) != 0xf57ff050)) {
  54967                   UnpredictableA32(instr);
  54968                 }
  54969                 break;
  54970               }
  54971               case 0x00400060: {
  54972                 // 0xf5700060
  54973                 MemoryBarrier option(instr & 0xf);
  54974                 // ISB{<c>}{<q>} {<option>} ; A1
  54975                 isb(al, option);
  54976                 if (((instr & 0xfffffff0) != 0xf57ff060)) {
  54977                   UnpredictableA32(instr);
  54978                 }
  54979                 break;
  54980               }
  54981               default:
  54982                 UnallocatedA32(instr);
  54983                 break;
  54984             }
  54985             break;
  54986           }
  54987           default:
  54988             UnallocatedA32(instr);
  54989             break;
  54990         }
  54991         break;
  54992       }
  54993       case 0x06000000: {
  54994         // 0xf6000000
  54995         switch (instr & 0x01700010) {
  54996           case 0x00500000: {
  54997             // 0xf6500000
  54998             switch (instr & 0x00000fe0) {
  54999               case 0x00000060: {
  55000                 // 0xf6500060
  55001                 unsigned rn = (instr >> 16) & 0xf;
  55002                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  55003                 unsigned rm = instr & 0xf;
  55004                 Shift shift = RRX;
  55005                 uint32_t amount = 0;
  55006                 AddrMode addrmode = Offset;
  55007                 // PLI{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
  55008                 pli(al,
  55009                     MemOperand(Register(rn),
  55010                                sign,
  55011                                Register(rm),
  55012                                shift,
  55013                                amount,
  55014                                addrmode));
  55015                 if (((instr & 0xff70fff0) != 0xf650f060)) {
  55016                   UnpredictableA32(instr);
  55017                 }
  55018                 break;
  55019               }
  55020               default: {
  55021                 if (((instr & 0xfe0) == 0x60)) {
  55022                   UnallocatedA32(instr);
  55023                   return;
  55024                 }
  55025                 unsigned rn = (instr >> 16) & 0xf;
  55026                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  55027                 unsigned rm = instr & 0xf;
  55028                 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  55029                                                     (instr >> 7) & 0x1f);
  55030                 Shift shift = shift_operand.GetShift();
  55031                 uint32_t amount = shift_operand.GetAmount();
  55032                 AddrMode addrmode = Offset;
  55033                 // PLI{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
  55034                 pli(al,
  55035                     MemOperand(Register(rn),
  55036                                sign,
  55037                                Register(rm),
  55038                                shift,
  55039                                amount,
  55040                                addrmode));
  55041                 if (((instr & 0xff70f010) != 0xf650f000)) {
  55042                   UnpredictableA32(instr);
  55043                 }
  55044                 break;
  55045               }
  55046             }
  55047             break;
  55048           }
  55049           case 0x01100000: {
  55050             // 0xf7100000
  55051             switch (instr & 0x00000fe0) {
  55052               case 0x00000060: {
  55053                 // 0xf7100060
  55054                 unsigned rn = (instr >> 16) & 0xf;
  55055                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  55056                 unsigned rm = instr & 0xf;
  55057                 Shift shift = RRX;
  55058                 uint32_t amount = 0;
  55059                 AddrMode addrmode = Offset;
  55060                 // PLDW{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
  55061                 pldw(al,
  55062                      MemOperand(Register(rn),
  55063                                 sign,
  55064                                 Register(rm),
  55065                                 shift,
  55066                                 amount,
  55067                                 addrmode));
  55068                 if (((instr & 0xff70fff0) != 0xf710f060)) {
  55069                   UnpredictableA32(instr);
  55070                 }
  55071                 break;
  55072               }
  55073               default: {
  55074                 if (((instr & 0xfe0) == 0x60)) {
  55075                   UnallocatedA32(instr);
  55076                   return;
  55077                 }
  55078                 unsigned rn = (instr >> 16) & 0xf;
  55079                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  55080                 unsigned rm = instr & 0xf;
  55081                 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  55082                                                     (instr >> 7) & 0x1f);
  55083                 Shift shift = shift_operand.GetShift();
  55084                 uint32_t amount = shift_operand.GetAmount();
  55085                 AddrMode addrmode = Offset;
  55086                 // PLDW{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
  55087                 pldw(al,
  55088                      MemOperand(Register(rn),
  55089                                 sign,
  55090                                 Register(rm),
  55091                                 shift,
  55092                                 amount,
  55093                                 addrmode));
  55094                 if (((instr & 0xff70f010) != 0xf710f000)) {
  55095                   UnpredictableA32(instr);
  55096                 }
  55097                 break;
  55098               }
  55099             }
  55100             break;
  55101           }
  55102           case 0x01500000: {
  55103             // 0xf7500000
  55104             switch (instr & 0x00000fe0) {
  55105               case 0x00000060: {
  55106                 // 0xf7500060
  55107                 unsigned rn = (instr >> 16) & 0xf;
  55108                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  55109                 unsigned rm = instr & 0xf;
  55110                 Shift shift = RRX;
  55111                 uint32_t amount = 0;
  55112                 AddrMode addrmode = Offset;
  55113                 // PLD{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1
  55114                 pld(al,
  55115                     MemOperand(Register(rn),
  55116                                sign,
  55117                                Register(rm),
  55118                                shift,
  55119                                amount,
  55120                                addrmode));
  55121                 if (((instr & 0xff70fff0) != 0xf750f060)) {
  55122                   UnpredictableA32(instr);
  55123                 }
  55124                 break;
  55125               }
  55126               default: {
  55127                 if (((instr & 0xfe0) == 0x60)) {
  55128                   UnallocatedA32(instr);
  55129                   return;
  55130                 }
  55131                 unsigned rn = (instr >> 16) & 0xf;
  55132                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  55133                 unsigned rm = instr & 0xf;
  55134                 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  55135                                                     (instr >> 7) & 0x1f);
  55136                 Shift shift = shift_operand.GetShift();
  55137                 uint32_t amount = shift_operand.GetAmount();
  55138                 AddrMode addrmode = Offset;
  55139                 // PLD{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1
  55140                 pld(al,
  55141                     MemOperand(Register(rn),
  55142                                sign,
  55143                                Register(rm),
  55144                                shift,
  55145                                amount,
  55146                                addrmode));
  55147                 if (((instr & 0xff70f010) != 0xf750f000)) {
  55148                   UnpredictableA32(instr);
  55149                 }
  55150                 break;
  55151               }
  55152             }
  55153             break;
  55154           }
  55155           default:
  55156             UnallocatedA32(instr);
  55157             break;
  55158         }
  55159         break;
  55160       }
  55161       case 0x08000000: {
  55162         // 0xf8000000
  55163         switch (instr & 0x01d00000) {
  55164           case 0x00100000: {
  55165             // 0xf8100000
  55166             UnimplementedA32("RFEDA", instr);
  55167             break;
  55168           }
  55169           case 0x00400000: {
  55170             // 0xf8400000
  55171             UnimplementedA32("SRSDA", instr);
  55172             break;
  55173           }
  55174           case 0x00900000: {
  55175             // 0xf8900000
  55176             UnimplementedA32("RFE{IA}", instr);
  55177             break;
  55178           }
  55179           case 0x00c00000: {
  55180             // 0xf8c00000
  55181             UnimplementedA32("SRS{IA}", instr);
  55182             break;
  55183           }
  55184           case 0x01100000: {
  55185             // 0xf9100000
  55186             UnimplementedA32("RFEDB", instr);
  55187             break;
  55188           }
  55189           case 0x01400000: {
  55190             // 0xf9400000
  55191             UnimplementedA32("SRSDB", instr);
  55192             break;
  55193           }
  55194           case 0x01900000: {
  55195             // 0xf9900000
  55196             UnimplementedA32("RFEIB", instr);
  55197             break;
  55198           }
  55199           case 0x01c00000: {
  55200             // 0xf9c00000
  55201             UnimplementedA32("SRSIB", instr);
  55202             break;
  55203           }
  55204           default:
  55205             UnallocatedA32(instr);
  55206             break;
  55207         }
  55208         break;
  55209       }
  55210       case 0x0a000000: {
  55211         // 0xfa000000
  55212         int32_t imm = SignExtend<int32_t>((((instr >> 24) & 0x1) |
  55213                                            ((instr << 1) & 0x1fffffe))
  55214                                               << 1,
  55215                                           26);
  55216         Location location(imm, kA32PcDelta);
  55217         // BLX{<c>}{<q>} <label> ; A2
  55218         blx(al, &location);
  55219         break;
  55220       }
  55221       case 0x0e000000: {
  55222         // 0xfe000000
  55223         switch (instr & 0x01b00f50) {
  55224           case 0x00000a00: {
  55225             // 0xfe000a00
  55226             unsigned rd = ExtractSRegister(instr, 22, 12);
  55227             unsigned rn = ExtractSRegister(instr, 7, 16);
  55228             unsigned rm = ExtractSRegister(instr, 5, 0);
  55229             // VSELEQ.F32 <Sd>, <Sn>, <Sm> ; A1
  55230             vseleq(F32, SRegister(rd), SRegister(rn), SRegister(rm));
  55231             break;
  55232           }
  55233           case 0x00000b00: {
  55234             // 0xfe000b00
  55235             unsigned rd = ExtractDRegister(instr, 22, 12);
  55236             unsigned rn = ExtractDRegister(instr, 7, 16);
  55237             unsigned rm = ExtractDRegister(instr, 5, 0);
  55238             // VSELEQ.F64 <Dd>, <Dn>, <Dm> ; A1
  55239             vseleq(F64, DRegister(rd), DRegister(rn), DRegister(rm));
  55240             break;
  55241           }
  55242           case 0x00100a00: {
  55243             // 0xfe100a00
  55244             unsigned rd = ExtractSRegister(instr, 22, 12);
  55245             unsigned rn = ExtractSRegister(instr, 7, 16);
  55246             unsigned rm = ExtractSRegister(instr, 5, 0);
  55247             // VSELVS.F32 <Sd>, <Sn>, <Sm> ; A1
  55248             vselvs(F32, SRegister(rd), SRegister(rn), SRegister(rm));
  55249             break;
  55250           }
  55251           case 0x00100b00: {
  55252             // 0xfe100b00
  55253             unsigned rd = ExtractDRegister(instr, 22, 12);
  55254             unsigned rn = ExtractDRegister(instr, 7, 16);
  55255             unsigned rm = ExtractDRegister(instr, 5, 0);
  55256             // VSELVS.F64 <Dd>, <Dn>, <Dm> ; A1
  55257             vselvs(F64, DRegister(rd), DRegister(rn), DRegister(rm));
  55258             break;
  55259           }
  55260           case 0x00200a00: {
  55261             // 0xfe200a00
  55262             unsigned rd = ExtractSRegister(instr, 22, 12);
  55263             unsigned rn = ExtractSRegister(instr, 7, 16);
  55264             unsigned rm = ExtractSRegister(instr, 5, 0);
  55265             // VSELGE.F32 <Sd>, <Sn>, <Sm> ; A1
  55266             vselge(F32, SRegister(rd), SRegister(rn), SRegister(rm));
  55267             break;
  55268           }
  55269           case 0x00200b00: {
  55270             // 0xfe200b00
  55271             unsigned rd = ExtractDRegister(instr, 22, 12);
  55272             unsigned rn = ExtractDRegister(instr, 7, 16);
  55273             unsigned rm = ExtractDRegister(instr, 5, 0);
  55274             // VSELGE.F64 <Dd>, <Dn>, <Dm> ; A1
  55275             vselge(F64, DRegister(rd), DRegister(rn), DRegister(rm));
  55276             break;
  55277           }
  55278           case 0x00300a00: {
  55279             // 0xfe300a00
  55280             unsigned rd = ExtractSRegister(instr, 22, 12);
  55281             unsigned rn = ExtractSRegister(instr, 7, 16);
  55282             unsigned rm = ExtractSRegister(instr, 5, 0);
  55283             // VSELGT.F32 <Sd>, <Sn>, <Sm> ; A1
  55284             vselgt(F32, SRegister(rd), SRegister(rn), SRegister(rm));
  55285             break;
  55286           }
  55287           case 0x00300b00: {
  55288             // 0xfe300b00
  55289             unsigned rd = ExtractDRegister(instr, 22, 12);
  55290             unsigned rn = ExtractDRegister(instr, 7, 16);
  55291             unsigned rm = ExtractDRegister(instr, 5, 0);
  55292             // VSELGT.F64 <Dd>, <Dn>, <Dm> ; A1
  55293             vselgt(F64, DRegister(rd), DRegister(rn), DRegister(rm));
  55294             break;
  55295           }
  55296           case 0x00800a00: {
  55297             // 0xfe800a00
  55298             unsigned rd = ExtractSRegister(instr, 22, 12);
  55299             unsigned rn = ExtractSRegister(instr, 7, 16);
  55300             unsigned rm = ExtractSRegister(instr, 5, 0);
  55301             // VMAXNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
  55302             vmaxnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
  55303             break;
  55304           }
  55305           case 0x00800a40: {
  55306             // 0xfe800a40
  55307             unsigned rd = ExtractSRegister(instr, 22, 12);
  55308             unsigned rn = ExtractSRegister(instr, 7, 16);
  55309             unsigned rm = ExtractSRegister(instr, 5, 0);
  55310             // VMINNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
  55311             vminnm(F32, SRegister(rd), SRegister(rn), SRegister(rm));
  55312             break;
  55313           }
  55314           case 0x00800b00: {
  55315             // 0xfe800b00
  55316             unsigned rd = ExtractDRegister(instr, 22, 12);
  55317             unsigned rn = ExtractDRegister(instr, 7, 16);
  55318             unsigned rm = ExtractDRegister(instr, 5, 0);
  55319             // VMAXNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
  55320             vmaxnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
  55321             break;
  55322           }
  55323           case 0x00800b40: {
  55324             // 0xfe800b40
  55325             unsigned rd = ExtractDRegister(instr, 22, 12);
  55326             unsigned rn = ExtractDRegister(instr, 7, 16);
  55327             unsigned rm = ExtractDRegister(instr, 5, 0);
  55328             // VMINNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
  55329             vminnm(F64, DRegister(rd), DRegister(rn), DRegister(rm));
  55330             break;
  55331           }
  55332           case 0x00b00a40: {
  55333             // 0xfeb00a40
  55334             switch (instr & 0x000f0000) {
  55335               case 0x00080000: {
  55336                 // 0xfeb80a40
  55337                 if ((instr & 0x00000080) == 0x00000000) {
  55338                   unsigned rd = ExtractSRegister(instr, 22, 12);
  55339                   unsigned rm = ExtractSRegister(instr, 5, 0);
  55340                   // VRINTA{<q>}.F32 <Sd>, <Sm> ; A1
  55341                   vrinta(F32, SRegister(rd), SRegister(rm));
  55342                 } else {
  55343                   UnallocatedA32(instr);
  55344                 }
  55345                 break;
  55346               }
  55347               case 0x00090000: {
  55348                 // 0xfeb90a40
  55349                 if ((instr & 0x00000080) == 0x00000000) {
  55350                   unsigned rd = ExtractSRegister(instr, 22, 12);
  55351                   unsigned rm = ExtractSRegister(instr, 5, 0);
  55352                   // VRINTN{<q>}.F32 <Sd>, <Sm> ; A1
  55353                   vrintn(F32, SRegister(rd), SRegister(rm));
  55354                 } else {
  55355                   UnallocatedA32(instr);
  55356                 }
  55357                 break;
  55358               }
  55359               case 0x000a0000: {
  55360                 // 0xfeba0a40
  55361                 if ((instr & 0x00000080) == 0x00000000) {
  55362                   unsigned rd = ExtractSRegister(instr, 22, 12);
  55363                   unsigned rm = ExtractSRegister(instr, 5, 0);
  55364                   // VRINTP{<q>}.F32 <Sd>, <Sm> ; A1
  55365                   vrintp(F32, SRegister(rd), SRegister(rm));
  55366                 } else {
  55367                   UnallocatedA32(instr);
  55368                 }
  55369                 break;
  55370               }
  55371               case 0x000b0000: {
  55372                 // 0xfebb0a40
  55373                 if ((instr & 0x00000080) == 0x00000000) {
  55374                   unsigned rd = ExtractSRegister(instr, 22, 12);
  55375                   unsigned rm = ExtractSRegister(instr, 5, 0);
  55376                   // VRINTM{<q>}.F32 <Sd>, <Sm> ; A1
  55377                   vrintm(F32, SRegister(rd), SRegister(rm));
  55378                 } else {
  55379                   UnallocatedA32(instr);
  55380                 }
  55381                 break;
  55382               }
  55383               case 0x000c0000: {
  55384                 // 0xfebc0a40
  55385                 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  55386                 if (dt.Is(kDataTypeValueInvalid)) {
  55387                   UnallocatedA32(instr);
  55388                   return;
  55389                 }
  55390                 unsigned rd = ExtractSRegister(instr, 22, 12);
  55391                 unsigned rm = ExtractSRegister(instr, 5, 0);
  55392                 // VCVTA{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
  55393                 vcvta(dt, F32, SRegister(rd), SRegister(rm));
  55394                 break;
  55395               }
  55396               case 0x000d0000: {
  55397                 // 0xfebd0a40
  55398                 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  55399                 if (dt.Is(kDataTypeValueInvalid)) {
  55400                   UnallocatedA32(instr);
  55401                   return;
  55402                 }
  55403                 unsigned rd = ExtractSRegister(instr, 22, 12);
  55404                 unsigned rm = ExtractSRegister(instr, 5, 0);
  55405                 // VCVTN{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
  55406                 vcvtn(dt, F32, SRegister(rd), SRegister(rm));
  55407                 break;
  55408               }
  55409               case 0x000e0000: {
  55410                 // 0xfebe0a40
  55411                 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  55412                 if (dt.Is(kDataTypeValueInvalid)) {
  55413                   UnallocatedA32(instr);
  55414                   return;
  55415                 }
  55416                 unsigned rd = ExtractSRegister(instr, 22, 12);
  55417                 unsigned rm = ExtractSRegister(instr, 5, 0);
  55418                 // VCVTP{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
  55419                 vcvtp(dt, F32, SRegister(rd), SRegister(rm));
  55420                 break;
  55421               }
  55422               case 0x000f0000: {
  55423                 // 0xfebf0a40
  55424                 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  55425                 if (dt.Is(kDataTypeValueInvalid)) {
  55426                   UnallocatedA32(instr);
  55427                   return;
  55428                 }
  55429                 unsigned rd = ExtractSRegister(instr, 22, 12);
  55430                 unsigned rm = ExtractSRegister(instr, 5, 0);
  55431                 // VCVTM{<q>}.<dt>.F32 <Sd>, <Sm> ; A1
  55432                 vcvtm(dt, F32, SRegister(rd), SRegister(rm));
  55433                 break;
  55434               }
  55435               default:
  55436                 UnallocatedA32(instr);
  55437                 break;
  55438             }
  55439             break;
  55440           }
  55441           case 0x00b00b40: {
  55442             // 0xfeb00b40
  55443             switch (instr & 0x000f0000) {
  55444               case 0x00080000: {
  55445                 // 0xfeb80b40
  55446                 if ((instr & 0x00000080) == 0x00000000) {
  55447                   unsigned rd = ExtractDRegister(instr, 22, 12);
  55448                   unsigned rm = ExtractDRegister(instr, 5, 0);
  55449                   // VRINTA{<q>}.F64 <Dd>, <Dm> ; A1
  55450                   vrinta(F64, DRegister(rd), DRegister(rm));
  55451                 } else {
  55452                   UnallocatedA32(instr);
  55453                 }
  55454                 break;
  55455               }
  55456               case 0x00090000: {
  55457                 // 0xfeb90b40
  55458                 if ((instr & 0x00000080) == 0x00000000) {
  55459                   unsigned rd = ExtractDRegister(instr, 22, 12);
  55460                   unsigned rm = ExtractDRegister(instr, 5, 0);
  55461                   // VRINTN{<q>}.F64 <Dd>, <Dm> ; A1
  55462                   vrintn(F64, DRegister(rd), DRegister(rm));
  55463                 } else {
  55464                   UnallocatedA32(instr);
  55465                 }
  55466                 break;
  55467               }
  55468               case 0x000a0000: {
  55469                 // 0xfeba0b40
  55470                 if ((instr & 0x00000080) == 0x00000000) {
  55471                   unsigned rd = ExtractDRegister(instr, 22, 12);
  55472                   unsigned rm = ExtractDRegister(instr, 5, 0);
  55473                   // VRINTP{<q>}.F64 <Dd>, <Dm> ; A1
  55474                   vrintp(F64, DRegister(rd), DRegister(rm));
  55475                 } else {
  55476                   UnallocatedA32(instr);
  55477                 }
  55478                 break;
  55479               }
  55480               case 0x000b0000: {
  55481                 // 0xfebb0b40
  55482                 if ((instr & 0x00000080) == 0x00000000) {
  55483                   unsigned rd = ExtractDRegister(instr, 22, 12);
  55484                   unsigned rm = ExtractDRegister(instr, 5, 0);
  55485                   // VRINTM{<q>}.F64 <Dd>, <Dm> ; A1
  55486                   vrintm(F64, DRegister(rd), DRegister(rm));
  55487                 } else {
  55488                   UnallocatedA32(instr);
  55489                 }
  55490                 break;
  55491               }
  55492               case 0x000c0000: {
  55493                 // 0xfebc0b40
  55494                 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  55495                 if (dt.Is(kDataTypeValueInvalid)) {
  55496                   UnallocatedA32(instr);
  55497                   return;
  55498                 }
  55499                 unsigned rd = ExtractSRegister(instr, 22, 12);
  55500                 unsigned rm = ExtractDRegister(instr, 5, 0);
  55501                 // VCVTA{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
  55502                 vcvta(dt, F64, SRegister(rd), DRegister(rm));
  55503                 break;
  55504               }
  55505               case 0x000d0000: {
  55506                 // 0xfebd0b40
  55507                 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  55508                 if (dt.Is(kDataTypeValueInvalid)) {
  55509                   UnallocatedA32(instr);
  55510                   return;
  55511                 }
  55512                 unsigned rd = ExtractSRegister(instr, 22, 12);
  55513                 unsigned rm = ExtractDRegister(instr, 5, 0);
  55514                 // VCVTN{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
  55515                 vcvtn(dt, F64, SRegister(rd), DRegister(rm));
  55516                 break;
  55517               }
  55518               case 0x000e0000: {
  55519                 // 0xfebe0b40
  55520                 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  55521                 if (dt.Is(kDataTypeValueInvalid)) {
  55522                   UnallocatedA32(instr);
  55523                   return;
  55524                 }
  55525                 unsigned rd = ExtractSRegister(instr, 22, 12);
  55526                 unsigned rm = ExtractDRegister(instr, 5, 0);
  55527                 // VCVTP{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
  55528                 vcvtp(dt, F64, SRegister(rd), DRegister(rm));
  55529                 break;
  55530               }
  55531               case 0x000f0000: {
  55532                 // 0xfebf0b40
  55533                 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  55534                 if (dt.Is(kDataTypeValueInvalid)) {
  55535                   UnallocatedA32(instr);
  55536                   return;
  55537                 }
  55538                 unsigned rd = ExtractSRegister(instr, 22, 12);
  55539                 unsigned rm = ExtractDRegister(instr, 5, 0);
  55540                 // VCVTM{<q>}.<dt>.F64 <Sd>, <Dm> ; A1
  55541                 vcvtm(dt, F64, SRegister(rd), DRegister(rm));
  55542                 break;
  55543               }
  55544               default:
  55545                 UnallocatedA32(instr);
  55546                 break;
  55547             }
  55548             break;
  55549           }
  55550           default:
  55551             UnallocatedA32(instr);
  55552             break;
  55553         }
  55554         break;
  55555       }
  55556       default:
  55557         UnallocatedA32(instr);
  55558         break;
  55559     }
  55560   } else {
  55561     switch (instr & 0x0e000000) {
  55562       case 0x00000000: {
  55563         // 0x00000000
  55564         switch (instr & 0x00100010) {
  55565           case 0x00000000: {
  55566             // 0x00000000
  55567             switch (instr & 0x01a00000) {
  55568               case 0x00000000: {
  55569                 // 0x00000000
  55570                 switch (instr & 0x00400000) {
  55571                   case 0x00000000: {
  55572                     // 0x00000000
  55573                     switch (instr & 0x00000fe0) {
  55574                       case 0x00000060: {
  55575                         // 0x00000060
  55576                         if (((instr & 0xf0000000) == 0xf0000000)) {
  55577                           UnallocatedA32(instr);
  55578                           return;
  55579                         }
  55580                         Condition condition((instr >> 28) & 0xf);
  55581                         unsigned rd = (instr >> 12) & 0xf;
  55582                         unsigned rn = (instr >> 16) & 0xf;
  55583                         unsigned rm = instr & 0xf;
  55584                         // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  55585                         and_(condition,
  55586                              Best,
  55587                              Register(rd),
  55588                              Register(rn),
  55589                              Operand(Register(rm), RRX));
  55590                         break;
  55591                       }
  55592                       default: {
  55593                         if (((instr & 0xf0000000) == 0xf0000000) ||
  55594                             ((instr & 0xfe0) == 0x60)) {
  55595                           UnallocatedA32(instr);
  55596                           return;
  55597                         }
  55598                         Condition condition((instr >> 28) & 0xf);
  55599                         unsigned rd = (instr >> 12) & 0xf;
  55600                         unsigned rn = (instr >> 16) & 0xf;
  55601                         unsigned rm = instr & 0xf;
  55602                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  55603                                                             (instr >> 7) &
  55604                                                                 0x1f);
  55605                         // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  55606                         and_(condition,
  55607                              Best,
  55608                              Register(rd),
  55609                              Register(rn),
  55610                              Operand(Register(rm),
  55611                                      shift_operand.GetType(),
  55612                                      shift_operand.GetAmount()));
  55613                         break;
  55614                       }
  55615                     }
  55616                     break;
  55617                   }
  55618                   case 0x00400000: {
  55619                     // 0x00400000
  55620                     switch (instr & 0x000f0000) {
  55621                       case 0x000d0000: {
  55622                         // 0x004d0000
  55623                         switch (instr & 0x00000fe0) {
  55624                           case 0x00000060: {
  55625                             // 0x004d0060
  55626                             if (((instr & 0xf0000000) == 0xf0000000)) {
  55627                               UnallocatedA32(instr);
  55628                               return;
  55629                             }
  55630                             Condition condition((instr >> 28) & 0xf);
  55631                             unsigned rd = (instr >> 12) & 0xf;
  55632                             unsigned rm = instr & 0xf;
  55633                             // SUB{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
  55634                             sub(condition,
  55635                                 Best,
  55636                                 Register(rd),
  55637                                 sp,
  55638                                 Operand(Register(rm), RRX));
  55639                             break;
  55640                           }
  55641                           default: {
  55642                             if (((instr & 0xf0000000) == 0xf0000000) ||
  55643                                 ((instr & 0xfe0) == 0x60)) {
  55644                               UnallocatedA32(instr);
  55645                               return;
  55646                             }
  55647                             Condition condition((instr >> 28) & 0xf);
  55648                             unsigned rd = (instr >> 12) & 0xf;
  55649                             unsigned rm = instr & 0xf;
  55650                             ImmediateShiftOperand shift_operand((instr >> 5) &
  55651                                                                     0x3,
  55652                                                                 (instr >> 7) &
  55653                                                                     0x1f);
  55654                             // SUB{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  55655                             sub(condition,
  55656                                 Best,
  55657                                 Register(rd),
  55658                                 sp,
  55659                                 Operand(Register(rm),
  55660                                         shift_operand.GetType(),
  55661                                         shift_operand.GetAmount()));
  55662                             break;
  55663                           }
  55664                         }
  55665                         break;
  55666                       }
  55667                       default: {
  55668                         switch (instr & 0x00000fe0) {
  55669                           case 0x00000060: {
  55670                             // 0x00400060
  55671                             if (((instr & 0xf0000000) == 0xf0000000) ||
  55672                                 ((instr & 0xf0000) == 0xd0000)) {
  55673                               UnallocatedA32(instr);
  55674                               return;
  55675                             }
  55676                             Condition condition((instr >> 28) & 0xf);
  55677                             unsigned rd = (instr >> 12) & 0xf;
  55678                             unsigned rn = (instr >> 16) & 0xf;
  55679                             unsigned rm = instr & 0xf;
  55680                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  55681                             sub(condition,
  55682                                 Best,
  55683                                 Register(rd),
  55684                                 Register(rn),
  55685                                 Operand(Register(rm), RRX));
  55686                             break;
  55687                           }
  55688                           default: {
  55689                             if (((instr & 0xf0000000) == 0xf0000000) ||
  55690                                 ((instr & 0xf0000) == 0xd0000) ||
  55691                                 ((instr & 0xfe0) == 0x60)) {
  55692                               UnallocatedA32(instr);
  55693                               return;
  55694                             }
  55695                             Condition condition((instr >> 28) & 0xf);
  55696                             unsigned rd = (instr >> 12) & 0xf;
  55697                             unsigned rn = (instr >> 16) & 0xf;
  55698                             unsigned rm = instr & 0xf;
  55699                             ImmediateShiftOperand shift_operand((instr >> 5) &
  55700                                                                     0x3,
  55701                                                                 (instr >> 7) &
  55702                                                                     0x1f);
  55703                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  55704                             sub(condition,
  55705                                 Best,
  55706                                 Register(rd),
  55707                                 Register(rn),
  55708                                 Operand(Register(rm),
  55709                                         shift_operand.GetType(),
  55710                                         shift_operand.GetAmount()));
  55711                             break;
  55712                           }
  55713                         }
  55714                         break;
  55715                       }
  55716                     }
  55717                     break;
  55718                   }
  55719                 }
  55720                 break;
  55721               }
  55722               case 0x00200000: {
  55723                 // 0x00200000
  55724                 switch (instr & 0x00400000) {
  55725                   case 0x00000000: {
  55726                     // 0x00200000
  55727                     switch (instr & 0x00000fe0) {
  55728                       case 0x00000060: {
  55729                         // 0x00200060
  55730                         if (((instr & 0xf0000000) == 0xf0000000)) {
  55731                           UnallocatedA32(instr);
  55732                           return;
  55733                         }
  55734                         Condition condition((instr >> 28) & 0xf);
  55735                         unsigned rd = (instr >> 12) & 0xf;
  55736                         unsigned rn = (instr >> 16) & 0xf;
  55737                         unsigned rm = instr & 0xf;
  55738                         // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  55739                         eor(condition,
  55740                             Best,
  55741                             Register(rd),
  55742                             Register(rn),
  55743                             Operand(Register(rm), RRX));
  55744                         break;
  55745                       }
  55746                       default: {
  55747                         if (((instr & 0xf0000000) == 0xf0000000) ||
  55748                             ((instr & 0xfe0) == 0x60)) {
  55749                           UnallocatedA32(instr);
  55750                           return;
  55751                         }
  55752                         Condition condition((instr >> 28) & 0xf);
  55753                         unsigned rd = (instr >> 12) & 0xf;
  55754                         unsigned rn = (instr >> 16) & 0xf;
  55755                         unsigned rm = instr & 0xf;
  55756                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  55757                                                             (instr >> 7) &
  55758                                                                 0x1f);
  55759                         // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  55760                         eor(condition,
  55761                             Best,
  55762                             Register(rd),
  55763                             Register(rn),
  55764                             Operand(Register(rm),
  55765                                     shift_operand.GetType(),
  55766                                     shift_operand.GetAmount()));
  55767                         break;
  55768                       }
  55769                     }
  55770                     break;
  55771                   }
  55772                   case 0x00400000: {
  55773                     // 0x00600000
  55774                     switch (instr & 0x00000fe0) {
  55775                       case 0x00000060: {
  55776                         // 0x00600060
  55777                         if (((instr & 0xf0000000) == 0xf0000000)) {
  55778                           UnallocatedA32(instr);
  55779                           return;
  55780                         }
  55781                         Condition condition((instr >> 28) & 0xf);
  55782                         unsigned rd = (instr >> 12) & 0xf;
  55783                         unsigned rn = (instr >> 16) & 0xf;
  55784                         unsigned rm = instr & 0xf;
  55785                         // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  55786                         rsb(condition,
  55787                             Best,
  55788                             Register(rd),
  55789                             Register(rn),
  55790                             Operand(Register(rm), RRX));
  55791                         break;
  55792                       }
  55793                       default: {
  55794                         if (((instr & 0xf0000000) == 0xf0000000) ||
  55795                             ((instr & 0xfe0) == 0x60)) {
  55796                           UnallocatedA32(instr);
  55797                           return;
  55798                         }
  55799                         Condition condition((instr >> 28) & 0xf);
  55800                         unsigned rd = (instr >> 12) & 0xf;
  55801                         unsigned rn = (instr >> 16) & 0xf;
  55802                         unsigned rm = instr & 0xf;
  55803                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  55804                                                             (instr >> 7) &
  55805                                                                 0x1f);
  55806                         // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  55807                         rsb(condition,
  55808                             Best,
  55809                             Register(rd),
  55810                             Register(rn),
  55811                             Operand(Register(rm),
  55812                                     shift_operand.GetType(),
  55813                                     shift_operand.GetAmount()));
  55814                         break;
  55815                       }
  55816                     }
  55817                     break;
  55818                   }
  55819                 }
  55820                 break;
  55821               }
  55822               case 0x00800000: {
  55823                 // 0x00800000
  55824                 switch (instr & 0x00400000) {
  55825                   case 0x00000000: {
  55826                     // 0x00800000
  55827                     switch (instr & 0x000f0000) {
  55828                       case 0x000d0000: {
  55829                         // 0x008d0000
  55830                         switch (instr & 0x00000fe0) {
  55831                           case 0x00000060: {
  55832                             // 0x008d0060
  55833                             if (((instr & 0xf0000000) == 0xf0000000)) {
  55834                               UnallocatedA32(instr);
  55835                               return;
  55836                             }
  55837                             Condition condition((instr >> 28) & 0xf);
  55838                             unsigned rd = (instr >> 12) & 0xf;
  55839                             unsigned rm = instr & 0xf;
  55840                             // ADD{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
  55841                             add(condition,
  55842                                 Best,
  55843                                 Register(rd),
  55844                                 sp,
  55845                                 Operand(Register(rm), RRX));
  55846                             break;
  55847                           }
  55848                           default: {
  55849                             if (((instr & 0xf0000000) == 0xf0000000) ||
  55850                                 ((instr & 0xfe0) == 0x60)) {
  55851                               UnallocatedA32(instr);
  55852                               return;
  55853                             }
  55854                             Condition condition((instr >> 28) & 0xf);
  55855                             unsigned rd = (instr >> 12) & 0xf;
  55856                             unsigned rm = instr & 0xf;
  55857                             ImmediateShiftOperand shift_operand((instr >> 5) &
  55858                                                                     0x3,
  55859                                                                 (instr >> 7) &
  55860                                                                     0x1f);
  55861                             // ADD{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  55862                             add(condition,
  55863                                 Best,
  55864                                 Register(rd),
  55865                                 sp,
  55866                                 Operand(Register(rm),
  55867                                         shift_operand.GetType(),
  55868                                         shift_operand.GetAmount()));
  55869                             break;
  55870                           }
  55871                         }
  55872                         break;
  55873                       }
  55874                       default: {
  55875                         switch (instr & 0x00000fe0) {
  55876                           case 0x00000060: {
  55877                             // 0x00800060
  55878                             if (((instr & 0xf0000000) == 0xf0000000) ||
  55879                                 ((instr & 0xf0000) == 0xd0000)) {
  55880                               UnallocatedA32(instr);
  55881                               return;
  55882                             }
  55883                             Condition condition((instr >> 28) & 0xf);
  55884                             unsigned rd = (instr >> 12) & 0xf;
  55885                             unsigned rn = (instr >> 16) & 0xf;
  55886                             unsigned rm = instr & 0xf;
  55887                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  55888                             add(condition,
  55889                                 Best,
  55890                                 Register(rd),
  55891                                 Register(rn),
  55892                                 Operand(Register(rm), RRX));
  55893                             break;
  55894                           }
  55895                           default: {
  55896                             if (((instr & 0xf0000000) == 0xf0000000) ||
  55897                                 ((instr & 0xf0000) == 0xd0000) ||
  55898                                 ((instr & 0xfe0) == 0x60)) {
  55899                               UnallocatedA32(instr);
  55900                               return;
  55901                             }
  55902                             Condition condition((instr >> 28) & 0xf);
  55903                             unsigned rd = (instr >> 12) & 0xf;
  55904                             unsigned rn = (instr >> 16) & 0xf;
  55905                             unsigned rm = instr & 0xf;
  55906                             ImmediateShiftOperand shift_operand((instr >> 5) &
  55907                                                                     0x3,
  55908                                                                 (instr >> 7) &
  55909                                                                     0x1f);
  55910                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  55911                             add(condition,
  55912                                 Best,
  55913                                 Register(rd),
  55914                                 Register(rn),
  55915                                 Operand(Register(rm),
  55916                                         shift_operand.GetType(),
  55917                                         shift_operand.GetAmount()));
  55918                             break;
  55919                           }
  55920                         }
  55921                         break;
  55922                       }
  55923                     }
  55924                     break;
  55925                   }
  55926                   case 0x00400000: {
  55927                     // 0x00c00000
  55928                     switch (instr & 0x00000fe0) {
  55929                       case 0x00000060: {
  55930                         // 0x00c00060
  55931                         if (((instr & 0xf0000000) == 0xf0000000)) {
  55932                           UnallocatedA32(instr);
  55933                           return;
  55934                         }
  55935                         Condition condition((instr >> 28) & 0xf);
  55936                         unsigned rd = (instr >> 12) & 0xf;
  55937                         unsigned rn = (instr >> 16) & 0xf;
  55938                         unsigned rm = instr & 0xf;
  55939                         // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  55940                         sbc(condition,
  55941                             Best,
  55942                             Register(rd),
  55943                             Register(rn),
  55944                             Operand(Register(rm), RRX));
  55945                         break;
  55946                       }
  55947                       default: {
  55948                         if (((instr & 0xf0000000) == 0xf0000000) ||
  55949                             ((instr & 0xfe0) == 0x60)) {
  55950                           UnallocatedA32(instr);
  55951                           return;
  55952                         }
  55953                         Condition condition((instr >> 28) & 0xf);
  55954                         unsigned rd = (instr >> 12) & 0xf;
  55955                         unsigned rn = (instr >> 16) & 0xf;
  55956                         unsigned rm = instr & 0xf;
  55957                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  55958                                                             (instr >> 7) &
  55959                                                                 0x1f);
  55960                         // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  55961                         sbc(condition,
  55962                             Best,
  55963                             Register(rd),
  55964                             Register(rn),
  55965                             Operand(Register(rm),
  55966                                     shift_operand.GetType(),
  55967                                     shift_operand.GetAmount()));
  55968                         break;
  55969                       }
  55970                     }
  55971                     break;
  55972                   }
  55973                 }
  55974                 break;
  55975               }
  55976               case 0x00a00000: {
  55977                 // 0x00a00000
  55978                 switch (instr & 0x00400000) {
  55979                   case 0x00000000: {
  55980                     // 0x00a00000
  55981                     switch (instr & 0x00000fe0) {
  55982                       case 0x00000060: {
  55983                         // 0x00a00060
  55984                         if (((instr & 0xf0000000) == 0xf0000000)) {
  55985                           UnallocatedA32(instr);
  55986                           return;
  55987                         }
  55988                         Condition condition((instr >> 28) & 0xf);
  55989                         unsigned rd = (instr >> 12) & 0xf;
  55990                         unsigned rn = (instr >> 16) & 0xf;
  55991                         unsigned rm = instr & 0xf;
  55992                         // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  55993                         adc(condition,
  55994                             Best,
  55995                             Register(rd),
  55996                             Register(rn),
  55997                             Operand(Register(rm), RRX));
  55998                         break;
  55999                       }
  56000                       default: {
  56001                         if (((instr & 0xf0000000) == 0xf0000000) ||
  56002                             ((instr & 0xfe0) == 0x60)) {
  56003                           UnallocatedA32(instr);
  56004                           return;
  56005                         }
  56006                         Condition condition((instr >> 28) & 0xf);
  56007                         unsigned rd = (instr >> 12) & 0xf;
  56008                         unsigned rn = (instr >> 16) & 0xf;
  56009                         unsigned rm = instr & 0xf;
  56010                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  56011                                                             (instr >> 7) &
  56012                                                                 0x1f);
  56013                         // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  56014                         adc(condition,
  56015                             Best,
  56016                             Register(rd),
  56017                             Register(rn),
  56018                             Operand(Register(rm),
  56019                                     shift_operand.GetType(),
  56020                                     shift_operand.GetAmount()));
  56021                         break;
  56022                       }
  56023                     }
  56024                     break;
  56025                   }
  56026                   case 0x00400000: {
  56027                     // 0x00e00000
  56028                     switch (instr & 0x00000fe0) {
  56029                       case 0x00000060: {
  56030                         // 0x00e00060
  56031                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56032                           UnallocatedA32(instr);
  56033                           return;
  56034                         }
  56035                         Condition condition((instr >> 28) & 0xf);
  56036                         unsigned rd = (instr >> 12) & 0xf;
  56037                         unsigned rn = (instr >> 16) & 0xf;
  56038                         unsigned rm = instr & 0xf;
  56039                         // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  56040                         rsc(condition,
  56041                             Register(rd),
  56042                             Register(rn),
  56043                             Operand(Register(rm), RRX));
  56044                         break;
  56045                       }
  56046                       default: {
  56047                         if (((instr & 0xf0000000) == 0xf0000000) ||
  56048                             ((instr & 0xfe0) == 0x60)) {
  56049                           UnallocatedA32(instr);
  56050                           return;
  56051                         }
  56052                         Condition condition((instr >> 28) & 0xf);
  56053                         unsigned rd = (instr >> 12) & 0xf;
  56054                         unsigned rn = (instr >> 16) & 0xf;
  56055                         unsigned rm = instr & 0xf;
  56056                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  56057                                                             (instr >> 7) &
  56058                                                                 0x1f);
  56059                         // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  56060                         rsc(condition,
  56061                             Register(rd),
  56062                             Register(rn),
  56063                             Operand(Register(rm),
  56064                                     shift_operand.GetType(),
  56065                                     shift_operand.GetAmount()));
  56066                         break;
  56067                       }
  56068                     }
  56069                     break;
  56070                   }
  56071                 }
  56072                 break;
  56073               }
  56074               case 0x01000000: {
  56075                 // 0x01000000
  56076                 switch (instr & 0x000000e0) {
  56077                   case 0x00000000: {
  56078                     // 0x01000000
  56079                     switch (instr & 0x00000200) {
  56080                       case 0x00000000: {
  56081                         // 0x01000000
  56082                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56083                           UnallocatedA32(instr);
  56084                           return;
  56085                         }
  56086                         Condition condition((instr >> 28) & 0xf);
  56087                         unsigned rd = (instr >> 12) & 0xf;
  56088                         unsigned spec_reg = (instr >> 22) & 0x1;
  56089                         // MRS{<c>}{<q>} <Rd>, <spec_reg> ; A1
  56090                         mrs(condition, Register(rd), SpecialRegister(spec_reg));
  56091                         if (((instr & 0xfbf0fff) != 0x10f0000)) {
  56092                           UnpredictableA32(instr);
  56093                         }
  56094                         break;
  56095                       }
  56096                       case 0x00000200: {
  56097                         // 0x01000200
  56098                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56099                           UnallocatedA32(instr);
  56100                           return;
  56101                         }
  56102                         UnimplementedA32("MRS", instr);
  56103                         break;
  56104                       }
  56105                     }
  56106                     break;
  56107                   }
  56108                   case 0x00000040: {
  56109                     // 0x01000040
  56110                     switch (instr & 0x00400200) {
  56111                       case 0x00000000: {
  56112                         // 0x01000040
  56113                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56114                           UnallocatedA32(instr);
  56115                           return;
  56116                         }
  56117                         unsigned rd = (instr >> 12) & 0xf;
  56118                         unsigned rn = (instr >> 16) & 0xf;
  56119                         unsigned rm = instr & 0xf;
  56120                         // CRC32B{<q>} <Rd>, <Rn>, <Rm> ; A1
  56121                         crc32b(al, Register(rd), Register(rn), Register(rm));
  56122                         if (((instr & 0xff00ff0) != 0x1000040)) {
  56123                           UnpredictableA32(instr);
  56124                         }
  56125                         break;
  56126                       }
  56127                       case 0x00000200: {
  56128                         // 0x01000240
  56129                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56130                           UnallocatedA32(instr);
  56131                           return;
  56132                         }
  56133                         unsigned rd = (instr >> 12) & 0xf;
  56134                         unsigned rn = (instr >> 16) & 0xf;
  56135                         unsigned rm = instr & 0xf;
  56136                         // CRC32CB{<q>} <Rd>, <Rn>, <Rm> ; A1
  56137                         crc32cb(al, Register(rd), Register(rn), Register(rm));
  56138                         if (((instr & 0xff00ff0) != 0x1000240)) {
  56139                           UnpredictableA32(instr);
  56140                         }
  56141                         break;
  56142                       }
  56143                       case 0x00400000: {
  56144                         // 0x01400040
  56145                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56146                           UnallocatedA32(instr);
  56147                           return;
  56148                         }
  56149                         unsigned rd = (instr >> 12) & 0xf;
  56150                         unsigned rn = (instr >> 16) & 0xf;
  56151                         unsigned rm = instr & 0xf;
  56152                         // CRC32W{<q>} <Rd>, <Rn>, <Rm> ; A1
  56153                         crc32w(al, Register(rd), Register(rn), Register(rm));
  56154                         if (((instr & 0xff00ff0) != 0x1400040)) {
  56155                           UnpredictableA32(instr);
  56156                         }
  56157                         break;
  56158                       }
  56159                       case 0x00400200: {
  56160                         // 0x01400240
  56161                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56162                           UnallocatedA32(instr);
  56163                           return;
  56164                         }
  56165                         unsigned rd = (instr >> 12) & 0xf;
  56166                         unsigned rn = (instr >> 16) & 0xf;
  56167                         unsigned rm = instr & 0xf;
  56168                         // CRC32CW{<q>} <Rd>, <Rn>, <Rm> ; A1
  56169                         crc32cw(al, Register(rd), Register(rn), Register(rm));
  56170                         if (((instr & 0xff00ff0) != 0x1400240)) {
  56171                           UnpredictableA32(instr);
  56172                         }
  56173                         break;
  56174                       }
  56175                     }
  56176                     break;
  56177                   }
  56178                   case 0x00000080: {
  56179                     // 0x01000080
  56180                     switch (instr & 0x00400000) {
  56181                       case 0x00000000: {
  56182                         // 0x01000080
  56183                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56184                           UnallocatedA32(instr);
  56185                           return;
  56186                         }
  56187                         Condition condition((instr >> 28) & 0xf);
  56188                         unsigned rd = (instr >> 16) & 0xf;
  56189                         unsigned rn = instr & 0xf;
  56190                         unsigned rm = (instr >> 8) & 0xf;
  56191                         unsigned ra = (instr >> 12) & 0xf;
  56192                         // SMLABB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
  56193                         smlabb(condition,
  56194                                Register(rd),
  56195                                Register(rn),
  56196                                Register(rm),
  56197                                Register(ra));
  56198                         break;
  56199                       }
  56200                       case 0x00400000: {
  56201                         // 0x01400080
  56202                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56203                           UnallocatedA32(instr);
  56204                           return;
  56205                         }
  56206                         Condition condition((instr >> 28) & 0xf);
  56207                         unsigned rdlo = (instr >> 12) & 0xf;
  56208                         unsigned rdhi = (instr >> 16) & 0xf;
  56209                         unsigned rn = instr & 0xf;
  56210                         unsigned rm = (instr >> 8) & 0xf;
  56211                         // SMLALBB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
  56212                         smlalbb(condition,
  56213                                 Register(rdlo),
  56214                                 Register(rdhi),
  56215                                 Register(rn),
  56216                                 Register(rm));
  56217                         break;
  56218                       }
  56219                     }
  56220                     break;
  56221                   }
  56222                   case 0x000000a0: {
  56223                     // 0x010000a0
  56224                     switch (instr & 0x00400000) {
  56225                       case 0x00000000: {
  56226                         // 0x010000a0
  56227                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56228                           UnallocatedA32(instr);
  56229                           return;
  56230                         }
  56231                         Condition condition((instr >> 28) & 0xf);
  56232                         unsigned rd = (instr >> 16) & 0xf;
  56233                         unsigned rn = instr & 0xf;
  56234                         unsigned rm = (instr >> 8) & 0xf;
  56235                         unsigned ra = (instr >> 12) & 0xf;
  56236                         // SMLATB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
  56237                         smlatb(condition,
  56238                                Register(rd),
  56239                                Register(rn),
  56240                                Register(rm),
  56241                                Register(ra));
  56242                         break;
  56243                       }
  56244                       case 0x00400000: {
  56245                         // 0x014000a0
  56246                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56247                           UnallocatedA32(instr);
  56248                           return;
  56249                         }
  56250                         Condition condition((instr >> 28) & 0xf);
  56251                         unsigned rdlo = (instr >> 12) & 0xf;
  56252                         unsigned rdhi = (instr >> 16) & 0xf;
  56253                         unsigned rn = instr & 0xf;
  56254                         unsigned rm = (instr >> 8) & 0xf;
  56255                         // SMLALTB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
  56256                         smlaltb(condition,
  56257                                 Register(rdlo),
  56258                                 Register(rdhi),
  56259                                 Register(rn),
  56260                                 Register(rm));
  56261                         break;
  56262                       }
  56263                     }
  56264                     break;
  56265                   }
  56266                   case 0x000000c0: {
  56267                     // 0x010000c0
  56268                     switch (instr & 0x00400000) {
  56269                       case 0x00000000: {
  56270                         // 0x010000c0
  56271                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56272                           UnallocatedA32(instr);
  56273                           return;
  56274                         }
  56275                         Condition condition((instr >> 28) & 0xf);
  56276                         unsigned rd = (instr >> 16) & 0xf;
  56277                         unsigned rn = instr & 0xf;
  56278                         unsigned rm = (instr >> 8) & 0xf;
  56279                         unsigned ra = (instr >> 12) & 0xf;
  56280                         // SMLABT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
  56281                         smlabt(condition,
  56282                                Register(rd),
  56283                                Register(rn),
  56284                                Register(rm),
  56285                                Register(ra));
  56286                         break;
  56287                       }
  56288                       case 0x00400000: {
  56289                         // 0x014000c0
  56290                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56291                           UnallocatedA32(instr);
  56292                           return;
  56293                         }
  56294                         Condition condition((instr >> 28) & 0xf);
  56295                         unsigned rdlo = (instr >> 12) & 0xf;
  56296                         unsigned rdhi = (instr >> 16) & 0xf;
  56297                         unsigned rn = instr & 0xf;
  56298                         unsigned rm = (instr >> 8) & 0xf;
  56299                         // SMLALBT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
  56300                         smlalbt(condition,
  56301                                 Register(rdlo),
  56302                                 Register(rdhi),
  56303                                 Register(rn),
  56304                                 Register(rm));
  56305                         break;
  56306                       }
  56307                     }
  56308                     break;
  56309                   }
  56310                   case 0x000000e0: {
  56311                     // 0x010000e0
  56312                     switch (instr & 0x00400000) {
  56313                       case 0x00000000: {
  56314                         // 0x010000e0
  56315                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56316                           UnallocatedA32(instr);
  56317                           return;
  56318                         }
  56319                         Condition condition((instr >> 28) & 0xf);
  56320                         unsigned rd = (instr >> 16) & 0xf;
  56321                         unsigned rn = instr & 0xf;
  56322                         unsigned rm = (instr >> 8) & 0xf;
  56323                         unsigned ra = (instr >> 12) & 0xf;
  56324                         // SMLATT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
  56325                         smlatt(condition,
  56326                                Register(rd),
  56327                                Register(rn),
  56328                                Register(rm),
  56329                                Register(ra));
  56330                         break;
  56331                       }
  56332                       case 0x00400000: {
  56333                         // 0x014000e0
  56334                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56335                           UnallocatedA32(instr);
  56336                           return;
  56337                         }
  56338                         Condition condition((instr >> 28) & 0xf);
  56339                         unsigned rdlo = (instr >> 12) & 0xf;
  56340                         unsigned rdhi = (instr >> 16) & 0xf;
  56341                         unsigned rn = instr & 0xf;
  56342                         unsigned rm = (instr >> 8) & 0xf;
  56343                         // SMLALTT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
  56344                         smlaltt(condition,
  56345                                 Register(rdlo),
  56346                                 Register(rdhi),
  56347                                 Register(rn),
  56348                                 Register(rm));
  56349                         break;
  56350                       }
  56351                     }
  56352                     break;
  56353                   }
  56354                   default:
  56355                     UnallocatedA32(instr);
  56356                     break;
  56357                 }
  56358                 break;
  56359               }
  56360               case 0x01200000: {
  56361                 // 0x01200000
  56362                 switch (instr & 0x000000e0) {
  56363                   case 0x00000000: {
  56364                     // 0x01200000
  56365                     switch (instr & 0x00000200) {
  56366                       case 0x00000000: {
  56367                         // 0x01200000
  56368                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56369                           UnallocatedA32(instr);
  56370                           return;
  56371                         }
  56372                         Condition condition((instr >> 28) & 0xf);
  56373                         unsigned spec_reg =
  56374                             ((instr >> 16) & 0xf) | ((instr >> 18) & 0x10);
  56375                         unsigned rn = instr & 0xf;
  56376                         // MSR{<c>}{<q>} <spec_reg>, <Rn> ; A1
  56377                         msr(condition,
  56378                             MaskedSpecialRegister(spec_reg),
  56379                             Register(rn));
  56380                         if (((instr & 0xfb0fff0) != 0x120f000)) {
  56381                           UnpredictableA32(instr);
  56382                         }
  56383                         break;
  56384                       }
  56385                       case 0x00000200: {
  56386                         // 0x01200200
  56387                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56388                           UnallocatedA32(instr);
  56389                           return;
  56390                         }
  56391                         UnimplementedA32("MSR", instr);
  56392                         break;
  56393                       }
  56394                     }
  56395                     break;
  56396                   }
  56397                   case 0x00000020: {
  56398                     // 0x01200020
  56399                     if ((instr & 0x00400000) == 0x00000000) {
  56400                       if (((instr & 0xf0000000) == 0xf0000000)) {
  56401                         UnallocatedA32(instr);
  56402                         return;
  56403                       }
  56404                       Condition condition((instr >> 28) & 0xf);
  56405                       unsigned rm = instr & 0xf;
  56406                       // BXJ{<c>}{<q>} <Rm> ; A1
  56407                       bxj(condition, Register(rm));
  56408                       if (((instr & 0xffffff0) != 0x12fff20)) {
  56409                         UnpredictableA32(instr);
  56410                       }
  56411                     } else {
  56412                       UnallocatedA32(instr);
  56413                     }
  56414                     break;
  56415                   }
  56416                   case 0x00000040: {
  56417                     // 0x01200040
  56418                     switch (instr & 0x00400200) {
  56419                       case 0x00000000: {
  56420                         // 0x01200040
  56421                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56422                           UnallocatedA32(instr);
  56423                           return;
  56424                         }
  56425                         unsigned rd = (instr >> 12) & 0xf;
  56426                         unsigned rn = (instr >> 16) & 0xf;
  56427                         unsigned rm = instr & 0xf;
  56428                         // CRC32H{<q>} <Rd>, <Rn>, <Rm> ; A1
  56429                         crc32h(al, Register(rd), Register(rn), Register(rm));
  56430                         if (((instr & 0xff00ff0) != 0x1200040)) {
  56431                           UnpredictableA32(instr);
  56432                         }
  56433                         break;
  56434                       }
  56435                       case 0x00000200: {
  56436                         // 0x01200240
  56437                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56438                           UnallocatedA32(instr);
  56439                           return;
  56440                         }
  56441                         unsigned rd = (instr >> 12) & 0xf;
  56442                         unsigned rn = (instr >> 16) & 0xf;
  56443                         unsigned rm = instr & 0xf;
  56444                         // CRC32CH{<q>} <Rd>, <Rn>, <Rm> ; A1
  56445                         crc32ch(al, Register(rd), Register(rn), Register(rm));
  56446                         if (((instr & 0xff00ff0) != 0x1200240)) {
  56447                           UnpredictableA32(instr);
  56448                         }
  56449                         break;
  56450                       }
  56451                       default:
  56452                         UnallocatedA32(instr);
  56453                         break;
  56454                     }
  56455                     break;
  56456                   }
  56457                   case 0x00000060: {
  56458                     // 0x01200060
  56459                     if ((instr & 0x00400000) == 0x00400000) {
  56460                       if (((instr & 0xf0000000) == 0xf0000000)) {
  56461                         UnallocatedA32(instr);
  56462                         return;
  56463                       }
  56464                       UnimplementedA32("ERET", instr);
  56465                     } else {
  56466                       UnallocatedA32(instr);
  56467                     }
  56468                     break;
  56469                   }
  56470                   case 0x00000080: {
  56471                     // 0x01200080
  56472                     switch (instr & 0x00400000) {
  56473                       case 0x00000000: {
  56474                         // 0x01200080
  56475                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56476                           UnallocatedA32(instr);
  56477                           return;
  56478                         }
  56479                         Condition condition((instr >> 28) & 0xf);
  56480                         unsigned rd = (instr >> 16) & 0xf;
  56481                         unsigned rn = instr & 0xf;
  56482                         unsigned rm = (instr >> 8) & 0xf;
  56483                         unsigned ra = (instr >> 12) & 0xf;
  56484                         // SMLAWB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
  56485                         smlawb(condition,
  56486                                Register(rd),
  56487                                Register(rn),
  56488                                Register(rm),
  56489                                Register(ra));
  56490                         break;
  56491                       }
  56492                       case 0x00400000: {
  56493                         // 0x01600080
  56494                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56495                           UnallocatedA32(instr);
  56496                           return;
  56497                         }
  56498                         Condition condition((instr >> 28) & 0xf);
  56499                         unsigned rd = (instr >> 16) & 0xf;
  56500                         unsigned rn = instr & 0xf;
  56501                         unsigned rm = (instr >> 8) & 0xf;
  56502                         // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  56503                         smulbb(condition,
  56504                                Register(rd),
  56505                                Register(rn),
  56506                                Register(rm));
  56507                         if (((instr & 0xff0f0f0) != 0x1600080)) {
  56508                           UnpredictableA32(instr);
  56509                         }
  56510                         break;
  56511                       }
  56512                     }
  56513                     break;
  56514                   }
  56515                   case 0x000000a0: {
  56516                     // 0x012000a0
  56517                     switch (instr & 0x00400000) {
  56518                       case 0x00000000: {
  56519                         // 0x012000a0
  56520                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56521                           UnallocatedA32(instr);
  56522                           return;
  56523                         }
  56524                         Condition condition((instr >> 28) & 0xf);
  56525                         unsigned rd = (instr >> 16) & 0xf;
  56526                         unsigned rn = instr & 0xf;
  56527                         unsigned rm = (instr >> 8) & 0xf;
  56528                         // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  56529                         smulwb(condition,
  56530                                Register(rd),
  56531                                Register(rn),
  56532                                Register(rm));
  56533                         if (((instr & 0xff0f0f0) != 0x12000a0)) {
  56534                           UnpredictableA32(instr);
  56535                         }
  56536                         break;
  56537                       }
  56538                       case 0x00400000: {
  56539                         // 0x016000a0
  56540                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56541                           UnallocatedA32(instr);
  56542                           return;
  56543                         }
  56544                         Condition condition((instr >> 28) & 0xf);
  56545                         unsigned rd = (instr >> 16) & 0xf;
  56546                         unsigned rn = instr & 0xf;
  56547                         unsigned rm = (instr >> 8) & 0xf;
  56548                         // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  56549                         smultb(condition,
  56550                                Register(rd),
  56551                                Register(rn),
  56552                                Register(rm));
  56553                         if (((instr & 0xff0f0f0) != 0x16000a0)) {
  56554                           UnpredictableA32(instr);
  56555                         }
  56556                         break;
  56557                       }
  56558                     }
  56559                     break;
  56560                   }
  56561                   case 0x000000c0: {
  56562                     // 0x012000c0
  56563                     switch (instr & 0x00400000) {
  56564                       case 0x00000000: {
  56565                         // 0x012000c0
  56566                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56567                           UnallocatedA32(instr);
  56568                           return;
  56569                         }
  56570                         Condition condition((instr >> 28) & 0xf);
  56571                         unsigned rd = (instr >> 16) & 0xf;
  56572                         unsigned rn = instr & 0xf;
  56573                         unsigned rm = (instr >> 8) & 0xf;
  56574                         unsigned ra = (instr >> 12) & 0xf;
  56575                         // SMLAWT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
  56576                         smlawt(condition,
  56577                                Register(rd),
  56578                                Register(rn),
  56579                                Register(rm),
  56580                                Register(ra));
  56581                         break;
  56582                       }
  56583                       case 0x00400000: {
  56584                         // 0x016000c0
  56585                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56586                           UnallocatedA32(instr);
  56587                           return;
  56588                         }
  56589                         Condition condition((instr >> 28) & 0xf);
  56590                         unsigned rd = (instr >> 16) & 0xf;
  56591                         unsigned rn = instr & 0xf;
  56592                         unsigned rm = (instr >> 8) & 0xf;
  56593                         // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  56594                         smulbt(condition,
  56595                                Register(rd),
  56596                                Register(rn),
  56597                                Register(rm));
  56598                         if (((instr & 0xff0f0f0) != 0x16000c0)) {
  56599                           UnpredictableA32(instr);
  56600                         }
  56601                         break;
  56602                       }
  56603                     }
  56604                     break;
  56605                   }
  56606                   case 0x000000e0: {
  56607                     // 0x012000e0
  56608                     switch (instr & 0x00400000) {
  56609                       case 0x00000000: {
  56610                         // 0x012000e0
  56611                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56612                           UnallocatedA32(instr);
  56613                           return;
  56614                         }
  56615                         Condition condition((instr >> 28) & 0xf);
  56616                         unsigned rd = (instr >> 16) & 0xf;
  56617                         unsigned rn = instr & 0xf;
  56618                         unsigned rm = (instr >> 8) & 0xf;
  56619                         // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  56620                         smulwt(condition,
  56621                                Register(rd),
  56622                                Register(rn),
  56623                                Register(rm));
  56624                         if (((instr & 0xff0f0f0) != 0x12000e0)) {
  56625                           UnpredictableA32(instr);
  56626                         }
  56627                         break;
  56628                       }
  56629                       case 0x00400000: {
  56630                         // 0x016000e0
  56631                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56632                           UnallocatedA32(instr);
  56633                           return;
  56634                         }
  56635                         Condition condition((instr >> 28) & 0xf);
  56636                         unsigned rd = (instr >> 16) & 0xf;
  56637                         unsigned rn = instr & 0xf;
  56638                         unsigned rm = (instr >> 8) & 0xf;
  56639                         // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  56640                         smultt(condition,
  56641                                Register(rd),
  56642                                Register(rn),
  56643                                Register(rm));
  56644                         if (((instr & 0xff0f0f0) != 0x16000e0)) {
  56645                           UnpredictableA32(instr);
  56646                         }
  56647                         break;
  56648                       }
  56649                     }
  56650                     break;
  56651                   }
  56652                 }
  56653                 break;
  56654               }
  56655               case 0x01800000: {
  56656                 // 0x01800000
  56657                 switch (instr & 0x00400000) {
  56658                   case 0x00000000: {
  56659                     // 0x01800000
  56660                     switch (instr & 0x00000fe0) {
  56661                       case 0x00000060: {
  56662                         // 0x01800060
  56663                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56664                           UnallocatedA32(instr);
  56665                           return;
  56666                         }
  56667                         Condition condition((instr >> 28) & 0xf);
  56668                         unsigned rd = (instr >> 12) & 0xf;
  56669                         unsigned rn = (instr >> 16) & 0xf;
  56670                         unsigned rm = instr & 0xf;
  56671                         // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  56672                         orr(condition,
  56673                             Best,
  56674                             Register(rd),
  56675                             Register(rn),
  56676                             Operand(Register(rm), RRX));
  56677                         break;
  56678                       }
  56679                       default: {
  56680                         if (((instr & 0xf0000000) == 0xf0000000) ||
  56681                             ((instr & 0xfe0) == 0x60)) {
  56682                           UnallocatedA32(instr);
  56683                           return;
  56684                         }
  56685                         Condition condition((instr >> 28) & 0xf);
  56686                         unsigned rd = (instr >> 12) & 0xf;
  56687                         unsigned rn = (instr >> 16) & 0xf;
  56688                         unsigned rm = instr & 0xf;
  56689                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  56690                                                             (instr >> 7) &
  56691                                                                 0x1f);
  56692                         // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  56693                         orr(condition,
  56694                             Best,
  56695                             Register(rd),
  56696                             Register(rn),
  56697                             Operand(Register(rm),
  56698                                     shift_operand.GetType(),
  56699                                     shift_operand.GetAmount()));
  56700                         break;
  56701                       }
  56702                     }
  56703                     break;
  56704                   }
  56705                   case 0x00400000: {
  56706                     // 0x01c00000
  56707                     switch (instr & 0x00000fe0) {
  56708                       case 0x00000060: {
  56709                         // 0x01c00060
  56710                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56711                           UnallocatedA32(instr);
  56712                           return;
  56713                         }
  56714                         Condition condition((instr >> 28) & 0xf);
  56715                         unsigned rd = (instr >> 12) & 0xf;
  56716                         unsigned rn = (instr >> 16) & 0xf;
  56717                         unsigned rm = instr & 0xf;
  56718                         // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  56719                         bic(condition,
  56720                             Best,
  56721                             Register(rd),
  56722                             Register(rn),
  56723                             Operand(Register(rm), RRX));
  56724                         break;
  56725                       }
  56726                       default: {
  56727                         if (((instr & 0xf0000000) == 0xf0000000) ||
  56728                             ((instr & 0xfe0) == 0x60)) {
  56729                           UnallocatedA32(instr);
  56730                           return;
  56731                         }
  56732                         Condition condition((instr >> 28) & 0xf);
  56733                         unsigned rd = (instr >> 12) & 0xf;
  56734                         unsigned rn = (instr >> 16) & 0xf;
  56735                         unsigned rm = instr & 0xf;
  56736                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  56737                                                             (instr >> 7) &
  56738                                                                 0x1f);
  56739                         // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  56740                         bic(condition,
  56741                             Best,
  56742                             Register(rd),
  56743                             Register(rn),
  56744                             Operand(Register(rm),
  56745                                     shift_operand.GetType(),
  56746                                     shift_operand.GetAmount()));
  56747                         break;
  56748                       }
  56749                     }
  56750                     break;
  56751                   }
  56752                 }
  56753                 break;
  56754               }
  56755               case 0x01a00000: {
  56756                 // 0x01a00000
  56757                 switch (instr & 0x00400000) {
  56758                   case 0x00000000: {
  56759                     // 0x01a00000
  56760                     switch (instr & 0x00000fe0) {
  56761                       case 0x00000060: {
  56762                         // 0x01a00060
  56763                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56764                           UnallocatedA32(instr);
  56765                           return;
  56766                         }
  56767                         if (((instr & 0xf0000000) != 0xf0000000)) {
  56768                           Condition condition((instr >> 28) & 0xf);
  56769                           unsigned rd = (instr >> 12) & 0xf;
  56770                           unsigned rm = instr & 0xf;
  56771                           // RRX{<c>}{<q>} {<Rd>}, <Rm> ; A1
  56772                           rrx(condition, Register(rd), Register(rm));
  56773                           if (((instr & 0xfff0ff0) != 0x1a00060)) {
  56774                             UnpredictableA32(instr);
  56775                           }
  56776                           return;
  56777                         }
  56778                         Condition condition((instr >> 28) & 0xf);
  56779                         unsigned rd = (instr >> 12) & 0xf;
  56780                         unsigned rm = instr & 0xf;
  56781                         // MOV{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
  56782                         mov(condition,
  56783                             Best,
  56784                             Register(rd),
  56785                             Operand(Register(rm), RRX));
  56786                         if (((instr & 0xfff0ff0) != 0x1a00060)) {
  56787                           UnpredictableA32(instr);
  56788                         }
  56789                         break;
  56790                       }
  56791                       default: {
  56792                         if (((instr & 0xf0000000) == 0xf0000000) ||
  56793                             ((instr & 0xfe0) == 0x60)) {
  56794                           UnallocatedA32(instr);
  56795                           return;
  56796                         }
  56797                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
  56798                              Uint32(0x2)) &&
  56799                             ((instr & 0xf0000000) != 0xf0000000)) {
  56800                           Condition condition((instr >> 28) & 0xf);
  56801                           unsigned rd = (instr >> 12) & 0xf;
  56802                           unsigned rm = instr & 0xf;
  56803                           uint32_t amount = (instr >> 7) & 0x1f;
  56804                           if (amount == 0) amount = 32;
  56805                           // ASR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
  56806                           asr(condition,
  56807                               Best,
  56808                               Register(rd),
  56809                               Register(rm),
  56810                               amount);
  56811                           if (((instr & 0xfff0070) != 0x1a00040)) {
  56812                             UnpredictableA32(instr);
  56813                           }
  56814                           return;
  56815                         }
  56816                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
  56817                              Uint32(0x0)) &&
  56818                             ((instr & 0xf0000000) != 0xf0000000) &&
  56819                             ((instr & 0x00000f80) != 0x00000000)) {
  56820                           Condition condition((instr >> 28) & 0xf);
  56821                           unsigned rd = (instr >> 12) & 0xf;
  56822                           unsigned rm = instr & 0xf;
  56823                           uint32_t amount = (instr >> 7) & 0x1f;
  56824                           // LSL{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
  56825                           lsl(condition,
  56826                               Best,
  56827                               Register(rd),
  56828                               Register(rm),
  56829                               amount);
  56830                           if (((instr & 0xfff0070) != 0x1a00000)) {
  56831                             UnpredictableA32(instr);
  56832                           }
  56833                           return;
  56834                         }
  56835                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
  56836                              Uint32(0x1)) &&
  56837                             ((instr & 0xf0000000) != 0xf0000000)) {
  56838                           Condition condition((instr >> 28) & 0xf);
  56839                           unsigned rd = (instr >> 12) & 0xf;
  56840                           unsigned rm = instr & 0xf;
  56841                           uint32_t amount = (instr >> 7) & 0x1f;
  56842                           if (amount == 0) amount = 32;
  56843                           // LSR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
  56844                           lsr(condition,
  56845                               Best,
  56846                               Register(rd),
  56847                               Register(rm),
  56848                               amount);
  56849                           if (((instr & 0xfff0070) != 0x1a00020)) {
  56850                             UnpredictableA32(instr);
  56851                           }
  56852                           return;
  56853                         }
  56854                         if (((Uint32((instr >> 5)) & Uint32(0x3)) ==
  56855                              Uint32(0x3)) &&
  56856                             ((instr & 0xf0000000) != 0xf0000000) &&
  56857                             ((instr & 0x00000f80) != 0x00000000)) {
  56858                           Condition condition((instr >> 28) & 0xf);
  56859                           unsigned rd = (instr >> 12) & 0xf;
  56860                           unsigned rm = instr & 0xf;
  56861                           uint32_t amount = (instr >> 7) & 0x1f;
  56862                           // ROR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
  56863                           ror(condition,
  56864                               Best,
  56865                               Register(rd),
  56866                               Register(rm),
  56867                               amount);
  56868                           if (((instr & 0xfff0070) != 0x1a00060)) {
  56869                             UnpredictableA32(instr);
  56870                           }
  56871                           return;
  56872                         }
  56873                         Condition condition((instr >> 28) & 0xf);
  56874                         unsigned rd = (instr >> 12) & 0xf;
  56875                         unsigned rm = instr & 0xf;
  56876                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  56877                                                             (instr >> 7) &
  56878                                                                 0x1f);
  56879                         // MOV{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
  56880                         mov(condition,
  56881                             Best,
  56882                             Register(rd),
  56883                             Operand(Register(rm),
  56884                                     shift_operand.GetType(),
  56885                                     shift_operand.GetAmount()));
  56886                         if (((instr & 0xfff0010) != 0x1a00000)) {
  56887                           UnpredictableA32(instr);
  56888                         }
  56889                         break;
  56890                       }
  56891                     }
  56892                     break;
  56893                   }
  56894                   case 0x00400000: {
  56895                     // 0x01e00000
  56896                     switch (instr & 0x00000fe0) {
  56897                       case 0x00000060: {
  56898                         // 0x01e00060
  56899                         if (((instr & 0xf0000000) == 0xf0000000)) {
  56900                           UnallocatedA32(instr);
  56901                           return;
  56902                         }
  56903                         Condition condition((instr >> 28) & 0xf);
  56904                         unsigned rd = (instr >> 12) & 0xf;
  56905                         unsigned rm = instr & 0xf;
  56906                         // MVN{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
  56907                         mvn(condition,
  56908                             Best,
  56909                             Register(rd),
  56910                             Operand(Register(rm), RRX));
  56911                         if (((instr & 0xfff0ff0) != 0x1e00060)) {
  56912                           UnpredictableA32(instr);
  56913                         }
  56914                         break;
  56915                       }
  56916                       default: {
  56917                         if (((instr & 0xf0000000) == 0xf0000000) ||
  56918                             ((instr & 0xfe0) == 0x60)) {
  56919                           UnallocatedA32(instr);
  56920                           return;
  56921                         }
  56922                         Condition condition((instr >> 28) & 0xf);
  56923                         unsigned rd = (instr >> 12) & 0xf;
  56924                         unsigned rm = instr & 0xf;
  56925                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  56926                                                             (instr >> 7) &
  56927                                                                 0x1f);
  56928                         // MVN{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
  56929                         mvn(condition,
  56930                             Best,
  56931                             Register(rd),
  56932                             Operand(Register(rm),
  56933                                     shift_operand.GetType(),
  56934                                     shift_operand.GetAmount()));
  56935                         if (((instr & 0xfff0010) != 0x1e00000)) {
  56936                           UnpredictableA32(instr);
  56937                         }
  56938                         break;
  56939                       }
  56940                     }
  56941                     break;
  56942                   }
  56943                 }
  56944                 break;
  56945               }
  56946             }
  56947             break;
  56948           }
  56949           case 0x00000010: {
  56950             // 0x00000010
  56951             switch (instr & 0x00400080) {
  56952               case 0x00000000: {
  56953                 // 0x00000010
  56954                 switch (instr & 0x01a00000) {
  56955                   case 0x00000000: {
  56956                     // 0x00000010
  56957                     if (((instr & 0xf0000000) == 0xf0000000)) {
  56958                       UnallocatedA32(instr);
  56959                       return;
  56960                     }
  56961                     Condition condition((instr >> 28) & 0xf);
  56962                     unsigned rd = (instr >> 12) & 0xf;
  56963                     unsigned rn = (instr >> 16) & 0xf;
  56964                     unsigned rm = instr & 0xf;
  56965                     Shift shift((instr >> 5) & 0x3);
  56966                     unsigned rs = (instr >> 8) & 0xf;
  56967                     // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  56968                     and_(condition,
  56969                          Best,
  56970                          Register(rd),
  56971                          Register(rn),
  56972                          Operand(Register(rm), shift.GetType(), Register(rs)));
  56973                     break;
  56974                   }
  56975                   case 0x00200000: {
  56976                     // 0x00200010
  56977                     if (((instr & 0xf0000000) == 0xf0000000)) {
  56978                       UnallocatedA32(instr);
  56979                       return;
  56980                     }
  56981                     Condition condition((instr >> 28) & 0xf);
  56982                     unsigned rd = (instr >> 12) & 0xf;
  56983                     unsigned rn = (instr >> 16) & 0xf;
  56984                     unsigned rm = instr & 0xf;
  56985                     Shift shift((instr >> 5) & 0x3);
  56986                     unsigned rs = (instr >> 8) & 0xf;
  56987                     // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  56988                     eor(condition,
  56989                         Best,
  56990                         Register(rd),
  56991                         Register(rn),
  56992                         Operand(Register(rm), shift.GetType(), Register(rs)));
  56993                     break;
  56994                   }
  56995                   case 0x00800000: {
  56996                     // 0x00800010
  56997                     if (((instr & 0xf0000000) == 0xf0000000)) {
  56998                       UnallocatedA32(instr);
  56999                       return;
  57000                     }
  57001                     Condition condition((instr >> 28) & 0xf);
  57002                     unsigned rd = (instr >> 12) & 0xf;
  57003                     unsigned rn = (instr >> 16) & 0xf;
  57004                     unsigned rm = instr & 0xf;
  57005                     Shift shift((instr >> 5) & 0x3);
  57006                     unsigned rs = (instr >> 8) & 0xf;
  57007                     // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  57008                     add(condition,
  57009                         Best,
  57010                         Register(rd),
  57011                         Register(rn),
  57012                         Operand(Register(rm), shift.GetType(), Register(rs)));
  57013                     break;
  57014                   }
  57015                   case 0x00a00000: {
  57016                     // 0x00a00010
  57017                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57018                       UnallocatedA32(instr);
  57019                       return;
  57020                     }
  57021                     Condition condition((instr >> 28) & 0xf);
  57022                     unsigned rd = (instr >> 12) & 0xf;
  57023                     unsigned rn = (instr >> 16) & 0xf;
  57024                     unsigned rm = instr & 0xf;
  57025                     Shift shift((instr >> 5) & 0x3);
  57026                     unsigned rs = (instr >> 8) & 0xf;
  57027                     // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  57028                     adc(condition,
  57029                         Best,
  57030                         Register(rd),
  57031                         Register(rn),
  57032                         Operand(Register(rm), shift.GetType(), Register(rs)));
  57033                     break;
  57034                   }
  57035                   case 0x01000000: {
  57036                     // 0x01000010
  57037                     switch (instr & 0x00000060) {
  57038                       case 0x00000040: {
  57039                         // 0x01000050
  57040                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57041                           UnallocatedA32(instr);
  57042                           return;
  57043                         }
  57044                         Condition condition((instr >> 28) & 0xf);
  57045                         unsigned rd = (instr >> 12) & 0xf;
  57046                         unsigned rm = instr & 0xf;
  57047                         unsigned rn = (instr >> 16) & 0xf;
  57048                         // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
  57049                         qadd(condition,
  57050                              Register(rd),
  57051                              Register(rm),
  57052                              Register(rn));
  57053                         if (((instr & 0xff00ff0) != 0x1000050)) {
  57054                           UnpredictableA32(instr);
  57055                         }
  57056                         break;
  57057                       }
  57058                       case 0x00000060: {
  57059                         // 0x01000070
  57060                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57061                           UnallocatedA32(instr);
  57062                           return;
  57063                         }
  57064                         uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
  57065                         // HLT{<q>} {#}<imm> ; A1
  57066                         hlt(al, imm);
  57067                         break;
  57068                       }
  57069                       default:
  57070                         UnallocatedA32(instr);
  57071                         break;
  57072                     }
  57073                     break;
  57074                   }
  57075                   case 0x01200000: {
  57076                     // 0x01200010
  57077                     switch (instr & 0x00000060) {
  57078                       case 0x00000000: {
  57079                         // 0x01200010
  57080                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57081                           UnallocatedA32(instr);
  57082                           return;
  57083                         }
  57084                         Condition condition((instr >> 28) & 0xf);
  57085                         unsigned rm = instr & 0xf;
  57086                         // BX{<c>}{<q>} <Rm> ; A1
  57087                         bx(condition, Register(rm));
  57088                         if (((instr & 0xffffff0) != 0x12fff10)) {
  57089                           UnpredictableA32(instr);
  57090                         }
  57091                         break;
  57092                       }
  57093                       case 0x00000020: {
  57094                         // 0x01200030
  57095                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57096                           UnallocatedA32(instr);
  57097                           return;
  57098                         }
  57099                         Condition condition((instr >> 28) & 0xf);
  57100                         unsigned rm = instr & 0xf;
  57101                         // BLX{<c>}{<q>} <Rm> ; A1
  57102                         blx(condition, Register(rm));
  57103                         if (((instr & 0xffffff0) != 0x12fff30)) {
  57104                           UnpredictableA32(instr);
  57105                         }
  57106                         break;
  57107                       }
  57108                       case 0x00000040: {
  57109                         // 0x01200050
  57110                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57111                           UnallocatedA32(instr);
  57112                           return;
  57113                         }
  57114                         Condition condition((instr >> 28) & 0xf);
  57115                         unsigned rd = (instr >> 12) & 0xf;
  57116                         unsigned rm = instr & 0xf;
  57117                         unsigned rn = (instr >> 16) & 0xf;
  57118                         // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
  57119                         qsub(condition,
  57120                              Register(rd),
  57121                              Register(rm),
  57122                              Register(rn));
  57123                         if (((instr & 0xff00ff0) != 0x1200050)) {
  57124                           UnpredictableA32(instr);
  57125                         }
  57126                         break;
  57127                       }
  57128                       case 0x00000060: {
  57129                         // 0x01200070
  57130                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57131                           UnallocatedA32(instr);
  57132                           return;
  57133                         }
  57134                         uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
  57135                         // BKPT{<q>} {#}<imm> ; A1
  57136                         bkpt(al, imm);
  57137                         break;
  57138                       }
  57139                     }
  57140                     break;
  57141                   }
  57142                   case 0x01800000: {
  57143                     // 0x01800010
  57144                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57145                       UnallocatedA32(instr);
  57146                       return;
  57147                     }
  57148                     Condition condition((instr >> 28) & 0xf);
  57149                     unsigned rd = (instr >> 12) & 0xf;
  57150                     unsigned rn = (instr >> 16) & 0xf;
  57151                     unsigned rm = instr & 0xf;
  57152                     Shift shift((instr >> 5) & 0x3);
  57153                     unsigned rs = (instr >> 8) & 0xf;
  57154                     // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  57155                     orr(condition,
  57156                         Best,
  57157                         Register(rd),
  57158                         Register(rn),
  57159                         Operand(Register(rm), shift.GetType(), Register(rs)));
  57160                     break;
  57161                   }
  57162                   case 0x01a00000: {
  57163                     // 0x01a00010
  57164                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57165                       UnallocatedA32(instr);
  57166                       return;
  57167                     }
  57168                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
  57169                         ((instr & 0xf0000000) != 0xf0000000)) {
  57170                       Condition condition((instr >> 28) & 0xf);
  57171                       unsigned rd = (instr >> 12) & 0xf;
  57172                       unsigned rm = instr & 0xf;
  57173                       unsigned rs = (instr >> 8) & 0xf;
  57174                       // ASR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
  57175                       asr(condition,
  57176                           Best,
  57177                           Register(rd),
  57178                           Register(rm),
  57179                           Register(rs));
  57180                       if (((instr & 0xfff00f0) != 0x1a00050)) {
  57181                         UnpredictableA32(instr);
  57182                       }
  57183                       return;
  57184                     }
  57185                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
  57186                         ((instr & 0xf0000000) != 0xf0000000)) {
  57187                       Condition condition((instr >> 28) & 0xf);
  57188                       unsigned rd = (instr >> 12) & 0xf;
  57189                       unsigned rm = instr & 0xf;
  57190                       unsigned rs = (instr >> 8) & 0xf;
  57191                       // LSL{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
  57192                       lsl(condition,
  57193                           Best,
  57194                           Register(rd),
  57195                           Register(rm),
  57196                           Register(rs));
  57197                       if (((instr & 0xfff00f0) != 0x1a00010)) {
  57198                         UnpredictableA32(instr);
  57199                       }
  57200                       return;
  57201                     }
  57202                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
  57203                         ((instr & 0xf0000000) != 0xf0000000)) {
  57204                       Condition condition((instr >> 28) & 0xf);
  57205                       unsigned rd = (instr >> 12) & 0xf;
  57206                       unsigned rm = instr & 0xf;
  57207                       unsigned rs = (instr >> 8) & 0xf;
  57208                       // LSR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
  57209                       lsr(condition,
  57210                           Best,
  57211                           Register(rd),
  57212                           Register(rm),
  57213                           Register(rs));
  57214                       if (((instr & 0xfff00f0) != 0x1a00030)) {
  57215                         UnpredictableA32(instr);
  57216                       }
  57217                       return;
  57218                     }
  57219                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
  57220                         ((instr & 0xf0000000) != 0xf0000000)) {
  57221                       Condition condition((instr >> 28) & 0xf);
  57222                       unsigned rd = (instr >> 12) & 0xf;
  57223                       unsigned rm = instr & 0xf;
  57224                       unsigned rs = (instr >> 8) & 0xf;
  57225                       // ROR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
  57226                       ror(condition,
  57227                           Best,
  57228                           Register(rd),
  57229                           Register(rm),
  57230                           Register(rs));
  57231                       if (((instr & 0xfff00f0) != 0x1a00070)) {
  57232                         UnpredictableA32(instr);
  57233                       }
  57234                       return;
  57235                     }
  57236                     Condition condition((instr >> 28) & 0xf);
  57237                     unsigned rd = (instr >> 12) & 0xf;
  57238                     unsigned rm = instr & 0xf;
  57239                     Shift shift((instr >> 5) & 0x3);
  57240                     unsigned rs = (instr >> 8) & 0xf;
  57241                     // MOV{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
  57242                     mov(condition,
  57243                         Best,
  57244                         Register(rd),
  57245                         Operand(Register(rm), shift.GetType(), Register(rs)));
  57246                     if (((instr & 0xfff0090) != 0x1a00010)) {
  57247                       UnpredictableA32(instr);
  57248                     }
  57249                     break;
  57250                   }
  57251                 }
  57252                 break;
  57253               }
  57254               case 0x00000080: {
  57255                 // 0x00000090
  57256                 switch (instr & 0x01200060) {
  57257                   case 0x00000000: {
  57258                     // 0x00000090
  57259                     switch (instr & 0x00800000) {
  57260                       case 0x00000000: {
  57261                         // 0x00000090
  57262                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57263                           UnallocatedA32(instr);
  57264                           return;
  57265                         }
  57266                         Condition condition((instr >> 28) & 0xf);
  57267                         unsigned rd = (instr >> 16) & 0xf;
  57268                         unsigned rn = instr & 0xf;
  57269                         unsigned rm = (instr >> 8) & 0xf;
  57270                         // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1
  57271                         mul(condition,
  57272                             Best,
  57273                             Register(rd),
  57274                             Register(rn),
  57275                             Register(rm));
  57276                         if (((instr & 0xff0f0f0) != 0x90)) {
  57277                           UnpredictableA32(instr);
  57278                         }
  57279                         break;
  57280                       }
  57281                       case 0x00800000: {
  57282                         // 0x00800090
  57283                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57284                           UnallocatedA32(instr);
  57285                           return;
  57286                         }
  57287                         Condition condition((instr >> 28) & 0xf);
  57288                         unsigned rdlo = (instr >> 12) & 0xf;
  57289                         unsigned rdhi = (instr >> 16) & 0xf;
  57290                         unsigned rn = instr & 0xf;
  57291                         unsigned rm = (instr >> 8) & 0xf;
  57292                         // UMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
  57293                         umull(condition,
  57294                               Register(rdlo),
  57295                               Register(rdhi),
  57296                               Register(rn),
  57297                               Register(rm));
  57298                         break;
  57299                       }
  57300                     }
  57301                     break;
  57302                   }
  57303                   case 0x00000020: {
  57304                     // 0x000000b0
  57305                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57306                       UnallocatedA32(instr);
  57307                       return;
  57308                     }
  57309                     Condition condition((instr >> 28) & 0xf);
  57310                     unsigned rt = (instr >> 12) & 0xf;
  57311                     unsigned rn = (instr >> 16) & 0xf;
  57312                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  57313                     unsigned rm = instr & 0xf;
  57314                     // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
  57315                     strh(condition,
  57316                          Best,
  57317                          Register(rt),
  57318                          MemOperand(Register(rn),
  57319                                     sign,
  57320                                     Register(rm),
  57321                                     PostIndex));
  57322                     if (((instr & 0xf700ff0) != 0xb0)) {
  57323                       UnpredictableA32(instr);
  57324                     }
  57325                     break;
  57326                   }
  57327                   case 0x00000040: {
  57328                     // 0x000000d0
  57329                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57330                       UnallocatedA32(instr);
  57331                       return;
  57332                     }
  57333                     Condition condition((instr >> 28) & 0xf);
  57334                     unsigned rt = (instr >> 12) & 0xf;
  57335                     unsigned rn = (instr >> 16) & 0xf;
  57336                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  57337                     unsigned rm = instr & 0xf;
  57338                     // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<Rm> ; A1
  57339                     ldrd(condition,
  57340                          Register(rt),
  57341                          Register(rt + 1),
  57342                          MemOperand(Register(rn),
  57343                                     sign,
  57344                                     Register(rm),
  57345                                     PostIndex));
  57346                     if (((instr & 0xf700ff0) != 0xd0)) {
  57347                       UnpredictableA32(instr);
  57348                     }
  57349                     break;
  57350                   }
  57351                   case 0x00000060: {
  57352                     // 0x000000f0
  57353                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57354                       UnallocatedA32(instr);
  57355                       return;
  57356                     }
  57357                     Condition condition((instr >> 28) & 0xf);
  57358                     unsigned rt = (instr >> 12) & 0xf;
  57359                     unsigned rn = (instr >> 16) & 0xf;
  57360                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  57361                     unsigned rm = instr & 0xf;
  57362                     // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<Rm> ; A1
  57363                     strd(condition,
  57364                          Register(rt),
  57365                          Register(rt + 1),
  57366                          MemOperand(Register(rn),
  57367                                     sign,
  57368                                     Register(rm),
  57369                                     PostIndex));
  57370                     if (((instr & 0xf700ff0) != 0xf0)) {
  57371                       UnpredictableA32(instr);
  57372                     }
  57373                     break;
  57374                   }
  57375                   case 0x00200000: {
  57376                     // 0x00200090
  57377                     switch (instr & 0x00800000) {
  57378                       case 0x00000000: {
  57379                         // 0x00200090
  57380                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57381                           UnallocatedA32(instr);
  57382                           return;
  57383                         }
  57384                         Condition condition((instr >> 28) & 0xf);
  57385                         unsigned rd = (instr >> 16) & 0xf;
  57386                         unsigned rn = instr & 0xf;
  57387                         unsigned rm = (instr >> 8) & 0xf;
  57388                         unsigned ra = (instr >> 12) & 0xf;
  57389                         // MLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
  57390                         mla(condition,
  57391                             Register(rd),
  57392                             Register(rn),
  57393                             Register(rm),
  57394                             Register(ra));
  57395                         break;
  57396                       }
  57397                       case 0x00800000: {
  57398                         // 0x00a00090
  57399                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57400                           UnallocatedA32(instr);
  57401                           return;
  57402                         }
  57403                         Condition condition((instr >> 28) & 0xf);
  57404                         unsigned rdlo = (instr >> 12) & 0xf;
  57405                         unsigned rdhi = (instr >> 16) & 0xf;
  57406                         unsigned rn = instr & 0xf;
  57407                         unsigned rm = (instr >> 8) & 0xf;
  57408                         // UMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
  57409                         umlal(condition,
  57410                               Register(rdlo),
  57411                               Register(rdhi),
  57412                               Register(rn),
  57413                               Register(rm));
  57414                         break;
  57415                       }
  57416                     }
  57417                     break;
  57418                   }
  57419                   case 0x00200020: {
  57420                     // 0x002000b0
  57421                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57422                       UnallocatedA32(instr);
  57423                       return;
  57424                     }
  57425                     UnimplementedA32("STRHT", instr);
  57426                     break;
  57427                   }
  57428                   case 0x01000000: {
  57429                     // 0x01000090
  57430                     switch (instr & 0x00800300) {
  57431                       case 0x00800000: {
  57432                         // 0x01800090
  57433                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57434                           UnallocatedA32(instr);
  57435                           return;
  57436                         }
  57437                         Condition condition((instr >> 28) & 0xf);
  57438                         unsigned rt = instr & 0xf;
  57439                         unsigned rn = (instr >> 16) & 0xf;
  57440                         // STL{<c>}{<q>} <Rt>, [<Rn>] ; A1
  57441                         stl(condition,
  57442                             Register(rt),
  57443                             MemOperand(Register(rn), Offset));
  57444                         if (((instr & 0xff0fff0) != 0x180fc90)) {
  57445                           UnpredictableA32(instr);
  57446                         }
  57447                         break;
  57448                       }
  57449                       case 0x00800200: {
  57450                         // 0x01800290
  57451                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57452                           UnallocatedA32(instr);
  57453                           return;
  57454                         }
  57455                         Condition condition((instr >> 28) & 0xf);
  57456                         unsigned rd = (instr >> 12) & 0xf;
  57457                         unsigned rt = instr & 0xf;
  57458                         unsigned rn = (instr >> 16) & 0xf;
  57459                         // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
  57460                         stlex(condition,
  57461                               Register(rd),
  57462                               Register(rt),
  57463                               MemOperand(Register(rn), Offset));
  57464                         if (((instr & 0xff00ff0) != 0x1800e90)) {
  57465                           UnpredictableA32(instr);
  57466                         }
  57467                         break;
  57468                       }
  57469                       case 0x00800300: {
  57470                         // 0x01800390
  57471                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57472                           UnallocatedA32(instr);
  57473                           return;
  57474                         }
  57475                         Condition condition((instr >> 28) & 0xf);
  57476                         unsigned rd = (instr >> 12) & 0xf;
  57477                         unsigned rt = instr & 0xf;
  57478                         unsigned rn = (instr >> 16) & 0xf;
  57479                         // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm_1>}] ; A1
  57480                         strex(condition,
  57481                               Register(rd),
  57482                               Register(rt),
  57483                               MemOperand(Register(rn), plus, 0, Offset));
  57484                         if (((instr & 0xff00ff0) != 0x1800f90)) {
  57485                           UnpredictableA32(instr);
  57486                         }
  57487                         break;
  57488                       }
  57489                       default:
  57490                         UnallocatedA32(instr);
  57491                         break;
  57492                     }
  57493                     break;
  57494                   }
  57495                   case 0x01000020: {
  57496                     // 0x010000b0
  57497                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57498                       UnallocatedA32(instr);
  57499                       return;
  57500                     }
  57501                     Condition condition((instr >> 28) & 0xf);
  57502                     unsigned rt = (instr >> 12) & 0xf;
  57503                     unsigned rn = (instr >> 16) & 0xf;
  57504                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  57505                     unsigned rm = instr & 0xf;
  57506                     AddrMode addrmode = Offset;
  57507                     // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
  57508                     strh(condition,
  57509                          Best,
  57510                          Register(rt),
  57511                          MemOperand(Register(rn),
  57512                                     sign,
  57513                                     Register(rm),
  57514                                     addrmode));
  57515                     if (((instr & 0xf700ff0) != 0x10000b0)) {
  57516                       UnpredictableA32(instr);
  57517                     }
  57518                     break;
  57519                   }
  57520                   case 0x01000040: {
  57521                     // 0x010000d0
  57522                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57523                       UnallocatedA32(instr);
  57524                       return;
  57525                     }
  57526                     Condition condition((instr >> 28) & 0xf);
  57527                     unsigned rt = (instr >> 12) & 0xf;
  57528                     unsigned rn = (instr >> 16) & 0xf;
  57529                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  57530                     unsigned rm = instr & 0xf;
  57531                     AddrMode addrmode = Offset;
  57532                     // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>] ; A1
  57533                     ldrd(condition,
  57534                          Register(rt),
  57535                          Register(rt + 1),
  57536                          MemOperand(Register(rn),
  57537                                     sign,
  57538                                     Register(rm),
  57539                                     addrmode));
  57540                     if (((instr & 0xf700ff0) != 0x10000d0)) {
  57541                       UnpredictableA32(instr);
  57542                     }
  57543                     break;
  57544                   }
  57545                   case 0x01000060: {
  57546                     // 0x010000f0
  57547                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57548                       UnallocatedA32(instr);
  57549                       return;
  57550                     }
  57551                     Condition condition((instr >> 28) & 0xf);
  57552                     unsigned rt = (instr >> 12) & 0xf;
  57553                     unsigned rn = (instr >> 16) & 0xf;
  57554                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  57555                     unsigned rm = instr & 0xf;
  57556                     AddrMode addrmode = Offset;
  57557                     // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>] ; A1
  57558                     strd(condition,
  57559                          Register(rt),
  57560                          Register(rt + 1),
  57561                          MemOperand(Register(rn),
  57562                                     sign,
  57563                                     Register(rm),
  57564                                     addrmode));
  57565                     if (((instr & 0xf700ff0) != 0x10000f0)) {
  57566                       UnpredictableA32(instr);
  57567                     }
  57568                     break;
  57569                   }
  57570                   case 0x01200000: {
  57571                     // 0x01200090
  57572                     switch (instr & 0x00800300) {
  57573                       case 0x00800200: {
  57574                         // 0x01a00290
  57575                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57576                           UnallocatedA32(instr);
  57577                           return;
  57578                         }
  57579                         Condition condition((instr >> 28) & 0xf);
  57580                         unsigned rd = (instr >> 12) & 0xf;
  57581                         unsigned rt = instr & 0xf;
  57582                         unsigned rn = (instr >> 16) & 0xf;
  57583                         // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; A1
  57584                         stlexd(condition,
  57585                                Register(rd),
  57586                                Register(rt),
  57587                                Register(rt + 1),
  57588                                MemOperand(Register(rn), Offset));
  57589                         if (((instr & 0xff00ff0) != 0x1a00e90)) {
  57590                           UnpredictableA32(instr);
  57591                         }
  57592                         break;
  57593                       }
  57594                       case 0x00800300: {
  57595                         // 0x01a00390
  57596                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57597                           UnallocatedA32(instr);
  57598                           return;
  57599                         }
  57600                         Condition condition((instr >> 28) & 0xf);
  57601                         unsigned rd = (instr >> 12) & 0xf;
  57602                         unsigned rt = instr & 0xf;
  57603                         unsigned rn = (instr >> 16) & 0xf;
  57604                         // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; A1
  57605                         strexd(condition,
  57606                                Register(rd),
  57607                                Register(rt),
  57608                                Register(rt + 1),
  57609                                MemOperand(Register(rn), Offset));
  57610                         if (((instr & 0xff00ff0) != 0x1a00f90)) {
  57611                           UnpredictableA32(instr);
  57612                         }
  57613                         break;
  57614                       }
  57615                       default:
  57616                         UnallocatedA32(instr);
  57617                         break;
  57618                     }
  57619                     break;
  57620                   }
  57621                   case 0x01200020: {
  57622                     // 0x012000b0
  57623                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57624                       UnallocatedA32(instr);
  57625                       return;
  57626                     }
  57627                     Condition condition((instr >> 28) & 0xf);
  57628                     unsigned rt = (instr >> 12) & 0xf;
  57629                     unsigned rn = (instr >> 16) & 0xf;
  57630                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  57631                     unsigned rm = instr & 0xf;
  57632                     AddrMode addrmode = PreIndex;
  57633                     // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
  57634                     strh(condition,
  57635                          Best,
  57636                          Register(rt),
  57637                          MemOperand(Register(rn),
  57638                                     sign,
  57639                                     Register(rm),
  57640                                     addrmode));
  57641                     if (((instr & 0xf700ff0) != 0x12000b0)) {
  57642                       UnpredictableA32(instr);
  57643                     }
  57644                     break;
  57645                   }
  57646                   case 0x01200040: {
  57647                     // 0x012000d0
  57648                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57649                       UnallocatedA32(instr);
  57650                       return;
  57651                     }
  57652                     Condition condition((instr >> 28) & 0xf);
  57653                     unsigned rt = (instr >> 12) & 0xf;
  57654                     unsigned rn = (instr >> 16) & 0xf;
  57655                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  57656                     unsigned rm = instr & 0xf;
  57657                     AddrMode addrmode = PreIndex;
  57658                     // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>]! ; A1
  57659                     ldrd(condition,
  57660                          Register(rt),
  57661                          Register(rt + 1),
  57662                          MemOperand(Register(rn),
  57663                                     sign,
  57664                                     Register(rm),
  57665                                     addrmode));
  57666                     if (((instr & 0xf700ff0) != 0x12000d0)) {
  57667                       UnpredictableA32(instr);
  57668                     }
  57669                     break;
  57670                   }
  57671                   case 0x01200060: {
  57672                     // 0x012000f0
  57673                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57674                       UnallocatedA32(instr);
  57675                       return;
  57676                     }
  57677                     Condition condition((instr >> 28) & 0xf);
  57678                     unsigned rt = (instr >> 12) & 0xf;
  57679                     unsigned rn = (instr >> 16) & 0xf;
  57680                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  57681                     unsigned rm = instr & 0xf;
  57682                     AddrMode addrmode = PreIndex;
  57683                     // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>]! ; A1
  57684                     strd(condition,
  57685                          Register(rt),
  57686                          Register(rt + 1),
  57687                          MemOperand(Register(rn),
  57688                                     sign,
  57689                                     Register(rm),
  57690                                     addrmode));
  57691                     if (((instr & 0xf700ff0) != 0x12000f0)) {
  57692                       UnpredictableA32(instr);
  57693                     }
  57694                     break;
  57695                   }
  57696                   default:
  57697                     UnallocatedA32(instr);
  57698                     break;
  57699                 }
  57700                 break;
  57701               }
  57702               case 0x00400000: {
  57703                 // 0x00400010
  57704                 switch (instr & 0x01a00000) {
  57705                   case 0x00000000: {
  57706                     // 0x00400010
  57707                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57708                       UnallocatedA32(instr);
  57709                       return;
  57710                     }
  57711                     Condition condition((instr >> 28) & 0xf);
  57712                     unsigned rd = (instr >> 12) & 0xf;
  57713                     unsigned rn = (instr >> 16) & 0xf;
  57714                     unsigned rm = instr & 0xf;
  57715                     Shift shift((instr >> 5) & 0x3);
  57716                     unsigned rs = (instr >> 8) & 0xf;
  57717                     // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  57718                     sub(condition,
  57719                         Best,
  57720                         Register(rd),
  57721                         Register(rn),
  57722                         Operand(Register(rm), shift.GetType(), Register(rs)));
  57723                     break;
  57724                   }
  57725                   case 0x00200000: {
  57726                     // 0x00600010
  57727                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57728                       UnallocatedA32(instr);
  57729                       return;
  57730                     }
  57731                     Condition condition((instr >> 28) & 0xf);
  57732                     unsigned rd = (instr >> 12) & 0xf;
  57733                     unsigned rn = (instr >> 16) & 0xf;
  57734                     unsigned rm = instr & 0xf;
  57735                     Shift shift((instr >> 5) & 0x3);
  57736                     unsigned rs = (instr >> 8) & 0xf;
  57737                     // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  57738                     rsb(condition,
  57739                         Best,
  57740                         Register(rd),
  57741                         Register(rn),
  57742                         Operand(Register(rm), shift.GetType(), Register(rs)));
  57743                     break;
  57744                   }
  57745                   case 0x00800000: {
  57746                     // 0x00c00010
  57747                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57748                       UnallocatedA32(instr);
  57749                       return;
  57750                     }
  57751                     Condition condition((instr >> 28) & 0xf);
  57752                     unsigned rd = (instr >> 12) & 0xf;
  57753                     unsigned rn = (instr >> 16) & 0xf;
  57754                     unsigned rm = instr & 0xf;
  57755                     Shift shift((instr >> 5) & 0x3);
  57756                     unsigned rs = (instr >> 8) & 0xf;
  57757                     // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  57758                     sbc(condition,
  57759                         Best,
  57760                         Register(rd),
  57761                         Register(rn),
  57762                         Operand(Register(rm), shift.GetType(), Register(rs)));
  57763                     break;
  57764                   }
  57765                   case 0x00a00000: {
  57766                     // 0x00e00010
  57767                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57768                       UnallocatedA32(instr);
  57769                       return;
  57770                     }
  57771                     Condition condition((instr >> 28) & 0xf);
  57772                     unsigned rd = (instr >> 12) & 0xf;
  57773                     unsigned rn = (instr >> 16) & 0xf;
  57774                     unsigned rm = instr & 0xf;
  57775                     Shift shift((instr >> 5) & 0x3);
  57776                     unsigned rs = (instr >> 8) & 0xf;
  57777                     // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  57778                     rsc(condition,
  57779                         Register(rd),
  57780                         Register(rn),
  57781                         Operand(Register(rm), shift.GetType(), Register(rs)));
  57782                     break;
  57783                   }
  57784                   case 0x01000000: {
  57785                     // 0x01400010
  57786                     switch (instr & 0x00000060) {
  57787                       case 0x00000040: {
  57788                         // 0x01400050
  57789                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57790                           UnallocatedA32(instr);
  57791                           return;
  57792                         }
  57793                         Condition condition((instr >> 28) & 0xf);
  57794                         unsigned rd = (instr >> 12) & 0xf;
  57795                         unsigned rm = instr & 0xf;
  57796                         unsigned rn = (instr >> 16) & 0xf;
  57797                         // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
  57798                         qdadd(condition,
  57799                               Register(rd),
  57800                               Register(rm),
  57801                               Register(rn));
  57802                         if (((instr & 0xff00ff0) != 0x1400050)) {
  57803                           UnpredictableA32(instr);
  57804                         }
  57805                         break;
  57806                       }
  57807                       case 0x00000060: {
  57808                         // 0x01400070
  57809                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57810                           UnallocatedA32(instr);
  57811                           return;
  57812                         }
  57813                         uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
  57814                         // HVC{<q>} {#}<imm16> ; A1
  57815                         hvc(al, imm);
  57816                         break;
  57817                       }
  57818                       default:
  57819                         UnallocatedA32(instr);
  57820                         break;
  57821                     }
  57822                     break;
  57823                   }
  57824                   case 0x01200000: {
  57825                     // 0x01600010
  57826                     switch (instr & 0x00000060) {
  57827                       case 0x00000000: {
  57828                         // 0x01600010
  57829                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57830                           UnallocatedA32(instr);
  57831                           return;
  57832                         }
  57833                         Condition condition((instr >> 28) & 0xf);
  57834                         unsigned rd = (instr >> 12) & 0xf;
  57835                         unsigned rm = instr & 0xf;
  57836                         // CLZ{<c>}{<q>} <Rd>, <Rm> ; A1
  57837                         clz(condition, Register(rd), Register(rm));
  57838                         if (((instr & 0xfff0ff0) != 0x16f0f10)) {
  57839                           UnpredictableA32(instr);
  57840                         }
  57841                         break;
  57842                       }
  57843                       case 0x00000040: {
  57844                         // 0x01600050
  57845                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57846                           UnallocatedA32(instr);
  57847                           return;
  57848                         }
  57849                         Condition condition((instr >> 28) & 0xf);
  57850                         unsigned rd = (instr >> 12) & 0xf;
  57851                         unsigned rm = instr & 0xf;
  57852                         unsigned rn = (instr >> 16) & 0xf;
  57853                         // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1
  57854                         qdsub(condition,
  57855                               Register(rd),
  57856                               Register(rm),
  57857                               Register(rn));
  57858                         if (((instr & 0xff00ff0) != 0x1600050)) {
  57859                           UnpredictableA32(instr);
  57860                         }
  57861                         break;
  57862                       }
  57863                       case 0x00000060: {
  57864                         // 0x01600070
  57865                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57866                           UnallocatedA32(instr);
  57867                           return;
  57868                         }
  57869                         UnimplementedA32("SMC", instr);
  57870                         break;
  57871                       }
  57872                       default:
  57873                         UnallocatedA32(instr);
  57874                         break;
  57875                     }
  57876                     break;
  57877                   }
  57878                   case 0x01800000: {
  57879                     // 0x01c00010
  57880                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57881                       UnallocatedA32(instr);
  57882                       return;
  57883                     }
  57884                     Condition condition((instr >> 28) & 0xf);
  57885                     unsigned rd = (instr >> 12) & 0xf;
  57886                     unsigned rn = (instr >> 16) & 0xf;
  57887                     unsigned rm = instr & 0xf;
  57888                     Shift shift((instr >> 5) & 0x3);
  57889                     unsigned rs = (instr >> 8) & 0xf;
  57890                     // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  57891                     bic(condition,
  57892                         Best,
  57893                         Register(rd),
  57894                         Register(rn),
  57895                         Operand(Register(rm), shift.GetType(), Register(rs)));
  57896                     break;
  57897                   }
  57898                   case 0x01a00000: {
  57899                     // 0x01e00010
  57900                     if (((instr & 0xf0000000) == 0xf0000000)) {
  57901                       UnallocatedA32(instr);
  57902                       return;
  57903                     }
  57904                     Condition condition((instr >> 28) & 0xf);
  57905                     unsigned rd = (instr >> 12) & 0xf;
  57906                     unsigned rm = instr & 0xf;
  57907                     Shift shift((instr >> 5) & 0x3);
  57908                     unsigned rs = (instr >> 8) & 0xf;
  57909                     // MVN{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
  57910                     mvn(condition,
  57911                         Best,
  57912                         Register(rd),
  57913                         Operand(Register(rm), shift.GetType(), Register(rs)));
  57914                     if (((instr & 0xfff0090) != 0x1e00010)) {
  57915                       UnpredictableA32(instr);
  57916                     }
  57917                     break;
  57918                   }
  57919                 }
  57920                 break;
  57921               }
  57922               case 0x00400080: {
  57923                 // 0x00400090
  57924                 switch (instr & 0x00000060) {
  57925                   case 0x00000000: {
  57926                     // 0x00400090
  57927                     switch (instr & 0x01a00000) {
  57928                       case 0x00000000: {
  57929                         // 0x00400090
  57930                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57931                           UnallocatedA32(instr);
  57932                           return;
  57933                         }
  57934                         Condition condition((instr >> 28) & 0xf);
  57935                         unsigned rdlo = (instr >> 12) & 0xf;
  57936                         unsigned rdhi = (instr >> 16) & 0xf;
  57937                         unsigned rn = instr & 0xf;
  57938                         unsigned rm = (instr >> 8) & 0xf;
  57939                         // UMAAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
  57940                         umaal(condition,
  57941                               Register(rdlo),
  57942                               Register(rdhi),
  57943                               Register(rn),
  57944                               Register(rm));
  57945                         break;
  57946                       }
  57947                       case 0x00200000: {
  57948                         // 0x00600090
  57949                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57950                           UnallocatedA32(instr);
  57951                           return;
  57952                         }
  57953                         Condition condition((instr >> 28) & 0xf);
  57954                         unsigned rd = (instr >> 16) & 0xf;
  57955                         unsigned rn = instr & 0xf;
  57956                         unsigned rm = (instr >> 8) & 0xf;
  57957                         unsigned ra = (instr >> 12) & 0xf;
  57958                         // MLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
  57959                         mls(condition,
  57960                             Register(rd),
  57961                             Register(rn),
  57962                             Register(rm),
  57963                             Register(ra));
  57964                         break;
  57965                       }
  57966                       case 0x00800000: {
  57967                         // 0x00c00090
  57968                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57969                           UnallocatedA32(instr);
  57970                           return;
  57971                         }
  57972                         Condition condition((instr >> 28) & 0xf);
  57973                         unsigned rdlo = (instr >> 12) & 0xf;
  57974                         unsigned rdhi = (instr >> 16) & 0xf;
  57975                         unsigned rn = instr & 0xf;
  57976                         unsigned rm = (instr >> 8) & 0xf;
  57977                         // SMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
  57978                         smull(condition,
  57979                               Register(rdlo),
  57980                               Register(rdhi),
  57981                               Register(rn),
  57982                               Register(rm));
  57983                         break;
  57984                       }
  57985                       case 0x00a00000: {
  57986                         // 0x00e00090
  57987                         if (((instr & 0xf0000000) == 0xf0000000)) {
  57988                           UnallocatedA32(instr);
  57989                           return;
  57990                         }
  57991                         Condition condition((instr >> 28) & 0xf);
  57992                         unsigned rdlo = (instr >> 12) & 0xf;
  57993                         unsigned rdhi = (instr >> 16) & 0xf;
  57994                         unsigned rn = instr & 0xf;
  57995                         unsigned rm = (instr >> 8) & 0xf;
  57996                         // SMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
  57997                         smlal(condition,
  57998                               Register(rdlo),
  57999                               Register(rdhi),
  58000                               Register(rn),
  58001                               Register(rm));
  58002                         break;
  58003                       }
  58004                       case 0x01800000: {
  58005                         // 0x01c00090
  58006                         switch (instr & 0x00000300) {
  58007                           case 0x00000000: {
  58008                             // 0x01c00090
  58009                             if (((instr & 0xf0000000) == 0xf0000000)) {
  58010                               UnallocatedA32(instr);
  58011                               return;
  58012                             }
  58013                             Condition condition((instr >> 28) & 0xf);
  58014                             unsigned rt = instr & 0xf;
  58015                             unsigned rn = (instr >> 16) & 0xf;
  58016                             // STLB{<c>}{<q>} <Rt>, [<Rn>] ; A1
  58017                             stlb(condition,
  58018                                  Register(rt),
  58019                                  MemOperand(Register(rn), Offset));
  58020                             if (((instr & 0xff0fff0) != 0x1c0fc90)) {
  58021                               UnpredictableA32(instr);
  58022                             }
  58023                             break;
  58024                           }
  58025                           case 0x00000200: {
  58026                             // 0x01c00290
  58027                             if (((instr & 0xf0000000) == 0xf0000000)) {
  58028                               UnallocatedA32(instr);
  58029                               return;
  58030                             }
  58031                             Condition condition((instr >> 28) & 0xf);
  58032                             unsigned rd = (instr >> 12) & 0xf;
  58033                             unsigned rt = instr & 0xf;
  58034                             unsigned rn = (instr >> 16) & 0xf;
  58035                             // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
  58036                             stlexb(condition,
  58037                                    Register(rd),
  58038                                    Register(rt),
  58039                                    MemOperand(Register(rn), Offset));
  58040                             if (((instr & 0xff00ff0) != 0x1c00e90)) {
  58041                               UnpredictableA32(instr);
  58042                             }
  58043                             break;
  58044                           }
  58045                           case 0x00000300: {
  58046                             // 0x01c00390
  58047                             if (((instr & 0xf0000000) == 0xf0000000)) {
  58048                               UnallocatedA32(instr);
  58049                               return;
  58050                             }
  58051                             Condition condition((instr >> 28) & 0xf);
  58052                             unsigned rd = (instr >> 12) & 0xf;
  58053                             unsigned rt = instr & 0xf;
  58054                             unsigned rn = (instr >> 16) & 0xf;
  58055                             // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
  58056                             strexb(condition,
  58057                                    Register(rd),
  58058                                    Register(rt),
  58059                                    MemOperand(Register(rn), Offset));
  58060                             if (((instr & 0xff00ff0) != 0x1c00f90)) {
  58061                               UnpredictableA32(instr);
  58062                             }
  58063                             break;
  58064                           }
  58065                           default:
  58066                             UnallocatedA32(instr);
  58067                             break;
  58068                         }
  58069                         break;
  58070                       }
  58071                       case 0x01a00000: {
  58072                         // 0x01e00090
  58073                         switch (instr & 0x00000300) {
  58074                           case 0x00000000: {
  58075                             // 0x01e00090
  58076                             if (((instr & 0xf0000000) == 0xf0000000)) {
  58077                               UnallocatedA32(instr);
  58078                               return;
  58079                             }
  58080                             Condition condition((instr >> 28) & 0xf);
  58081                             unsigned rt = instr & 0xf;
  58082                             unsigned rn = (instr >> 16) & 0xf;
  58083                             // STLH{<c>}{<q>} <Rt>, [<Rn>] ; A1
  58084                             stlh(condition,
  58085                                  Register(rt),
  58086                                  MemOperand(Register(rn), Offset));
  58087                             if (((instr & 0xff0fff0) != 0x1e0fc90)) {
  58088                               UnpredictableA32(instr);
  58089                             }
  58090                             break;
  58091                           }
  58092                           case 0x00000200: {
  58093                             // 0x01e00290
  58094                             if (((instr & 0xf0000000) == 0xf0000000)) {
  58095                               UnallocatedA32(instr);
  58096                               return;
  58097                             }
  58098                             Condition condition((instr >> 28) & 0xf);
  58099                             unsigned rd = (instr >> 12) & 0xf;
  58100                             unsigned rt = instr & 0xf;
  58101                             unsigned rn = (instr >> 16) & 0xf;
  58102                             // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
  58103                             stlexh(condition,
  58104                                    Register(rd),
  58105                                    Register(rt),
  58106                                    MemOperand(Register(rn), Offset));
  58107                             if (((instr & 0xff00ff0) != 0x1e00e90)) {
  58108                               UnpredictableA32(instr);
  58109                             }
  58110                             break;
  58111                           }
  58112                           case 0x00000300: {
  58113                             // 0x01e00390
  58114                             if (((instr & 0xf0000000) == 0xf0000000)) {
  58115                               UnallocatedA32(instr);
  58116                               return;
  58117                             }
  58118                             Condition condition((instr >> 28) & 0xf);
  58119                             unsigned rd = (instr >> 12) & 0xf;
  58120                             unsigned rt = instr & 0xf;
  58121                             unsigned rn = (instr >> 16) & 0xf;
  58122                             // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1
  58123                             strexh(condition,
  58124                                    Register(rd),
  58125                                    Register(rt),
  58126                                    MemOperand(Register(rn), Offset));
  58127                             if (((instr & 0xff00ff0) != 0x1e00f90)) {
  58128                               UnpredictableA32(instr);
  58129                             }
  58130                             break;
  58131                           }
  58132                           default:
  58133                             UnallocatedA32(instr);
  58134                             break;
  58135                         }
  58136                         break;
  58137                       }
  58138                       default:
  58139                         UnallocatedA32(instr);
  58140                         break;
  58141                     }
  58142                     break;
  58143                   }
  58144                   case 0x00000020: {
  58145                     // 0x004000b0
  58146                     switch (instr & 0x01200000) {
  58147                       case 0x00000000: {
  58148                         // 0x004000b0
  58149                         if (((instr & 0xf0000000) == 0xf0000000)) {
  58150                           UnallocatedA32(instr);
  58151                           return;
  58152                         }
  58153                         Condition condition((instr >> 28) & 0xf);
  58154                         unsigned rt = (instr >> 12) & 0xf;
  58155                         unsigned rn = (instr >> 16) & 0xf;
  58156                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  58157                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
  58158                         // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
  58159                         strh(condition,
  58160                              Best,
  58161                              Register(rt),
  58162                              MemOperand(Register(rn), sign, offset, PostIndex));
  58163                         break;
  58164                       }
  58165                       case 0x00200000: {
  58166                         // 0x006000b0
  58167                         if (((instr & 0xf0000000) == 0xf0000000)) {
  58168                           UnallocatedA32(instr);
  58169                           return;
  58170                         }
  58171                         UnimplementedA32("STRHT", instr);
  58172                         break;
  58173                       }
  58174                       case 0x01000000: {
  58175                         // 0x014000b0
  58176                         if (((instr & 0xf0000000) == 0xf0000000)) {
  58177                           UnallocatedA32(instr);
  58178                           return;
  58179                         }
  58180                         Condition condition((instr >> 28) & 0xf);
  58181                         unsigned rt = (instr >> 12) & 0xf;
  58182                         unsigned rn = (instr >> 16) & 0xf;
  58183                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  58184                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
  58185                         // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
  58186                         strh(condition,
  58187                              Best,
  58188                              Register(rt),
  58189                              MemOperand(Register(rn), sign, offset, Offset));
  58190                         break;
  58191                       }
  58192                       case 0x01200000: {
  58193                         // 0x016000b0
  58194                         if (((instr & 0xf0000000) == 0xf0000000)) {
  58195                           UnallocatedA32(instr);
  58196                           return;
  58197                         }
  58198                         Condition condition((instr >> 28) & 0xf);
  58199                         unsigned rt = (instr >> 12) & 0xf;
  58200                         unsigned rn = (instr >> 16) & 0xf;
  58201                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  58202                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
  58203                         // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
  58204                         strh(condition,
  58205                              Best,
  58206                              Register(rt),
  58207                              MemOperand(Register(rn), sign, offset, PreIndex));
  58208                         break;
  58209                       }
  58210                     }
  58211                     break;
  58212                   }
  58213                   case 0x00000040: {
  58214                     // 0x004000d0
  58215                     switch (instr & 0x000f0000) {
  58216                       case 0x000f0000: {
  58217                         // 0x004f00d0
  58218                         if (((instr & 0xf0000000) == 0xf0000000)) {
  58219                           UnallocatedA32(instr);
  58220                           return;
  58221                         }
  58222                         Condition condition((instr >> 28) & 0xf);
  58223                         unsigned rt = (instr >> 12) & 0xf;
  58224                         uint32_t U = (instr >> 23) & 0x1;
  58225                         int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
  58226                         if (U == 0) imm = -imm;
  58227                         bool minus_zero = (imm == 0) && (U == 0);
  58228                         Location location(imm, kA32PcDelta);
  58229                         // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; A1
  58230                         if (minus_zero) {
  58231                           ldrd(condition,
  58232                                Register(rt),
  58233                                Register(rt + 1),
  58234                                MemOperand(pc, minus, 0));
  58235                         } else {
  58236                           ldrd(condition,
  58237                                Register(rt),
  58238                                Register(rt + 1),
  58239                                &location);
  58240                         }
  58241                         if (((instr & 0xf7f00f0) != 0x14f00d0)) {
  58242                           UnpredictableA32(instr);
  58243                         }
  58244                         break;
  58245                       }
  58246                       default: {
  58247                         switch (instr & 0x01200000) {
  58248                           case 0x00000000: {
  58249                             // 0x004000d0
  58250                             if (((instr & 0xf0000000) == 0xf0000000) ||
  58251                                 ((instr & 0xf0000) == 0xf0000)) {
  58252                               UnallocatedA32(instr);
  58253                               return;
  58254                             }
  58255                             Condition condition((instr >> 28) & 0xf);
  58256                             unsigned rt = (instr >> 12) & 0xf;
  58257                             unsigned rn = (instr >> 16) & 0xf;
  58258                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  58259                                                                    : plus);
  58260                             int32_t offset =
  58261                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
  58262                             // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm_1> ; A1 NOLINT(whitespace/line_length)
  58263                             ldrd(condition,
  58264                                  Register(rt),
  58265                                  Register(rt + 1),
  58266                                  MemOperand(Register(rn),
  58267                                             sign,
  58268                                             offset,
  58269                                             PostIndex));
  58270                             break;
  58271                           }
  58272                           case 0x01000000: {
  58273                             // 0x014000d0
  58274                             if (((instr & 0xf0000000) == 0xf0000000) ||
  58275                                 ((instr & 0xf0000) == 0xf0000)) {
  58276                               UnallocatedA32(instr);
  58277                               return;
  58278                             }
  58279                             Condition condition((instr >> 28) & 0xf);
  58280                             unsigned rt = (instr >> 12) & 0xf;
  58281                             unsigned rn = (instr >> 16) & 0xf;
  58282                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  58283                                                                    : plus);
  58284                             int32_t offset =
  58285                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
  58286                             // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}] ; A1 NOLINT(whitespace/line_length)
  58287                             ldrd(condition,
  58288                                  Register(rt),
  58289                                  Register(rt + 1),
  58290                                  MemOperand(Register(rn),
  58291                                             sign,
  58292                                             offset,
  58293                                             Offset));
  58294                             break;
  58295                           }
  58296                           case 0x01200000: {
  58297                             // 0x016000d0
  58298                             if (((instr & 0xf0000000) == 0xf0000000) ||
  58299                                 ((instr & 0xf0000) == 0xf0000)) {
  58300                               UnallocatedA32(instr);
  58301                               return;
  58302                             }
  58303                             Condition condition((instr >> 28) & 0xf);
  58304                             unsigned rt = (instr >> 12) & 0xf;
  58305                             unsigned rn = (instr >> 16) & 0xf;
  58306                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  58307                                                                    : plus);
  58308                             int32_t offset =
  58309                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
  58310                             // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}]! ; A1 NOLINT(whitespace/line_length)
  58311                             ldrd(condition,
  58312                                  Register(rt),
  58313                                  Register(rt + 1),
  58314                                  MemOperand(Register(rn),
  58315                                             sign,
  58316                                             offset,
  58317                                             PreIndex));
  58318                             break;
  58319                           }
  58320                           default:
  58321                             UnallocatedA32(instr);
  58322                             break;
  58323                         }
  58324                         break;
  58325                       }
  58326                     }
  58327                     break;
  58328                   }
  58329                   case 0x00000060: {
  58330                     // 0x004000f0
  58331                     switch (instr & 0x01200000) {
  58332                       case 0x00000000: {
  58333                         // 0x004000f0
  58334                         if (((instr & 0xf0000000) == 0xf0000000)) {
  58335                           UnallocatedA32(instr);
  58336                           return;
  58337                         }
  58338                         Condition condition((instr >> 28) & 0xf);
  58339                         unsigned rt = (instr >> 12) & 0xf;
  58340                         unsigned rn = (instr >> 16) & 0xf;
  58341                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  58342                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
  58343                         // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm_1> ; A1 NOLINT(whitespace/line_length)
  58344                         strd(condition,
  58345                              Register(rt),
  58346                              Register(rt + 1),
  58347                              MemOperand(Register(rn), sign, offset, PostIndex));
  58348                         break;
  58349                       }
  58350                       case 0x01000000: {
  58351                         // 0x014000f0
  58352                         if (((instr & 0xf0000000) == 0xf0000000)) {
  58353                           UnallocatedA32(instr);
  58354                           return;
  58355                         }
  58356                         Condition condition((instr >> 28) & 0xf);
  58357                         unsigned rt = (instr >> 12) & 0xf;
  58358                         unsigned rn = (instr >> 16) & 0xf;
  58359                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  58360                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
  58361                         // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}] ; A1 NOLINT(whitespace/line_length)
  58362                         strd(condition,
  58363                              Register(rt),
  58364                              Register(rt + 1),
  58365                              MemOperand(Register(rn), sign, offset, Offset));
  58366                         break;
  58367                       }
  58368                       case 0x01200000: {
  58369                         // 0x016000f0
  58370                         if (((instr & 0xf0000000) == 0xf0000000)) {
  58371                           UnallocatedA32(instr);
  58372                           return;
  58373                         }
  58374                         Condition condition((instr >> 28) & 0xf);
  58375                         unsigned rt = (instr >> 12) & 0xf;
  58376                         unsigned rn = (instr >> 16) & 0xf;
  58377                         Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  58378                         int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0);
  58379                         // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}]! ; A1 NOLINT(whitespace/line_length)
  58380                         strd(condition,
  58381                              Register(rt),
  58382                              Register(rt + 1),
  58383                              MemOperand(Register(rn), sign, offset, PreIndex));
  58384                         break;
  58385                       }
  58386                       default:
  58387                         UnallocatedA32(instr);
  58388                         break;
  58389                     }
  58390                     break;
  58391                   }
  58392                 }
  58393                 break;
  58394               }
  58395             }
  58396             break;
  58397           }
  58398           case 0x00100000: {
  58399             // 0x00100000
  58400             switch (instr & 0x01e00000) {
  58401               case 0x00000000: {
  58402                 // 0x00100000
  58403                 switch (instr & 0x00000fe0) {
  58404                   case 0x00000060: {
  58405                     // 0x00100060
  58406                     if (((instr & 0xf0000000) == 0xf0000000)) {
  58407                       UnallocatedA32(instr);
  58408                       return;
  58409                     }
  58410                     Condition condition((instr >> 28) & 0xf);
  58411                     unsigned rd = (instr >> 12) & 0xf;
  58412                     unsigned rn = (instr >> 16) & 0xf;
  58413                     unsigned rm = instr & 0xf;
  58414                     // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  58415                     ands(condition,
  58416                          Best,
  58417                          Register(rd),
  58418                          Register(rn),
  58419                          Operand(Register(rm), RRX));
  58420                     break;
  58421                   }
  58422                   default: {
  58423                     if (((instr & 0xf0000000) == 0xf0000000) ||
  58424                         ((instr & 0xfe0) == 0x60)) {
  58425                       UnallocatedA32(instr);
  58426                       return;
  58427                     }
  58428                     Condition condition((instr >> 28) & 0xf);
  58429                     unsigned rd = (instr >> 12) & 0xf;
  58430                     unsigned rn = (instr >> 16) & 0xf;
  58431                     unsigned rm = instr & 0xf;
  58432                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  58433                                                         (instr >> 7) & 0x1f);
  58434                     // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  58435                     ands(condition,
  58436                          Best,
  58437                          Register(rd),
  58438                          Register(rn),
  58439                          Operand(Register(rm),
  58440                                  shift_operand.GetType(),
  58441                                  shift_operand.GetAmount()));
  58442                     break;
  58443                   }
  58444                 }
  58445                 break;
  58446               }
  58447               case 0x00200000: {
  58448                 // 0x00300000
  58449                 switch (instr & 0x00000fe0) {
  58450                   case 0x00000060: {
  58451                     // 0x00300060
  58452                     if (((instr & 0xf0000000) == 0xf0000000)) {
  58453                       UnallocatedA32(instr);
  58454                       return;
  58455                     }
  58456                     Condition condition((instr >> 28) & 0xf);
  58457                     unsigned rd = (instr >> 12) & 0xf;
  58458                     unsigned rn = (instr >> 16) & 0xf;
  58459                     unsigned rm = instr & 0xf;
  58460                     // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  58461                     eors(condition,
  58462                          Best,
  58463                          Register(rd),
  58464                          Register(rn),
  58465                          Operand(Register(rm), RRX));
  58466                     break;
  58467                   }
  58468                   default: {
  58469                     if (((instr & 0xf0000000) == 0xf0000000) ||
  58470                         ((instr & 0xfe0) == 0x60)) {
  58471                       UnallocatedA32(instr);
  58472                       return;
  58473                     }
  58474                     Condition condition((instr >> 28) & 0xf);
  58475                     unsigned rd = (instr >> 12) & 0xf;
  58476                     unsigned rn = (instr >> 16) & 0xf;
  58477                     unsigned rm = instr & 0xf;
  58478                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  58479                                                         (instr >> 7) & 0x1f);
  58480                     // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  58481                     eors(condition,
  58482                          Best,
  58483                          Register(rd),
  58484                          Register(rn),
  58485                          Operand(Register(rm),
  58486                                  shift_operand.GetType(),
  58487                                  shift_operand.GetAmount()));
  58488                     break;
  58489                   }
  58490                 }
  58491                 break;
  58492               }
  58493               case 0x00400000: {
  58494                 // 0x00500000
  58495                 switch (instr & 0x000f0000) {
  58496                   case 0x000d0000: {
  58497                     // 0x005d0000
  58498                     switch (instr & 0x00000fe0) {
  58499                       case 0x00000060: {
  58500                         // 0x005d0060
  58501                         if (((instr & 0xf0000000) == 0xf0000000)) {
  58502                           UnallocatedA32(instr);
  58503                           return;
  58504                         }
  58505                         Condition condition((instr >> 28) & 0xf);
  58506                         unsigned rd = (instr >> 12) & 0xf;
  58507                         unsigned rm = instr & 0xf;
  58508                         // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
  58509                         subs(condition,
  58510                              Best,
  58511                              Register(rd),
  58512                              sp,
  58513                              Operand(Register(rm), RRX));
  58514                         break;
  58515                       }
  58516                       default: {
  58517                         if (((instr & 0xf0000000) == 0xf0000000) ||
  58518                             ((instr & 0xfe0) == 0x60)) {
  58519                           UnallocatedA32(instr);
  58520                           return;
  58521                         }
  58522                         Condition condition((instr >> 28) & 0xf);
  58523                         unsigned rd = (instr >> 12) & 0xf;
  58524                         unsigned rm = instr & 0xf;
  58525                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  58526                                                             (instr >> 7) &
  58527                                                                 0x1f);
  58528                         // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  58529                         subs(condition,
  58530                              Best,
  58531                              Register(rd),
  58532                              sp,
  58533                              Operand(Register(rm),
  58534                                      shift_operand.GetType(),
  58535                                      shift_operand.GetAmount()));
  58536                         break;
  58537                       }
  58538                     }
  58539                     break;
  58540                   }
  58541                   default: {
  58542                     switch (instr & 0x00000fe0) {
  58543                       case 0x00000060: {
  58544                         // 0x00500060
  58545                         if (((instr & 0xf0000000) == 0xf0000000) ||
  58546                             ((instr & 0xf0000) == 0xd0000)) {
  58547                           UnallocatedA32(instr);
  58548                           return;
  58549                         }
  58550                         Condition condition((instr >> 28) & 0xf);
  58551                         unsigned rd = (instr >> 12) & 0xf;
  58552                         unsigned rn = (instr >> 16) & 0xf;
  58553                         unsigned rm = instr & 0xf;
  58554                         // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  58555                         subs(condition,
  58556                              Best,
  58557                              Register(rd),
  58558                              Register(rn),
  58559                              Operand(Register(rm), RRX));
  58560                         break;
  58561                       }
  58562                       default: {
  58563                         if (((instr & 0xf0000000) == 0xf0000000) ||
  58564                             ((instr & 0xf0000) == 0xd0000) ||
  58565                             ((instr & 0xfe0) == 0x60)) {
  58566                           UnallocatedA32(instr);
  58567                           return;
  58568                         }
  58569                         Condition condition((instr >> 28) & 0xf);
  58570                         unsigned rd = (instr >> 12) & 0xf;
  58571                         unsigned rn = (instr >> 16) & 0xf;
  58572                         unsigned rm = instr & 0xf;
  58573                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  58574                                                             (instr >> 7) &
  58575                                                                 0x1f);
  58576                         // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  58577                         subs(condition,
  58578                              Best,
  58579                              Register(rd),
  58580                              Register(rn),
  58581                              Operand(Register(rm),
  58582                                      shift_operand.GetType(),
  58583                                      shift_operand.GetAmount()));
  58584                         break;
  58585                       }
  58586                     }
  58587                     break;
  58588                   }
  58589                 }
  58590                 break;
  58591               }
  58592               case 0x00600000: {
  58593                 // 0x00700000
  58594                 switch (instr & 0x00000fe0) {
  58595                   case 0x00000060: {
  58596                     // 0x00700060
  58597                     if (((instr & 0xf0000000) == 0xf0000000)) {
  58598                       UnallocatedA32(instr);
  58599                       return;
  58600                     }
  58601                     Condition condition((instr >> 28) & 0xf);
  58602                     unsigned rd = (instr >> 12) & 0xf;
  58603                     unsigned rn = (instr >> 16) & 0xf;
  58604                     unsigned rm = instr & 0xf;
  58605                     // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  58606                     rsbs(condition,
  58607                          Best,
  58608                          Register(rd),
  58609                          Register(rn),
  58610                          Operand(Register(rm), RRX));
  58611                     break;
  58612                   }
  58613                   default: {
  58614                     if (((instr & 0xf0000000) == 0xf0000000) ||
  58615                         ((instr & 0xfe0) == 0x60)) {
  58616                       UnallocatedA32(instr);
  58617                       return;
  58618                     }
  58619                     Condition condition((instr >> 28) & 0xf);
  58620                     unsigned rd = (instr >> 12) & 0xf;
  58621                     unsigned rn = (instr >> 16) & 0xf;
  58622                     unsigned rm = instr & 0xf;
  58623                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  58624                                                         (instr >> 7) & 0x1f);
  58625                     // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  58626                     rsbs(condition,
  58627                          Best,
  58628                          Register(rd),
  58629                          Register(rn),
  58630                          Operand(Register(rm),
  58631                                  shift_operand.GetType(),
  58632                                  shift_operand.GetAmount()));
  58633                     break;
  58634                   }
  58635                 }
  58636                 break;
  58637               }
  58638               case 0x00800000: {
  58639                 // 0x00900000
  58640                 switch (instr & 0x000f0000) {
  58641                   case 0x000d0000: {
  58642                     // 0x009d0000
  58643                     switch (instr & 0x00000fe0) {
  58644                       case 0x00000060: {
  58645                         // 0x009d0060
  58646                         if (((instr & 0xf0000000) == 0xf0000000)) {
  58647                           UnallocatedA32(instr);
  58648                           return;
  58649                         }
  58650                         Condition condition((instr >> 28) & 0xf);
  58651                         unsigned rd = (instr >> 12) & 0xf;
  58652                         unsigned rm = instr & 0xf;
  58653                         // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1
  58654                         adds(condition,
  58655                              Best,
  58656                              Register(rd),
  58657                              sp,
  58658                              Operand(Register(rm), RRX));
  58659                         break;
  58660                       }
  58661                       default: {
  58662                         if (((instr & 0xf0000000) == 0xf0000000) ||
  58663                             ((instr & 0xfe0) == 0x60)) {
  58664                           UnallocatedA32(instr);
  58665                           return;
  58666                         }
  58667                         Condition condition((instr >> 28) & 0xf);
  58668                         unsigned rd = (instr >> 12) & 0xf;
  58669                         unsigned rm = instr & 0xf;
  58670                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  58671                                                             (instr >> 7) &
  58672                                                                 0x1f);
  58673                         // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  58674                         adds(condition,
  58675                              Best,
  58676                              Register(rd),
  58677                              sp,
  58678                              Operand(Register(rm),
  58679                                      shift_operand.GetType(),
  58680                                      shift_operand.GetAmount()));
  58681                         break;
  58682                       }
  58683                     }
  58684                     break;
  58685                   }
  58686                   default: {
  58687                     switch (instr & 0x00000fe0) {
  58688                       case 0x00000060: {
  58689                         // 0x00900060
  58690                         if (((instr & 0xf0000000) == 0xf0000000) ||
  58691                             ((instr & 0xf0000) == 0xd0000)) {
  58692                           UnallocatedA32(instr);
  58693                           return;
  58694                         }
  58695                         Condition condition((instr >> 28) & 0xf);
  58696                         unsigned rd = (instr >> 12) & 0xf;
  58697                         unsigned rn = (instr >> 16) & 0xf;
  58698                         unsigned rm = instr & 0xf;
  58699                         // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  58700                         adds(condition,
  58701                              Best,
  58702                              Register(rd),
  58703                              Register(rn),
  58704                              Operand(Register(rm), RRX));
  58705                         break;
  58706                       }
  58707                       default: {
  58708                         if (((instr & 0xf0000000) == 0xf0000000) ||
  58709                             ((instr & 0xf0000) == 0xd0000) ||
  58710                             ((instr & 0xfe0) == 0x60)) {
  58711                           UnallocatedA32(instr);
  58712                           return;
  58713                         }
  58714                         Condition condition((instr >> 28) & 0xf);
  58715                         unsigned rd = (instr >> 12) & 0xf;
  58716                         unsigned rn = (instr >> 16) & 0xf;
  58717                         unsigned rm = instr & 0xf;
  58718                         ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  58719                                                             (instr >> 7) &
  58720                                                                 0x1f);
  58721                         // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  58722                         adds(condition,
  58723                              Best,
  58724                              Register(rd),
  58725                              Register(rn),
  58726                              Operand(Register(rm),
  58727                                      shift_operand.GetType(),
  58728                                      shift_operand.GetAmount()));
  58729                         break;
  58730                       }
  58731                     }
  58732                     break;
  58733                   }
  58734                 }
  58735                 break;
  58736               }
  58737               case 0x00a00000: {
  58738                 // 0x00b00000
  58739                 switch (instr & 0x00000fe0) {
  58740                   case 0x00000060: {
  58741                     // 0x00b00060
  58742                     if (((instr & 0xf0000000) == 0xf0000000)) {
  58743                       UnallocatedA32(instr);
  58744                       return;
  58745                     }
  58746                     Condition condition((instr >> 28) & 0xf);
  58747                     unsigned rd = (instr >> 12) & 0xf;
  58748                     unsigned rn = (instr >> 16) & 0xf;
  58749                     unsigned rm = instr & 0xf;
  58750                     // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  58751                     adcs(condition,
  58752                          Best,
  58753                          Register(rd),
  58754                          Register(rn),
  58755                          Operand(Register(rm), RRX));
  58756                     break;
  58757                   }
  58758                   default: {
  58759                     if (((instr & 0xf0000000) == 0xf0000000) ||
  58760                         ((instr & 0xfe0) == 0x60)) {
  58761                       UnallocatedA32(instr);
  58762                       return;
  58763                     }
  58764                     Condition condition((instr >> 28) & 0xf);
  58765                     unsigned rd = (instr >> 12) & 0xf;
  58766                     unsigned rn = (instr >> 16) & 0xf;
  58767                     unsigned rm = instr & 0xf;
  58768                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  58769                                                         (instr >> 7) & 0x1f);
  58770                     // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  58771                     adcs(condition,
  58772                          Best,
  58773                          Register(rd),
  58774                          Register(rn),
  58775                          Operand(Register(rm),
  58776                                  shift_operand.GetType(),
  58777                                  shift_operand.GetAmount()));
  58778                     break;
  58779                   }
  58780                 }
  58781                 break;
  58782               }
  58783               case 0x00c00000: {
  58784                 // 0x00d00000
  58785                 switch (instr & 0x00000fe0) {
  58786                   case 0x00000060: {
  58787                     // 0x00d00060
  58788                     if (((instr & 0xf0000000) == 0xf0000000)) {
  58789                       UnallocatedA32(instr);
  58790                       return;
  58791                     }
  58792                     Condition condition((instr >> 28) & 0xf);
  58793                     unsigned rd = (instr >> 12) & 0xf;
  58794                     unsigned rn = (instr >> 16) & 0xf;
  58795                     unsigned rm = instr & 0xf;
  58796                     // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  58797                     sbcs(condition,
  58798                          Best,
  58799                          Register(rd),
  58800                          Register(rn),
  58801                          Operand(Register(rm), RRX));
  58802                     break;
  58803                   }
  58804                   default: {
  58805                     if (((instr & 0xf0000000) == 0xf0000000) ||
  58806                         ((instr & 0xfe0) == 0x60)) {
  58807                       UnallocatedA32(instr);
  58808                       return;
  58809                     }
  58810                     Condition condition((instr >> 28) & 0xf);
  58811                     unsigned rd = (instr >> 12) & 0xf;
  58812                     unsigned rn = (instr >> 16) & 0xf;
  58813                     unsigned rm = instr & 0xf;
  58814                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  58815                                                         (instr >> 7) & 0x1f);
  58816                     // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  58817                     sbcs(condition,
  58818                          Best,
  58819                          Register(rd),
  58820                          Register(rn),
  58821                          Operand(Register(rm),
  58822                                  shift_operand.GetType(),
  58823                                  shift_operand.GetAmount()));
  58824                     break;
  58825                   }
  58826                 }
  58827                 break;
  58828               }
  58829               case 0x00e00000: {
  58830                 // 0x00f00000
  58831                 switch (instr & 0x00000fe0) {
  58832                   case 0x00000060: {
  58833                     // 0x00f00060
  58834                     if (((instr & 0xf0000000) == 0xf0000000)) {
  58835                       UnallocatedA32(instr);
  58836                       return;
  58837                     }
  58838                     Condition condition((instr >> 28) & 0xf);
  58839                     unsigned rd = (instr >> 12) & 0xf;
  58840                     unsigned rn = (instr >> 16) & 0xf;
  58841                     unsigned rm = instr & 0xf;
  58842                     // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  58843                     rscs(condition,
  58844                          Register(rd),
  58845                          Register(rn),
  58846                          Operand(Register(rm), RRX));
  58847                     break;
  58848                   }
  58849                   default: {
  58850                     if (((instr & 0xf0000000) == 0xf0000000) ||
  58851                         ((instr & 0xfe0) == 0x60)) {
  58852                       UnallocatedA32(instr);
  58853                       return;
  58854                     }
  58855                     Condition condition((instr >> 28) & 0xf);
  58856                     unsigned rd = (instr >> 12) & 0xf;
  58857                     unsigned rn = (instr >> 16) & 0xf;
  58858                     unsigned rm = instr & 0xf;
  58859                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  58860                                                         (instr >> 7) & 0x1f);
  58861                     // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  58862                     rscs(condition,
  58863                          Register(rd),
  58864                          Register(rn),
  58865                          Operand(Register(rm),
  58866                                  shift_operand.GetType(),
  58867                                  shift_operand.GetAmount()));
  58868                     break;
  58869                   }
  58870                 }
  58871                 break;
  58872               }
  58873               case 0x01000000: {
  58874                 // 0x01100000
  58875                 switch (instr & 0x00000fe0) {
  58876                   case 0x00000060: {
  58877                     // 0x01100060
  58878                     if (((instr & 0xf0000000) == 0xf0000000)) {
  58879                       UnallocatedA32(instr);
  58880                       return;
  58881                     }
  58882                     Condition condition((instr >> 28) & 0xf);
  58883                     unsigned rn = (instr >> 16) & 0xf;
  58884                     unsigned rm = instr & 0xf;
  58885                     // TST{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
  58886                     tst(condition,
  58887                         Best,
  58888                         Register(rn),
  58889                         Operand(Register(rm), RRX));
  58890                     if (((instr & 0xff0fff0) != 0x1100060)) {
  58891                       UnpredictableA32(instr);
  58892                     }
  58893                     break;
  58894                   }
  58895                   default: {
  58896                     if (((instr & 0xf0000000) == 0xf0000000) ||
  58897                         ((instr & 0xfe0) == 0x60)) {
  58898                       UnallocatedA32(instr);
  58899                       return;
  58900                     }
  58901                     Condition condition((instr >> 28) & 0xf);
  58902                     unsigned rn = (instr >> 16) & 0xf;
  58903                     unsigned rm = instr & 0xf;
  58904                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  58905                                                         (instr >> 7) & 0x1f);
  58906                     // TST{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
  58907                     tst(condition,
  58908                         Best,
  58909                         Register(rn),
  58910                         Operand(Register(rm),
  58911                                 shift_operand.GetType(),
  58912                                 shift_operand.GetAmount()));
  58913                     if (((instr & 0xff0f010) != 0x1100000)) {
  58914                       UnpredictableA32(instr);
  58915                     }
  58916                     break;
  58917                   }
  58918                 }
  58919                 break;
  58920               }
  58921               case 0x01200000: {
  58922                 // 0x01300000
  58923                 switch (instr & 0x00000fe0) {
  58924                   case 0x00000060: {
  58925                     // 0x01300060
  58926                     if (((instr & 0xf0000000) == 0xf0000000)) {
  58927                       UnallocatedA32(instr);
  58928                       return;
  58929                     }
  58930                     Condition condition((instr >> 28) & 0xf);
  58931                     unsigned rn = (instr >> 16) & 0xf;
  58932                     unsigned rm = instr & 0xf;
  58933                     // TEQ{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
  58934                     teq(condition, Register(rn), Operand(Register(rm), RRX));
  58935                     if (((instr & 0xff0fff0) != 0x1300060)) {
  58936                       UnpredictableA32(instr);
  58937                     }
  58938                     break;
  58939                   }
  58940                   default: {
  58941                     if (((instr & 0xf0000000) == 0xf0000000) ||
  58942                         ((instr & 0xfe0) == 0x60)) {
  58943                       UnallocatedA32(instr);
  58944                       return;
  58945                     }
  58946                     Condition condition((instr >> 28) & 0xf);
  58947                     unsigned rn = (instr >> 16) & 0xf;
  58948                     unsigned rm = instr & 0xf;
  58949                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  58950                                                         (instr >> 7) & 0x1f);
  58951                     // TEQ{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
  58952                     teq(condition,
  58953                         Register(rn),
  58954                         Operand(Register(rm),
  58955                                 shift_operand.GetType(),
  58956                                 shift_operand.GetAmount()));
  58957                     if (((instr & 0xff0f010) != 0x1300000)) {
  58958                       UnpredictableA32(instr);
  58959                     }
  58960                     break;
  58961                   }
  58962                 }
  58963                 break;
  58964               }
  58965               case 0x01400000: {
  58966                 // 0x01500000
  58967                 switch (instr & 0x00000fe0) {
  58968                   case 0x00000060: {
  58969                     // 0x01500060
  58970                     if (((instr & 0xf0000000) == 0xf0000000)) {
  58971                       UnallocatedA32(instr);
  58972                       return;
  58973                     }
  58974                     Condition condition((instr >> 28) & 0xf);
  58975                     unsigned rn = (instr >> 16) & 0xf;
  58976                     unsigned rm = instr & 0xf;
  58977                     // CMP{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
  58978                     cmp(condition,
  58979                         Best,
  58980                         Register(rn),
  58981                         Operand(Register(rm), RRX));
  58982                     if (((instr & 0xff0fff0) != 0x1500060)) {
  58983                       UnpredictableA32(instr);
  58984                     }
  58985                     break;
  58986                   }
  58987                   default: {
  58988                     if (((instr & 0xf0000000) == 0xf0000000) ||
  58989                         ((instr & 0xfe0) == 0x60)) {
  58990                       UnallocatedA32(instr);
  58991                       return;
  58992                     }
  58993                     Condition condition((instr >> 28) & 0xf);
  58994                     unsigned rn = (instr >> 16) & 0xf;
  58995                     unsigned rm = instr & 0xf;
  58996                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  58997                                                         (instr >> 7) & 0x1f);
  58998                     // CMP{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
  58999                     cmp(condition,
  59000                         Best,
  59001                         Register(rn),
  59002                         Operand(Register(rm),
  59003                                 shift_operand.GetType(),
  59004                                 shift_operand.GetAmount()));
  59005                     if (((instr & 0xff0f010) != 0x1500000)) {
  59006                       UnpredictableA32(instr);
  59007                     }
  59008                     break;
  59009                   }
  59010                 }
  59011                 break;
  59012               }
  59013               case 0x01600000: {
  59014                 // 0x01700000
  59015                 switch (instr & 0x00000fe0) {
  59016                   case 0x00000060: {
  59017                     // 0x01700060
  59018                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59019                       UnallocatedA32(instr);
  59020                       return;
  59021                     }
  59022                     Condition condition((instr >> 28) & 0xf);
  59023                     unsigned rn = (instr >> 16) & 0xf;
  59024                     unsigned rm = instr & 0xf;
  59025                     // CMN{<c>}{<q>} <Rn>, <Rm>, RRX ; A1
  59026                     cmn(condition,
  59027                         Best,
  59028                         Register(rn),
  59029                         Operand(Register(rm), RRX));
  59030                     if (((instr & 0xff0fff0) != 0x1700060)) {
  59031                       UnpredictableA32(instr);
  59032                     }
  59033                     break;
  59034                   }
  59035                   default: {
  59036                     if (((instr & 0xf0000000) == 0xf0000000) ||
  59037                         ((instr & 0xfe0) == 0x60)) {
  59038                       UnallocatedA32(instr);
  59039                       return;
  59040                     }
  59041                     Condition condition((instr >> 28) & 0xf);
  59042                     unsigned rn = (instr >> 16) & 0xf;
  59043                     unsigned rm = instr & 0xf;
  59044                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  59045                                                         (instr >> 7) & 0x1f);
  59046                     // CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1
  59047                     cmn(condition,
  59048                         Best,
  59049                         Register(rn),
  59050                         Operand(Register(rm),
  59051                                 shift_operand.GetType(),
  59052                                 shift_operand.GetAmount()));
  59053                     if (((instr & 0xff0f010) != 0x1700000)) {
  59054                       UnpredictableA32(instr);
  59055                     }
  59056                     break;
  59057                   }
  59058                 }
  59059                 break;
  59060               }
  59061               case 0x01800000: {
  59062                 // 0x01900000
  59063                 switch (instr & 0x00000fe0) {
  59064                   case 0x00000060: {
  59065                     // 0x01900060
  59066                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59067                       UnallocatedA32(instr);
  59068                       return;
  59069                     }
  59070                     Condition condition((instr >> 28) & 0xf);
  59071                     unsigned rd = (instr >> 12) & 0xf;
  59072                     unsigned rn = (instr >> 16) & 0xf;
  59073                     unsigned rm = instr & 0xf;
  59074                     // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  59075                     orrs(condition,
  59076                          Best,
  59077                          Register(rd),
  59078                          Register(rn),
  59079                          Operand(Register(rm), RRX));
  59080                     break;
  59081                   }
  59082                   default: {
  59083                     if (((instr & 0xf0000000) == 0xf0000000) ||
  59084                         ((instr & 0xfe0) == 0x60)) {
  59085                       UnallocatedA32(instr);
  59086                       return;
  59087                     }
  59088                     Condition condition((instr >> 28) & 0xf);
  59089                     unsigned rd = (instr >> 12) & 0xf;
  59090                     unsigned rn = (instr >> 16) & 0xf;
  59091                     unsigned rm = instr & 0xf;
  59092                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  59093                                                         (instr >> 7) & 0x1f);
  59094                     // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  59095                     orrs(condition,
  59096                          Best,
  59097                          Register(rd),
  59098                          Register(rn),
  59099                          Operand(Register(rm),
  59100                                  shift_operand.GetType(),
  59101                                  shift_operand.GetAmount()));
  59102                     break;
  59103                   }
  59104                 }
  59105                 break;
  59106               }
  59107               case 0x01a00000: {
  59108                 // 0x01b00000
  59109                 switch (instr & 0x00000fe0) {
  59110                   case 0x00000060: {
  59111                     // 0x01b00060
  59112                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59113                       UnallocatedA32(instr);
  59114                       return;
  59115                     }
  59116                     if (((instr & 0xf0000000) != 0xf0000000)) {
  59117                       Condition condition((instr >> 28) & 0xf);
  59118                       unsigned rd = (instr >> 12) & 0xf;
  59119                       unsigned rm = instr & 0xf;
  59120                       // RRXS{<c>}{<q>} {<Rd>}, <Rm> ; A1
  59121                       rrxs(condition, Register(rd), Register(rm));
  59122                       if (((instr & 0xfff0ff0) != 0x1b00060)) {
  59123                         UnpredictableA32(instr);
  59124                       }
  59125                       return;
  59126                     }
  59127                     Condition condition((instr >> 28) & 0xf);
  59128                     unsigned rd = (instr >> 12) & 0xf;
  59129                     unsigned rm = instr & 0xf;
  59130                     // MOVS{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
  59131                     movs(condition,
  59132                          Best,
  59133                          Register(rd),
  59134                          Operand(Register(rm), RRX));
  59135                     if (((instr & 0xfff0ff0) != 0x1b00060)) {
  59136                       UnpredictableA32(instr);
  59137                     }
  59138                     break;
  59139                   }
  59140                   default: {
  59141                     if (((instr & 0xf0000000) == 0xf0000000) ||
  59142                         ((instr & 0xfe0) == 0x60)) {
  59143                       UnallocatedA32(instr);
  59144                       return;
  59145                     }
  59146                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
  59147                         ((instr & 0xf0000000) != 0xf0000000)) {
  59148                       Condition condition((instr >> 28) & 0xf);
  59149                       unsigned rd = (instr >> 12) & 0xf;
  59150                       unsigned rm = instr & 0xf;
  59151                       uint32_t amount = (instr >> 7) & 0x1f;
  59152                       if (amount == 0) amount = 32;
  59153                       // ASRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
  59154                       asrs(condition, Best, Register(rd), Register(rm), amount);
  59155                       if (((instr & 0xfff0070) != 0x1b00040)) {
  59156                         UnpredictableA32(instr);
  59157                       }
  59158                       return;
  59159                     }
  59160                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
  59161                         ((instr & 0xf0000000) != 0xf0000000) &&
  59162                         ((instr & 0x00000f80) != 0x00000000)) {
  59163                       Condition condition((instr >> 28) & 0xf);
  59164                       unsigned rd = (instr >> 12) & 0xf;
  59165                       unsigned rm = instr & 0xf;
  59166                       uint32_t amount = (instr >> 7) & 0x1f;
  59167                       // LSLS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
  59168                       lsls(condition, Best, Register(rd), Register(rm), amount);
  59169                       if (((instr & 0xfff0070) != 0x1b00000)) {
  59170                         UnpredictableA32(instr);
  59171                       }
  59172                       return;
  59173                     }
  59174                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
  59175                         ((instr & 0xf0000000) != 0xf0000000)) {
  59176                       Condition condition((instr >> 28) & 0xf);
  59177                       unsigned rd = (instr >> 12) & 0xf;
  59178                       unsigned rm = instr & 0xf;
  59179                       uint32_t amount = (instr >> 7) & 0x1f;
  59180                       if (amount == 0) amount = 32;
  59181                       // LSRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
  59182                       lsrs(condition, Best, Register(rd), Register(rm), amount);
  59183                       if (((instr & 0xfff0070) != 0x1b00020)) {
  59184                         UnpredictableA32(instr);
  59185                       }
  59186                       return;
  59187                     }
  59188                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
  59189                         ((instr & 0xf0000000) != 0xf0000000) &&
  59190                         ((instr & 0x00000f80) != 0x00000000)) {
  59191                       Condition condition((instr >> 28) & 0xf);
  59192                       unsigned rd = (instr >> 12) & 0xf;
  59193                       unsigned rm = instr & 0xf;
  59194                       uint32_t amount = (instr >> 7) & 0x1f;
  59195                       // RORS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1
  59196                       rors(condition, Best, Register(rd), Register(rm), amount);
  59197                       if (((instr & 0xfff0070) != 0x1b00060)) {
  59198                         UnpredictableA32(instr);
  59199                       }
  59200                       return;
  59201                     }
  59202                     Condition condition((instr >> 28) & 0xf);
  59203                     unsigned rd = (instr >> 12) & 0xf;
  59204                     unsigned rm = instr & 0xf;
  59205                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  59206                                                         (instr >> 7) & 0x1f);
  59207                     // MOVS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
  59208                     movs(condition,
  59209                          Best,
  59210                          Register(rd),
  59211                          Operand(Register(rm),
  59212                                  shift_operand.GetType(),
  59213                                  shift_operand.GetAmount()));
  59214                     if (((instr & 0xfff0010) != 0x1b00000)) {
  59215                       UnpredictableA32(instr);
  59216                     }
  59217                     break;
  59218                   }
  59219                 }
  59220                 break;
  59221               }
  59222               case 0x01c00000: {
  59223                 // 0x01d00000
  59224                 switch (instr & 0x00000fe0) {
  59225                   case 0x00000060: {
  59226                     // 0x01d00060
  59227                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59228                       UnallocatedA32(instr);
  59229                       return;
  59230                     }
  59231                     Condition condition((instr >> 28) & 0xf);
  59232                     unsigned rd = (instr >> 12) & 0xf;
  59233                     unsigned rn = (instr >> 16) & 0xf;
  59234                     unsigned rm = instr & 0xf;
  59235                     // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1
  59236                     bics(condition,
  59237                          Best,
  59238                          Register(rd),
  59239                          Register(rn),
  59240                          Operand(Register(rm), RRX));
  59241                     break;
  59242                   }
  59243                   default: {
  59244                     if (((instr & 0xf0000000) == 0xf0000000) ||
  59245                         ((instr & 0xfe0) == 0x60)) {
  59246                       UnallocatedA32(instr);
  59247                       return;
  59248                     }
  59249                     Condition condition((instr >> 28) & 0xf);
  59250                     unsigned rd = (instr >> 12) & 0xf;
  59251                     unsigned rn = (instr >> 16) & 0xf;
  59252                     unsigned rm = instr & 0xf;
  59253                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  59254                                                         (instr >> 7) & 0x1f);
  59255                     // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length)
  59256                     bics(condition,
  59257                          Best,
  59258                          Register(rd),
  59259                          Register(rn),
  59260                          Operand(Register(rm),
  59261                                  shift_operand.GetType(),
  59262                                  shift_operand.GetAmount()));
  59263                     break;
  59264                   }
  59265                 }
  59266                 break;
  59267               }
  59268               case 0x01e00000: {
  59269                 // 0x01f00000
  59270                 switch (instr & 0x00000fe0) {
  59271                   case 0x00000060: {
  59272                     // 0x01f00060
  59273                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59274                       UnallocatedA32(instr);
  59275                       return;
  59276                     }
  59277                     Condition condition((instr >> 28) & 0xf);
  59278                     unsigned rd = (instr >> 12) & 0xf;
  59279                     unsigned rm = instr & 0xf;
  59280                     // MVNS{<c>}{<q>} <Rd>, <Rm>, RRX ; A1
  59281                     mvns(condition,
  59282                          Best,
  59283                          Register(rd),
  59284                          Operand(Register(rm), RRX));
  59285                     if (((instr & 0xfff0ff0) != 0x1f00060)) {
  59286                       UnpredictableA32(instr);
  59287                     }
  59288                     break;
  59289                   }
  59290                   default: {
  59291                     if (((instr & 0xf0000000) == 0xf0000000) ||
  59292                         ((instr & 0xfe0) == 0x60)) {
  59293                       UnallocatedA32(instr);
  59294                       return;
  59295                     }
  59296                     Condition condition((instr >> 28) & 0xf);
  59297                     unsigned rd = (instr >> 12) & 0xf;
  59298                     unsigned rm = instr & 0xf;
  59299                     ImmediateShiftOperand shift_operand((instr >> 5) & 0x3,
  59300                                                         (instr >> 7) & 0x1f);
  59301                     // MVNS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1
  59302                     mvns(condition,
  59303                          Best,
  59304                          Register(rd),
  59305                          Operand(Register(rm),
  59306                                  shift_operand.GetType(),
  59307                                  shift_operand.GetAmount()));
  59308                     if (((instr & 0xfff0010) != 0x1f00000)) {
  59309                       UnpredictableA32(instr);
  59310                     }
  59311                     break;
  59312                   }
  59313                 }
  59314                 break;
  59315               }
  59316             }
  59317             break;
  59318           }
  59319           case 0x00100010: {
  59320             // 0x00100010
  59321             switch (instr & 0x00400080) {
  59322               case 0x00000000: {
  59323                 // 0x00100010
  59324                 switch (instr & 0x01a00000) {
  59325                   case 0x00000000: {
  59326                     // 0x00100010
  59327                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59328                       UnallocatedA32(instr);
  59329                       return;
  59330                     }
  59331                     Condition condition((instr >> 28) & 0xf);
  59332                     unsigned rd = (instr >> 12) & 0xf;
  59333                     unsigned rn = (instr >> 16) & 0xf;
  59334                     unsigned rm = instr & 0xf;
  59335                     Shift shift((instr >> 5) & 0x3);
  59336                     unsigned rs = (instr >> 8) & 0xf;
  59337                     // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  59338                     ands(condition,
  59339                          Best,
  59340                          Register(rd),
  59341                          Register(rn),
  59342                          Operand(Register(rm), shift.GetType(), Register(rs)));
  59343                     break;
  59344                   }
  59345                   case 0x00200000: {
  59346                     // 0x00300010
  59347                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59348                       UnallocatedA32(instr);
  59349                       return;
  59350                     }
  59351                     Condition condition((instr >> 28) & 0xf);
  59352                     unsigned rd = (instr >> 12) & 0xf;
  59353                     unsigned rn = (instr >> 16) & 0xf;
  59354                     unsigned rm = instr & 0xf;
  59355                     Shift shift((instr >> 5) & 0x3);
  59356                     unsigned rs = (instr >> 8) & 0xf;
  59357                     // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  59358                     eors(condition,
  59359                          Best,
  59360                          Register(rd),
  59361                          Register(rn),
  59362                          Operand(Register(rm), shift.GetType(), Register(rs)));
  59363                     break;
  59364                   }
  59365                   case 0x00800000: {
  59366                     // 0x00900010
  59367                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59368                       UnallocatedA32(instr);
  59369                       return;
  59370                     }
  59371                     Condition condition((instr >> 28) & 0xf);
  59372                     unsigned rd = (instr >> 12) & 0xf;
  59373                     unsigned rn = (instr >> 16) & 0xf;
  59374                     unsigned rm = instr & 0xf;
  59375                     Shift shift((instr >> 5) & 0x3);
  59376                     unsigned rs = (instr >> 8) & 0xf;
  59377                     // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  59378                     adds(condition,
  59379                          Best,
  59380                          Register(rd),
  59381                          Register(rn),
  59382                          Operand(Register(rm), shift.GetType(), Register(rs)));
  59383                     break;
  59384                   }
  59385                   case 0x00a00000: {
  59386                     // 0x00b00010
  59387                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59388                       UnallocatedA32(instr);
  59389                       return;
  59390                     }
  59391                     Condition condition((instr >> 28) & 0xf);
  59392                     unsigned rd = (instr >> 12) & 0xf;
  59393                     unsigned rn = (instr >> 16) & 0xf;
  59394                     unsigned rm = instr & 0xf;
  59395                     Shift shift((instr >> 5) & 0x3);
  59396                     unsigned rs = (instr >> 8) & 0xf;
  59397                     // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  59398                     adcs(condition,
  59399                          Best,
  59400                          Register(rd),
  59401                          Register(rn),
  59402                          Operand(Register(rm), shift.GetType(), Register(rs)));
  59403                     break;
  59404                   }
  59405                   case 0x01000000: {
  59406                     // 0x01100010
  59407                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59408                       UnallocatedA32(instr);
  59409                       return;
  59410                     }
  59411                     Condition condition((instr >> 28) & 0xf);
  59412                     unsigned rn = (instr >> 16) & 0xf;
  59413                     unsigned rm = instr & 0xf;
  59414                     Shift shift((instr >> 5) & 0x3);
  59415                     unsigned rs = (instr >> 8) & 0xf;
  59416                     // TST{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
  59417                     tst(condition,
  59418                         Best,
  59419                         Register(rn),
  59420                         Operand(Register(rm), shift.GetType(), Register(rs)));
  59421                     if (((instr & 0xff0f090) != 0x1100010)) {
  59422                       UnpredictableA32(instr);
  59423                     }
  59424                     break;
  59425                   }
  59426                   case 0x01200000: {
  59427                     // 0x01300010
  59428                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59429                       UnallocatedA32(instr);
  59430                       return;
  59431                     }
  59432                     Condition condition((instr >> 28) & 0xf);
  59433                     unsigned rn = (instr >> 16) & 0xf;
  59434                     unsigned rm = instr & 0xf;
  59435                     Shift shift((instr >> 5) & 0x3);
  59436                     unsigned rs = (instr >> 8) & 0xf;
  59437                     // TEQ{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
  59438                     teq(condition,
  59439                         Register(rn),
  59440                         Operand(Register(rm), shift.GetType(), Register(rs)));
  59441                     if (((instr & 0xff0f090) != 0x1300010)) {
  59442                       UnpredictableA32(instr);
  59443                     }
  59444                     break;
  59445                   }
  59446                   case 0x01800000: {
  59447                     // 0x01900010
  59448                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59449                       UnallocatedA32(instr);
  59450                       return;
  59451                     }
  59452                     Condition condition((instr >> 28) & 0xf);
  59453                     unsigned rd = (instr >> 12) & 0xf;
  59454                     unsigned rn = (instr >> 16) & 0xf;
  59455                     unsigned rm = instr & 0xf;
  59456                     Shift shift((instr >> 5) & 0x3);
  59457                     unsigned rs = (instr >> 8) & 0xf;
  59458                     // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  59459                     orrs(condition,
  59460                          Best,
  59461                          Register(rd),
  59462                          Register(rn),
  59463                          Operand(Register(rm), shift.GetType(), Register(rs)));
  59464                     break;
  59465                   }
  59466                   case 0x01a00000: {
  59467                     // 0x01b00010
  59468                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59469                       UnallocatedA32(instr);
  59470                       return;
  59471                     }
  59472                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) &&
  59473                         ((instr & 0xf0000000) != 0xf0000000)) {
  59474                       Condition condition((instr >> 28) & 0xf);
  59475                       unsigned rd = (instr >> 12) & 0xf;
  59476                       unsigned rm = instr & 0xf;
  59477                       unsigned rs = (instr >> 8) & 0xf;
  59478                       // ASRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
  59479                       asrs(condition,
  59480                            Best,
  59481                            Register(rd),
  59482                            Register(rm),
  59483                            Register(rs));
  59484                       if (((instr & 0xfff00f0) != 0x1b00050)) {
  59485                         UnpredictableA32(instr);
  59486                       }
  59487                       return;
  59488                     }
  59489                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) &&
  59490                         ((instr & 0xf0000000) != 0xf0000000)) {
  59491                       Condition condition((instr >> 28) & 0xf);
  59492                       unsigned rd = (instr >> 12) & 0xf;
  59493                       unsigned rm = instr & 0xf;
  59494                       unsigned rs = (instr >> 8) & 0xf;
  59495                       // LSLS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
  59496                       lsls(condition,
  59497                            Best,
  59498                            Register(rd),
  59499                            Register(rm),
  59500                            Register(rs));
  59501                       if (((instr & 0xfff00f0) != 0x1b00010)) {
  59502                         UnpredictableA32(instr);
  59503                       }
  59504                       return;
  59505                     }
  59506                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) &&
  59507                         ((instr & 0xf0000000) != 0xf0000000)) {
  59508                       Condition condition((instr >> 28) & 0xf);
  59509                       unsigned rd = (instr >> 12) & 0xf;
  59510                       unsigned rm = instr & 0xf;
  59511                       unsigned rs = (instr >> 8) & 0xf;
  59512                       // LSRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
  59513                       lsrs(condition,
  59514                            Best,
  59515                            Register(rd),
  59516                            Register(rm),
  59517                            Register(rs));
  59518                       if (((instr & 0xfff00f0) != 0x1b00030)) {
  59519                         UnpredictableA32(instr);
  59520                       }
  59521                       return;
  59522                     }
  59523                     if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) &&
  59524                         ((instr & 0xf0000000) != 0xf0000000)) {
  59525                       Condition condition((instr >> 28) & 0xf);
  59526                       unsigned rd = (instr >> 12) & 0xf;
  59527                       unsigned rm = instr & 0xf;
  59528                       unsigned rs = (instr >> 8) & 0xf;
  59529                       // RORS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1
  59530                       rors(condition,
  59531                            Best,
  59532                            Register(rd),
  59533                            Register(rm),
  59534                            Register(rs));
  59535                       if (((instr & 0xfff00f0) != 0x1b00070)) {
  59536                         UnpredictableA32(instr);
  59537                       }
  59538                       return;
  59539                     }
  59540                     Condition condition((instr >> 28) & 0xf);
  59541                     unsigned rd = (instr >> 12) & 0xf;
  59542                     unsigned rm = instr & 0xf;
  59543                     Shift shift((instr >> 5) & 0x3);
  59544                     unsigned rs = (instr >> 8) & 0xf;
  59545                     // MOVS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
  59546                     movs(condition,
  59547                          Best,
  59548                          Register(rd),
  59549                          Operand(Register(rm), shift.GetType(), Register(rs)));
  59550                     if (((instr & 0xfff0090) != 0x1b00010)) {
  59551                       UnpredictableA32(instr);
  59552                     }
  59553                     break;
  59554                   }
  59555                 }
  59556                 break;
  59557               }
  59558               case 0x00000080: {
  59559                 // 0x00100090
  59560                 switch (instr & 0x01200060) {
  59561                   case 0x00000000: {
  59562                     // 0x00100090
  59563                     switch (instr & 0x00800000) {
  59564                       case 0x00000000: {
  59565                         // 0x00100090
  59566                         if (((instr & 0xf0000000) == 0xf0000000)) {
  59567                           UnallocatedA32(instr);
  59568                           return;
  59569                         }
  59570                         Condition condition((instr >> 28) & 0xf);
  59571                         unsigned rd = (instr >> 16) & 0xf;
  59572                         unsigned rn = instr & 0xf;
  59573                         unsigned rm = (instr >> 8) & 0xf;
  59574                         // MULS{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1
  59575                         muls(condition,
  59576                              Register(rd),
  59577                              Register(rn),
  59578                              Register(rm));
  59579                         if (((instr & 0xff0f0f0) != 0x100090)) {
  59580                           UnpredictableA32(instr);
  59581                         }
  59582                         break;
  59583                       }
  59584                       case 0x00800000: {
  59585                         // 0x00900090
  59586                         if (((instr & 0xf0000000) == 0xf0000000)) {
  59587                           UnallocatedA32(instr);
  59588                           return;
  59589                         }
  59590                         Condition condition((instr >> 28) & 0xf);
  59591                         unsigned rdlo = (instr >> 12) & 0xf;
  59592                         unsigned rdhi = (instr >> 16) & 0xf;
  59593                         unsigned rn = instr & 0xf;
  59594                         unsigned rm = (instr >> 8) & 0xf;
  59595                         // UMULLS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
  59596                         umulls(condition,
  59597                                Register(rdlo),
  59598                                Register(rdhi),
  59599                                Register(rn),
  59600                                Register(rm));
  59601                         break;
  59602                       }
  59603                     }
  59604                     break;
  59605                   }
  59606                   case 0x00000020: {
  59607                     // 0x001000b0
  59608                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59609                       UnallocatedA32(instr);
  59610                       return;
  59611                     }
  59612                     Condition condition((instr >> 28) & 0xf);
  59613                     unsigned rt = (instr >> 12) & 0xf;
  59614                     unsigned rn = (instr >> 16) & 0xf;
  59615                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  59616                     unsigned rm = instr & 0xf;
  59617                     // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
  59618                     ldrh(condition,
  59619                          Best,
  59620                          Register(rt),
  59621                          MemOperand(Register(rn),
  59622                                     sign,
  59623                                     Register(rm),
  59624                                     PostIndex));
  59625                     if (((instr & 0xf700ff0) != 0x1000b0)) {
  59626                       UnpredictableA32(instr);
  59627                     }
  59628                     break;
  59629                   }
  59630                   case 0x00000040: {
  59631                     // 0x001000d0
  59632                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59633                       UnallocatedA32(instr);
  59634                       return;
  59635                     }
  59636                     Condition condition((instr >> 28) & 0xf);
  59637                     unsigned rt = (instr >> 12) & 0xf;
  59638                     unsigned rn = (instr >> 16) & 0xf;
  59639                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  59640                     unsigned rm = instr & 0xf;
  59641                     // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
  59642                     ldrsb(condition,
  59643                           Best,
  59644                           Register(rt),
  59645                           MemOperand(Register(rn),
  59646                                      sign,
  59647                                      Register(rm),
  59648                                      PostIndex));
  59649                     if (((instr & 0xf700ff0) != 0x1000d0)) {
  59650                       UnpredictableA32(instr);
  59651                     }
  59652                     break;
  59653                   }
  59654                   case 0x00000060: {
  59655                     // 0x001000f0
  59656                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59657                       UnallocatedA32(instr);
  59658                       return;
  59659                     }
  59660                     Condition condition((instr >> 28) & 0xf);
  59661                     unsigned rt = (instr >> 12) & 0xf;
  59662                     unsigned rn = (instr >> 16) & 0xf;
  59663                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  59664                     unsigned rm = instr & 0xf;
  59665                     // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1
  59666                     ldrsh(condition,
  59667                           Best,
  59668                           Register(rt),
  59669                           MemOperand(Register(rn),
  59670                                      sign,
  59671                                      Register(rm),
  59672                                      PostIndex));
  59673                     if (((instr & 0xf700ff0) != 0x1000f0)) {
  59674                       UnpredictableA32(instr);
  59675                     }
  59676                     break;
  59677                   }
  59678                   case 0x00200000: {
  59679                     // 0x00300090
  59680                     switch (instr & 0x00800000) {
  59681                       case 0x00000000: {
  59682                         // 0x00300090
  59683                         if (((instr & 0xf0000000) == 0xf0000000)) {
  59684                           UnallocatedA32(instr);
  59685                           return;
  59686                         }
  59687                         Condition condition((instr >> 28) & 0xf);
  59688                         unsigned rd = (instr >> 16) & 0xf;
  59689                         unsigned rn = instr & 0xf;
  59690                         unsigned rm = (instr >> 8) & 0xf;
  59691                         unsigned ra = (instr >> 12) & 0xf;
  59692                         // MLAS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
  59693                         mlas(condition,
  59694                              Register(rd),
  59695                              Register(rn),
  59696                              Register(rm),
  59697                              Register(ra));
  59698                         break;
  59699                       }
  59700                       case 0x00800000: {
  59701                         // 0x00b00090
  59702                         if (((instr & 0xf0000000) == 0xf0000000)) {
  59703                           UnallocatedA32(instr);
  59704                           return;
  59705                         }
  59706                         Condition condition((instr >> 28) & 0xf);
  59707                         unsigned rdlo = (instr >> 12) & 0xf;
  59708                         unsigned rdhi = (instr >> 16) & 0xf;
  59709                         unsigned rn = instr & 0xf;
  59710                         unsigned rm = (instr >> 8) & 0xf;
  59711                         // UMLALS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
  59712                         umlals(condition,
  59713                                Register(rdlo),
  59714                                Register(rdhi),
  59715                                Register(rn),
  59716                                Register(rm));
  59717                         break;
  59718                       }
  59719                     }
  59720                     break;
  59721                   }
  59722                   case 0x00200020: {
  59723                     // 0x003000b0
  59724                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59725                       UnallocatedA32(instr);
  59726                       return;
  59727                     }
  59728                     UnimplementedA32("LDRHT", instr);
  59729                     break;
  59730                   }
  59731                   case 0x00200040: {
  59732                     // 0x003000d0
  59733                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59734                       UnallocatedA32(instr);
  59735                       return;
  59736                     }
  59737                     UnimplementedA32("LDRSBT", instr);
  59738                     break;
  59739                   }
  59740                   case 0x00200060: {
  59741                     // 0x003000f0
  59742                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59743                       UnallocatedA32(instr);
  59744                       return;
  59745                     }
  59746                     UnimplementedA32("LDRSHT", instr);
  59747                     break;
  59748                   }
  59749                   case 0x01000000: {
  59750                     // 0x01100090
  59751                     switch (instr & 0x00800300) {
  59752                       case 0x00800000: {
  59753                         // 0x01900090
  59754                         if (((instr & 0xf0000000) == 0xf0000000)) {
  59755                           UnallocatedA32(instr);
  59756                           return;
  59757                         }
  59758                         Condition condition((instr >> 28) & 0xf);
  59759                         unsigned rt = (instr >> 12) & 0xf;
  59760                         unsigned rn = (instr >> 16) & 0xf;
  59761                         // LDA{<c>}{<q>} <Rt>, [<Rn>] ; A1
  59762                         lda(condition,
  59763                             Register(rt),
  59764                             MemOperand(Register(rn), Offset));
  59765                         if (((instr & 0xff00fff) != 0x1900c9f)) {
  59766                           UnpredictableA32(instr);
  59767                         }
  59768                         break;
  59769                       }
  59770                       case 0x00800200: {
  59771                         // 0x01900290
  59772                         if (((instr & 0xf0000000) == 0xf0000000)) {
  59773                           UnallocatedA32(instr);
  59774                           return;
  59775                         }
  59776                         Condition condition((instr >> 28) & 0xf);
  59777                         unsigned rt = (instr >> 12) & 0xf;
  59778                         unsigned rn = (instr >> 16) & 0xf;
  59779                         // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; A1
  59780                         ldaex(condition,
  59781                               Register(rt),
  59782                               MemOperand(Register(rn), Offset));
  59783                         if (((instr & 0xff00fff) != 0x1900e9f)) {
  59784                           UnpredictableA32(instr);
  59785                         }
  59786                         break;
  59787                       }
  59788                       case 0x00800300: {
  59789                         // 0x01900390
  59790                         if (((instr & 0xf0000000) == 0xf0000000)) {
  59791                           UnallocatedA32(instr);
  59792                           return;
  59793                         }
  59794                         Condition condition((instr >> 28) & 0xf);
  59795                         unsigned rt = (instr >> 12) & 0xf;
  59796                         unsigned rn = (instr >> 16) & 0xf;
  59797                         // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm_1>}] ; A1
  59798                         ldrex(condition,
  59799                               Register(rt),
  59800                               MemOperand(Register(rn), plus, 0, Offset));
  59801                         if (((instr & 0xff00fff) != 0x1900f9f)) {
  59802                           UnpredictableA32(instr);
  59803                         }
  59804                         break;
  59805                       }
  59806                       default:
  59807                         UnallocatedA32(instr);
  59808                         break;
  59809                     }
  59810                     break;
  59811                   }
  59812                   case 0x01000020: {
  59813                     // 0x011000b0
  59814                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59815                       UnallocatedA32(instr);
  59816                       return;
  59817                     }
  59818                     Condition condition((instr >> 28) & 0xf);
  59819                     unsigned rt = (instr >> 12) & 0xf;
  59820                     unsigned rn = (instr >> 16) & 0xf;
  59821                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  59822                     unsigned rm = instr & 0xf;
  59823                     AddrMode addrmode = Offset;
  59824                     // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
  59825                     ldrh(condition,
  59826                          Best,
  59827                          Register(rt),
  59828                          MemOperand(Register(rn),
  59829                                     sign,
  59830                                     Register(rm),
  59831                                     addrmode));
  59832                     if (((instr & 0xf700ff0) != 0x11000b0)) {
  59833                       UnpredictableA32(instr);
  59834                     }
  59835                     break;
  59836                   }
  59837                   case 0x01000040: {
  59838                     // 0x011000d0
  59839                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59840                       UnallocatedA32(instr);
  59841                       return;
  59842                     }
  59843                     Condition condition((instr >> 28) & 0xf);
  59844                     unsigned rt = (instr >> 12) & 0xf;
  59845                     unsigned rn = (instr >> 16) & 0xf;
  59846                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  59847                     unsigned rm = instr & 0xf;
  59848                     AddrMode addrmode = Offset;
  59849                     // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
  59850                     ldrsb(condition,
  59851                           Best,
  59852                           Register(rt),
  59853                           MemOperand(Register(rn),
  59854                                      sign,
  59855                                      Register(rm),
  59856                                      addrmode));
  59857                     if (((instr & 0xf700ff0) != 0x11000d0)) {
  59858                       UnpredictableA32(instr);
  59859                     }
  59860                     break;
  59861                   }
  59862                   case 0x01000060: {
  59863                     // 0x011000f0
  59864                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59865                       UnallocatedA32(instr);
  59866                       return;
  59867                     }
  59868                     Condition condition((instr >> 28) & 0xf);
  59869                     unsigned rt = (instr >> 12) & 0xf;
  59870                     unsigned rn = (instr >> 16) & 0xf;
  59871                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  59872                     unsigned rm = instr & 0xf;
  59873                     AddrMode addrmode = Offset;
  59874                     // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1
  59875                     ldrsh(condition,
  59876                           Best,
  59877                           Register(rt),
  59878                           MemOperand(Register(rn),
  59879                                      sign,
  59880                                      Register(rm),
  59881                                      addrmode));
  59882                     if (((instr & 0xf700ff0) != 0x11000f0)) {
  59883                       UnpredictableA32(instr);
  59884                     }
  59885                     break;
  59886                   }
  59887                   case 0x01200000: {
  59888                     // 0x01300090
  59889                     switch (instr & 0x00800300) {
  59890                       case 0x00800200: {
  59891                         // 0x01b00290
  59892                         if (((instr & 0xf0000000) == 0xf0000000)) {
  59893                           UnallocatedA32(instr);
  59894                           return;
  59895                         }
  59896                         Condition condition((instr >> 28) & 0xf);
  59897                         unsigned rt = (instr >> 12) & 0xf;
  59898                         unsigned rn = (instr >> 16) & 0xf;
  59899                         // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; A1
  59900                         ldaexd(condition,
  59901                                Register(rt),
  59902                                Register(rt + 1),
  59903                                MemOperand(Register(rn), Offset));
  59904                         if (((instr & 0xff00fff) != 0x1b00e9f)) {
  59905                           UnpredictableA32(instr);
  59906                         }
  59907                         break;
  59908                       }
  59909                       case 0x00800300: {
  59910                         // 0x01b00390
  59911                         if (((instr & 0xf0000000) == 0xf0000000)) {
  59912                           UnallocatedA32(instr);
  59913                           return;
  59914                         }
  59915                         Condition condition((instr >> 28) & 0xf);
  59916                         unsigned rt = (instr >> 12) & 0xf;
  59917                         unsigned rn = (instr >> 16) & 0xf;
  59918                         // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; A1
  59919                         ldrexd(condition,
  59920                                Register(rt),
  59921                                Register(rt + 1),
  59922                                MemOperand(Register(rn), Offset));
  59923                         if (((instr & 0xff00fff) != 0x1b00f9f)) {
  59924                           UnpredictableA32(instr);
  59925                         }
  59926                         break;
  59927                       }
  59928                       default:
  59929                         UnallocatedA32(instr);
  59930                         break;
  59931                     }
  59932                     break;
  59933                   }
  59934                   case 0x01200020: {
  59935                     // 0x013000b0
  59936                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59937                       UnallocatedA32(instr);
  59938                       return;
  59939                     }
  59940                     Condition condition((instr >> 28) & 0xf);
  59941                     unsigned rt = (instr >> 12) & 0xf;
  59942                     unsigned rn = (instr >> 16) & 0xf;
  59943                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  59944                     unsigned rm = instr & 0xf;
  59945                     AddrMode addrmode = PreIndex;
  59946                     // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
  59947                     ldrh(condition,
  59948                          Best,
  59949                          Register(rt),
  59950                          MemOperand(Register(rn),
  59951                                     sign,
  59952                                     Register(rm),
  59953                                     addrmode));
  59954                     if (((instr & 0xf700ff0) != 0x13000b0)) {
  59955                       UnpredictableA32(instr);
  59956                     }
  59957                     break;
  59958                   }
  59959                   case 0x01200040: {
  59960                     // 0x013000d0
  59961                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59962                       UnallocatedA32(instr);
  59963                       return;
  59964                     }
  59965                     Condition condition((instr >> 28) & 0xf);
  59966                     unsigned rt = (instr >> 12) & 0xf;
  59967                     unsigned rn = (instr >> 16) & 0xf;
  59968                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  59969                     unsigned rm = instr & 0xf;
  59970                     AddrMode addrmode = PreIndex;
  59971                     // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
  59972                     ldrsb(condition,
  59973                           Best,
  59974                           Register(rt),
  59975                           MemOperand(Register(rn),
  59976                                      sign,
  59977                                      Register(rm),
  59978                                      addrmode));
  59979                     if (((instr & 0xf700ff0) != 0x13000d0)) {
  59980                       UnpredictableA32(instr);
  59981                     }
  59982                     break;
  59983                   }
  59984                   case 0x01200060: {
  59985                     // 0x013000f0
  59986                     if (((instr & 0xf0000000) == 0xf0000000)) {
  59987                       UnallocatedA32(instr);
  59988                       return;
  59989                     }
  59990                     Condition condition((instr >> 28) & 0xf);
  59991                     unsigned rt = (instr >> 12) & 0xf;
  59992                     unsigned rn = (instr >> 16) & 0xf;
  59993                     Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  59994                     unsigned rm = instr & 0xf;
  59995                     AddrMode addrmode = PreIndex;
  59996                     // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1
  59997                     ldrsh(condition,
  59998                           Best,
  59999                           Register(rt),
  60000                           MemOperand(Register(rn),
  60001                                      sign,
  60002                                      Register(rm),
  60003                                      addrmode));
  60004                     if (((instr & 0xf700ff0) != 0x13000f0)) {
  60005                       UnpredictableA32(instr);
  60006                     }
  60007                     break;
  60008                   }
  60009                 }
  60010                 break;
  60011               }
  60012               case 0x00400000: {
  60013                 // 0x00500010
  60014                 switch (instr & 0x01a00000) {
  60015                   case 0x00000000: {
  60016                     // 0x00500010
  60017                     if (((instr & 0xf0000000) == 0xf0000000)) {
  60018                       UnallocatedA32(instr);
  60019                       return;
  60020                     }
  60021                     Condition condition((instr >> 28) & 0xf);
  60022                     unsigned rd = (instr >> 12) & 0xf;
  60023                     unsigned rn = (instr >> 16) & 0xf;
  60024                     unsigned rm = instr & 0xf;
  60025                     Shift shift((instr >> 5) & 0x3);
  60026                     unsigned rs = (instr >> 8) & 0xf;
  60027                     // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  60028                     subs(condition,
  60029                          Best,
  60030                          Register(rd),
  60031                          Register(rn),
  60032                          Operand(Register(rm), shift.GetType(), Register(rs)));
  60033                     break;
  60034                   }
  60035                   case 0x00200000: {
  60036                     // 0x00700010
  60037                     if (((instr & 0xf0000000) == 0xf0000000)) {
  60038                       UnallocatedA32(instr);
  60039                       return;
  60040                     }
  60041                     Condition condition((instr >> 28) & 0xf);
  60042                     unsigned rd = (instr >> 12) & 0xf;
  60043                     unsigned rn = (instr >> 16) & 0xf;
  60044                     unsigned rm = instr & 0xf;
  60045                     Shift shift((instr >> 5) & 0x3);
  60046                     unsigned rs = (instr >> 8) & 0xf;
  60047                     // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  60048                     rsbs(condition,
  60049                          Best,
  60050                          Register(rd),
  60051                          Register(rn),
  60052                          Operand(Register(rm), shift.GetType(), Register(rs)));
  60053                     break;
  60054                   }
  60055                   case 0x00800000: {
  60056                     // 0x00d00010
  60057                     if (((instr & 0xf0000000) == 0xf0000000)) {
  60058                       UnallocatedA32(instr);
  60059                       return;
  60060                     }
  60061                     Condition condition((instr >> 28) & 0xf);
  60062                     unsigned rd = (instr >> 12) & 0xf;
  60063                     unsigned rn = (instr >> 16) & 0xf;
  60064                     unsigned rm = instr & 0xf;
  60065                     Shift shift((instr >> 5) & 0x3);
  60066                     unsigned rs = (instr >> 8) & 0xf;
  60067                     // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  60068                     sbcs(condition,
  60069                          Best,
  60070                          Register(rd),
  60071                          Register(rn),
  60072                          Operand(Register(rm), shift.GetType(), Register(rs)));
  60073                     break;
  60074                   }
  60075                   case 0x00a00000: {
  60076                     // 0x00f00010
  60077                     if (((instr & 0xf0000000) == 0xf0000000)) {
  60078                       UnallocatedA32(instr);
  60079                       return;
  60080                     }
  60081                     Condition condition((instr >> 28) & 0xf);
  60082                     unsigned rd = (instr >> 12) & 0xf;
  60083                     unsigned rn = (instr >> 16) & 0xf;
  60084                     unsigned rm = instr & 0xf;
  60085                     Shift shift((instr >> 5) & 0x3);
  60086                     unsigned rs = (instr >> 8) & 0xf;
  60087                     // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  60088                     rscs(condition,
  60089                          Register(rd),
  60090                          Register(rn),
  60091                          Operand(Register(rm), shift.GetType(), Register(rs)));
  60092                     break;
  60093                   }
  60094                   case 0x01000000: {
  60095                     // 0x01500010
  60096                     if (((instr & 0xf0000000) == 0xf0000000)) {
  60097                       UnallocatedA32(instr);
  60098                       return;
  60099                     }
  60100                     Condition condition((instr >> 28) & 0xf);
  60101                     unsigned rn = (instr >> 16) & 0xf;
  60102                     unsigned rm = instr & 0xf;
  60103                     Shift shift((instr >> 5) & 0x3);
  60104                     unsigned rs = (instr >> 8) & 0xf;
  60105                     // CMP{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
  60106                     cmp(condition,
  60107                         Best,
  60108                         Register(rn),
  60109                         Operand(Register(rm), shift.GetType(), Register(rs)));
  60110                     if (((instr & 0xff0f090) != 0x1500010)) {
  60111                       UnpredictableA32(instr);
  60112                     }
  60113                     break;
  60114                   }
  60115                   case 0x01200000: {
  60116                     // 0x01700010
  60117                     if (((instr & 0xf0000000) == 0xf0000000)) {
  60118                       UnallocatedA32(instr);
  60119                       return;
  60120                     }
  60121                     Condition condition((instr >> 28) & 0xf);
  60122                     unsigned rn = (instr >> 16) & 0xf;
  60123                     unsigned rm = instr & 0xf;
  60124                     Shift shift((instr >> 5) & 0x3);
  60125                     unsigned rs = (instr >> 8) & 0xf;
  60126                     // CMN{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1
  60127                     cmn(condition,
  60128                         Best,
  60129                         Register(rn),
  60130                         Operand(Register(rm), shift.GetType(), Register(rs)));
  60131                     if (((instr & 0xff0f090) != 0x1700010)) {
  60132                       UnpredictableA32(instr);
  60133                     }
  60134                     break;
  60135                   }
  60136                   case 0x01800000: {
  60137                     // 0x01d00010
  60138                     if (((instr & 0xf0000000) == 0xf0000000)) {
  60139                       UnallocatedA32(instr);
  60140                       return;
  60141                     }
  60142                     Condition condition((instr >> 28) & 0xf);
  60143                     unsigned rd = (instr >> 12) & 0xf;
  60144                     unsigned rn = (instr >> 16) & 0xf;
  60145                     unsigned rm = instr & 0xf;
  60146                     Shift shift((instr >> 5) & 0x3);
  60147                     unsigned rs = (instr >> 8) & 0xf;
  60148                     // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1
  60149                     bics(condition,
  60150                          Best,
  60151                          Register(rd),
  60152                          Register(rn),
  60153                          Operand(Register(rm), shift.GetType(), Register(rs)));
  60154                     break;
  60155                   }
  60156                   case 0x01a00000: {
  60157                     // 0x01f00010
  60158                     if (((instr & 0xf0000000) == 0xf0000000)) {
  60159                       UnallocatedA32(instr);
  60160                       return;
  60161                     }
  60162                     Condition condition((instr >> 28) & 0xf);
  60163                     unsigned rd = (instr >> 12) & 0xf;
  60164                     unsigned rm = instr & 0xf;
  60165                     Shift shift((instr >> 5) & 0x3);
  60166                     unsigned rs = (instr >> 8) & 0xf;
  60167                     // MVNS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1
  60168                     mvns(condition,
  60169                          Best,
  60170                          Register(rd),
  60171                          Operand(Register(rm), shift.GetType(), Register(rs)));
  60172                     if (((instr & 0xfff0090) != 0x1f00010)) {
  60173                       UnpredictableA32(instr);
  60174                     }
  60175                     break;
  60176                   }
  60177                 }
  60178                 break;
  60179               }
  60180               case 0x00400080: {
  60181                 // 0x00500090
  60182                 switch (instr & 0x00000060) {
  60183                   case 0x00000000: {
  60184                     // 0x00500090
  60185                     switch (instr & 0x01a00000) {
  60186                       case 0x00800000: {
  60187                         // 0x00d00090
  60188                         if (((instr & 0xf0000000) == 0xf0000000)) {
  60189                           UnallocatedA32(instr);
  60190                           return;
  60191                         }
  60192                         Condition condition((instr >> 28) & 0xf);
  60193                         unsigned rdlo = (instr >> 12) & 0xf;
  60194                         unsigned rdhi = (instr >> 16) & 0xf;
  60195                         unsigned rn = instr & 0xf;
  60196                         unsigned rm = (instr >> 8) & 0xf;
  60197                         // SMULLS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
  60198                         smulls(condition,
  60199                                Register(rdlo),
  60200                                Register(rdhi),
  60201                                Register(rn),
  60202                                Register(rm));
  60203                         break;
  60204                       }
  60205                       case 0x00a00000: {
  60206                         // 0x00f00090
  60207                         if (((instr & 0xf0000000) == 0xf0000000)) {
  60208                           UnallocatedA32(instr);
  60209                           return;
  60210                         }
  60211                         Condition condition((instr >> 28) & 0xf);
  60212                         unsigned rdlo = (instr >> 12) & 0xf;
  60213                         unsigned rdhi = (instr >> 16) & 0xf;
  60214                         unsigned rn = instr & 0xf;
  60215                         unsigned rm = (instr >> 8) & 0xf;
  60216                         // SMLALS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
  60217                         smlals(condition,
  60218                                Register(rdlo),
  60219                                Register(rdhi),
  60220                                Register(rn),
  60221                                Register(rm));
  60222                         break;
  60223                       }
  60224                       case 0x01800000: {
  60225                         // 0x01d00090
  60226                         switch (instr & 0x00000300) {
  60227                           case 0x00000000: {
  60228                             // 0x01d00090
  60229                             if (((instr & 0xf0000000) == 0xf0000000)) {
  60230                               UnallocatedA32(instr);
  60231                               return;
  60232                             }
  60233                             Condition condition((instr >> 28) & 0xf);
  60234                             unsigned rt = (instr >> 12) & 0xf;
  60235                             unsigned rn = (instr >> 16) & 0xf;
  60236                             // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; A1
  60237                             ldab(condition,
  60238                                  Register(rt),
  60239                                  MemOperand(Register(rn), Offset));
  60240                             if (((instr & 0xff00fff) != 0x1d00c9f)) {
  60241                               UnpredictableA32(instr);
  60242                             }
  60243                             break;
  60244                           }
  60245                           case 0x00000200: {
  60246                             // 0x01d00290
  60247                             if (((instr & 0xf0000000) == 0xf0000000)) {
  60248                               UnallocatedA32(instr);
  60249                               return;
  60250                             }
  60251                             Condition condition((instr >> 28) & 0xf);
  60252                             unsigned rt = (instr >> 12) & 0xf;
  60253                             unsigned rn = (instr >> 16) & 0xf;
  60254                             // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; A1
  60255                             ldaexb(condition,
  60256                                    Register(rt),
  60257                                    MemOperand(Register(rn), Offset));
  60258                             if (((instr & 0xff00fff) != 0x1d00e9f)) {
  60259                               UnpredictableA32(instr);
  60260                             }
  60261                             break;
  60262                           }
  60263                           case 0x00000300: {
  60264                             // 0x01d00390
  60265                             if (((instr & 0xf0000000) == 0xf0000000)) {
  60266                               UnallocatedA32(instr);
  60267                               return;
  60268                             }
  60269                             Condition condition((instr >> 28) & 0xf);
  60270                             unsigned rt = (instr >> 12) & 0xf;
  60271                             unsigned rn = (instr >> 16) & 0xf;
  60272                             // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; A1
  60273                             ldrexb(condition,
  60274                                    Register(rt),
  60275                                    MemOperand(Register(rn), Offset));
  60276                             if (((instr & 0xff00fff) != 0x1d00f9f)) {
  60277                               UnpredictableA32(instr);
  60278                             }
  60279                             break;
  60280                           }
  60281                           default:
  60282                             UnallocatedA32(instr);
  60283                             break;
  60284                         }
  60285                         break;
  60286                       }
  60287                       case 0x01a00000: {
  60288                         // 0x01f00090
  60289                         switch (instr & 0x00000300) {
  60290                           case 0x00000000: {
  60291                             // 0x01f00090
  60292                             if (((instr & 0xf0000000) == 0xf0000000)) {
  60293                               UnallocatedA32(instr);
  60294                               return;
  60295                             }
  60296                             Condition condition((instr >> 28) & 0xf);
  60297                             unsigned rt = (instr >> 12) & 0xf;
  60298                             unsigned rn = (instr >> 16) & 0xf;
  60299                             // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; A1
  60300                             ldah(condition,
  60301                                  Register(rt),
  60302                                  MemOperand(Register(rn), Offset));
  60303                             if (((instr & 0xff00fff) != 0x1f00c9f)) {
  60304                               UnpredictableA32(instr);
  60305                             }
  60306                             break;
  60307                           }
  60308                           case 0x00000200: {
  60309                             // 0x01f00290
  60310                             if (((instr & 0xf0000000) == 0xf0000000)) {
  60311                               UnallocatedA32(instr);
  60312                               return;
  60313                             }
  60314                             Condition condition((instr >> 28) & 0xf);
  60315                             unsigned rt = (instr >> 12) & 0xf;
  60316                             unsigned rn = (instr >> 16) & 0xf;
  60317                             // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; A1
  60318                             ldaexh(condition,
  60319                                    Register(rt),
  60320                                    MemOperand(Register(rn), Offset));
  60321                             if (((instr & 0xff00fff) != 0x1f00e9f)) {
  60322                               UnpredictableA32(instr);
  60323                             }
  60324                             break;
  60325                           }
  60326                           case 0x00000300: {
  60327                             // 0x01f00390
  60328                             if (((instr & 0xf0000000) == 0xf0000000)) {
  60329                               UnallocatedA32(instr);
  60330                               return;
  60331                             }
  60332                             Condition condition((instr >> 28) & 0xf);
  60333                             unsigned rt = (instr >> 12) & 0xf;
  60334                             unsigned rn = (instr >> 16) & 0xf;
  60335                             // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; A1
  60336                             ldrexh(condition,
  60337                                    Register(rt),
  60338                                    MemOperand(Register(rn), Offset));
  60339                             if (((instr & 0xff00fff) != 0x1f00f9f)) {
  60340                               UnpredictableA32(instr);
  60341                             }
  60342                             break;
  60343                           }
  60344                           default:
  60345                             UnallocatedA32(instr);
  60346                             break;
  60347                         }
  60348                         break;
  60349                       }
  60350                       default:
  60351                         UnallocatedA32(instr);
  60352                         break;
  60353                     }
  60354                     break;
  60355                   }
  60356                   case 0x00000020: {
  60357                     // 0x005000b0
  60358                     switch (instr & 0x01200000) {
  60359                       case 0x00000000: {
  60360                         // 0x005000b0
  60361                         switch (instr & 0x000f0000) {
  60362                           case 0x000f0000: {
  60363                             // 0x005f00b0
  60364                             if (((instr & 0xf0000000) == 0xf0000000) ||
  60365                                 ((instr & 0x1200000) == 0x200000)) {
  60366                               UnallocatedA32(instr);
  60367                               return;
  60368                             }
  60369                             Condition condition((instr >> 28) & 0xf);
  60370                             unsigned rt = (instr >> 12) & 0xf;
  60371                             uint32_t U = (instr >> 23) & 0x1;
  60372                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
  60373                             if (U == 0) imm = -imm;
  60374                             bool minus_zero = (imm == 0) && (U == 0);
  60375                             Location location(imm, kA32PcDelta);
  60376                             // LDRH{<c>}{<q>} <Rt>, <label> ; A1
  60377                             if (minus_zero) {
  60378                               ldrh(condition,
  60379                                    Best,
  60380                                    Register(rt),
  60381                                    MemOperand(pc, minus, 0));
  60382                             } else {
  60383                               ldrh(condition, Register(rt), &location);
  60384                             }
  60385                             if (((instr & 0xf7f00f0) != 0x15f00b0)) {
  60386                               UnpredictableA32(instr);
  60387                             }
  60388                             break;
  60389                           }
  60390                           default: {
  60391                             if (((instr & 0xf0000000) == 0xf0000000) ||
  60392                                 ((instr & 0xf0000) == 0xf0000)) {
  60393                               UnallocatedA32(instr);
  60394                               return;
  60395                             }
  60396                             Condition condition((instr >> 28) & 0xf);
  60397                             unsigned rt = (instr >> 12) & 0xf;
  60398                             unsigned rn = (instr >> 16) & 0xf;
  60399                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  60400                                                                    : plus);
  60401                             int32_t offset =
  60402                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
  60403                             // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
  60404                             ldrh(condition,
  60405                                  Best,
  60406                                  Register(rt),
  60407                                  MemOperand(Register(rn),
  60408                                             sign,
  60409                                             offset,
  60410                                             PostIndex));
  60411                             break;
  60412                           }
  60413                         }
  60414                         break;
  60415                       }
  60416                       case 0x00200000: {
  60417                         // 0x007000b0
  60418                         if (((instr & 0xf0000000) == 0xf0000000)) {
  60419                           UnallocatedA32(instr);
  60420                           return;
  60421                         }
  60422                         UnimplementedA32("LDRHT", instr);
  60423                         break;
  60424                       }
  60425                       case 0x01000000: {
  60426                         // 0x015000b0
  60427                         switch (instr & 0x000f0000) {
  60428                           case 0x000f0000: {
  60429                             // 0x015f00b0
  60430                             if (((instr & 0xf0000000) == 0xf0000000) ||
  60431                                 ((instr & 0x1200000) == 0x200000)) {
  60432                               UnallocatedA32(instr);
  60433                               return;
  60434                             }
  60435                             Condition condition((instr >> 28) & 0xf);
  60436                             unsigned rt = (instr >> 12) & 0xf;
  60437                             uint32_t U = (instr >> 23) & 0x1;
  60438                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
  60439                             if (U == 0) imm = -imm;
  60440                             bool minus_zero = (imm == 0) && (U == 0);
  60441                             Location location(imm, kA32PcDelta);
  60442                             // LDRH{<c>}{<q>} <Rt>, <label> ; A1
  60443                             if (minus_zero) {
  60444                               ldrh(condition,
  60445                                    Best,
  60446                                    Register(rt),
  60447                                    MemOperand(pc, minus, 0));
  60448                             } else {
  60449                               ldrh(condition, Register(rt), &location);
  60450                             }
  60451                             if (((instr & 0xf7f00f0) != 0x15f00b0)) {
  60452                               UnpredictableA32(instr);
  60453                             }
  60454                             break;
  60455                           }
  60456                           default: {
  60457                             if (((instr & 0xf0000000) == 0xf0000000) ||
  60458                                 ((instr & 0xf0000) == 0xf0000)) {
  60459                               UnallocatedA32(instr);
  60460                               return;
  60461                             }
  60462                             Condition condition((instr >> 28) & 0xf);
  60463                             unsigned rt = (instr >> 12) & 0xf;
  60464                             unsigned rn = (instr >> 16) & 0xf;
  60465                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  60466                                                                    : plus);
  60467                             int32_t offset =
  60468                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
  60469                             // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
  60470                             ldrh(condition,
  60471                                  Best,
  60472                                  Register(rt),
  60473                                  MemOperand(Register(rn),
  60474                                             sign,
  60475                                             offset,
  60476                                             Offset));
  60477                             break;
  60478                           }
  60479                         }
  60480                         break;
  60481                       }
  60482                       case 0x01200000: {
  60483                         // 0x017000b0
  60484                         switch (instr & 0x000f0000) {
  60485                           case 0x000f0000: {
  60486                             // 0x017f00b0
  60487                             if (((instr & 0xf0000000) == 0xf0000000) ||
  60488                                 ((instr & 0x1200000) == 0x200000)) {
  60489                               UnallocatedA32(instr);
  60490                               return;
  60491                             }
  60492                             Condition condition((instr >> 28) & 0xf);
  60493                             unsigned rt = (instr >> 12) & 0xf;
  60494                             uint32_t U = (instr >> 23) & 0x1;
  60495                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
  60496                             if (U == 0) imm = -imm;
  60497                             bool minus_zero = (imm == 0) && (U == 0);
  60498                             Location location(imm, kA32PcDelta);
  60499                             // LDRH{<c>}{<q>} <Rt>, <label> ; A1
  60500                             if (minus_zero) {
  60501                               ldrh(condition,
  60502                                    Best,
  60503                                    Register(rt),
  60504                                    MemOperand(pc, minus, 0));
  60505                             } else {
  60506                               ldrh(condition, Register(rt), &location);
  60507                             }
  60508                             if (((instr & 0xf7f00f0) != 0x15f00b0)) {
  60509                               UnpredictableA32(instr);
  60510                             }
  60511                             break;
  60512                           }
  60513                           default: {
  60514                             if (((instr & 0xf0000000) == 0xf0000000) ||
  60515                                 ((instr & 0xf0000) == 0xf0000)) {
  60516                               UnallocatedA32(instr);
  60517                               return;
  60518                             }
  60519                             Condition condition((instr >> 28) & 0xf);
  60520                             unsigned rt = (instr >> 12) & 0xf;
  60521                             unsigned rn = (instr >> 16) & 0xf;
  60522                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  60523                                                                    : plus);
  60524                             int32_t offset =
  60525                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
  60526                             // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1 NOLINT(whitespace/line_length)
  60527                             ldrh(condition,
  60528                                  Best,
  60529                                  Register(rt),
  60530                                  MemOperand(Register(rn),
  60531                                             sign,
  60532                                             offset,
  60533                                             PreIndex));
  60534                             break;
  60535                           }
  60536                         }
  60537                         break;
  60538                       }
  60539                     }
  60540                     break;
  60541                   }
  60542                   case 0x00000040: {
  60543                     // 0x005000d0
  60544                     switch (instr & 0x01200000) {
  60545                       case 0x00000000: {
  60546                         // 0x005000d0
  60547                         switch (instr & 0x000f0000) {
  60548                           case 0x000f0000: {
  60549                             // 0x005f00d0
  60550                             if (((instr & 0xf0000000) == 0xf0000000) ||
  60551                                 ((instr & 0x1200000) == 0x200000)) {
  60552                               UnallocatedA32(instr);
  60553                               return;
  60554                             }
  60555                             Condition condition((instr >> 28) & 0xf);
  60556                             unsigned rt = (instr >> 12) & 0xf;
  60557                             uint32_t U = (instr >> 23) & 0x1;
  60558                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
  60559                             if (U == 0) imm = -imm;
  60560                             bool minus_zero = (imm == 0) && (U == 0);
  60561                             Location location(imm, kA32PcDelta);
  60562                             // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
  60563                             if (minus_zero) {
  60564                               ldrsb(condition,
  60565                                     Best,
  60566                                     Register(rt),
  60567                                     MemOperand(pc, minus, 0));
  60568                             } else {
  60569                               ldrsb(condition, Register(rt), &location);
  60570                             }
  60571                             if (((instr & 0xf7f00f0) != 0x15f00d0)) {
  60572                               UnpredictableA32(instr);
  60573                             }
  60574                             break;
  60575                           }
  60576                           default: {
  60577                             if (((instr & 0xf0000000) == 0xf0000000) ||
  60578                                 ((instr & 0xf0000) == 0xf0000)) {
  60579                               UnallocatedA32(instr);
  60580                               return;
  60581                             }
  60582                             Condition condition((instr >> 28) & 0xf);
  60583                             unsigned rt = (instr >> 12) & 0xf;
  60584                             unsigned rn = (instr >> 16) & 0xf;
  60585                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  60586                                                                    : plus);
  60587                             int32_t offset =
  60588                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
  60589                             // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; A1
  60590                             ldrsb(condition,
  60591                                   Best,
  60592                                   Register(rt),
  60593                                   MemOperand(Register(rn),
  60594                                              sign,
  60595                                              offset,
  60596                                              PostIndex));
  60597                             break;
  60598                           }
  60599                         }
  60600                         break;
  60601                       }
  60602                       case 0x00200000: {
  60603                         // 0x007000d0
  60604                         if (((instr & 0xf0000000) == 0xf0000000)) {
  60605                           UnallocatedA32(instr);
  60606                           return;
  60607                         }
  60608                         UnimplementedA32("LDRSBT", instr);
  60609                         break;
  60610                       }
  60611                       case 0x01000000: {
  60612                         // 0x015000d0
  60613                         switch (instr & 0x000f0000) {
  60614                           case 0x000f0000: {
  60615                             // 0x015f00d0
  60616                             if (((instr & 0xf0000000) == 0xf0000000) ||
  60617                                 ((instr & 0x1200000) == 0x200000)) {
  60618                               UnallocatedA32(instr);
  60619                               return;
  60620                             }
  60621                             Condition condition((instr >> 28) & 0xf);
  60622                             unsigned rt = (instr >> 12) & 0xf;
  60623                             uint32_t U = (instr >> 23) & 0x1;
  60624                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
  60625                             if (U == 0) imm = -imm;
  60626                             bool minus_zero = (imm == 0) && (U == 0);
  60627                             Location location(imm, kA32PcDelta);
  60628                             // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
  60629                             if (minus_zero) {
  60630                               ldrsb(condition,
  60631                                     Best,
  60632                                     Register(rt),
  60633                                     MemOperand(pc, minus, 0));
  60634                             } else {
  60635                               ldrsb(condition, Register(rt), &location);
  60636                             }
  60637                             if (((instr & 0xf7f00f0) != 0x15f00d0)) {
  60638                               UnpredictableA32(instr);
  60639                             }
  60640                             break;
  60641                           }
  60642                           default: {
  60643                             if (((instr & 0xf0000000) == 0xf0000000) ||
  60644                                 ((instr & 0xf0000) == 0xf0000)) {
  60645                               UnallocatedA32(instr);
  60646                               return;
  60647                             }
  60648                             Condition condition((instr >> 28) & 0xf);
  60649                             unsigned rt = (instr >> 12) & 0xf;
  60650                             unsigned rn = (instr >> 16) & 0xf;
  60651                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  60652                                                                    : plus);
  60653                             int32_t offset =
  60654                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
  60655                             // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}] ; A1 NOLINT(whitespace/line_length)
  60656                             ldrsb(condition,
  60657                                   Best,
  60658                                   Register(rt),
  60659                                   MemOperand(Register(rn),
  60660                                              sign,
  60661                                              offset,
  60662                                              Offset));
  60663                             break;
  60664                           }
  60665                         }
  60666                         break;
  60667                       }
  60668                       case 0x01200000: {
  60669                         // 0x017000d0
  60670                         switch (instr & 0x000f0000) {
  60671                           case 0x000f0000: {
  60672                             // 0x017f00d0
  60673                             if (((instr & 0xf0000000) == 0xf0000000) ||
  60674                                 ((instr & 0x1200000) == 0x200000)) {
  60675                               UnallocatedA32(instr);
  60676                               return;
  60677                             }
  60678                             Condition condition((instr >> 28) & 0xf);
  60679                             unsigned rt = (instr >> 12) & 0xf;
  60680                             uint32_t U = (instr >> 23) & 0x1;
  60681                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
  60682                             if (U == 0) imm = -imm;
  60683                             bool minus_zero = (imm == 0) && (U == 0);
  60684                             Location location(imm, kA32PcDelta);
  60685                             // LDRSB{<c>}{<q>} <Rt>, <label> ; A1
  60686                             if (minus_zero) {
  60687                               ldrsb(condition,
  60688                                     Best,
  60689                                     Register(rt),
  60690                                     MemOperand(pc, minus, 0));
  60691                             } else {
  60692                               ldrsb(condition, Register(rt), &location);
  60693                             }
  60694                             if (((instr & 0xf7f00f0) != 0x15f00d0)) {
  60695                               UnpredictableA32(instr);
  60696                             }
  60697                             break;
  60698                           }
  60699                           default: {
  60700                             if (((instr & 0xf0000000) == 0xf0000000) ||
  60701                                 ((instr & 0xf0000) == 0xf0000)) {
  60702                               UnallocatedA32(instr);
  60703                               return;
  60704                             }
  60705                             Condition condition((instr >> 28) & 0xf);
  60706                             unsigned rt = (instr >> 12) & 0xf;
  60707                             unsigned rn = (instr >> 16) & 0xf;
  60708                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  60709                                                                    : plus);
  60710                             int32_t offset =
  60711                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
  60712                             // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; A1 NOLINT(whitespace/line_length)
  60713                             ldrsb(condition,
  60714                                   Best,
  60715                                   Register(rt),
  60716                                   MemOperand(Register(rn),
  60717                                              sign,
  60718                                              offset,
  60719                                              PreIndex));
  60720                             break;
  60721                           }
  60722                         }
  60723                         break;
  60724                       }
  60725                     }
  60726                     break;
  60727                   }
  60728                   case 0x00000060: {
  60729                     // 0x005000f0
  60730                     switch (instr & 0x01200000) {
  60731                       case 0x00000000: {
  60732                         // 0x005000f0
  60733                         switch (instr & 0x000f0000) {
  60734                           case 0x000f0000: {
  60735                             // 0x005f00f0
  60736                             if (((instr & 0xf0000000) == 0xf0000000) ||
  60737                                 ((instr & 0x1200000) == 0x200000)) {
  60738                               UnallocatedA32(instr);
  60739                               return;
  60740                             }
  60741                             Condition condition((instr >> 28) & 0xf);
  60742                             unsigned rt = (instr >> 12) & 0xf;
  60743                             uint32_t U = (instr >> 23) & 0x1;
  60744                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
  60745                             if (U == 0) imm = -imm;
  60746                             bool minus_zero = (imm == 0) && (U == 0);
  60747                             Location location(imm, kA32PcDelta);
  60748                             // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
  60749                             if (minus_zero) {
  60750                               ldrsh(condition,
  60751                                     Best,
  60752                                     Register(rt),
  60753                                     MemOperand(pc, minus, 0));
  60754                             } else {
  60755                               ldrsh(condition, Register(rt), &location);
  60756                             }
  60757                             if (((instr & 0xf7f00f0) != 0x15f00f0)) {
  60758                               UnpredictableA32(instr);
  60759                             }
  60760                             break;
  60761                           }
  60762                           default: {
  60763                             if (((instr & 0xf0000000) == 0xf0000000) ||
  60764                                 ((instr & 0xf0000) == 0xf0000)) {
  60765                               UnallocatedA32(instr);
  60766                               return;
  60767                             }
  60768                             Condition condition((instr >> 28) & 0xf);
  60769                             unsigned rt = (instr >> 12) & 0xf;
  60770                             unsigned rn = (instr >> 16) & 0xf;
  60771                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  60772                                                                    : plus);
  60773                             int32_t offset =
  60774                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
  60775                             // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; A1
  60776                             ldrsh(condition,
  60777                                   Best,
  60778                                   Register(rt),
  60779                                   MemOperand(Register(rn),
  60780                                              sign,
  60781                                              offset,
  60782                                              PostIndex));
  60783                             break;
  60784                           }
  60785                         }
  60786                         break;
  60787                       }
  60788                       case 0x00200000: {
  60789                         // 0x007000f0
  60790                         if (((instr & 0xf0000000) == 0xf0000000)) {
  60791                           UnallocatedA32(instr);
  60792                           return;
  60793                         }
  60794                         UnimplementedA32("LDRSHT", instr);
  60795                         break;
  60796                       }
  60797                       case 0x01000000: {
  60798                         // 0x015000f0
  60799                         switch (instr & 0x000f0000) {
  60800                           case 0x000f0000: {
  60801                             // 0x015f00f0
  60802                             if (((instr & 0xf0000000) == 0xf0000000) ||
  60803                                 ((instr & 0x1200000) == 0x200000)) {
  60804                               UnallocatedA32(instr);
  60805                               return;
  60806                             }
  60807                             Condition condition((instr >> 28) & 0xf);
  60808                             unsigned rt = (instr >> 12) & 0xf;
  60809                             uint32_t U = (instr >> 23) & 0x1;
  60810                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
  60811                             if (U == 0) imm = -imm;
  60812                             bool minus_zero = (imm == 0) && (U == 0);
  60813                             Location location(imm, kA32PcDelta);
  60814                             // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
  60815                             if (minus_zero) {
  60816                               ldrsh(condition,
  60817                                     Best,
  60818                                     Register(rt),
  60819                                     MemOperand(pc, minus, 0));
  60820                             } else {
  60821                               ldrsh(condition, Register(rt), &location);
  60822                             }
  60823                             if (((instr & 0xf7f00f0) != 0x15f00f0)) {
  60824                               UnpredictableA32(instr);
  60825                             }
  60826                             break;
  60827                           }
  60828                           default: {
  60829                             if (((instr & 0xf0000000) == 0xf0000000) ||
  60830                                 ((instr & 0xf0000) == 0xf0000)) {
  60831                               UnallocatedA32(instr);
  60832                               return;
  60833                             }
  60834                             Condition condition((instr >> 28) & 0xf);
  60835                             unsigned rt = (instr >> 12) & 0xf;
  60836                             unsigned rn = (instr >> 16) & 0xf;
  60837                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  60838                                                                    : plus);
  60839                             int32_t offset =
  60840                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
  60841                             // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}] ; A1 NOLINT(whitespace/line_length)
  60842                             ldrsh(condition,
  60843                                   Best,
  60844                                   Register(rt),
  60845                                   MemOperand(Register(rn),
  60846                                              sign,
  60847                                              offset,
  60848                                              Offset));
  60849                             break;
  60850                           }
  60851                         }
  60852                         break;
  60853                       }
  60854                       case 0x01200000: {
  60855                         // 0x017000f0
  60856                         switch (instr & 0x000f0000) {
  60857                           case 0x000f0000: {
  60858                             // 0x017f00f0
  60859                             if (((instr & 0xf0000000) == 0xf0000000) ||
  60860                                 ((instr & 0x1200000) == 0x200000)) {
  60861                               UnallocatedA32(instr);
  60862                               return;
  60863                             }
  60864                             Condition condition((instr >> 28) & 0xf);
  60865                             unsigned rt = (instr >> 12) & 0xf;
  60866                             uint32_t U = (instr >> 23) & 0x1;
  60867                             int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0);
  60868                             if (U == 0) imm = -imm;
  60869                             bool minus_zero = (imm == 0) && (U == 0);
  60870                             Location location(imm, kA32PcDelta);
  60871                             // LDRSH{<c>}{<q>} <Rt>, <label> ; A1
  60872                             if (minus_zero) {
  60873                               ldrsh(condition,
  60874                                     Best,
  60875                                     Register(rt),
  60876                                     MemOperand(pc, minus, 0));
  60877                             } else {
  60878                               ldrsh(condition, Register(rt), &location);
  60879                             }
  60880                             if (((instr & 0xf7f00f0) != 0x15f00f0)) {
  60881                               UnpredictableA32(instr);
  60882                             }
  60883                             break;
  60884                           }
  60885                           default: {
  60886                             if (((instr & 0xf0000000) == 0xf0000000) ||
  60887                                 ((instr & 0xf0000) == 0xf0000)) {
  60888                               UnallocatedA32(instr);
  60889                               return;
  60890                             }
  60891                             Condition condition((instr >> 28) & 0xf);
  60892                             unsigned rt = (instr >> 12) & 0xf;
  60893                             unsigned rn = (instr >> 16) & 0xf;
  60894                             Sign sign((((instr >> 23) & 0x1) == 0) ? minus
  60895                                                                    : plus);
  60896                             int32_t offset =
  60897                                 (instr & 0xf) | ((instr >> 4) & 0xf0);
  60898                             // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; A1 NOLINT(whitespace/line_length)
  60899                             ldrsh(condition,
  60900                                   Best,
  60901                                   Register(rt),
  60902                                   MemOperand(Register(rn),
  60903                                              sign,
  60904                                              offset,
  60905                                              PreIndex));
  60906                             break;
  60907                           }
  60908                         }
  60909                         break;
  60910                       }
  60911                     }
  60912                     break;
  60913                   }
  60914                 }
  60915                 break;
  60916               }
  60917             }
  60918             break;
  60919           }
  60920         }
  60921         break;
  60922       }
  60923       case 0x02000000: {
  60924         // 0x02000000
  60925         switch (instr & 0x01b00000) {
  60926           case 0x00000000: {
  60927             // 0x02000000
  60928             switch (instr & 0x00400000) {
  60929               case 0x00000000: {
  60930                 // 0x02000000
  60931                 if (((instr & 0xf0000000) == 0xf0000000)) {
  60932                   UnallocatedA32(instr);
  60933                   return;
  60934                 }
  60935                 Condition condition((instr >> 28) & 0xf);
  60936                 unsigned rd = (instr >> 12) & 0xf;
  60937                 unsigned rn = (instr >> 16) & 0xf;
  60938                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  60939                 // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  60940                 and_(condition, Best, Register(rd), Register(rn), imm);
  60941                 break;
  60942               }
  60943               case 0x00400000: {
  60944                 // 0x02400000
  60945                 switch (instr & 0x000d0000) {
  60946                   case 0x000d0000: {
  60947                     // 0x024d0000
  60948                     switch (instr & 0x00020000) {
  60949                       case 0x00000000: {
  60950                         // 0x024d0000
  60951                         if (((instr & 0xf0000000) == 0xf0000000)) {
  60952                           UnallocatedA32(instr);
  60953                           return;
  60954                         }
  60955                         Condition condition((instr >> 28) & 0xf);
  60956                         unsigned rd = (instr >> 12) & 0xf;
  60957                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  60958                         // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
  60959                         sub(condition, Best, Register(rd), sp, imm);
  60960                         break;
  60961                       }
  60962                       case 0x00020000: {
  60963                         // 0x024f0000
  60964                         if (((instr & 0xf0000000) == 0xf0000000)) {
  60965                           UnallocatedA32(instr);
  60966                           return;
  60967                         }
  60968                         if (((instr & 0xf0000000) != 0xf0000000) &&
  60969                             ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x0))) {
  60970                           Condition condition((instr >> 28) & 0xf);
  60971                           unsigned rd = (instr >> 12) & 0xf;
  60972                           uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  60973                           // SUB{<c>}{<q>} <Rd>, PC, #<const> ; A2
  60974                           sub(condition, Best, Register(rd), pc, imm);
  60975                           return;
  60976                         }
  60977                         Condition condition((instr >> 28) & 0xf);
  60978                         unsigned rd = (instr >> 12) & 0xf;
  60979                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  60980                         Location location(UnsignedNegate(imm), kA32PcDelta);
  60981                         // ADR{<c>}{<q>} <Rd>, <label> ; A2
  60982                         adr(condition, Best, Register(rd), &location);
  60983                         break;
  60984                       }
  60985                     }
  60986                     break;
  60987                   }
  60988                   default: {
  60989                     if (((instr & 0xf0000000) == 0xf0000000) ||
  60990                         ((instr & 0xd0000) == 0xd0000)) {
  60991                       UnallocatedA32(instr);
  60992                       return;
  60993                     }
  60994                     Condition condition((instr >> 28) & 0xf);
  60995                     unsigned rd = (instr >> 12) & 0xf;
  60996                     unsigned rn = (instr >> 16) & 0xf;
  60997                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  60998                     // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  60999                     sub(condition, Best, Register(rd), Register(rn), imm);
  61000                     break;
  61001                   }
  61002                 }
  61003                 break;
  61004               }
  61005             }
  61006             break;
  61007           }
  61008           case 0x00100000: {
  61009             // 0x02100000
  61010             switch (instr & 0x00400000) {
  61011               case 0x00000000: {
  61012                 // 0x02100000
  61013                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61014                   UnallocatedA32(instr);
  61015                   return;
  61016                 }
  61017                 Condition condition((instr >> 28) & 0xf);
  61018                 unsigned rd = (instr >> 12) & 0xf;
  61019                 unsigned rn = (instr >> 16) & 0xf;
  61020                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61021                 // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  61022                 ands(condition, Best, Register(rd), Register(rn), imm);
  61023                 break;
  61024               }
  61025               case 0x00400000: {
  61026                 // 0x02500000
  61027                 switch (instr & 0x000f0000) {
  61028                   case 0x000d0000: {
  61029                     // 0x025d0000
  61030                     if (((instr & 0xf0000000) == 0xf0000000)) {
  61031                       UnallocatedA32(instr);
  61032                       return;
  61033                     }
  61034                     Condition condition((instr >> 28) & 0xf);
  61035                     unsigned rd = (instr >> 12) & 0xf;
  61036                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61037                     // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
  61038                     subs(condition, Best, Register(rd), sp, imm);
  61039                     break;
  61040                   }
  61041                   default: {
  61042                     if (((instr & 0xf0000000) == 0xf0000000) ||
  61043                         ((instr & 0xf0000) == 0xd0000)) {
  61044                       UnallocatedA32(instr);
  61045                       return;
  61046                     }
  61047                     Condition condition((instr >> 28) & 0xf);
  61048                     unsigned rd = (instr >> 12) & 0xf;
  61049                     unsigned rn = (instr >> 16) & 0xf;
  61050                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61051                     // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  61052                     subs(condition, Best, Register(rd), Register(rn), imm);
  61053                     break;
  61054                   }
  61055                 }
  61056                 break;
  61057               }
  61058             }
  61059             break;
  61060           }
  61061           case 0x00200000: {
  61062             // 0x02200000
  61063             switch (instr & 0x00400000) {
  61064               case 0x00000000: {
  61065                 // 0x02200000
  61066                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61067                   UnallocatedA32(instr);
  61068                   return;
  61069                 }
  61070                 Condition condition((instr >> 28) & 0xf);
  61071                 unsigned rd = (instr >> 12) & 0xf;
  61072                 unsigned rn = (instr >> 16) & 0xf;
  61073                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61074                 // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  61075                 eor(condition, Best, Register(rd), Register(rn), imm);
  61076                 break;
  61077               }
  61078               case 0x00400000: {
  61079                 // 0x02600000
  61080                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61081                   UnallocatedA32(instr);
  61082                   return;
  61083                 }
  61084                 Condition condition((instr >> 28) & 0xf);
  61085                 unsigned rd = (instr >> 12) & 0xf;
  61086                 unsigned rn = (instr >> 16) & 0xf;
  61087                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61088                 // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  61089                 rsb(condition, Best, Register(rd), Register(rn), imm);
  61090                 break;
  61091               }
  61092             }
  61093             break;
  61094           }
  61095           case 0x00300000: {
  61096             // 0x02300000
  61097             switch (instr & 0x00400000) {
  61098               case 0x00000000: {
  61099                 // 0x02300000
  61100                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61101                   UnallocatedA32(instr);
  61102                   return;
  61103                 }
  61104                 Condition condition((instr >> 28) & 0xf);
  61105                 unsigned rd = (instr >> 12) & 0xf;
  61106                 unsigned rn = (instr >> 16) & 0xf;
  61107                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61108                 // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  61109                 eors(condition, Best, Register(rd), Register(rn), imm);
  61110                 break;
  61111               }
  61112               case 0x00400000: {
  61113                 // 0x02700000
  61114                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61115                   UnallocatedA32(instr);
  61116                   return;
  61117                 }
  61118                 Condition condition((instr >> 28) & 0xf);
  61119                 unsigned rd = (instr >> 12) & 0xf;
  61120                 unsigned rn = (instr >> 16) & 0xf;
  61121                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61122                 // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  61123                 rsbs(condition, Best, Register(rd), Register(rn), imm);
  61124                 break;
  61125               }
  61126             }
  61127             break;
  61128           }
  61129           case 0x00800000: {
  61130             // 0x02800000
  61131             switch (instr & 0x00400000) {
  61132               case 0x00000000: {
  61133                 // 0x02800000
  61134                 switch (instr & 0x000d0000) {
  61135                   case 0x000d0000: {
  61136                     // 0x028d0000
  61137                     switch (instr & 0x00020000) {
  61138                       case 0x00000000: {
  61139                         // 0x028d0000
  61140                         if (((instr & 0xf0000000) == 0xf0000000)) {
  61141                           UnallocatedA32(instr);
  61142                           return;
  61143                         }
  61144                         Condition condition((instr >> 28) & 0xf);
  61145                         unsigned rd = (instr >> 12) & 0xf;
  61146                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61147                         // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
  61148                         add(condition, Best, Register(rd), sp, imm);
  61149                         break;
  61150                       }
  61151                       case 0x00020000: {
  61152                         // 0x028f0000
  61153                         if (((instr & 0xf0000000) == 0xf0000000)) {
  61154                           UnallocatedA32(instr);
  61155                           return;
  61156                         }
  61157                         Condition condition((instr >> 28) & 0xf);
  61158                         unsigned rd = (instr >> 12) & 0xf;
  61159                         uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61160                         Location location(imm, kA32PcDelta);
  61161                         // ADR{<c>}{<q>} <Rd>, <label> ; A1
  61162                         adr(condition, Best, Register(rd), &location);
  61163                         break;
  61164                       }
  61165                     }
  61166                     break;
  61167                   }
  61168                   default: {
  61169                     if (((instr & 0xf0000000) == 0xf0000000) ||
  61170                         ((instr & 0xd0000) == 0xd0000)) {
  61171                       UnallocatedA32(instr);
  61172                       return;
  61173                     }
  61174                     Condition condition((instr >> 28) & 0xf);
  61175                     unsigned rd = (instr >> 12) & 0xf;
  61176                     unsigned rn = (instr >> 16) & 0xf;
  61177                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61178                     // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  61179                     add(condition, Best, Register(rd), Register(rn), imm);
  61180                     break;
  61181                   }
  61182                 }
  61183                 break;
  61184               }
  61185               case 0x00400000: {
  61186                 // 0x02c00000
  61187                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61188                   UnallocatedA32(instr);
  61189                   return;
  61190                 }
  61191                 Condition condition((instr >> 28) & 0xf);
  61192                 unsigned rd = (instr >> 12) & 0xf;
  61193                 unsigned rn = (instr >> 16) & 0xf;
  61194                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61195                 // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  61196                 sbc(condition, Best, Register(rd), Register(rn), imm);
  61197                 break;
  61198               }
  61199             }
  61200             break;
  61201           }
  61202           case 0x00900000: {
  61203             // 0x02900000
  61204             switch (instr & 0x00400000) {
  61205               case 0x00000000: {
  61206                 // 0x02900000
  61207                 switch (instr & 0x000f0000) {
  61208                   case 0x000d0000: {
  61209                     // 0x029d0000
  61210                     if (((instr & 0xf0000000) == 0xf0000000)) {
  61211                       UnallocatedA32(instr);
  61212                       return;
  61213                     }
  61214                     Condition condition((instr >> 28) & 0xf);
  61215                     unsigned rd = (instr >> 12) & 0xf;
  61216                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61217                     // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; A1
  61218                     adds(condition, Best, Register(rd), sp, imm);
  61219                     break;
  61220                   }
  61221                   default: {
  61222                     if (((instr & 0xf0000000) == 0xf0000000) ||
  61223                         ((instr & 0xf0000) == 0xd0000)) {
  61224                       UnallocatedA32(instr);
  61225                       return;
  61226                     }
  61227                     Condition condition((instr >> 28) & 0xf);
  61228                     unsigned rd = (instr >> 12) & 0xf;
  61229                     unsigned rn = (instr >> 16) & 0xf;
  61230                     uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61231                     // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  61232                     adds(condition, Best, Register(rd), Register(rn), imm);
  61233                     break;
  61234                   }
  61235                 }
  61236                 break;
  61237               }
  61238               case 0x00400000: {
  61239                 // 0x02d00000
  61240                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61241                   UnallocatedA32(instr);
  61242                   return;
  61243                 }
  61244                 Condition condition((instr >> 28) & 0xf);
  61245                 unsigned rd = (instr >> 12) & 0xf;
  61246                 unsigned rn = (instr >> 16) & 0xf;
  61247                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61248                 // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  61249                 sbcs(condition, Best, Register(rd), Register(rn), imm);
  61250                 break;
  61251               }
  61252             }
  61253             break;
  61254           }
  61255           case 0x00a00000: {
  61256             // 0x02a00000
  61257             switch (instr & 0x00400000) {
  61258               case 0x00000000: {
  61259                 // 0x02a00000
  61260                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61261                   UnallocatedA32(instr);
  61262                   return;
  61263                 }
  61264                 Condition condition((instr >> 28) & 0xf);
  61265                 unsigned rd = (instr >> 12) & 0xf;
  61266                 unsigned rn = (instr >> 16) & 0xf;
  61267                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61268                 // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  61269                 adc(condition, Best, Register(rd), Register(rn), imm);
  61270                 break;
  61271               }
  61272               case 0x00400000: {
  61273                 // 0x02e00000
  61274                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61275                   UnallocatedA32(instr);
  61276                   return;
  61277                 }
  61278                 Condition condition((instr >> 28) & 0xf);
  61279                 unsigned rd = (instr >> 12) & 0xf;
  61280                 unsigned rn = (instr >> 16) & 0xf;
  61281                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61282                 // RSC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  61283                 rsc(condition, Register(rd), Register(rn), imm);
  61284                 break;
  61285               }
  61286             }
  61287             break;
  61288           }
  61289           case 0x00b00000: {
  61290             // 0x02b00000
  61291             switch (instr & 0x00400000) {
  61292               case 0x00000000: {
  61293                 // 0x02b00000
  61294                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61295                   UnallocatedA32(instr);
  61296                   return;
  61297                 }
  61298                 Condition condition((instr >> 28) & 0xf);
  61299                 unsigned rd = (instr >> 12) & 0xf;
  61300                 unsigned rn = (instr >> 16) & 0xf;
  61301                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61302                 // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  61303                 adcs(condition, Best, Register(rd), Register(rn), imm);
  61304                 break;
  61305               }
  61306               case 0x00400000: {
  61307                 // 0x02f00000
  61308                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61309                   UnallocatedA32(instr);
  61310                   return;
  61311                 }
  61312                 Condition condition((instr >> 28) & 0xf);
  61313                 unsigned rd = (instr >> 12) & 0xf;
  61314                 unsigned rn = (instr >> 16) & 0xf;
  61315                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61316                 // RSCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  61317                 rscs(condition, Register(rd), Register(rn), imm);
  61318                 break;
  61319               }
  61320             }
  61321             break;
  61322           }
  61323           case 0x01000000: {
  61324             // 0x03000000
  61325             switch (instr & 0x00400000) {
  61326               case 0x00000000: {
  61327                 // 0x03000000
  61328                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61329                   UnallocatedA32(instr);
  61330                   return;
  61331                 }
  61332                 Condition condition((instr >> 28) & 0xf);
  61333                 unsigned rd = (instr >> 12) & 0xf;
  61334                 uint32_t imm = (instr & 0xfff) | ((instr >> 4) & 0xf000);
  61335                 if (!ImmediateA32::IsImmediateA32(imm)) {
  61336                   // MOV{<c>}{<q>} <Rd>, #<imm16> ; A2
  61337                   mov(condition, Best, Register(rd), imm);
  61338                 } else {
  61339                   // MOVW{<c>}{<q>} <Rd>, #<imm16> ; A2
  61340                   movw(condition, Register(rd), imm);
  61341                 }
  61342                 break;
  61343               }
  61344               case 0x00400000: {
  61345                 // 0x03400000
  61346                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61347                   UnallocatedA32(instr);
  61348                   return;
  61349                 }
  61350                 Condition condition((instr >> 28) & 0xf);
  61351                 unsigned rd = (instr >> 12) & 0xf;
  61352                 uint32_t imm = (instr & 0xfff) | ((instr >> 4) & 0xf000);
  61353                 // MOVT{<c>}{<q>} <Rd>, #<imm16> ; A1
  61354                 movt(condition, Register(rd), imm);
  61355                 break;
  61356               }
  61357             }
  61358             break;
  61359           }
  61360           case 0x01100000: {
  61361             // 0x03100000
  61362             switch (instr & 0x00400000) {
  61363               case 0x00000000: {
  61364                 // 0x03100000
  61365                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61366                   UnallocatedA32(instr);
  61367                   return;
  61368                 }
  61369                 Condition condition((instr >> 28) & 0xf);
  61370                 unsigned rn = (instr >> 16) & 0xf;
  61371                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61372                 // TST{<c>}{<q>} <Rn>, #<const> ; A1
  61373                 tst(condition, Best, Register(rn), imm);
  61374                 if (((instr & 0xff0f000) != 0x3100000)) {
  61375                   UnpredictableA32(instr);
  61376                 }
  61377                 break;
  61378               }
  61379               case 0x00400000: {
  61380                 // 0x03500000
  61381                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61382                   UnallocatedA32(instr);
  61383                   return;
  61384                 }
  61385                 Condition condition((instr >> 28) & 0xf);
  61386                 unsigned rn = (instr >> 16) & 0xf;
  61387                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61388                 // CMP{<c>}{<q>} <Rn>, #<const> ; A1
  61389                 cmp(condition, Best, Register(rn), imm);
  61390                 if (((instr & 0xff0f000) != 0x3500000)) {
  61391                   UnpredictableA32(instr);
  61392                 }
  61393                 break;
  61394               }
  61395             }
  61396             break;
  61397           }
  61398           case 0x01200000: {
  61399             // 0x03200000
  61400             switch (instr & 0x004f0000) {
  61401               case 0x00000000: {
  61402                 // 0x03200000
  61403                 switch (instr & 0x000000f0) {
  61404                   case 0x00000000: {
  61405                     // 0x03200000
  61406                     switch (instr & 0x0000000f) {
  61407                       case 0x00000000: {
  61408                         // 0x03200000
  61409                         if (((instr & 0xf0000000) == 0xf0000000)) {
  61410                           UnallocatedA32(instr);
  61411                           return;
  61412                         }
  61413                         Condition condition((instr >> 28) & 0xf);
  61414                         // NOP{<c>}{<q>} ; A1
  61415                         nop(condition, Best);
  61416                         if (((instr & 0xfffffff) != 0x320f000)) {
  61417                           UnpredictableA32(instr);
  61418                         }
  61419                         break;
  61420                       }
  61421                       case 0x00000001: {
  61422                         // 0x03200001
  61423                         if (((instr & 0xf0000000) == 0xf0000000)) {
  61424                           UnallocatedA32(instr);
  61425                           return;
  61426                         }
  61427                         Condition condition((instr >> 28) & 0xf);
  61428                         // YIELD{<c>}{<q>} ; A1
  61429                         yield(condition, Best);
  61430                         if (((instr & 0xfffffff) != 0x320f001)) {
  61431                           UnpredictableA32(instr);
  61432                         }
  61433                         break;
  61434                       }
  61435                       case 0x00000002: {
  61436                         // 0x03200002
  61437                         if (((instr & 0xf0000000) == 0xf0000000)) {
  61438                           UnallocatedA32(instr);
  61439                           return;
  61440                         }
  61441                         UnimplementedA32("WFE", instr);
  61442                         break;
  61443                       }
  61444                       case 0x00000003: {
  61445                         // 0x03200003
  61446                         if (((instr & 0xf0000000) == 0xf0000000)) {
  61447                           UnallocatedA32(instr);
  61448                           return;
  61449                         }
  61450                         UnimplementedA32("WFI", instr);
  61451                         break;
  61452                       }
  61453                       case 0x00000004: {
  61454                         // 0x03200004
  61455                         if (((instr & 0xf0000000) == 0xf0000000)) {
  61456                           UnallocatedA32(instr);
  61457                           return;
  61458                         }
  61459                         UnimplementedA32("SEV", instr);
  61460                         break;
  61461                       }
  61462                       case 0x00000005: {
  61463                         // 0x03200005
  61464                         if (((instr & 0xf0000000) == 0xf0000000)) {
  61465                           UnallocatedA32(instr);
  61466                           return;
  61467                         }
  61468                         UnimplementedA32("SEVL", instr);
  61469                         break;
  61470                       }
  61471                       default:
  61472                         UnallocatedA32(instr);
  61473                         break;
  61474                     }
  61475                     break;
  61476                   }
  61477                   case 0x000000f0: {
  61478                     // 0x032000f0
  61479                     if (((instr & 0xf0000000) == 0xf0000000)) {
  61480                       UnallocatedA32(instr);
  61481                       return;
  61482                     }
  61483                     UnimplementedA32("DBG", instr);
  61484                     break;
  61485                   }
  61486                   default:
  61487                     UnallocatedA32(instr);
  61488                     break;
  61489                 }
  61490                 break;
  61491               }
  61492               default: {
  61493                 if (((instr & 0xf0000000) == 0xf0000000) ||
  61494                     ((instr & 0x4f0000) == 0x0)) {
  61495                   UnallocatedA32(instr);
  61496                   return;
  61497                 }
  61498                 Condition condition((instr >> 28) & 0xf);
  61499                 unsigned spec_reg =
  61500                     ((instr >> 16) & 0xf) | ((instr >> 18) & 0x10);
  61501                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61502                 // MSR{<c>}{<q>} <spec_reg>, #<imm> ; A1
  61503                 msr(condition, MaskedSpecialRegister(spec_reg), imm);
  61504                 if (((instr & 0xfb0f000) != 0x320f000)) {
  61505                   UnpredictableA32(instr);
  61506                 }
  61507                 break;
  61508               }
  61509             }
  61510             break;
  61511           }
  61512           case 0x01300000: {
  61513             // 0x03300000
  61514             switch (instr & 0x00400000) {
  61515               case 0x00000000: {
  61516                 // 0x03300000
  61517                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61518                   UnallocatedA32(instr);
  61519                   return;
  61520                 }
  61521                 Condition condition((instr >> 28) & 0xf);
  61522                 unsigned rn = (instr >> 16) & 0xf;
  61523                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61524                 // TEQ{<c>}{<q>} <Rn>, #<const> ; A1
  61525                 teq(condition, Register(rn), imm);
  61526                 if (((instr & 0xff0f000) != 0x3300000)) {
  61527                   UnpredictableA32(instr);
  61528                 }
  61529                 break;
  61530               }
  61531               case 0x00400000: {
  61532                 // 0x03700000
  61533                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61534                   UnallocatedA32(instr);
  61535                   return;
  61536                 }
  61537                 Condition condition((instr >> 28) & 0xf);
  61538                 unsigned rn = (instr >> 16) & 0xf;
  61539                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61540                 // CMN{<c>}{<q>} <Rn>, #<const> ; A1
  61541                 cmn(condition, Best, Register(rn), imm);
  61542                 if (((instr & 0xff0f000) != 0x3700000)) {
  61543                   UnpredictableA32(instr);
  61544                 }
  61545                 break;
  61546               }
  61547             }
  61548             break;
  61549           }
  61550           case 0x01800000: {
  61551             // 0x03800000
  61552             switch (instr & 0x00400000) {
  61553               case 0x00000000: {
  61554                 // 0x03800000
  61555                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61556                   UnallocatedA32(instr);
  61557                   return;
  61558                 }
  61559                 Condition condition((instr >> 28) & 0xf);
  61560                 unsigned rd = (instr >> 12) & 0xf;
  61561                 unsigned rn = (instr >> 16) & 0xf;
  61562                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61563                 // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  61564                 orr(condition, Best, Register(rd), Register(rn), imm);
  61565                 break;
  61566               }
  61567               case 0x00400000: {
  61568                 // 0x03c00000
  61569                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61570                   UnallocatedA32(instr);
  61571                   return;
  61572                 }
  61573                 Condition condition((instr >> 28) & 0xf);
  61574                 unsigned rd = (instr >> 12) & 0xf;
  61575                 unsigned rn = (instr >> 16) & 0xf;
  61576                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61577                 // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  61578                 bic(condition, Best, Register(rd), Register(rn), imm);
  61579                 break;
  61580               }
  61581             }
  61582             break;
  61583           }
  61584           case 0x01900000: {
  61585             // 0x03900000
  61586             switch (instr & 0x00400000) {
  61587               case 0x00000000: {
  61588                 // 0x03900000
  61589                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61590                   UnallocatedA32(instr);
  61591                   return;
  61592                 }
  61593                 Condition condition((instr >> 28) & 0xf);
  61594                 unsigned rd = (instr >> 12) & 0xf;
  61595                 unsigned rn = (instr >> 16) & 0xf;
  61596                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61597                 // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  61598                 orrs(condition, Best, Register(rd), Register(rn), imm);
  61599                 break;
  61600               }
  61601               case 0x00400000: {
  61602                 // 0x03d00000
  61603                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61604                   UnallocatedA32(instr);
  61605                   return;
  61606                 }
  61607                 Condition condition((instr >> 28) & 0xf);
  61608                 unsigned rd = (instr >> 12) & 0xf;
  61609                 unsigned rn = (instr >> 16) & 0xf;
  61610                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61611                 // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1
  61612                 bics(condition, Best, Register(rd), Register(rn), imm);
  61613                 break;
  61614               }
  61615             }
  61616             break;
  61617           }
  61618           case 0x01a00000: {
  61619             // 0x03a00000
  61620             switch (instr & 0x00400000) {
  61621               case 0x00000000: {
  61622                 // 0x03a00000
  61623                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61624                   UnallocatedA32(instr);
  61625                   return;
  61626                 }
  61627                 Condition condition((instr >> 28) & 0xf);
  61628                 unsigned rd = (instr >> 12) & 0xf;
  61629                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61630                 // MOV{<c>}{<q>} <Rd>, #<const> ; A1
  61631                 mov(condition, Best, Register(rd), imm);
  61632                 if (((instr & 0xfff0000) != 0x3a00000)) {
  61633                   UnpredictableA32(instr);
  61634                 }
  61635                 break;
  61636               }
  61637               case 0x00400000: {
  61638                 // 0x03e00000
  61639                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61640                   UnallocatedA32(instr);
  61641                   return;
  61642                 }
  61643                 Condition condition((instr >> 28) & 0xf);
  61644                 unsigned rd = (instr >> 12) & 0xf;
  61645                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61646                 // MVN{<c>}{<q>} <Rd>, #<const> ; A1
  61647                 mvn(condition, Best, Register(rd), imm);
  61648                 if (((instr & 0xfff0000) != 0x3e00000)) {
  61649                   UnpredictableA32(instr);
  61650                 }
  61651                 break;
  61652               }
  61653             }
  61654             break;
  61655           }
  61656           case 0x01b00000: {
  61657             // 0x03b00000
  61658             switch (instr & 0x00400000) {
  61659               case 0x00000000: {
  61660                 // 0x03b00000
  61661                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61662                   UnallocatedA32(instr);
  61663                   return;
  61664                 }
  61665                 Condition condition((instr >> 28) & 0xf);
  61666                 unsigned rd = (instr >> 12) & 0xf;
  61667                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61668                 // MOVS{<c>}{<q>} <Rd>, #<const> ; A1
  61669                 movs(condition, Best, Register(rd), imm);
  61670                 if (((instr & 0xfff0000) != 0x3b00000)) {
  61671                   UnpredictableA32(instr);
  61672                 }
  61673                 break;
  61674               }
  61675               case 0x00400000: {
  61676                 // 0x03f00000
  61677                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61678                   UnallocatedA32(instr);
  61679                   return;
  61680                 }
  61681                 Condition condition((instr >> 28) & 0xf);
  61682                 unsigned rd = (instr >> 12) & 0xf;
  61683                 uint32_t imm = ImmediateA32::Decode(instr & 0xfff);
  61684                 // MVNS{<c>}{<q>} <Rd>, #<const> ; A1
  61685                 mvns(condition, Best, Register(rd), imm);
  61686                 if (((instr & 0xfff0000) != 0x3f00000)) {
  61687                   UnpredictableA32(instr);
  61688                 }
  61689                 break;
  61690               }
  61691             }
  61692             break;
  61693           }
  61694         }
  61695         break;
  61696       }
  61697       case 0x04000000: {
  61698         // 0x04000000
  61699         switch (instr & 0x00500000) {
  61700           case 0x00000000: {
  61701             // 0x04000000
  61702             switch (instr & 0x01200000) {
  61703               case 0x00000000: {
  61704                 // 0x04000000
  61705                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61706                   UnallocatedA32(instr);
  61707                   return;
  61708                 }
  61709                 Condition condition((instr >> 28) & 0xf);
  61710                 unsigned rt = (instr >> 12) & 0xf;
  61711                 unsigned rn = (instr >> 16) & 0xf;
  61712                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  61713                 int32_t offset = instr & 0xfff;
  61714                 // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
  61715                 str(condition,
  61716                     Best,
  61717                     Register(rt),
  61718                     MemOperand(Register(rn), sign, offset, PostIndex));
  61719                 break;
  61720               }
  61721               case 0x00200000: {
  61722                 // 0x04200000
  61723                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61724                   UnallocatedA32(instr);
  61725                   return;
  61726                 }
  61727                 UnimplementedA32("STRT", instr);
  61728                 break;
  61729               }
  61730               case 0x01000000: {
  61731                 // 0x05000000
  61732                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61733                   UnallocatedA32(instr);
  61734                   return;
  61735                 }
  61736                 Condition condition((instr >> 28) & 0xf);
  61737                 unsigned rt = (instr >> 12) & 0xf;
  61738                 unsigned rn = (instr >> 16) & 0xf;
  61739                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  61740                 int32_t offset = instr & 0xfff;
  61741                 // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
  61742                 str(condition,
  61743                     Best,
  61744                     Register(rt),
  61745                     MemOperand(Register(rn), sign, offset, Offset));
  61746                 break;
  61747               }
  61748               case 0x01200000: {
  61749                 // 0x05200000
  61750                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61751                   UnallocatedA32(instr);
  61752                   return;
  61753                 }
  61754                 if (((Uint32((instr >> 23)) & Uint32(0x1)) == Uint32(0x0)) &&
  61755                     ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
  61756                     ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x4)) &&
  61757                     ((instr & 0xf0000000) != 0xf0000000)) {
  61758                   Condition condition((instr >> 28) & 0xf);
  61759                   unsigned rt = (instr >> 12) & 0xf;
  61760                   // PUSH{<c>}{<q>} <single_register_list> ; A1
  61761                   push(condition, Best, Register(rt));
  61762                   return;
  61763                 }
  61764                 Condition condition((instr >> 28) & 0xf);
  61765                 unsigned rt = (instr >> 12) & 0xf;
  61766                 unsigned rn = (instr >> 16) & 0xf;
  61767                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  61768                 int32_t offset = instr & 0xfff;
  61769                 // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
  61770                 str(condition,
  61771                     Best,
  61772                     Register(rt),
  61773                     MemOperand(Register(rn), sign, offset, PreIndex));
  61774                 break;
  61775               }
  61776             }
  61777             break;
  61778           }
  61779           case 0x00100000: {
  61780             // 0x04100000
  61781             switch (instr & 0x01200000) {
  61782               case 0x00000000: {
  61783                 // 0x04100000
  61784                 switch (instr & 0x000f0000) {
  61785                   case 0x000f0000: {
  61786                     // 0x041f0000
  61787                     if (((instr & 0xf0000000) == 0xf0000000) ||
  61788                         ((instr & 0x1200000) == 0x200000)) {
  61789                       UnallocatedA32(instr);
  61790                       return;
  61791                     }
  61792                     Condition condition((instr >> 28) & 0xf);
  61793                     unsigned rt = (instr >> 12) & 0xf;
  61794                     uint32_t U = (instr >> 23) & 0x1;
  61795                     int32_t imm = instr & 0xfff;
  61796                     if (U == 0) imm = -imm;
  61797                     bool minus_zero = (imm == 0) && (U == 0);
  61798                     Location location(imm, kA32PcDelta);
  61799                     // LDR{<c>}{<q>} <Rt>, <label> ; A1
  61800                     if (minus_zero) {
  61801                       ldr(condition,
  61802                           Best,
  61803                           Register(rt),
  61804                           MemOperand(pc, minus, 0));
  61805                     } else {
  61806                       ldr(condition, Best, Register(rt), &location);
  61807                     }
  61808                     if (((instr & 0xf7f0000) != 0x51f0000)) {
  61809                       UnpredictableA32(instr);
  61810                     }
  61811                     break;
  61812                   }
  61813                   default: {
  61814                     if (((instr & 0xf0000000) == 0xf0000000) ||
  61815                         ((instr & 0xf0000) == 0xf0000)) {
  61816                       UnallocatedA32(instr);
  61817                       return;
  61818                     }
  61819                     if (((Uint32((instr >> 23)) & Uint32(0x1)) ==
  61820                          Uint32(0x1)) &&
  61821                         ((Uint32((instr >> 16)) & Uint32(0xf)) ==
  61822                          Uint32(0xd)) &&
  61823                         ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x4)) &&
  61824                         ((instr & 0xf0000000) != 0xf0000000)) {
  61825                       Condition condition((instr >> 28) & 0xf);
  61826                       unsigned rt = (instr >> 12) & 0xf;
  61827                       // POP{<c>}{<q>} <single_register_list> ; A1
  61828                       pop(condition, Best, Register(rt));
  61829                       return;
  61830                     }
  61831                     Condition condition((instr >> 28) & 0xf);
  61832                     unsigned rt = (instr >> 12) & 0xf;
  61833                     unsigned rn = (instr >> 16) & 0xf;
  61834                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  61835                     int32_t offset = instr & 0xfff;
  61836                     // LDR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
  61837                     ldr(condition,
  61838                         Best,
  61839                         Register(rt),
  61840                         MemOperand(Register(rn), sign, offset, PostIndex));
  61841                     break;
  61842                   }
  61843                 }
  61844                 break;
  61845               }
  61846               case 0x00200000: {
  61847                 // 0x04300000
  61848                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61849                   UnallocatedA32(instr);
  61850                   return;
  61851                 }
  61852                 UnimplementedA32("LDRT", instr);
  61853                 break;
  61854               }
  61855               case 0x01000000: {
  61856                 // 0x05100000
  61857                 switch (instr & 0x000f0000) {
  61858                   case 0x000f0000: {
  61859                     // 0x051f0000
  61860                     if (((instr & 0xf0000000) == 0xf0000000) ||
  61861                         ((instr & 0x1200000) == 0x200000)) {
  61862                       UnallocatedA32(instr);
  61863                       return;
  61864                     }
  61865                     Condition condition((instr >> 28) & 0xf);
  61866                     unsigned rt = (instr >> 12) & 0xf;
  61867                     uint32_t U = (instr >> 23) & 0x1;
  61868                     int32_t imm = instr & 0xfff;
  61869                     if (U == 0) imm = -imm;
  61870                     bool minus_zero = (imm == 0) && (U == 0);
  61871                     Location location(imm, kA32PcDelta);
  61872                     // LDR{<c>}{<q>} <Rt>, <label> ; A1
  61873                     if (minus_zero) {
  61874                       ldr(condition,
  61875                           Best,
  61876                           Register(rt),
  61877                           MemOperand(pc, minus, 0));
  61878                     } else {
  61879                       ldr(condition, Best, Register(rt), &location);
  61880                     }
  61881                     if (((instr & 0xf7f0000) != 0x51f0000)) {
  61882                       UnpredictableA32(instr);
  61883                     }
  61884                     break;
  61885                   }
  61886                   default: {
  61887                     if (((instr & 0xf0000000) == 0xf0000000) ||
  61888                         ((instr & 0xf0000) == 0xf0000)) {
  61889                       UnallocatedA32(instr);
  61890                       return;
  61891                     }
  61892                     Condition condition((instr >> 28) & 0xf);
  61893                     unsigned rt = (instr >> 12) & 0xf;
  61894                     unsigned rn = (instr >> 16) & 0xf;
  61895                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  61896                     int32_t offset = instr & 0xfff;
  61897                     // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
  61898                     ldr(condition,
  61899                         Best,
  61900                         Register(rt),
  61901                         MemOperand(Register(rn), sign, offset, Offset));
  61902                     break;
  61903                   }
  61904                 }
  61905                 break;
  61906               }
  61907               case 0x01200000: {
  61908                 // 0x05300000
  61909                 switch (instr & 0x000f0000) {
  61910                   case 0x000f0000: {
  61911                     // 0x053f0000
  61912                     if (((instr & 0xf0000000) == 0xf0000000) ||
  61913                         ((instr & 0x1200000) == 0x200000)) {
  61914                       UnallocatedA32(instr);
  61915                       return;
  61916                     }
  61917                     Condition condition((instr >> 28) & 0xf);
  61918                     unsigned rt = (instr >> 12) & 0xf;
  61919                     uint32_t U = (instr >> 23) & 0x1;
  61920                     int32_t imm = instr & 0xfff;
  61921                     if (U == 0) imm = -imm;
  61922                     bool minus_zero = (imm == 0) && (U == 0);
  61923                     Location location(imm, kA32PcDelta);
  61924                     // LDR{<c>}{<q>} <Rt>, <label> ; A1
  61925                     if (minus_zero) {
  61926                       ldr(condition,
  61927                           Best,
  61928                           Register(rt),
  61929                           MemOperand(pc, minus, 0));
  61930                     } else {
  61931                       ldr(condition, Best, Register(rt), &location);
  61932                     }
  61933                     if (((instr & 0xf7f0000) != 0x51f0000)) {
  61934                       UnpredictableA32(instr);
  61935                     }
  61936                     break;
  61937                   }
  61938                   default: {
  61939                     if (((instr & 0xf0000000) == 0xf0000000) ||
  61940                         ((instr & 0xf0000) == 0xf0000)) {
  61941                       UnallocatedA32(instr);
  61942                       return;
  61943                     }
  61944                     Condition condition((instr >> 28) & 0xf);
  61945                     unsigned rt = (instr >> 12) & 0xf;
  61946                     unsigned rn = (instr >> 16) & 0xf;
  61947                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  61948                     int32_t offset = instr & 0xfff;
  61949                     // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
  61950                     ldr(condition,
  61951                         Best,
  61952                         Register(rt),
  61953                         MemOperand(Register(rn), sign, offset, PreIndex));
  61954                     break;
  61955                   }
  61956                 }
  61957                 break;
  61958               }
  61959             }
  61960             break;
  61961           }
  61962           case 0x00400000: {
  61963             // 0x04400000
  61964             switch (instr & 0x01200000) {
  61965               case 0x00000000: {
  61966                 // 0x04400000
  61967                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61968                   UnallocatedA32(instr);
  61969                   return;
  61970                 }
  61971                 Condition condition((instr >> 28) & 0xf);
  61972                 unsigned rt = (instr >> 12) & 0xf;
  61973                 unsigned rn = (instr >> 16) & 0xf;
  61974                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  61975                 int32_t offset = instr & 0xfff;
  61976                 // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
  61977                 strb(condition,
  61978                      Best,
  61979                      Register(rt),
  61980                      MemOperand(Register(rn), sign, offset, PostIndex));
  61981                 break;
  61982               }
  61983               case 0x00200000: {
  61984                 // 0x04600000
  61985                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61986                   UnallocatedA32(instr);
  61987                   return;
  61988                 }
  61989                 UnimplementedA32("STRBT", instr);
  61990                 break;
  61991               }
  61992               case 0x01000000: {
  61993                 // 0x05400000
  61994                 if (((instr & 0xf0000000) == 0xf0000000)) {
  61995                   UnallocatedA32(instr);
  61996                   return;
  61997                 }
  61998                 Condition condition((instr >> 28) & 0xf);
  61999                 unsigned rt = (instr >> 12) & 0xf;
  62000                 unsigned rn = (instr >> 16) & 0xf;
  62001                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  62002                 int32_t offset = instr & 0xfff;
  62003                 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
  62004                 strb(condition,
  62005                      Best,
  62006                      Register(rt),
  62007                      MemOperand(Register(rn), sign, offset, Offset));
  62008                 break;
  62009               }
  62010               case 0x01200000: {
  62011                 // 0x05600000
  62012                 if (((instr & 0xf0000000) == 0xf0000000)) {
  62013                   UnallocatedA32(instr);
  62014                   return;
  62015                 }
  62016                 Condition condition((instr >> 28) & 0xf);
  62017                 unsigned rt = (instr >> 12) & 0xf;
  62018                 unsigned rn = (instr >> 16) & 0xf;
  62019                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  62020                 int32_t offset = instr & 0xfff;
  62021                 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
  62022                 strb(condition,
  62023                      Best,
  62024                      Register(rt),
  62025                      MemOperand(Register(rn), sign, offset, PreIndex));
  62026                 break;
  62027               }
  62028             }
  62029             break;
  62030           }
  62031           case 0x00500000: {
  62032             // 0x04500000
  62033             switch (instr & 0x01200000) {
  62034               case 0x00000000: {
  62035                 // 0x04500000
  62036                 switch (instr & 0x000f0000) {
  62037                   case 0x000f0000: {
  62038                     // 0x045f0000
  62039                     if (((instr & 0xf0000000) == 0xf0000000) ||
  62040                         ((instr & 0x1200000) == 0x200000)) {
  62041                       UnallocatedA32(instr);
  62042                       return;
  62043                     }
  62044                     Condition condition((instr >> 28) & 0xf);
  62045                     unsigned rt = (instr >> 12) & 0xf;
  62046                     uint32_t U = (instr >> 23) & 0x1;
  62047                     int32_t imm = instr & 0xfff;
  62048                     if (U == 0) imm = -imm;
  62049                     bool minus_zero = (imm == 0) && (U == 0);
  62050                     Location location(imm, kA32PcDelta);
  62051                     // LDRB{<c>}{<q>} <Rt>, <label> ; A1
  62052                     if (minus_zero) {
  62053                       ldrb(condition,
  62054                            Best,
  62055                            Register(rt),
  62056                            MemOperand(pc, minus, 0));
  62057                     } else {
  62058                       ldrb(condition, Register(rt), &location);
  62059                     }
  62060                     if (((instr & 0xf7f0000) != 0x55f0000)) {
  62061                       UnpredictableA32(instr);
  62062                     }
  62063                     break;
  62064                   }
  62065                   default: {
  62066                     if (((instr & 0xf0000000) == 0xf0000000) ||
  62067                         ((instr & 0xf0000) == 0xf0000)) {
  62068                       UnallocatedA32(instr);
  62069                       return;
  62070                     }
  62071                     Condition condition((instr >> 28) & 0xf);
  62072                     unsigned rt = (instr >> 12) & 0xf;
  62073                     unsigned rn = (instr >> 16) & 0xf;
  62074                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  62075                     int32_t offset = instr & 0xfff;
  62076                     // LDRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1
  62077                     ldrb(condition,
  62078                          Best,
  62079                          Register(rt),
  62080                          MemOperand(Register(rn), sign, offset, PostIndex));
  62081                     break;
  62082                   }
  62083                 }
  62084                 break;
  62085               }
  62086               case 0x00200000: {
  62087                 // 0x04700000
  62088                 if (((instr & 0xf0000000) == 0xf0000000)) {
  62089                   UnallocatedA32(instr);
  62090                   return;
  62091                 }
  62092                 UnimplementedA32("LDRBT", instr);
  62093                 break;
  62094               }
  62095               case 0x01000000: {
  62096                 // 0x05500000
  62097                 switch (instr & 0x000f0000) {
  62098                   case 0x000f0000: {
  62099                     // 0x055f0000
  62100                     if (((instr & 0xf0000000) == 0xf0000000) ||
  62101                         ((instr & 0x1200000) == 0x200000)) {
  62102                       UnallocatedA32(instr);
  62103                       return;
  62104                     }
  62105                     Condition condition((instr >> 28) & 0xf);
  62106                     unsigned rt = (instr >> 12) & 0xf;
  62107                     uint32_t U = (instr >> 23) & 0x1;
  62108                     int32_t imm = instr & 0xfff;
  62109                     if (U == 0) imm = -imm;
  62110                     bool minus_zero = (imm == 0) && (U == 0);
  62111                     Location location(imm, kA32PcDelta);
  62112                     // LDRB{<c>}{<q>} <Rt>, <label> ; A1
  62113                     if (minus_zero) {
  62114                       ldrb(condition,
  62115                            Best,
  62116                            Register(rt),
  62117                            MemOperand(pc, minus, 0));
  62118                     } else {
  62119                       ldrb(condition, Register(rt), &location);
  62120                     }
  62121                     if (((instr & 0xf7f0000) != 0x55f0000)) {
  62122                       UnpredictableA32(instr);
  62123                     }
  62124                     break;
  62125                   }
  62126                   default: {
  62127                     if (((instr & 0xf0000000) == 0xf0000000) ||
  62128                         ((instr & 0xf0000) == 0xf0000)) {
  62129                       UnallocatedA32(instr);
  62130                       return;
  62131                     }
  62132                     Condition condition((instr >> 28) & 0xf);
  62133                     unsigned rt = (instr >> 12) & 0xf;
  62134                     unsigned rn = (instr >> 16) & 0xf;
  62135                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  62136                     int32_t offset = instr & 0xfff;
  62137                     // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1
  62138                     ldrb(condition,
  62139                          Best,
  62140                          Register(rt),
  62141                          MemOperand(Register(rn), sign, offset, Offset));
  62142                     break;
  62143                   }
  62144                 }
  62145                 break;
  62146               }
  62147               case 0x01200000: {
  62148                 // 0x05700000
  62149                 switch (instr & 0x000f0000) {
  62150                   case 0x000f0000: {
  62151                     // 0x057f0000
  62152                     if (((instr & 0xf0000000) == 0xf0000000) ||
  62153                         ((instr & 0x1200000) == 0x200000)) {
  62154                       UnallocatedA32(instr);
  62155                       return;
  62156                     }
  62157                     Condition condition((instr >> 28) & 0xf);
  62158                     unsigned rt = (instr >> 12) & 0xf;
  62159                     uint32_t U = (instr >> 23) & 0x1;
  62160                     int32_t imm = instr & 0xfff;
  62161                     if (U == 0) imm = -imm;
  62162                     bool minus_zero = (imm == 0) && (U == 0);
  62163                     Location location(imm, kA32PcDelta);
  62164                     // LDRB{<c>}{<q>} <Rt>, <label> ; A1
  62165                     if (minus_zero) {
  62166                       ldrb(condition,
  62167                            Best,
  62168                            Register(rt),
  62169                            MemOperand(pc, minus, 0));
  62170                     } else {
  62171                       ldrb(condition, Register(rt), &location);
  62172                     }
  62173                     if (((instr & 0xf7f0000) != 0x55f0000)) {
  62174                       UnpredictableA32(instr);
  62175                     }
  62176                     break;
  62177                   }
  62178                   default: {
  62179                     if (((instr & 0xf0000000) == 0xf0000000) ||
  62180                         ((instr & 0xf0000) == 0xf0000)) {
  62181                       UnallocatedA32(instr);
  62182                       return;
  62183                     }
  62184                     Condition condition((instr >> 28) & 0xf);
  62185                     unsigned rt = (instr >> 12) & 0xf;
  62186                     unsigned rn = (instr >> 16) & 0xf;
  62187                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  62188                     int32_t offset = instr & 0xfff;
  62189                     // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1
  62190                     ldrb(condition,
  62191                          Best,
  62192                          Register(rt),
  62193                          MemOperand(Register(rn), sign, offset, PreIndex));
  62194                     break;
  62195                   }
  62196                 }
  62197                 break;
  62198               }
  62199             }
  62200             break;
  62201           }
  62202         }
  62203         break;
  62204       }
  62205       case 0x06000000: {
  62206         // 0x06000000
  62207         switch (instr & 0x01600010) {
  62208           case 0x00000000: {
  62209             // 0x06000000
  62210             switch (instr & 0x00100000) {
  62211               case 0x00000000: {
  62212                 // 0x06000000
  62213                 if (((instr & 0xf0000000) == 0xf0000000)) {
  62214                   UnallocatedA32(instr);
  62215                   return;
  62216                 }
  62217                 Condition condition((instr >> 28) & 0xf);
  62218                 unsigned rt = (instr >> 12) & 0xf;
  62219                 unsigned rn = (instr >> 16) & 0xf;
  62220                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  62221                 unsigned rm = instr & 0xf;
  62222                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
  62223                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
  62224                                                     (imm_and_type_ & 0x7c) >>
  62225                                                         2);
  62226                 Shift shift = shift_operand.GetShift();
  62227                 uint32_t amount = shift_operand.GetAmount();
  62228                 // STR{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
  62229                 str(condition,
  62230                     Best,
  62231                     Register(rt),
  62232                     MemOperand(Register(rn),
  62233                                sign,
  62234                                Register(rm),
  62235                                shift,
  62236                                amount,
  62237                                PostIndex));
  62238                 break;
  62239               }
  62240               case 0x00100000: {
  62241                 // 0x06100000
  62242                 if (((instr & 0xf0000000) == 0xf0000000)) {
  62243                   UnallocatedA32(instr);
  62244                   return;
  62245                 }
  62246                 Condition condition((instr >> 28) & 0xf);
  62247                 unsigned rt = (instr >> 12) & 0xf;
  62248                 unsigned rn = (instr >> 16) & 0xf;
  62249                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  62250                 unsigned rm = instr & 0xf;
  62251                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
  62252                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
  62253                                                     (imm_and_type_ & 0x7c) >>
  62254                                                         2);
  62255                 Shift shift = shift_operand.GetShift();
  62256                 uint32_t amount = shift_operand.GetAmount();
  62257                 // LDR{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
  62258                 ldr(condition,
  62259                     Best,
  62260                     Register(rt),
  62261                     MemOperand(Register(rn),
  62262                                sign,
  62263                                Register(rm),
  62264                                shift,
  62265                                amount,
  62266                                PostIndex));
  62267                 break;
  62268               }
  62269             }
  62270             break;
  62271           }
  62272           case 0x00000010: {
  62273             // 0x06000010
  62274             switch (instr & 0x00900060) {
  62275               case 0x00100000: {
  62276                 // 0x06100010
  62277                 switch (instr & 0x00000080) {
  62278                   case 0x00000000: {
  62279                     // 0x06100010
  62280                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62281                       UnallocatedA32(instr);
  62282                       return;
  62283                     }
  62284                     Condition condition((instr >> 28) & 0xf);
  62285                     unsigned rd = (instr >> 12) & 0xf;
  62286                     unsigned rn = (instr >> 16) & 0xf;
  62287                     unsigned rm = instr & 0xf;
  62288                     // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62289                     sadd16(condition, Register(rd), Register(rn), Register(rm));
  62290                     if (((instr & 0xff00ff0) != 0x6100f10)) {
  62291                       UnpredictableA32(instr);
  62292                     }
  62293                     break;
  62294                   }
  62295                   case 0x00000080: {
  62296                     // 0x06100090
  62297                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62298                       UnallocatedA32(instr);
  62299                       return;
  62300                     }
  62301                     Condition condition((instr >> 28) & 0xf);
  62302                     unsigned rd = (instr >> 12) & 0xf;
  62303                     unsigned rn = (instr >> 16) & 0xf;
  62304                     unsigned rm = instr & 0xf;
  62305                     // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62306                     sadd8(condition, Register(rd), Register(rn), Register(rm));
  62307                     if (((instr & 0xff00ff0) != 0x6100f90)) {
  62308                       UnpredictableA32(instr);
  62309                     }
  62310                     break;
  62311                   }
  62312                 }
  62313                 break;
  62314               }
  62315               case 0x00100020: {
  62316                 // 0x06100030
  62317                 if ((instr & 0x00000080) == 0x00000000) {
  62318                   if (((instr & 0xf0000000) == 0xf0000000)) {
  62319                     UnallocatedA32(instr);
  62320                     return;
  62321                   }
  62322                   Condition condition((instr >> 28) & 0xf);
  62323                   unsigned rd = (instr >> 12) & 0xf;
  62324                   unsigned rn = (instr >> 16) & 0xf;
  62325                   unsigned rm = instr & 0xf;
  62326                   // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62327                   sasx(condition, Register(rd), Register(rn), Register(rm));
  62328                   if (((instr & 0xff00ff0) != 0x6100f30)) {
  62329                     UnpredictableA32(instr);
  62330                   }
  62331                 } else {
  62332                   UnallocatedA32(instr);
  62333                 }
  62334                 break;
  62335               }
  62336               case 0x00100040: {
  62337                 // 0x06100050
  62338                 if ((instr & 0x00000080) == 0x00000000) {
  62339                   if (((instr & 0xf0000000) == 0xf0000000)) {
  62340                     UnallocatedA32(instr);
  62341                     return;
  62342                   }
  62343                   Condition condition((instr >> 28) & 0xf);
  62344                   unsigned rd = (instr >> 12) & 0xf;
  62345                   unsigned rn = (instr >> 16) & 0xf;
  62346                   unsigned rm = instr & 0xf;
  62347                   // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62348                   ssax(condition, Register(rd), Register(rn), Register(rm));
  62349                   if (((instr & 0xff00ff0) != 0x6100f50)) {
  62350                     UnpredictableA32(instr);
  62351                   }
  62352                 } else {
  62353                   UnallocatedA32(instr);
  62354                 }
  62355                 break;
  62356               }
  62357               case 0x00100060: {
  62358                 // 0x06100070
  62359                 switch (instr & 0x00000080) {
  62360                   case 0x00000000: {
  62361                     // 0x06100070
  62362                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62363                       UnallocatedA32(instr);
  62364                       return;
  62365                     }
  62366                     Condition condition((instr >> 28) & 0xf);
  62367                     unsigned rd = (instr >> 12) & 0xf;
  62368                     unsigned rn = (instr >> 16) & 0xf;
  62369                     unsigned rm = instr & 0xf;
  62370                     // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62371                     ssub16(condition, Register(rd), Register(rn), Register(rm));
  62372                     if (((instr & 0xff00ff0) != 0x6100f70)) {
  62373                       UnpredictableA32(instr);
  62374                     }
  62375                     break;
  62376                   }
  62377                   case 0x00000080: {
  62378                     // 0x061000f0
  62379                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62380                       UnallocatedA32(instr);
  62381                       return;
  62382                     }
  62383                     Condition condition((instr >> 28) & 0xf);
  62384                     unsigned rd = (instr >> 12) & 0xf;
  62385                     unsigned rn = (instr >> 16) & 0xf;
  62386                     unsigned rm = instr & 0xf;
  62387                     // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62388                     ssub8(condition, Register(rd), Register(rn), Register(rm));
  62389                     if (((instr & 0xff00ff0) != 0x6100ff0)) {
  62390                       UnpredictableA32(instr);
  62391                     }
  62392                     break;
  62393                   }
  62394                 }
  62395                 break;
  62396               }
  62397               case 0x00800000: {
  62398                 // 0x06800010
  62399                 if (((instr & 0xf0000000) == 0xf0000000)) {
  62400                   UnallocatedA32(instr);
  62401                   return;
  62402                 }
  62403                 Condition condition((instr >> 28) & 0xf);
  62404                 unsigned rd = (instr >> 12) & 0xf;
  62405                 unsigned rn = (instr >> 16) & 0xf;
  62406                 unsigned rm = instr & 0xf;
  62407                 uint32_t amount = (instr >> 7) & 0x1f;
  62408                 // PKHBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, LSL #<imm> } ; A1
  62409                 pkhbt(condition,
  62410                       Register(rd),
  62411                       Register(rn),
  62412                       Operand(Register(rm), LSL, amount));
  62413                 break;
  62414               }
  62415               case 0x00800020: {
  62416                 // 0x06800030
  62417                 if ((instr & 0x00000080) == 0x00000080) {
  62418                   if (((instr & 0xf0000000) == 0xf0000000)) {
  62419                     UnallocatedA32(instr);
  62420                     return;
  62421                   }
  62422                   Condition condition((instr >> 28) & 0xf);
  62423                   unsigned rd = (instr >> 12) & 0xf;
  62424                   unsigned rn = (instr >> 16) & 0xf;
  62425                   unsigned rm = instr & 0xf;
  62426                   // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62427                   sel(condition, Register(rd), Register(rn), Register(rm));
  62428                   if (((instr & 0xff00ff0) != 0x6800fb0)) {
  62429                     UnpredictableA32(instr);
  62430                   }
  62431                 } else {
  62432                   UnallocatedA32(instr);
  62433                 }
  62434                 break;
  62435               }
  62436               case 0x00800040: {
  62437                 // 0x06800050
  62438                 if (((instr & 0xf0000000) == 0xf0000000)) {
  62439                   UnallocatedA32(instr);
  62440                   return;
  62441                 }
  62442                 Condition condition((instr >> 28) & 0xf);
  62443                 unsigned rd = (instr >> 12) & 0xf;
  62444                 unsigned rn = (instr >> 16) & 0xf;
  62445                 unsigned rm = instr & 0xf;
  62446                 uint32_t amount = (instr >> 7) & 0x1f;
  62447                 if (amount == 0) amount = 32;
  62448                 // PKHTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ASR #<imm> } ; A1
  62449                 pkhtb(condition,
  62450                       Register(rd),
  62451                       Register(rn),
  62452                       Operand(Register(rm), ASR, amount));
  62453                 break;
  62454               }
  62455               case 0x00800060: {
  62456                 // 0x06800070
  62457                 switch (instr & 0x00000080) {
  62458                   case 0x00000000: {
  62459                     // 0x06800070
  62460                     switch (instr & 0x000f0000) {
  62461                       case 0x000f0000: {
  62462                         // 0x068f0070
  62463                         if (((instr & 0xf0000000) == 0xf0000000)) {
  62464                           UnallocatedA32(instr);
  62465                           return;
  62466                         }
  62467                         Condition condition((instr >> 28) & 0xf);
  62468                         unsigned rd = (instr >> 12) & 0xf;
  62469                         unsigned rm = instr & 0xf;
  62470                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
  62471                         // SXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
  62472                         sxtb16(condition,
  62473                                Register(rd),
  62474                                Operand(Register(rm), ROR, amount));
  62475                         if (((instr & 0xfff03f0) != 0x68f0070)) {
  62476                           UnpredictableA32(instr);
  62477                         }
  62478                         break;
  62479                       }
  62480                       default: {
  62481                         if (((instr & 0xf0000000) == 0xf0000000) ||
  62482                             ((instr & 0xf0000) == 0xf0000)) {
  62483                           UnallocatedA32(instr);
  62484                           return;
  62485                         }
  62486                         Condition condition((instr >> 28) & 0xf);
  62487                         unsigned rd = (instr >> 12) & 0xf;
  62488                         unsigned rn = (instr >> 16) & 0xf;
  62489                         unsigned rm = instr & 0xf;
  62490                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
  62491                         // SXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
  62492                         sxtab16(condition,
  62493                                 Register(rd),
  62494                                 Register(rn),
  62495                                 Operand(Register(rm), ROR, amount));
  62496                         if (((instr & 0xff003f0) != 0x6800070)) {
  62497                           UnpredictableA32(instr);
  62498                         }
  62499                         break;
  62500                       }
  62501                     }
  62502                     break;
  62503                   }
  62504                   default:
  62505                     UnallocatedA32(instr);
  62506                     break;
  62507                 }
  62508                 break;
  62509               }
  62510               default:
  62511                 UnallocatedA32(instr);
  62512                 break;
  62513             }
  62514             break;
  62515           }
  62516           case 0x00200000: {
  62517             // 0x06200000
  62518             switch (instr & 0x00100000) {
  62519               case 0x00000000: {
  62520                 // 0x06200000
  62521                 if (((instr & 0xf0000000) == 0xf0000000)) {
  62522                   UnallocatedA32(instr);
  62523                   return;
  62524                 }
  62525                 UnimplementedA32("STRT", instr);
  62526                 break;
  62527               }
  62528               case 0x00100000: {
  62529                 // 0x06300000
  62530                 if (((instr & 0xf0000000) == 0xf0000000)) {
  62531                   UnallocatedA32(instr);
  62532                   return;
  62533                 }
  62534                 UnimplementedA32("LDRT", instr);
  62535                 break;
  62536               }
  62537             }
  62538             break;
  62539           }
  62540           case 0x00200010: {
  62541             // 0x06200010
  62542             switch (instr & 0x00800060) {
  62543               case 0x00000000: {
  62544                 // 0x06200010
  62545                 switch (instr & 0x00100080) {
  62546                   case 0x00000000: {
  62547                     // 0x06200010
  62548                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62549                       UnallocatedA32(instr);
  62550                       return;
  62551                     }
  62552                     Condition condition((instr >> 28) & 0xf);
  62553                     unsigned rd = (instr >> 12) & 0xf;
  62554                     unsigned rn = (instr >> 16) & 0xf;
  62555                     unsigned rm = instr & 0xf;
  62556                     // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62557                     qadd16(condition, Register(rd), Register(rn), Register(rm));
  62558                     if (((instr & 0xff00ff0) != 0x6200f10)) {
  62559                       UnpredictableA32(instr);
  62560                     }
  62561                     break;
  62562                   }
  62563                   case 0x00000080: {
  62564                     // 0x06200090
  62565                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62566                       UnallocatedA32(instr);
  62567                       return;
  62568                     }
  62569                     Condition condition((instr >> 28) & 0xf);
  62570                     unsigned rd = (instr >> 12) & 0xf;
  62571                     unsigned rn = (instr >> 16) & 0xf;
  62572                     unsigned rm = instr & 0xf;
  62573                     // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62574                     qadd8(condition, Register(rd), Register(rn), Register(rm));
  62575                     if (((instr & 0xff00ff0) != 0x6200f90)) {
  62576                       UnpredictableA32(instr);
  62577                     }
  62578                     break;
  62579                   }
  62580                   case 0x00100000: {
  62581                     // 0x06300010
  62582                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62583                       UnallocatedA32(instr);
  62584                       return;
  62585                     }
  62586                     Condition condition((instr >> 28) & 0xf);
  62587                     unsigned rd = (instr >> 12) & 0xf;
  62588                     unsigned rn = (instr >> 16) & 0xf;
  62589                     unsigned rm = instr & 0xf;
  62590                     // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62591                     shadd16(condition,
  62592                             Register(rd),
  62593                             Register(rn),
  62594                             Register(rm));
  62595                     if (((instr & 0xff00ff0) != 0x6300f10)) {
  62596                       UnpredictableA32(instr);
  62597                     }
  62598                     break;
  62599                   }
  62600                   case 0x00100080: {
  62601                     // 0x06300090
  62602                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62603                       UnallocatedA32(instr);
  62604                       return;
  62605                     }
  62606                     Condition condition((instr >> 28) & 0xf);
  62607                     unsigned rd = (instr >> 12) & 0xf;
  62608                     unsigned rn = (instr >> 16) & 0xf;
  62609                     unsigned rm = instr & 0xf;
  62610                     // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62611                     shadd8(condition, Register(rd), Register(rn), Register(rm));
  62612                     if (((instr & 0xff00ff0) != 0x6300f90)) {
  62613                       UnpredictableA32(instr);
  62614                     }
  62615                     break;
  62616                   }
  62617                 }
  62618                 break;
  62619               }
  62620               case 0x00000020: {
  62621                 // 0x06200030
  62622                 switch (instr & 0x00100080) {
  62623                   case 0x00000000: {
  62624                     // 0x06200030
  62625                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62626                       UnallocatedA32(instr);
  62627                       return;
  62628                     }
  62629                     Condition condition((instr >> 28) & 0xf);
  62630                     unsigned rd = (instr >> 12) & 0xf;
  62631                     unsigned rn = (instr >> 16) & 0xf;
  62632                     unsigned rm = instr & 0xf;
  62633                     // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62634                     qasx(condition, Register(rd), Register(rn), Register(rm));
  62635                     if (((instr & 0xff00ff0) != 0x6200f30)) {
  62636                       UnpredictableA32(instr);
  62637                     }
  62638                     break;
  62639                   }
  62640                   case 0x00100000: {
  62641                     // 0x06300030
  62642                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62643                       UnallocatedA32(instr);
  62644                       return;
  62645                     }
  62646                     Condition condition((instr >> 28) & 0xf);
  62647                     unsigned rd = (instr >> 12) & 0xf;
  62648                     unsigned rn = (instr >> 16) & 0xf;
  62649                     unsigned rm = instr & 0xf;
  62650                     // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62651                     shasx(condition, Register(rd), Register(rn), Register(rm));
  62652                     if (((instr & 0xff00ff0) != 0x6300f30)) {
  62653                       UnpredictableA32(instr);
  62654                     }
  62655                     break;
  62656                   }
  62657                   default:
  62658                     UnallocatedA32(instr);
  62659                     break;
  62660                 }
  62661                 break;
  62662               }
  62663               case 0x00000040: {
  62664                 // 0x06200050
  62665                 switch (instr & 0x00100080) {
  62666                   case 0x00000000: {
  62667                     // 0x06200050
  62668                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62669                       UnallocatedA32(instr);
  62670                       return;
  62671                     }
  62672                     Condition condition((instr >> 28) & 0xf);
  62673                     unsigned rd = (instr >> 12) & 0xf;
  62674                     unsigned rn = (instr >> 16) & 0xf;
  62675                     unsigned rm = instr & 0xf;
  62676                     // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62677                     qsax(condition, Register(rd), Register(rn), Register(rm));
  62678                     if (((instr & 0xff00ff0) != 0x6200f50)) {
  62679                       UnpredictableA32(instr);
  62680                     }
  62681                     break;
  62682                   }
  62683                   case 0x00100000: {
  62684                     // 0x06300050
  62685                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62686                       UnallocatedA32(instr);
  62687                       return;
  62688                     }
  62689                     Condition condition((instr >> 28) & 0xf);
  62690                     unsigned rd = (instr >> 12) & 0xf;
  62691                     unsigned rn = (instr >> 16) & 0xf;
  62692                     unsigned rm = instr & 0xf;
  62693                     // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62694                     shsax(condition, Register(rd), Register(rn), Register(rm));
  62695                     if (((instr & 0xff00ff0) != 0x6300f50)) {
  62696                       UnpredictableA32(instr);
  62697                     }
  62698                     break;
  62699                   }
  62700                   default:
  62701                     UnallocatedA32(instr);
  62702                     break;
  62703                 }
  62704                 break;
  62705               }
  62706               case 0x00000060: {
  62707                 // 0x06200070
  62708                 switch (instr & 0x00100080) {
  62709                   case 0x00000000: {
  62710                     // 0x06200070
  62711                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62712                       UnallocatedA32(instr);
  62713                       return;
  62714                     }
  62715                     Condition condition((instr >> 28) & 0xf);
  62716                     unsigned rd = (instr >> 12) & 0xf;
  62717                     unsigned rn = (instr >> 16) & 0xf;
  62718                     unsigned rm = instr & 0xf;
  62719                     // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62720                     qsub16(condition, Register(rd), Register(rn), Register(rm));
  62721                     if (((instr & 0xff00ff0) != 0x6200f70)) {
  62722                       UnpredictableA32(instr);
  62723                     }
  62724                     break;
  62725                   }
  62726                   case 0x00000080: {
  62727                     // 0x062000f0
  62728                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62729                       UnallocatedA32(instr);
  62730                       return;
  62731                     }
  62732                     Condition condition((instr >> 28) & 0xf);
  62733                     unsigned rd = (instr >> 12) & 0xf;
  62734                     unsigned rn = (instr >> 16) & 0xf;
  62735                     unsigned rm = instr & 0xf;
  62736                     // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62737                     qsub8(condition, Register(rd), Register(rn), Register(rm));
  62738                     if (((instr & 0xff00ff0) != 0x6200ff0)) {
  62739                       UnpredictableA32(instr);
  62740                     }
  62741                     break;
  62742                   }
  62743                   case 0x00100000: {
  62744                     // 0x06300070
  62745                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62746                       UnallocatedA32(instr);
  62747                       return;
  62748                     }
  62749                     Condition condition((instr >> 28) & 0xf);
  62750                     unsigned rd = (instr >> 12) & 0xf;
  62751                     unsigned rn = (instr >> 16) & 0xf;
  62752                     unsigned rm = instr & 0xf;
  62753                     // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62754                     shsub16(condition,
  62755                             Register(rd),
  62756                             Register(rn),
  62757                             Register(rm));
  62758                     if (((instr & 0xff00ff0) != 0x6300f70)) {
  62759                       UnpredictableA32(instr);
  62760                     }
  62761                     break;
  62762                   }
  62763                   case 0x00100080: {
  62764                     // 0x063000f0
  62765                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62766                       UnallocatedA32(instr);
  62767                       return;
  62768                     }
  62769                     Condition condition((instr >> 28) & 0xf);
  62770                     unsigned rd = (instr >> 12) & 0xf;
  62771                     unsigned rn = (instr >> 16) & 0xf;
  62772                     unsigned rm = instr & 0xf;
  62773                     // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  62774                     shsub8(condition, Register(rd), Register(rn), Register(rm));
  62775                     if (((instr & 0xff00ff0) != 0x6300ff0)) {
  62776                       UnpredictableA32(instr);
  62777                     }
  62778                     break;
  62779                   }
  62780                 }
  62781                 break;
  62782               }
  62783               case 0x00800000: {
  62784                 // 0x06a00010
  62785                 if (((instr & 0xf0000000) == 0xf0000000)) {
  62786                   UnallocatedA32(instr);
  62787                   return;
  62788                 }
  62789                 Condition condition((instr >> 28) & 0xf);
  62790                 unsigned rd = (instr >> 12) & 0xf;
  62791                 uint32_t imm = ((instr >> 16) & 0x1f) + 1;
  62792                 unsigned rn = instr & 0xf;
  62793                 uint32_t amount = (instr >> 7) & 0x1f;
  62794                 // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; A1
  62795                 ssat(condition,
  62796                      Register(rd),
  62797                      imm,
  62798                      Operand(Register(rn), LSL, amount));
  62799                 break;
  62800               }
  62801               case 0x00800020: {
  62802                 // 0x06a00030
  62803                 switch (instr & 0x00100080) {
  62804                   case 0x00000000: {
  62805                     // 0x06a00030
  62806                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62807                       UnallocatedA32(instr);
  62808                       return;
  62809                     }
  62810                     Condition condition((instr >> 28) & 0xf);
  62811                     unsigned rd = (instr >> 12) & 0xf;
  62812                     uint32_t imm = ((instr >> 16) & 0xf) + 1;
  62813                     unsigned rn = instr & 0xf;
  62814                     // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; A1
  62815                     ssat16(condition, Register(rd), imm, Register(rn));
  62816                     if (((instr & 0xff00ff0) != 0x6a00f30)) {
  62817                       UnpredictableA32(instr);
  62818                     }
  62819                     break;
  62820                   }
  62821                   case 0x00100000: {
  62822                     // 0x06b00030
  62823                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62824                       UnallocatedA32(instr);
  62825                       return;
  62826                     }
  62827                     Condition condition((instr >> 28) & 0xf);
  62828                     unsigned rd = (instr >> 12) & 0xf;
  62829                     unsigned rm = instr & 0xf;
  62830                     // REV{<c>}{<q>} <Rd>, <Rm> ; A1
  62831                     rev(condition, Best, Register(rd), Register(rm));
  62832                     if (((instr & 0xfff0ff0) != 0x6bf0f30)) {
  62833                       UnpredictableA32(instr);
  62834                     }
  62835                     break;
  62836                   }
  62837                   case 0x00100080: {
  62838                     // 0x06b000b0
  62839                     if (((instr & 0xf0000000) == 0xf0000000)) {
  62840                       UnallocatedA32(instr);
  62841                       return;
  62842                     }
  62843                     Condition condition((instr >> 28) & 0xf);
  62844                     unsigned rd = (instr >> 12) & 0xf;
  62845                     unsigned rm = instr & 0xf;
  62846                     // REV16{<c>}{<q>} <Rd>, <Rm> ; A1
  62847                     rev16(condition, Best, Register(rd), Register(rm));
  62848                     if (((instr & 0xfff0ff0) != 0x6bf0fb0)) {
  62849                       UnpredictableA32(instr);
  62850                     }
  62851                     break;
  62852                   }
  62853                   default:
  62854                     UnallocatedA32(instr);
  62855                     break;
  62856                 }
  62857                 break;
  62858               }
  62859               case 0x00800040: {
  62860                 // 0x06a00050
  62861                 if (((instr & 0xf0000000) == 0xf0000000)) {
  62862                   UnallocatedA32(instr);
  62863                   return;
  62864                 }
  62865                 Condition condition((instr >> 28) & 0xf);
  62866                 unsigned rd = (instr >> 12) & 0xf;
  62867                 uint32_t imm = ((instr >> 16) & 0x1f) + 1;
  62868                 unsigned rn = instr & 0xf;
  62869                 uint32_t amount = (instr >> 7) & 0x1f;
  62870                 if (amount == 0) amount = 32;
  62871                 // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; A1
  62872                 ssat(condition,
  62873                      Register(rd),
  62874                      imm,
  62875                      Operand(Register(rn), ASR, amount));
  62876                 break;
  62877               }
  62878               case 0x00800060: {
  62879                 // 0x06a00070
  62880                 switch (instr & 0x00100080) {
  62881                   case 0x00000000: {
  62882                     // 0x06a00070
  62883                     switch (instr & 0x000f0000) {
  62884                       case 0x000f0000: {
  62885                         // 0x06af0070
  62886                         if (((instr & 0xf0000000) == 0xf0000000)) {
  62887                           UnallocatedA32(instr);
  62888                           return;
  62889                         }
  62890                         Condition condition((instr >> 28) & 0xf);
  62891                         unsigned rd = (instr >> 12) & 0xf;
  62892                         unsigned rm = instr & 0xf;
  62893                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
  62894                         // SXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
  62895                         sxtb(condition,
  62896                              Best,
  62897                              Register(rd),
  62898                              Operand(Register(rm), ROR, amount));
  62899                         if (((instr & 0xfff03f0) != 0x6af0070)) {
  62900                           UnpredictableA32(instr);
  62901                         }
  62902                         break;
  62903                       }
  62904                       default: {
  62905                         if (((instr & 0xf0000000) == 0xf0000000) ||
  62906                             ((instr & 0xf0000) == 0xf0000)) {
  62907                           UnallocatedA32(instr);
  62908                           return;
  62909                         }
  62910                         Condition condition((instr >> 28) & 0xf);
  62911                         unsigned rd = (instr >> 12) & 0xf;
  62912                         unsigned rn = (instr >> 16) & 0xf;
  62913                         unsigned rm = instr & 0xf;
  62914                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
  62915                         // SXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
  62916                         sxtab(condition,
  62917                               Register(rd),
  62918                               Register(rn),
  62919                               Operand(Register(rm), ROR, amount));
  62920                         if (((instr & 0xff003f0) != 0x6a00070)) {
  62921                           UnpredictableA32(instr);
  62922                         }
  62923                         break;
  62924                       }
  62925                     }
  62926                     break;
  62927                   }
  62928                   case 0x00100000: {
  62929                     // 0x06b00070
  62930                     switch (instr & 0x000f0000) {
  62931                       case 0x000f0000: {
  62932                         // 0x06bf0070
  62933                         if (((instr & 0xf0000000) == 0xf0000000)) {
  62934                           UnallocatedA32(instr);
  62935                           return;
  62936                         }
  62937                         Condition condition((instr >> 28) & 0xf);
  62938                         unsigned rd = (instr >> 12) & 0xf;
  62939                         unsigned rm = instr & 0xf;
  62940                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
  62941                         // SXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
  62942                         sxth(condition,
  62943                              Best,
  62944                              Register(rd),
  62945                              Operand(Register(rm), ROR, amount));
  62946                         if (((instr & 0xfff03f0) != 0x6bf0070)) {
  62947                           UnpredictableA32(instr);
  62948                         }
  62949                         break;
  62950                       }
  62951                       default: {
  62952                         if (((instr & 0xf0000000) == 0xf0000000) ||
  62953                             ((instr & 0xf0000) == 0xf0000)) {
  62954                           UnallocatedA32(instr);
  62955                           return;
  62956                         }
  62957                         Condition condition((instr >> 28) & 0xf);
  62958                         unsigned rd = (instr >> 12) & 0xf;
  62959                         unsigned rn = (instr >> 16) & 0xf;
  62960                         unsigned rm = instr & 0xf;
  62961                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
  62962                         // SXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
  62963                         sxtah(condition,
  62964                               Register(rd),
  62965                               Register(rn),
  62966                               Operand(Register(rm), ROR, amount));
  62967                         if (((instr & 0xff003f0) != 0x6b00070)) {
  62968                           UnpredictableA32(instr);
  62969                         }
  62970                         break;
  62971                       }
  62972                     }
  62973                     break;
  62974                   }
  62975                   default:
  62976                     UnallocatedA32(instr);
  62977                     break;
  62978                 }
  62979                 break;
  62980               }
  62981             }
  62982             break;
  62983           }
  62984           case 0x00400000: {
  62985             // 0x06400000
  62986             switch (instr & 0x00100000) {
  62987               case 0x00000000: {
  62988                 // 0x06400000
  62989                 if (((instr & 0xf0000000) == 0xf0000000)) {
  62990                   UnallocatedA32(instr);
  62991                   return;
  62992                 }
  62993                 Condition condition((instr >> 28) & 0xf);
  62994                 unsigned rt = (instr >> 12) & 0xf;
  62995                 unsigned rn = (instr >> 16) & 0xf;
  62996                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  62997                 unsigned rm = instr & 0xf;
  62998                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
  62999                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
  63000                                                     (imm_and_type_ & 0x7c) >>
  63001                                                         2);
  63002                 Shift shift = shift_operand.GetShift();
  63003                 uint32_t amount = shift_operand.GetAmount();
  63004                 // STRB{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
  63005                 strb(condition,
  63006                      Best,
  63007                      Register(rt),
  63008                      MemOperand(Register(rn),
  63009                                 sign,
  63010                                 Register(rm),
  63011                                 shift,
  63012                                 amount,
  63013                                 PostIndex));
  63014                 break;
  63015               }
  63016               case 0x00100000: {
  63017                 // 0x06500000
  63018                 if (((instr & 0xf0000000) == 0xf0000000)) {
  63019                   UnallocatedA32(instr);
  63020                   return;
  63021                 }
  63022                 Condition condition((instr >> 28) & 0xf);
  63023                 unsigned rt = (instr >> 12) & 0xf;
  63024                 unsigned rn = (instr >> 16) & 0xf;
  63025                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  63026                 unsigned rm = instr & 0xf;
  63027                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
  63028                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
  63029                                                     (imm_and_type_ & 0x7c) >>
  63030                                                         2);
  63031                 Shift shift = shift_operand.GetShift();
  63032                 uint32_t amount = shift_operand.GetAmount();
  63033                 // LDRB{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1
  63034                 ldrb(condition,
  63035                      Best,
  63036                      Register(rt),
  63037                      MemOperand(Register(rn),
  63038                                 sign,
  63039                                 Register(rm),
  63040                                 shift,
  63041                                 amount,
  63042                                 PostIndex));
  63043                 break;
  63044               }
  63045             }
  63046             break;
  63047           }
  63048           case 0x00400010: {
  63049             // 0x06400010
  63050             switch (instr & 0x009000e0) {
  63051               case 0x00100000: {
  63052                 // 0x06500010
  63053                 if (((instr & 0xf0000000) == 0xf0000000)) {
  63054                   UnallocatedA32(instr);
  63055                   return;
  63056                 }
  63057                 Condition condition((instr >> 28) & 0xf);
  63058                 unsigned rd = (instr >> 12) & 0xf;
  63059                 unsigned rn = (instr >> 16) & 0xf;
  63060                 unsigned rm = instr & 0xf;
  63061                 // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63062                 uadd16(condition, Register(rd), Register(rn), Register(rm));
  63063                 if (((instr & 0xff00ff0) != 0x6500f10)) {
  63064                   UnpredictableA32(instr);
  63065                 }
  63066                 break;
  63067               }
  63068               case 0x00100020: {
  63069                 // 0x06500030
  63070                 if (((instr & 0xf0000000) == 0xf0000000)) {
  63071                   UnallocatedA32(instr);
  63072                   return;
  63073                 }
  63074                 Condition condition((instr >> 28) & 0xf);
  63075                 unsigned rd = (instr >> 12) & 0xf;
  63076                 unsigned rn = (instr >> 16) & 0xf;
  63077                 unsigned rm = instr & 0xf;
  63078                 // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63079                 uasx(condition, Register(rd), Register(rn), Register(rm));
  63080                 if (((instr & 0xff00ff0) != 0x6500f30)) {
  63081                   UnpredictableA32(instr);
  63082                 }
  63083                 break;
  63084               }
  63085               case 0x00100040: {
  63086                 // 0x06500050
  63087                 if (((instr & 0xf0000000) == 0xf0000000)) {
  63088                   UnallocatedA32(instr);
  63089                   return;
  63090                 }
  63091                 Condition condition((instr >> 28) & 0xf);
  63092                 unsigned rd = (instr >> 12) & 0xf;
  63093                 unsigned rn = (instr >> 16) & 0xf;
  63094                 unsigned rm = instr & 0xf;
  63095                 // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63096                 usax(condition, Register(rd), Register(rn), Register(rm));
  63097                 if (((instr & 0xff00ff0) != 0x6500f50)) {
  63098                   UnpredictableA32(instr);
  63099                 }
  63100                 break;
  63101               }
  63102               case 0x00100060: {
  63103                 // 0x06500070
  63104                 if (((instr & 0xf0000000) == 0xf0000000)) {
  63105                   UnallocatedA32(instr);
  63106                   return;
  63107                 }
  63108                 Condition condition((instr >> 28) & 0xf);
  63109                 unsigned rd = (instr >> 12) & 0xf;
  63110                 unsigned rn = (instr >> 16) & 0xf;
  63111                 unsigned rm = instr & 0xf;
  63112                 // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63113                 usub16(condition, Register(rd), Register(rn), Register(rm));
  63114                 if (((instr & 0xff00ff0) != 0x6500f70)) {
  63115                   UnpredictableA32(instr);
  63116                 }
  63117                 break;
  63118               }
  63119               case 0x00100080: {
  63120                 // 0x06500090
  63121                 if (((instr & 0xf0000000) == 0xf0000000)) {
  63122                   UnallocatedA32(instr);
  63123                   return;
  63124                 }
  63125                 Condition condition((instr >> 28) & 0xf);
  63126                 unsigned rd = (instr >> 12) & 0xf;
  63127                 unsigned rn = (instr >> 16) & 0xf;
  63128                 unsigned rm = instr & 0xf;
  63129                 // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63130                 uadd8(condition, Register(rd), Register(rn), Register(rm));
  63131                 if (((instr & 0xff00ff0) != 0x6500f90)) {
  63132                   UnpredictableA32(instr);
  63133                 }
  63134                 break;
  63135               }
  63136               case 0x001000e0: {
  63137                 // 0x065000f0
  63138                 if (((instr & 0xf0000000) == 0xf0000000)) {
  63139                   UnallocatedA32(instr);
  63140                   return;
  63141                 }
  63142                 Condition condition((instr >> 28) & 0xf);
  63143                 unsigned rd = (instr >> 12) & 0xf;
  63144                 unsigned rn = (instr >> 16) & 0xf;
  63145                 unsigned rm = instr & 0xf;
  63146                 // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63147                 usub8(condition, Register(rd), Register(rn), Register(rm));
  63148                 if (((instr & 0xff00ff0) != 0x6500ff0)) {
  63149                   UnpredictableA32(instr);
  63150                 }
  63151                 break;
  63152               }
  63153               case 0x00800060: {
  63154                 // 0x06c00070
  63155                 switch (instr & 0x000f0000) {
  63156                   case 0x000f0000: {
  63157                     // 0x06cf0070
  63158                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63159                       UnallocatedA32(instr);
  63160                       return;
  63161                     }
  63162                     Condition condition((instr >> 28) & 0xf);
  63163                     unsigned rd = (instr >> 12) & 0xf;
  63164                     unsigned rm = instr & 0xf;
  63165                     uint32_t amount = ((instr >> 10) & 0x3) * 8;
  63166                     // UXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
  63167                     uxtb16(condition,
  63168                            Register(rd),
  63169                            Operand(Register(rm), ROR, amount));
  63170                     if (((instr & 0xfff03f0) != 0x6cf0070)) {
  63171                       UnpredictableA32(instr);
  63172                     }
  63173                     break;
  63174                   }
  63175                   default: {
  63176                     if (((instr & 0xf0000000) == 0xf0000000) ||
  63177                         ((instr & 0xf0000) == 0xf0000)) {
  63178                       UnallocatedA32(instr);
  63179                       return;
  63180                     }
  63181                     Condition condition((instr >> 28) & 0xf);
  63182                     unsigned rd = (instr >> 12) & 0xf;
  63183                     unsigned rn = (instr >> 16) & 0xf;
  63184                     unsigned rm = instr & 0xf;
  63185                     uint32_t amount = ((instr >> 10) & 0x3) * 8;
  63186                     // UXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
  63187                     uxtab16(condition,
  63188                             Register(rd),
  63189                             Register(rn),
  63190                             Operand(Register(rm), ROR, amount));
  63191                     if (((instr & 0xff003f0) != 0x6c00070)) {
  63192                       UnpredictableA32(instr);
  63193                     }
  63194                     break;
  63195                   }
  63196                 }
  63197                 break;
  63198               }
  63199               default:
  63200                 UnallocatedA32(instr);
  63201                 break;
  63202             }
  63203             break;
  63204           }
  63205           case 0x00600000: {
  63206             // 0x06600000
  63207             switch (instr & 0x00100000) {
  63208               case 0x00000000: {
  63209                 // 0x06600000
  63210                 if (((instr & 0xf0000000) == 0xf0000000)) {
  63211                   UnallocatedA32(instr);
  63212                   return;
  63213                 }
  63214                 UnimplementedA32("STRBT", instr);
  63215                 break;
  63216               }
  63217               case 0x00100000: {
  63218                 // 0x06700000
  63219                 if (((instr & 0xf0000000) == 0xf0000000)) {
  63220                   UnallocatedA32(instr);
  63221                   return;
  63222                 }
  63223                 UnimplementedA32("LDRBT", instr);
  63224                 break;
  63225               }
  63226             }
  63227             break;
  63228           }
  63229           case 0x00600010: {
  63230             // 0x06600010
  63231             switch (instr & 0x00800060) {
  63232               case 0x00000000: {
  63233                 // 0x06600010
  63234                 switch (instr & 0x00100080) {
  63235                   case 0x00000000: {
  63236                     // 0x06600010
  63237                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63238                       UnallocatedA32(instr);
  63239                       return;
  63240                     }
  63241                     Condition condition((instr >> 28) & 0xf);
  63242                     unsigned rd = (instr >> 12) & 0xf;
  63243                     unsigned rn = (instr >> 16) & 0xf;
  63244                     unsigned rm = instr & 0xf;
  63245                     // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63246                     uqadd16(condition,
  63247                             Register(rd),
  63248                             Register(rn),
  63249                             Register(rm));
  63250                     if (((instr & 0xff00ff0) != 0x6600f10)) {
  63251                       UnpredictableA32(instr);
  63252                     }
  63253                     break;
  63254                   }
  63255                   case 0x00000080: {
  63256                     // 0x06600090
  63257                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63258                       UnallocatedA32(instr);
  63259                       return;
  63260                     }
  63261                     Condition condition((instr >> 28) & 0xf);
  63262                     unsigned rd = (instr >> 12) & 0xf;
  63263                     unsigned rn = (instr >> 16) & 0xf;
  63264                     unsigned rm = instr & 0xf;
  63265                     // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63266                     uqadd8(condition, Register(rd), Register(rn), Register(rm));
  63267                     if (((instr & 0xff00ff0) != 0x6600f90)) {
  63268                       UnpredictableA32(instr);
  63269                     }
  63270                     break;
  63271                   }
  63272                   case 0x00100000: {
  63273                     // 0x06700010
  63274                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63275                       UnallocatedA32(instr);
  63276                       return;
  63277                     }
  63278                     Condition condition((instr >> 28) & 0xf);
  63279                     unsigned rd = (instr >> 12) & 0xf;
  63280                     unsigned rn = (instr >> 16) & 0xf;
  63281                     unsigned rm = instr & 0xf;
  63282                     // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63283                     uhadd16(condition,
  63284                             Register(rd),
  63285                             Register(rn),
  63286                             Register(rm));
  63287                     if (((instr & 0xff00ff0) != 0x6700f10)) {
  63288                       UnpredictableA32(instr);
  63289                     }
  63290                     break;
  63291                   }
  63292                   case 0x00100080: {
  63293                     // 0x06700090
  63294                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63295                       UnallocatedA32(instr);
  63296                       return;
  63297                     }
  63298                     Condition condition((instr >> 28) & 0xf);
  63299                     unsigned rd = (instr >> 12) & 0xf;
  63300                     unsigned rn = (instr >> 16) & 0xf;
  63301                     unsigned rm = instr & 0xf;
  63302                     // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63303                     uhadd8(condition, Register(rd), Register(rn), Register(rm));
  63304                     if (((instr & 0xff00ff0) != 0x6700f90)) {
  63305                       UnpredictableA32(instr);
  63306                     }
  63307                     break;
  63308                   }
  63309                 }
  63310                 break;
  63311               }
  63312               case 0x00000020: {
  63313                 // 0x06600030
  63314                 switch (instr & 0x00100080) {
  63315                   case 0x00000000: {
  63316                     // 0x06600030
  63317                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63318                       UnallocatedA32(instr);
  63319                       return;
  63320                     }
  63321                     Condition condition((instr >> 28) & 0xf);
  63322                     unsigned rd = (instr >> 12) & 0xf;
  63323                     unsigned rn = (instr >> 16) & 0xf;
  63324                     unsigned rm = instr & 0xf;
  63325                     // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63326                     uqasx(condition, Register(rd), Register(rn), Register(rm));
  63327                     if (((instr & 0xff00ff0) != 0x6600f30)) {
  63328                       UnpredictableA32(instr);
  63329                     }
  63330                     break;
  63331                   }
  63332                   case 0x00100000: {
  63333                     // 0x06700030
  63334                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63335                       UnallocatedA32(instr);
  63336                       return;
  63337                     }
  63338                     Condition condition((instr >> 28) & 0xf);
  63339                     unsigned rd = (instr >> 12) & 0xf;
  63340                     unsigned rn = (instr >> 16) & 0xf;
  63341                     unsigned rm = instr & 0xf;
  63342                     // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63343                     uhasx(condition, Register(rd), Register(rn), Register(rm));
  63344                     if (((instr & 0xff00ff0) != 0x6700f30)) {
  63345                       UnpredictableA32(instr);
  63346                     }
  63347                     break;
  63348                   }
  63349                   default:
  63350                     UnallocatedA32(instr);
  63351                     break;
  63352                 }
  63353                 break;
  63354               }
  63355               case 0x00000040: {
  63356                 // 0x06600050
  63357                 switch (instr & 0x00100080) {
  63358                   case 0x00000000: {
  63359                     // 0x06600050
  63360                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63361                       UnallocatedA32(instr);
  63362                       return;
  63363                     }
  63364                     Condition condition((instr >> 28) & 0xf);
  63365                     unsigned rd = (instr >> 12) & 0xf;
  63366                     unsigned rn = (instr >> 16) & 0xf;
  63367                     unsigned rm = instr & 0xf;
  63368                     // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63369                     uqsax(condition, Register(rd), Register(rn), Register(rm));
  63370                     if (((instr & 0xff00ff0) != 0x6600f50)) {
  63371                       UnpredictableA32(instr);
  63372                     }
  63373                     break;
  63374                   }
  63375                   case 0x00100000: {
  63376                     // 0x06700050
  63377                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63378                       UnallocatedA32(instr);
  63379                       return;
  63380                     }
  63381                     Condition condition((instr >> 28) & 0xf);
  63382                     unsigned rd = (instr >> 12) & 0xf;
  63383                     unsigned rn = (instr >> 16) & 0xf;
  63384                     unsigned rm = instr & 0xf;
  63385                     // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63386                     uhsax(condition, Register(rd), Register(rn), Register(rm));
  63387                     if (((instr & 0xff00ff0) != 0x6700f50)) {
  63388                       UnpredictableA32(instr);
  63389                     }
  63390                     break;
  63391                   }
  63392                   default:
  63393                     UnallocatedA32(instr);
  63394                     break;
  63395                 }
  63396                 break;
  63397               }
  63398               case 0x00000060: {
  63399                 // 0x06600070
  63400                 switch (instr & 0x00100080) {
  63401                   case 0x00000000: {
  63402                     // 0x06600070
  63403                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63404                       UnallocatedA32(instr);
  63405                       return;
  63406                     }
  63407                     Condition condition((instr >> 28) & 0xf);
  63408                     unsigned rd = (instr >> 12) & 0xf;
  63409                     unsigned rn = (instr >> 16) & 0xf;
  63410                     unsigned rm = instr & 0xf;
  63411                     // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63412                     uqsub16(condition,
  63413                             Register(rd),
  63414                             Register(rn),
  63415                             Register(rm));
  63416                     if (((instr & 0xff00ff0) != 0x6600f70)) {
  63417                       UnpredictableA32(instr);
  63418                     }
  63419                     break;
  63420                   }
  63421                   case 0x00000080: {
  63422                     // 0x066000f0
  63423                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63424                       UnallocatedA32(instr);
  63425                       return;
  63426                     }
  63427                     Condition condition((instr >> 28) & 0xf);
  63428                     unsigned rd = (instr >> 12) & 0xf;
  63429                     unsigned rn = (instr >> 16) & 0xf;
  63430                     unsigned rm = instr & 0xf;
  63431                     // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63432                     uqsub8(condition, Register(rd), Register(rn), Register(rm));
  63433                     if (((instr & 0xff00ff0) != 0x6600ff0)) {
  63434                       UnpredictableA32(instr);
  63435                     }
  63436                     break;
  63437                   }
  63438                   case 0x00100000: {
  63439                     // 0x06700070
  63440                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63441                       UnallocatedA32(instr);
  63442                       return;
  63443                     }
  63444                     Condition condition((instr >> 28) & 0xf);
  63445                     unsigned rd = (instr >> 12) & 0xf;
  63446                     unsigned rn = (instr >> 16) & 0xf;
  63447                     unsigned rm = instr & 0xf;
  63448                     // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63449                     uhsub16(condition,
  63450                             Register(rd),
  63451                             Register(rn),
  63452                             Register(rm));
  63453                     if (((instr & 0xff00ff0) != 0x6700f70)) {
  63454                       UnpredictableA32(instr);
  63455                     }
  63456                     break;
  63457                   }
  63458                   case 0x00100080: {
  63459                     // 0x067000f0
  63460                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63461                       UnallocatedA32(instr);
  63462                       return;
  63463                     }
  63464                     Condition condition((instr >> 28) & 0xf);
  63465                     unsigned rd = (instr >> 12) & 0xf;
  63466                     unsigned rn = (instr >> 16) & 0xf;
  63467                     unsigned rm = instr & 0xf;
  63468                     // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63469                     uhsub8(condition, Register(rd), Register(rn), Register(rm));
  63470                     if (((instr & 0xff00ff0) != 0x6700ff0)) {
  63471                       UnpredictableA32(instr);
  63472                     }
  63473                     break;
  63474                   }
  63475                 }
  63476                 break;
  63477               }
  63478               case 0x00800000: {
  63479                 // 0x06e00010
  63480                 if (((instr & 0xf0000000) == 0xf0000000)) {
  63481                   UnallocatedA32(instr);
  63482                   return;
  63483                 }
  63484                 Condition condition((instr >> 28) & 0xf);
  63485                 unsigned rd = (instr >> 12) & 0xf;
  63486                 uint32_t imm = (instr >> 16) & 0x1f;
  63487                 unsigned rn = instr & 0xf;
  63488                 uint32_t amount = (instr >> 7) & 0x1f;
  63489                 // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; A1
  63490                 usat(condition,
  63491                      Register(rd),
  63492                      imm,
  63493                      Operand(Register(rn), LSL, amount));
  63494                 break;
  63495               }
  63496               case 0x00800020: {
  63497                 // 0x06e00030
  63498                 switch (instr & 0x00100080) {
  63499                   case 0x00000000: {
  63500                     // 0x06e00030
  63501                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63502                       UnallocatedA32(instr);
  63503                       return;
  63504                     }
  63505                     Condition condition((instr >> 28) & 0xf);
  63506                     unsigned rd = (instr >> 12) & 0xf;
  63507                     uint32_t imm = (instr >> 16) & 0xf;
  63508                     unsigned rn = instr & 0xf;
  63509                     // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; A1
  63510                     usat16(condition, Register(rd), imm, Register(rn));
  63511                     if (((instr & 0xff00ff0) != 0x6e00f30)) {
  63512                       UnpredictableA32(instr);
  63513                     }
  63514                     break;
  63515                   }
  63516                   case 0x00100000: {
  63517                     // 0x06f00030
  63518                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63519                       UnallocatedA32(instr);
  63520                       return;
  63521                     }
  63522                     Condition condition((instr >> 28) & 0xf);
  63523                     unsigned rd = (instr >> 12) & 0xf;
  63524                     unsigned rm = instr & 0xf;
  63525                     // RBIT{<c>}{<q>} <Rd>, <Rm> ; A1
  63526                     rbit(condition, Register(rd), Register(rm));
  63527                     if (((instr & 0xfff0ff0) != 0x6ff0f30)) {
  63528                       UnpredictableA32(instr);
  63529                     }
  63530                     break;
  63531                   }
  63532                   case 0x00100080: {
  63533                     // 0x06f000b0
  63534                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63535                       UnallocatedA32(instr);
  63536                       return;
  63537                     }
  63538                     Condition condition((instr >> 28) & 0xf);
  63539                     unsigned rd = (instr >> 12) & 0xf;
  63540                     unsigned rm = instr & 0xf;
  63541                     // REVSH{<c>}{<q>} <Rd>, <Rm> ; A1
  63542                     revsh(condition, Best, Register(rd), Register(rm));
  63543                     if (((instr & 0xfff0ff0) != 0x6ff0fb0)) {
  63544                       UnpredictableA32(instr);
  63545                     }
  63546                     break;
  63547                   }
  63548                   default:
  63549                     UnallocatedA32(instr);
  63550                     break;
  63551                 }
  63552                 break;
  63553               }
  63554               case 0x00800040: {
  63555                 // 0x06e00050
  63556                 if (((instr & 0xf0000000) == 0xf0000000)) {
  63557                   UnallocatedA32(instr);
  63558                   return;
  63559                 }
  63560                 Condition condition((instr >> 28) & 0xf);
  63561                 unsigned rd = (instr >> 12) & 0xf;
  63562                 uint32_t imm = (instr >> 16) & 0x1f;
  63563                 unsigned rn = instr & 0xf;
  63564                 uint32_t amount = (instr >> 7) & 0x1f;
  63565                 if (amount == 0) amount = 32;
  63566                 // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; A1
  63567                 usat(condition,
  63568                      Register(rd),
  63569                      imm,
  63570                      Operand(Register(rn), ASR, amount));
  63571                 break;
  63572               }
  63573               case 0x00800060: {
  63574                 // 0x06e00070
  63575                 switch (instr & 0x00100080) {
  63576                   case 0x00000000: {
  63577                     // 0x06e00070
  63578                     switch (instr & 0x000f0000) {
  63579                       case 0x000f0000: {
  63580                         // 0x06ef0070
  63581                         if (((instr & 0xf0000000) == 0xf0000000)) {
  63582                           UnallocatedA32(instr);
  63583                           return;
  63584                         }
  63585                         Condition condition((instr >> 28) & 0xf);
  63586                         unsigned rd = (instr >> 12) & 0xf;
  63587                         unsigned rm = instr & 0xf;
  63588                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
  63589                         // UXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
  63590                         uxtb(condition,
  63591                              Best,
  63592                              Register(rd),
  63593                              Operand(Register(rm), ROR, amount));
  63594                         if (((instr & 0xfff03f0) != 0x6ef0070)) {
  63595                           UnpredictableA32(instr);
  63596                         }
  63597                         break;
  63598                       }
  63599                       default: {
  63600                         if (((instr & 0xf0000000) == 0xf0000000) ||
  63601                             ((instr & 0xf0000) == 0xf0000)) {
  63602                           UnallocatedA32(instr);
  63603                           return;
  63604                         }
  63605                         Condition condition((instr >> 28) & 0xf);
  63606                         unsigned rd = (instr >> 12) & 0xf;
  63607                         unsigned rn = (instr >> 16) & 0xf;
  63608                         unsigned rm = instr & 0xf;
  63609                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
  63610                         // UXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
  63611                         uxtab(condition,
  63612                               Register(rd),
  63613                               Register(rn),
  63614                               Operand(Register(rm), ROR, amount));
  63615                         if (((instr & 0xff003f0) != 0x6e00070)) {
  63616                           UnpredictableA32(instr);
  63617                         }
  63618                         break;
  63619                       }
  63620                     }
  63621                     break;
  63622                   }
  63623                   case 0x00100000: {
  63624                     // 0x06f00070
  63625                     switch (instr & 0x000f0000) {
  63626                       case 0x000f0000: {
  63627                         // 0x06ff0070
  63628                         if (((instr & 0xf0000000) == 0xf0000000)) {
  63629                           UnallocatedA32(instr);
  63630                           return;
  63631                         }
  63632                         Condition condition((instr >> 28) & 0xf);
  63633                         unsigned rd = (instr >> 12) & 0xf;
  63634                         unsigned rm = instr & 0xf;
  63635                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
  63636                         // UXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1
  63637                         uxth(condition,
  63638                              Best,
  63639                              Register(rd),
  63640                              Operand(Register(rm), ROR, amount));
  63641                         if (((instr & 0xfff03f0) != 0x6ff0070)) {
  63642                           UnpredictableA32(instr);
  63643                         }
  63644                         break;
  63645                       }
  63646                       default: {
  63647                         if (((instr & 0xf0000000) == 0xf0000000) ||
  63648                             ((instr & 0xf0000) == 0xf0000)) {
  63649                           UnallocatedA32(instr);
  63650                           return;
  63651                         }
  63652                         Condition condition((instr >> 28) & 0xf);
  63653                         unsigned rd = (instr >> 12) & 0xf;
  63654                         unsigned rn = (instr >> 16) & 0xf;
  63655                         unsigned rm = instr & 0xf;
  63656                         uint32_t amount = ((instr >> 10) & 0x3) * 8;
  63657                         // UXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length)
  63658                         uxtah(condition,
  63659                               Register(rd),
  63660                               Register(rn),
  63661                               Operand(Register(rm), ROR, amount));
  63662                         if (((instr & 0xff003f0) != 0x6f00070)) {
  63663                           UnpredictableA32(instr);
  63664                         }
  63665                         break;
  63666                       }
  63667                     }
  63668                     break;
  63669                   }
  63670                   default:
  63671                     UnallocatedA32(instr);
  63672                     break;
  63673                 }
  63674                 break;
  63675               }
  63676             }
  63677             break;
  63678           }
  63679           case 0x01000000: {
  63680             // 0x07000000
  63681             switch (instr & 0x00100000) {
  63682               case 0x00000000: {
  63683                 // 0x07000000
  63684                 if (((instr & 0xf0000000) == 0xf0000000)) {
  63685                   UnallocatedA32(instr);
  63686                   return;
  63687                 }
  63688                 Condition condition((instr >> 28) & 0xf);
  63689                 unsigned rt = (instr >> 12) & 0xf;
  63690                 unsigned rn = (instr >> 16) & 0xf;
  63691                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  63692                 unsigned rm = instr & 0xf;
  63693                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
  63694                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
  63695                                                     (imm_and_type_ & 0x7c) >>
  63696                                                         2);
  63697                 Shift shift = shift_operand.GetShift();
  63698                 uint32_t amount = shift_operand.GetAmount();
  63699                 AddrMode addrmode = Offset;
  63700                 // STR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
  63701                 str(condition,
  63702                     Best,
  63703                     Register(rt),
  63704                     MemOperand(Register(rn),
  63705                                sign,
  63706                                Register(rm),
  63707                                shift,
  63708                                amount,
  63709                                addrmode));
  63710                 break;
  63711               }
  63712               case 0x00100000: {
  63713                 // 0x07100000
  63714                 if (((instr & 0xf0000000) == 0xf0000000)) {
  63715                   UnallocatedA32(instr);
  63716                   return;
  63717                 }
  63718                 Condition condition((instr >> 28) & 0xf);
  63719                 unsigned rt = (instr >> 12) & 0xf;
  63720                 unsigned rn = (instr >> 16) & 0xf;
  63721                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  63722                 unsigned rm = instr & 0xf;
  63723                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
  63724                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
  63725                                                     (imm_and_type_ & 0x7c) >>
  63726                                                         2);
  63727                 Shift shift = shift_operand.GetShift();
  63728                 uint32_t amount = shift_operand.GetAmount();
  63729                 AddrMode addrmode = Offset;
  63730                 // LDR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
  63731                 ldr(condition,
  63732                     Best,
  63733                     Register(rt),
  63734                     MemOperand(Register(rn),
  63735                                sign,
  63736                                Register(rm),
  63737                                shift,
  63738                                amount,
  63739                                addrmode));
  63740                 break;
  63741               }
  63742             }
  63743             break;
  63744           }
  63745           case 0x01000010: {
  63746             // 0x07000010
  63747             switch (instr & 0x009000e0) {
  63748               case 0x00000000: {
  63749                 // 0x07000010
  63750                 switch (instr & 0x0000f000) {
  63751                   case 0x0000f000: {
  63752                     // 0x0700f010
  63753                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63754                       UnallocatedA32(instr);
  63755                       return;
  63756                     }
  63757                     Condition condition((instr >> 28) & 0xf);
  63758                     unsigned rd = (instr >> 16) & 0xf;
  63759                     unsigned rn = instr & 0xf;
  63760                     unsigned rm = (instr >> 8) & 0xf;
  63761                     // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63762                     smuad(condition, Register(rd), Register(rn), Register(rm));
  63763                     break;
  63764                   }
  63765                   default: {
  63766                     if (((instr & 0xf0000000) == 0xf0000000) ||
  63767                         ((instr & 0xf000) == 0xf000)) {
  63768                       UnallocatedA32(instr);
  63769                       return;
  63770                     }
  63771                     Condition condition((instr >> 28) & 0xf);
  63772                     unsigned rd = (instr >> 16) & 0xf;
  63773                     unsigned rn = instr & 0xf;
  63774                     unsigned rm = (instr >> 8) & 0xf;
  63775                     unsigned ra = (instr >> 12) & 0xf;
  63776                     // SMLAD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
  63777                     smlad(condition,
  63778                           Register(rd),
  63779                           Register(rn),
  63780                           Register(rm),
  63781                           Register(ra));
  63782                     break;
  63783                   }
  63784                 }
  63785                 break;
  63786               }
  63787               case 0x00000020: {
  63788                 // 0x07000030
  63789                 switch (instr & 0x0000f000) {
  63790                   case 0x0000f000: {
  63791                     // 0x0700f030
  63792                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63793                       UnallocatedA32(instr);
  63794                       return;
  63795                     }
  63796                     Condition condition((instr >> 28) & 0xf);
  63797                     unsigned rd = (instr >> 16) & 0xf;
  63798                     unsigned rn = instr & 0xf;
  63799                     unsigned rm = (instr >> 8) & 0xf;
  63800                     // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63801                     smuadx(condition, Register(rd), Register(rn), Register(rm));
  63802                     break;
  63803                   }
  63804                   default: {
  63805                     if (((instr & 0xf0000000) == 0xf0000000) ||
  63806                         ((instr & 0xf000) == 0xf000)) {
  63807                       UnallocatedA32(instr);
  63808                       return;
  63809                     }
  63810                     Condition condition((instr >> 28) & 0xf);
  63811                     unsigned rd = (instr >> 16) & 0xf;
  63812                     unsigned rn = instr & 0xf;
  63813                     unsigned rm = (instr >> 8) & 0xf;
  63814                     unsigned ra = (instr >> 12) & 0xf;
  63815                     // SMLADX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
  63816                     smladx(condition,
  63817                            Register(rd),
  63818                            Register(rn),
  63819                            Register(rm),
  63820                            Register(ra));
  63821                     break;
  63822                   }
  63823                 }
  63824                 break;
  63825               }
  63826               case 0x00000040: {
  63827                 // 0x07000050
  63828                 switch (instr & 0x0000f000) {
  63829                   case 0x0000f000: {
  63830                     // 0x0700f050
  63831                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63832                       UnallocatedA32(instr);
  63833                       return;
  63834                     }
  63835                     Condition condition((instr >> 28) & 0xf);
  63836                     unsigned rd = (instr >> 16) & 0xf;
  63837                     unsigned rn = instr & 0xf;
  63838                     unsigned rm = (instr >> 8) & 0xf;
  63839                     // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63840                     smusd(condition, Register(rd), Register(rn), Register(rm));
  63841                     break;
  63842                   }
  63843                   default: {
  63844                     if (((instr & 0xf0000000) == 0xf0000000) ||
  63845                         ((instr & 0xf000) == 0xf000)) {
  63846                       UnallocatedA32(instr);
  63847                       return;
  63848                     }
  63849                     Condition condition((instr >> 28) & 0xf);
  63850                     unsigned rd = (instr >> 16) & 0xf;
  63851                     unsigned rn = instr & 0xf;
  63852                     unsigned rm = (instr >> 8) & 0xf;
  63853                     unsigned ra = (instr >> 12) & 0xf;
  63854                     // SMLSD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
  63855                     smlsd(condition,
  63856                           Register(rd),
  63857                           Register(rn),
  63858                           Register(rm),
  63859                           Register(ra));
  63860                     break;
  63861                   }
  63862                 }
  63863                 break;
  63864               }
  63865               case 0x00000060: {
  63866                 // 0x07000070
  63867                 switch (instr & 0x0000f000) {
  63868                   case 0x0000f000: {
  63869                     // 0x0700f070
  63870                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63871                       UnallocatedA32(instr);
  63872                       return;
  63873                     }
  63874                     Condition condition((instr >> 28) & 0xf);
  63875                     unsigned rd = (instr >> 16) & 0xf;
  63876                     unsigned rn = instr & 0xf;
  63877                     unsigned rm = (instr >> 8) & 0xf;
  63878                     // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63879                     smusdx(condition, Register(rd), Register(rn), Register(rm));
  63880                     break;
  63881                   }
  63882                   default: {
  63883                     if (((instr & 0xf0000000) == 0xf0000000) ||
  63884                         ((instr & 0xf000) == 0xf000)) {
  63885                       UnallocatedA32(instr);
  63886                       return;
  63887                     }
  63888                     Condition condition((instr >> 28) & 0xf);
  63889                     unsigned rd = (instr >> 16) & 0xf;
  63890                     unsigned rn = instr & 0xf;
  63891                     unsigned rm = (instr >> 8) & 0xf;
  63892                     unsigned ra = (instr >> 12) & 0xf;
  63893                     // SMLSDX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
  63894                     smlsdx(condition,
  63895                            Register(rd),
  63896                            Register(rn),
  63897                            Register(rm),
  63898                            Register(ra));
  63899                     break;
  63900                   }
  63901                 }
  63902                 break;
  63903               }
  63904               case 0x00100000: {
  63905                 // 0x07100010
  63906                 if (((instr & 0xf0000000) == 0xf0000000)) {
  63907                   UnallocatedA32(instr);
  63908                   return;
  63909                 }
  63910                 Condition condition((instr >> 28) & 0xf);
  63911                 unsigned rd = (instr >> 16) & 0xf;
  63912                 unsigned rn = instr & 0xf;
  63913                 unsigned rm = (instr >> 8) & 0xf;
  63914                 // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63915                 sdiv(condition, Register(rd), Register(rn), Register(rm));
  63916                 if (((instr & 0xff0f0f0) != 0x710f010)) {
  63917                   UnpredictableA32(instr);
  63918                 }
  63919                 break;
  63920               }
  63921               case 0x00800000: {
  63922                 // 0x07800010
  63923                 switch (instr & 0x0000f000) {
  63924                   case 0x0000f000: {
  63925                     // 0x0780f010
  63926                     if (((instr & 0xf0000000) == 0xf0000000)) {
  63927                       UnallocatedA32(instr);
  63928                       return;
  63929                     }
  63930                     Condition condition((instr >> 28) & 0xf);
  63931                     unsigned rd = (instr >> 16) & 0xf;
  63932                     unsigned rn = instr & 0xf;
  63933                     unsigned rm = (instr >> 8) & 0xf;
  63934                     // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  63935                     usad8(condition, Register(rd), Register(rn), Register(rm));
  63936                     break;
  63937                   }
  63938                   default: {
  63939                     if (((instr & 0xf0000000) == 0xf0000000) ||
  63940                         ((instr & 0xf000) == 0xf000)) {
  63941                       UnallocatedA32(instr);
  63942                       return;
  63943                     }
  63944                     Condition condition((instr >> 28) & 0xf);
  63945                     unsigned rd = (instr >> 16) & 0xf;
  63946                     unsigned rn = instr & 0xf;
  63947                     unsigned rm = (instr >> 8) & 0xf;
  63948                     unsigned ra = (instr >> 12) & 0xf;
  63949                     // USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
  63950                     usada8(condition,
  63951                            Register(rd),
  63952                            Register(rn),
  63953                            Register(rm),
  63954                            Register(ra));
  63955                     break;
  63956                   }
  63957                 }
  63958                 break;
  63959               }
  63960               default:
  63961                 UnallocatedA32(instr);
  63962                 break;
  63963             }
  63964             break;
  63965           }
  63966           case 0x01200000: {
  63967             // 0x07200000
  63968             switch (instr & 0x00100000) {
  63969               case 0x00000000: {
  63970                 // 0x07200000
  63971                 if (((instr & 0xf0000000) == 0xf0000000)) {
  63972                   UnallocatedA32(instr);
  63973                   return;
  63974                 }
  63975                 Condition condition((instr >> 28) & 0xf);
  63976                 unsigned rt = (instr >> 12) & 0xf;
  63977                 unsigned rn = (instr >> 16) & 0xf;
  63978                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  63979                 unsigned rm = instr & 0xf;
  63980                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
  63981                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
  63982                                                     (imm_and_type_ & 0x7c) >>
  63983                                                         2);
  63984                 Shift shift = shift_operand.GetShift();
  63985                 uint32_t amount = shift_operand.GetAmount();
  63986                 AddrMode addrmode = PreIndex;
  63987                 // STR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
  63988                 str(condition,
  63989                     Best,
  63990                     Register(rt),
  63991                     MemOperand(Register(rn),
  63992                                sign,
  63993                                Register(rm),
  63994                                shift,
  63995                                amount,
  63996                                addrmode));
  63997                 break;
  63998               }
  63999               case 0x00100000: {
  64000                 // 0x07300000
  64001                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64002                   UnallocatedA32(instr);
  64003                   return;
  64004                 }
  64005                 Condition condition((instr >> 28) & 0xf);
  64006                 unsigned rt = (instr >> 12) & 0xf;
  64007                 unsigned rn = (instr >> 16) & 0xf;
  64008                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  64009                 unsigned rm = instr & 0xf;
  64010                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
  64011                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
  64012                                                     (imm_and_type_ & 0x7c) >>
  64013                                                         2);
  64014                 Shift shift = shift_operand.GetShift();
  64015                 uint32_t amount = shift_operand.GetAmount();
  64016                 AddrMode addrmode = PreIndex;
  64017                 // LDR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
  64018                 ldr(condition,
  64019                     Best,
  64020                     Register(rt),
  64021                     MemOperand(Register(rn),
  64022                                sign,
  64023                                Register(rm),
  64024                                shift,
  64025                                amount,
  64026                                addrmode));
  64027                 break;
  64028               }
  64029             }
  64030             break;
  64031           }
  64032           case 0x01200010: {
  64033             // 0x07200010
  64034             switch (instr & 0x00800060) {
  64035               case 0x00000000: {
  64036                 // 0x07200010
  64037                 if ((instr & 0x00100080) == 0x00100000) {
  64038                   if (((instr & 0xf0000000) == 0xf0000000)) {
  64039                     UnallocatedA32(instr);
  64040                     return;
  64041                   }
  64042                   Condition condition((instr >> 28) & 0xf);
  64043                   unsigned rd = (instr >> 16) & 0xf;
  64044                   unsigned rn = instr & 0xf;
  64045                   unsigned rm = (instr >> 8) & 0xf;
  64046                   // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  64047                   udiv(condition, Register(rd), Register(rn), Register(rm));
  64048                   if (((instr & 0xff0f0f0) != 0x730f010)) {
  64049                     UnpredictableA32(instr);
  64050                   }
  64051                 } else {
  64052                   UnallocatedA32(instr);
  64053                 }
  64054                 break;
  64055               }
  64056               case 0x00800040: {
  64057                 // 0x07a00050
  64058                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64059                   UnallocatedA32(instr);
  64060                   return;
  64061                 }
  64062                 Condition condition((instr >> 28) & 0xf);
  64063                 unsigned rd = (instr >> 12) & 0xf;
  64064                 unsigned rn = instr & 0xf;
  64065                 uint32_t lsb = (instr >> 7) & 0x1f;
  64066                 uint32_t widthm1 = (instr >> 16) & 0x1f;
  64067                 uint32_t width = widthm1 + 1;
  64068                 // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
  64069                 sbfx(condition, Register(rd), Register(rn), lsb, width);
  64070                 break;
  64071               }
  64072               default:
  64073                 UnallocatedA32(instr);
  64074                 break;
  64075             }
  64076             break;
  64077           }
  64078           case 0x01400000: {
  64079             // 0x07400000
  64080             switch (instr & 0x00100000) {
  64081               case 0x00000000: {
  64082                 // 0x07400000
  64083                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64084                   UnallocatedA32(instr);
  64085                   return;
  64086                 }
  64087                 Condition condition((instr >> 28) & 0xf);
  64088                 unsigned rt = (instr >> 12) & 0xf;
  64089                 unsigned rn = (instr >> 16) & 0xf;
  64090                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  64091                 unsigned rm = instr & 0xf;
  64092                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
  64093                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
  64094                                                     (imm_and_type_ & 0x7c) >>
  64095                                                         2);
  64096                 Shift shift = shift_operand.GetShift();
  64097                 uint32_t amount = shift_operand.GetAmount();
  64098                 AddrMode addrmode = Offset;
  64099                 // STRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
  64100                 strb(condition,
  64101                      Best,
  64102                      Register(rt),
  64103                      MemOperand(Register(rn),
  64104                                 sign,
  64105                                 Register(rm),
  64106                                 shift,
  64107                                 amount,
  64108                                 addrmode));
  64109                 break;
  64110               }
  64111               case 0x00100000: {
  64112                 // 0x07500000
  64113                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64114                   UnallocatedA32(instr);
  64115                   return;
  64116                 }
  64117                 Condition condition((instr >> 28) & 0xf);
  64118                 unsigned rt = (instr >> 12) & 0xf;
  64119                 unsigned rn = (instr >> 16) & 0xf;
  64120                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  64121                 unsigned rm = instr & 0xf;
  64122                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
  64123                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
  64124                                                     (imm_and_type_ & 0x7c) >>
  64125                                                         2);
  64126                 Shift shift = shift_operand.GetShift();
  64127                 uint32_t amount = shift_operand.GetAmount();
  64128                 AddrMode addrmode = Offset;
  64129                 // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1
  64130                 ldrb(condition,
  64131                      Best,
  64132                      Register(rt),
  64133                      MemOperand(Register(rn),
  64134                                 sign,
  64135                                 Register(rm),
  64136                                 shift,
  64137                                 amount,
  64138                                 addrmode));
  64139                 break;
  64140               }
  64141             }
  64142             break;
  64143           }
  64144           case 0x01400010: {
  64145             // 0x07400010
  64146             switch (instr & 0x00800060) {
  64147               case 0x00000000: {
  64148                 // 0x07400010
  64149                 switch (instr & 0x00100080) {
  64150                   case 0x00000000: {
  64151                     // 0x07400010
  64152                     if (((instr & 0xf0000000) == 0xf0000000)) {
  64153                       UnallocatedA32(instr);
  64154                       return;
  64155                     }
  64156                     Condition condition((instr >> 28) & 0xf);
  64157                     unsigned rdlo = (instr >> 12) & 0xf;
  64158                     unsigned rdhi = (instr >> 16) & 0xf;
  64159                     unsigned rn = instr & 0xf;
  64160                     unsigned rm = (instr >> 8) & 0xf;
  64161                     // SMLALD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
  64162                     smlald(condition,
  64163                            Register(rdlo),
  64164                            Register(rdhi),
  64165                            Register(rn),
  64166                            Register(rm));
  64167                     break;
  64168                   }
  64169                   case 0x00100000: {
  64170                     // 0x07500010
  64171                     switch (instr & 0x0000f000) {
  64172                       case 0x0000f000: {
  64173                         // 0x0750f010
  64174                         if (((instr & 0xf0000000) == 0xf0000000)) {
  64175                           UnallocatedA32(instr);
  64176                           return;
  64177                         }
  64178                         Condition condition((instr >> 28) & 0xf);
  64179                         unsigned rd = (instr >> 16) & 0xf;
  64180                         unsigned rn = instr & 0xf;
  64181                         unsigned rm = (instr >> 8) & 0xf;
  64182                         // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  64183                         smmul(condition,
  64184                               Register(rd),
  64185                               Register(rn),
  64186                               Register(rm));
  64187                         break;
  64188                       }
  64189                       default: {
  64190                         if (((instr & 0xf0000000) == 0xf0000000) ||
  64191                             ((instr & 0xf000) == 0xf000)) {
  64192                           UnallocatedA32(instr);
  64193                           return;
  64194                         }
  64195                         Condition condition((instr >> 28) & 0xf);
  64196                         unsigned rd = (instr >> 16) & 0xf;
  64197                         unsigned rn = instr & 0xf;
  64198                         unsigned rm = (instr >> 8) & 0xf;
  64199                         unsigned ra = (instr >> 12) & 0xf;
  64200                         // SMMLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
  64201                         smmla(condition,
  64202                               Register(rd),
  64203                               Register(rn),
  64204                               Register(rm),
  64205                               Register(ra));
  64206                         break;
  64207                       }
  64208                     }
  64209                     break;
  64210                   }
  64211                   default:
  64212                     UnallocatedA32(instr);
  64213                     break;
  64214                 }
  64215                 break;
  64216               }
  64217               case 0x00000020: {
  64218                 // 0x07400030
  64219                 switch (instr & 0x00100080) {
  64220                   case 0x00000000: {
  64221                     // 0x07400030
  64222                     if (((instr & 0xf0000000) == 0xf0000000)) {
  64223                       UnallocatedA32(instr);
  64224                       return;
  64225                     }
  64226                     Condition condition((instr >> 28) & 0xf);
  64227                     unsigned rdlo = (instr >> 12) & 0xf;
  64228                     unsigned rdhi = (instr >> 16) & 0xf;
  64229                     unsigned rn = instr & 0xf;
  64230                     unsigned rm = (instr >> 8) & 0xf;
  64231                     // SMLALDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
  64232                     smlaldx(condition,
  64233                             Register(rdlo),
  64234                             Register(rdhi),
  64235                             Register(rn),
  64236                             Register(rm));
  64237                     break;
  64238                   }
  64239                   case 0x00100000: {
  64240                     // 0x07500030
  64241                     switch (instr & 0x0000f000) {
  64242                       case 0x0000f000: {
  64243                         // 0x0750f030
  64244                         if (((instr & 0xf0000000) == 0xf0000000)) {
  64245                           UnallocatedA32(instr);
  64246                           return;
  64247                         }
  64248                         Condition condition((instr >> 28) & 0xf);
  64249                         unsigned rd = (instr >> 16) & 0xf;
  64250                         unsigned rn = instr & 0xf;
  64251                         unsigned rm = (instr >> 8) & 0xf;
  64252                         // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1
  64253                         smmulr(condition,
  64254                                Register(rd),
  64255                                Register(rn),
  64256                                Register(rm));
  64257                         break;
  64258                       }
  64259                       default: {
  64260                         if (((instr & 0xf0000000) == 0xf0000000) ||
  64261                             ((instr & 0xf000) == 0xf000)) {
  64262                           UnallocatedA32(instr);
  64263                           return;
  64264                         }
  64265                         Condition condition((instr >> 28) & 0xf);
  64266                         unsigned rd = (instr >> 16) & 0xf;
  64267                         unsigned rn = instr & 0xf;
  64268                         unsigned rm = (instr >> 8) & 0xf;
  64269                         unsigned ra = (instr >> 12) & 0xf;
  64270                         // SMMLAR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
  64271                         smmlar(condition,
  64272                                Register(rd),
  64273                                Register(rn),
  64274                                Register(rm),
  64275                                Register(ra));
  64276                         break;
  64277                       }
  64278                     }
  64279                     break;
  64280                   }
  64281                   default:
  64282                     UnallocatedA32(instr);
  64283                     break;
  64284                 }
  64285                 break;
  64286               }
  64287               case 0x00000040: {
  64288                 // 0x07400050
  64289                 switch (instr & 0x00100080) {
  64290                   case 0x00000000: {
  64291                     // 0x07400050
  64292                     if (((instr & 0xf0000000) == 0xf0000000)) {
  64293                       UnallocatedA32(instr);
  64294                       return;
  64295                     }
  64296                     Condition condition((instr >> 28) & 0xf);
  64297                     unsigned rdlo = (instr >> 12) & 0xf;
  64298                     unsigned rdhi = (instr >> 16) & 0xf;
  64299                     unsigned rn = instr & 0xf;
  64300                     unsigned rm = (instr >> 8) & 0xf;
  64301                     // SMLSLD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
  64302                     smlsld(condition,
  64303                            Register(rdlo),
  64304                            Register(rdhi),
  64305                            Register(rn),
  64306                            Register(rm));
  64307                     break;
  64308                   }
  64309                   case 0x00100080: {
  64310                     // 0x075000d0
  64311                     if (((instr & 0xf0000000) == 0xf0000000)) {
  64312                       UnallocatedA32(instr);
  64313                       return;
  64314                     }
  64315                     Condition condition((instr >> 28) & 0xf);
  64316                     unsigned rd = (instr >> 16) & 0xf;
  64317                     unsigned rn = instr & 0xf;
  64318                     unsigned rm = (instr >> 8) & 0xf;
  64319                     unsigned ra = (instr >> 12) & 0xf;
  64320                     // SMMLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
  64321                     smmls(condition,
  64322                           Register(rd),
  64323                           Register(rn),
  64324                           Register(rm),
  64325                           Register(ra));
  64326                     break;
  64327                   }
  64328                   default:
  64329                     UnallocatedA32(instr);
  64330                     break;
  64331                 }
  64332                 break;
  64333               }
  64334               case 0x00000060: {
  64335                 // 0x07400070
  64336                 switch (instr & 0x00100080) {
  64337                   case 0x00000000: {
  64338                     // 0x07400070
  64339                     if (((instr & 0xf0000000) == 0xf0000000)) {
  64340                       UnallocatedA32(instr);
  64341                       return;
  64342                     }
  64343                     Condition condition((instr >> 28) & 0xf);
  64344                     unsigned rdlo = (instr >> 12) & 0xf;
  64345                     unsigned rdhi = (instr >> 16) & 0xf;
  64346                     unsigned rn = instr & 0xf;
  64347                     unsigned rm = (instr >> 8) & 0xf;
  64348                     // SMLSLDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1
  64349                     smlsldx(condition,
  64350                             Register(rdlo),
  64351                             Register(rdhi),
  64352                             Register(rn),
  64353                             Register(rm));
  64354                     break;
  64355                   }
  64356                   case 0x00100080: {
  64357                     // 0x075000f0
  64358                     if (((instr & 0xf0000000) == 0xf0000000)) {
  64359                       UnallocatedA32(instr);
  64360                       return;
  64361                     }
  64362                     Condition condition((instr >> 28) & 0xf);
  64363                     unsigned rd = (instr >> 16) & 0xf;
  64364                     unsigned rn = instr & 0xf;
  64365                     unsigned rm = (instr >> 8) & 0xf;
  64366                     unsigned ra = (instr >> 12) & 0xf;
  64367                     // SMMLSR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1
  64368                     smmlsr(condition,
  64369                            Register(rd),
  64370                            Register(rn),
  64371                            Register(rm),
  64372                            Register(ra));
  64373                     break;
  64374                   }
  64375                   default:
  64376                     UnallocatedA32(instr);
  64377                     break;
  64378                 }
  64379                 break;
  64380               }
  64381               case 0x00800000: {
  64382                 // 0x07c00010
  64383                 switch (instr & 0x0000000f) {
  64384                   case 0x0000000f: {
  64385                     // 0x07c0001f
  64386                     if (((instr & 0xf0000000) == 0xf0000000)) {
  64387                       UnallocatedA32(instr);
  64388                       return;
  64389                     }
  64390                     Condition condition((instr >> 28) & 0xf);
  64391                     unsigned rd = (instr >> 12) & 0xf;
  64392                     uint32_t lsb = (instr >> 7) & 0x1f;
  64393                     uint32_t msb = (instr >> 16) & 0x1f;
  64394                     uint32_t width = msb - lsb + 1;
  64395                     // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; A1
  64396                     bfc(condition, Register(rd), lsb, width);
  64397                     break;
  64398                   }
  64399                   default: {
  64400                     if (((instr & 0xf0000000) == 0xf0000000) ||
  64401                         ((instr & 0xf) == 0xf)) {
  64402                       UnallocatedA32(instr);
  64403                       return;
  64404                     }
  64405                     Condition condition((instr >> 28) & 0xf);
  64406                     unsigned rd = (instr >> 12) & 0xf;
  64407                     unsigned rn = instr & 0xf;
  64408                     uint32_t lsb = (instr >> 7) & 0x1f;
  64409                     uint32_t msb = (instr >> 16) & 0x1f;
  64410                     uint32_t width = msb - lsb + 1;
  64411                     // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
  64412                     bfi(condition, Register(rd), Register(rn), lsb, width);
  64413                     break;
  64414                   }
  64415                 }
  64416                 break;
  64417               }
  64418               default:
  64419                 UnallocatedA32(instr);
  64420                 break;
  64421             }
  64422             break;
  64423           }
  64424           case 0x01600000: {
  64425             // 0x07600000
  64426             switch (instr & 0x00100000) {
  64427               case 0x00000000: {
  64428                 // 0x07600000
  64429                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64430                   UnallocatedA32(instr);
  64431                   return;
  64432                 }
  64433                 Condition condition((instr >> 28) & 0xf);
  64434                 unsigned rt = (instr >> 12) & 0xf;
  64435                 unsigned rn = (instr >> 16) & 0xf;
  64436                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  64437                 unsigned rm = instr & 0xf;
  64438                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
  64439                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
  64440                                                     (imm_and_type_ & 0x7c) >>
  64441                                                         2);
  64442                 Shift shift = shift_operand.GetShift();
  64443                 uint32_t amount = shift_operand.GetAmount();
  64444                 AddrMode addrmode = PreIndex;
  64445                 // STRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
  64446                 strb(condition,
  64447                      Best,
  64448                      Register(rt),
  64449                      MemOperand(Register(rn),
  64450                                 sign,
  64451                                 Register(rm),
  64452                                 shift,
  64453                                 amount,
  64454                                 addrmode));
  64455                 break;
  64456               }
  64457               case 0x00100000: {
  64458                 // 0x07700000
  64459                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64460                   UnallocatedA32(instr);
  64461                   return;
  64462                 }
  64463                 Condition condition((instr >> 28) & 0xf);
  64464                 unsigned rt = (instr >> 12) & 0xf;
  64465                 unsigned rn = (instr >> 16) & 0xf;
  64466                 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus);
  64467                 unsigned rm = instr & 0xf;
  64468                 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f);
  64469                 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3,
  64470                                                     (imm_and_type_ & 0x7c) >>
  64471                                                         2);
  64472                 Shift shift = shift_operand.GetShift();
  64473                 uint32_t amount = shift_operand.GetAmount();
  64474                 AddrMode addrmode = PreIndex;
  64475                 // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1
  64476                 ldrb(condition,
  64477                      Best,
  64478                      Register(rt),
  64479                      MemOperand(Register(rn),
  64480                                 sign,
  64481                                 Register(rm),
  64482                                 shift,
  64483                                 amount,
  64484                                 addrmode));
  64485                 break;
  64486               }
  64487             }
  64488             break;
  64489           }
  64490           case 0x01600010: {
  64491             // 0x07600010
  64492             switch (instr & 0x00800060) {
  64493               case 0x00800040: {
  64494                 // 0x07e00050
  64495                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64496                   UnallocatedA32(instr);
  64497                   return;
  64498                 }
  64499                 Condition condition((instr >> 28) & 0xf);
  64500                 unsigned rd = (instr >> 12) & 0xf;
  64501                 unsigned rn = instr & 0xf;
  64502                 uint32_t lsb = (instr >> 7) & 0x1f;
  64503                 uint32_t widthm1 = (instr >> 16) & 0x1f;
  64504                 uint32_t width = widthm1 + 1;
  64505                 // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1
  64506                 ubfx(condition, Register(rd), Register(rn), lsb, width);
  64507                 break;
  64508               }
  64509               case 0x00800060: {
  64510                 // 0x07e00070
  64511                 if ((instr & 0xf0100080) == 0xe0100080) {
  64512                   uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0);
  64513                   // UDF{<c>}{<q>} {#}<imm> ; A1
  64514                   udf(al, Best, imm);
  64515                 } else {
  64516                   UnallocatedA32(instr);
  64517                 }
  64518                 break;
  64519               }
  64520               default:
  64521                 UnallocatedA32(instr);
  64522                 break;
  64523             }
  64524             break;
  64525           }
  64526         }
  64527         break;
  64528       }
  64529       case 0x08000000: {
  64530         // 0x08000000
  64531         switch (instr & 0x00500000) {
  64532           case 0x00000000: {
  64533             // 0x08000000
  64534             switch (instr & 0x01800000) {
  64535               case 0x00000000: {
  64536                 // 0x08000000
  64537                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64538                   UnallocatedA32(instr);
  64539                   return;
  64540                 }
  64541                 Condition condition((instr >> 28) & 0xf);
  64542                 unsigned rn = (instr >> 16) & 0xf;
  64543                 WriteBack write_back((instr >> 21) & 0x1);
  64544                 RegisterList registers((instr & 0xffff));
  64545                 // STMDA{<c>}{<q>} <Rn>{!}, <registers> ; A1
  64546                 stmda(condition, Register(rn), write_back, registers);
  64547                 break;
  64548               }
  64549               case 0x00800000: {
  64550                 // 0x08800000
  64551                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64552                   UnallocatedA32(instr);
  64553                   return;
  64554                 }
  64555                 Condition condition((instr >> 28) & 0xf);
  64556                 unsigned rn = (instr >> 16) & 0xf;
  64557                 WriteBack write_back((instr >> 21) & 0x1);
  64558                 RegisterList registers((instr & 0xffff));
  64559                 // STM{<c>}{<q>} <Rn>{!}, <registers> ; A1
  64560                 stm(condition, Best, Register(rn), write_back, registers);
  64561                 break;
  64562               }
  64563               case 0x01000000: {
  64564                 // 0x09000000
  64565                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64566                   UnallocatedA32(instr);
  64567                   return;
  64568                 }
  64569                 if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
  64570                     ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
  64571                     ((instr & 0xf0000000) != 0xf0000000) &&
  64572                     (BitCount((Uint32(instr) & Uint32(0xffff))) > Int64(1))) {
  64573                   Condition condition((instr >> 28) & 0xf);
  64574                   RegisterList registers((instr & 0xffff));
  64575                   // PUSH{<c>}{<q>} <registers> ; A1
  64576                   push(condition, Best, registers);
  64577                   return;
  64578                 }
  64579                 Condition condition((instr >> 28) & 0xf);
  64580                 unsigned rn = (instr >> 16) & 0xf;
  64581                 WriteBack write_back((instr >> 21) & 0x1);
  64582                 RegisterList registers((instr & 0xffff));
  64583                 // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; A1
  64584                 stmdb(condition, Best, Register(rn), write_back, registers);
  64585                 break;
  64586               }
  64587               case 0x01800000: {
  64588                 // 0x09800000
  64589                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64590                   UnallocatedA32(instr);
  64591                   return;
  64592                 }
  64593                 Condition condition((instr >> 28) & 0xf);
  64594                 unsigned rn = (instr >> 16) & 0xf;
  64595                 WriteBack write_back((instr >> 21) & 0x1);
  64596                 RegisterList registers((instr & 0xffff));
  64597                 // STMIB{<c>}{<q>} <Rn>{!}, <registers> ; A1
  64598                 stmib(condition, Register(rn), write_back, registers);
  64599                 break;
  64600               }
  64601             }
  64602             break;
  64603           }
  64604           case 0x00100000: {
  64605             // 0x08100000
  64606             switch (instr & 0x01800000) {
  64607               case 0x00000000: {
  64608                 // 0x08100000
  64609                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64610                   UnallocatedA32(instr);
  64611                   return;
  64612                 }
  64613                 Condition condition((instr >> 28) & 0xf);
  64614                 unsigned rn = (instr >> 16) & 0xf;
  64615                 WriteBack write_back((instr >> 21) & 0x1);
  64616                 RegisterList registers((instr & 0xffff));
  64617                 // LDMDA{<c>}{<q>} <Rn>{!}, <registers> ; A1
  64618                 ldmda(condition, Register(rn), write_back, registers);
  64619                 break;
  64620               }
  64621               case 0x00800000: {
  64622                 // 0x08900000
  64623                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64624                   UnallocatedA32(instr);
  64625                   return;
  64626                 }
  64627                 if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
  64628                     ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
  64629                     ((instr & 0xf0000000) != 0xf0000000) &&
  64630                     (BitCount((Uint32(instr) & Uint32(0xffff))) > Int64(1))) {
  64631                   Condition condition((instr >> 28) & 0xf);
  64632                   RegisterList registers((instr & 0xffff));
  64633                   // POP{<c>}{<q>} <registers> ; A1
  64634                   pop(condition, Best, registers);
  64635                   return;
  64636                 }
  64637                 Condition condition((instr >> 28) & 0xf);
  64638                 unsigned rn = (instr >> 16) & 0xf;
  64639                 WriteBack write_back((instr >> 21) & 0x1);
  64640                 RegisterList registers((instr & 0xffff));
  64641                 // LDM{<c>}{<q>} <Rn>{!}, <registers> ; A1
  64642                 ldm(condition, Best, Register(rn), write_back, registers);
  64643                 break;
  64644               }
  64645               case 0x01000000: {
  64646                 // 0x09100000
  64647                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64648                   UnallocatedA32(instr);
  64649                   return;
  64650                 }
  64651                 Condition condition((instr >> 28) & 0xf);
  64652                 unsigned rn = (instr >> 16) & 0xf;
  64653                 WriteBack write_back((instr >> 21) & 0x1);
  64654                 RegisterList registers((instr & 0xffff));
  64655                 // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; A1
  64656                 ldmdb(condition, Register(rn), write_back, registers);
  64657                 break;
  64658               }
  64659               case 0x01800000: {
  64660                 // 0x09900000
  64661                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64662                   UnallocatedA32(instr);
  64663                   return;
  64664                 }
  64665                 Condition condition((instr >> 28) & 0xf);
  64666                 unsigned rn = (instr >> 16) & 0xf;
  64667                 WriteBack write_back((instr >> 21) & 0x1);
  64668                 RegisterList registers((instr & 0xffff));
  64669                 // LDMIB{<c>}{<q>} <Rn>{!}, <registers> ; A1
  64670                 ldmib(condition, Register(rn), write_back, registers);
  64671                 break;
  64672               }
  64673             }
  64674             break;
  64675           }
  64676           case 0x00400000: {
  64677             // 0x08400000
  64678             if (((instr & 0xf0000000) == 0xf0000000)) {
  64679               UnallocatedA32(instr);
  64680               return;
  64681             }
  64682             UnimplementedA32("STM", instr);
  64683             break;
  64684           }
  64685           case 0x00500000: {
  64686             // 0x08500000
  64687             switch (instr & 0x00008000) {
  64688               case 0x00000000: {
  64689                 // 0x08500000
  64690                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64691                   UnallocatedA32(instr);
  64692                   return;
  64693                 }
  64694                 UnimplementedA32("LDM", instr);
  64695                 break;
  64696               }
  64697               case 0x00008000: {
  64698                 // 0x08508000
  64699                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64700                   UnallocatedA32(instr);
  64701                   return;
  64702                 }
  64703                 UnimplementedA32("LDM", instr);
  64704                 break;
  64705               }
  64706             }
  64707             break;
  64708           }
  64709         }
  64710         break;
  64711       }
  64712       case 0x0a000000: {
  64713         // 0x0a000000
  64714         switch (instr & 0x01000000) {
  64715           case 0x00000000: {
  64716             // 0x0a000000
  64717             if (((instr & 0xf0000000) == 0xf0000000)) {
  64718               UnallocatedA32(instr);
  64719               return;
  64720             }
  64721             Condition condition((instr >> 28) & 0xf);
  64722             int32_t imm = SignExtend<int32_t>((instr & 0xffffff) << 2, 26);
  64723             Location location(imm, kA32PcDelta);
  64724             // B{<c>}{<q>} <label> ; A1
  64725             b(condition, Best, &location);
  64726             break;
  64727           }
  64728           case 0x01000000: {
  64729             // 0x0b000000
  64730             if (((instr & 0xf0000000) == 0xf0000000)) {
  64731               UnallocatedA32(instr);
  64732               return;
  64733             }
  64734             Condition condition((instr >> 28) & 0xf);
  64735             int32_t imm = SignExtend<int32_t>((instr & 0xffffff) << 2, 26);
  64736             Location location(imm, kA32PcDelta);
  64737             // BL{<c>}{<q>} <label> ; A1
  64738             bl(condition, &location);
  64739             break;
  64740           }
  64741         }
  64742         break;
  64743       }
  64744       case 0x0c000000: {
  64745         // 0x0c000000
  64746         switch (instr & 0x01100e00) {
  64747           case 0x00000a00: {
  64748             // 0x0c000a00
  64749             switch (instr & 0x00800100) {
  64750               case 0x00000000: {
  64751                 // 0x0c000a00
  64752                 if ((instr & 0x006000d0) == 0x00400010) {
  64753                   if (((instr & 0xf0000000) == 0xf0000000)) {
  64754                     UnallocatedA32(instr);
  64755                     return;
  64756                   }
  64757                   Condition condition((instr >> 28) & 0xf);
  64758                   unsigned rm = ExtractSRegister(instr, 5, 0);
  64759                   unsigned rt = (instr >> 12) & 0xf;
  64760                   unsigned rt2 = (instr >> 16) & 0xf;
  64761                   // VMOV{<c>}{<q>} <Sm>, <Sm1>, <Rt>, <Rt2> ; A1
  64762                   vmov(condition,
  64763                        SRegister(rm),
  64764                        SRegister(rm + 1),
  64765                        Register(rt),
  64766                        Register(rt2));
  64767                 } else {
  64768                   UnallocatedA32(instr);
  64769                 }
  64770                 break;
  64771               }
  64772               case 0x00000100: {
  64773                 // 0x0c000b00
  64774                 if ((instr & 0x006000d0) == 0x00400010) {
  64775                   if (((instr & 0xf0000000) == 0xf0000000)) {
  64776                     UnallocatedA32(instr);
  64777                     return;
  64778                   }
  64779                   Condition condition((instr >> 28) & 0xf);
  64780                   unsigned rm = ExtractDRegister(instr, 5, 0);
  64781                   unsigned rt = (instr >> 12) & 0xf;
  64782                   unsigned rt2 = (instr >> 16) & 0xf;
  64783                   // VMOV{<c>}{<q>} <Dm>, <Rt>, <Rt2> ; A1
  64784                   vmov(condition, DRegister(rm), Register(rt), Register(rt2));
  64785                 } else {
  64786                   UnallocatedA32(instr);
  64787                 }
  64788                 break;
  64789               }
  64790               case 0x00800000: {
  64791                 // 0x0c800a00
  64792                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64793                   UnallocatedA32(instr);
  64794                   return;
  64795                 }
  64796                 Condition condition((instr >> 28) & 0xf);
  64797                 unsigned rn = (instr >> 16) & 0xf;
  64798                 WriteBack write_back((instr >> 21) & 0x1);
  64799                 unsigned first = ExtractSRegister(instr, 22, 12);
  64800                 unsigned len = instr & 0xff;
  64801                 // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; A2
  64802                 vstm(condition,
  64803                      kDataTypeValueNone,
  64804                      Register(rn),
  64805                      write_back,
  64806                      SRegisterList(SRegister(first), len));
  64807                 if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
  64808                   UnpredictableA32(instr);
  64809                 }
  64810                 break;
  64811               }
  64812               case 0x00800100: {
  64813                 // 0x0c800b00
  64814                 switch (instr & 0x00000001) {
  64815                   case 0x00000000: {
  64816                     // 0x0c800b00
  64817                     if (((instr & 0xf0000000) == 0xf0000000)) {
  64818                       UnallocatedA32(instr);
  64819                       return;
  64820                     }
  64821                     Condition condition((instr >> 28) & 0xf);
  64822                     unsigned rn = (instr >> 16) & 0xf;
  64823                     WriteBack write_back((instr >> 21) & 0x1);
  64824                     unsigned first = ExtractDRegister(instr, 22, 12);
  64825                     unsigned imm8 = (instr & 0xff);
  64826                     unsigned len = imm8 / 2;
  64827                     unsigned end = first + len;
  64828                     // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; A1
  64829                     vstm(condition,
  64830                          kDataTypeValueNone,
  64831                          Register(rn),
  64832                          write_back,
  64833                          DRegisterList(DRegister(first), len));
  64834                     if ((len == 0) || (len > 16) ||
  64835                         (end > kMaxNumberOfDRegisters)) {
  64836                       UnpredictableA32(instr);
  64837                     }
  64838                     break;
  64839                   }
  64840                   case 0x00000001: {
  64841                     // 0x0c800b01
  64842                     if (((instr & 0xf0000000) == 0xf0000000)) {
  64843                       UnallocatedA32(instr);
  64844                       return;
  64845                     }
  64846                     Condition condition((instr >> 28) & 0xf);
  64847                     unsigned rn = (instr >> 16) & 0xf;
  64848                     WriteBack write_back((instr >> 21) & 0x1);
  64849                     unsigned first = ExtractDRegister(instr, 22, 12);
  64850                     unsigned imm8 = (instr & 0xff);
  64851                     unsigned len = imm8 / 2;
  64852                     unsigned end = first + len;
  64853                     // FSTMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; A1
  64854                     fstmiax(condition,
  64855                             Register(rn),
  64856                             write_back,
  64857                             DRegisterList(DRegister(first), len));
  64858                     if ((len == 0) || (len > 16) || (end > 16)) {
  64859                       UnpredictableA32(instr);
  64860                     }
  64861                     break;
  64862                   }
  64863                 }
  64864                 break;
  64865               }
  64866             }
  64867             break;
  64868           }
  64869           case 0x00000e00: {
  64870             // 0x0c000e00
  64871             switch (instr & 0x00600000) {
  64872               case 0x00000000: {
  64873                 // 0x0c000e00
  64874                 if ((instr & 0x0080f100) == 0x00805000) {
  64875                   if (((instr & 0xf0000000) == 0xf0000000)) {
  64876                     UnallocatedA32(instr);
  64877                     return;
  64878                   }
  64879                   UnimplementedA32("STC", instr);
  64880                 } else {
  64881                   UnallocatedA32(instr);
  64882                 }
  64883                 break;
  64884               }
  64885               case 0x00200000: {
  64886                 // 0x0c200e00
  64887                 if ((instr & 0x0000f100) == 0x00005000) {
  64888                   if (((instr & 0xf0000000) == 0xf0000000)) {
  64889                     UnallocatedA32(instr);
  64890                     return;
  64891                   }
  64892                   UnimplementedA32("STC", instr);
  64893                 } else {
  64894                   UnallocatedA32(instr);
  64895                 }
  64896                 break;
  64897               }
  64898               case 0x00400000: {
  64899                 // 0x0c400e00
  64900                 if ((instr & 0x00800000) == 0x00000000) {
  64901                   if (((instr & 0xf0000000) == 0xf0000000)) {
  64902                     UnallocatedA32(instr);
  64903                     return;
  64904                   }
  64905                   UnimplementedA32("MCRR", instr);
  64906                 } else {
  64907                   UnallocatedA32(instr);
  64908                 }
  64909                 break;
  64910               }
  64911               default:
  64912                 UnallocatedA32(instr);
  64913                 break;
  64914             }
  64915             break;
  64916           }
  64917           case 0x00100a00: {
  64918             // 0x0c100a00
  64919             switch (instr & 0x00800100) {
  64920               case 0x00000000: {
  64921                 // 0x0c100a00
  64922                 if ((instr & 0x006000d0) == 0x00400010) {
  64923                   if (((instr & 0xf0000000) == 0xf0000000)) {
  64924                     UnallocatedA32(instr);
  64925                     return;
  64926                   }
  64927                   Condition condition((instr >> 28) & 0xf);
  64928                   unsigned rt = (instr >> 12) & 0xf;
  64929                   unsigned rt2 = (instr >> 16) & 0xf;
  64930                   unsigned rm = ExtractSRegister(instr, 5, 0);
  64931                   // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Sm>, <Sm1> ; A1
  64932                   vmov(condition,
  64933                        Register(rt),
  64934                        Register(rt2),
  64935                        SRegister(rm),
  64936                        SRegister(rm + 1));
  64937                 } else {
  64938                   UnallocatedA32(instr);
  64939                 }
  64940                 break;
  64941               }
  64942               case 0x00000100: {
  64943                 // 0x0c100b00
  64944                 if ((instr & 0x006000d0) == 0x00400010) {
  64945                   if (((instr & 0xf0000000) == 0xf0000000)) {
  64946                     UnallocatedA32(instr);
  64947                     return;
  64948                   }
  64949                   Condition condition((instr >> 28) & 0xf);
  64950                   unsigned rt = (instr >> 12) & 0xf;
  64951                   unsigned rt2 = (instr >> 16) & 0xf;
  64952                   unsigned rm = ExtractDRegister(instr, 5, 0);
  64953                   // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Dm> ; A1
  64954                   vmov(condition, Register(rt), Register(rt2), DRegister(rm));
  64955                 } else {
  64956                   UnallocatedA32(instr);
  64957                 }
  64958                 break;
  64959               }
  64960               case 0x00800000: {
  64961                 // 0x0c900a00
  64962                 if (((instr & 0xf0000000) == 0xf0000000)) {
  64963                   UnallocatedA32(instr);
  64964                   return;
  64965                 }
  64966                 if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) &&
  64967                     ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
  64968                     ((instr & 0xf0000000) != 0xf0000000)) {
  64969                   Condition condition((instr >> 28) & 0xf);
  64970                   unsigned first = ExtractSRegister(instr, 22, 12);
  64971                   unsigned len = instr & 0xff;
  64972                   // VPOP{<c>}{<q>}{.<size>} <sreglist> ; A2
  64973                   vpop(condition,
  64974                        kDataTypeValueNone,
  64975                        SRegisterList(SRegister(first), len));
  64976                   if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
  64977                     UnpredictableA32(instr);
  64978                   }
  64979                   return;
  64980                 }
  64981                 Condition condition((instr >> 28) & 0xf);
  64982                 unsigned rn = (instr >> 16) & 0xf;
  64983                 WriteBack write_back((instr >> 21) & 0x1);
  64984                 unsigned first = ExtractSRegister(instr, 22, 12);
  64985                 unsigned len = instr & 0xff;
  64986                 // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; A2
  64987                 vldm(condition,
  64988                      kDataTypeValueNone,
  64989                      Register(rn),
  64990                      write_back,
  64991                      SRegisterList(SRegister(first), len));
  64992                 if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
  64993                   UnpredictableA32(instr);
  64994                 }
  64995                 break;
  64996               }
  64997               case 0x00800100: {
  64998                 // 0x0c900b00
  64999                 switch (instr & 0x00000001) {
  65000                   case 0x00000000: {
  65001                     // 0x0c900b00
  65002                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65003                       UnallocatedA32(instr);
  65004                       return;
  65005                     }
  65006                     if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
  65007                          Uint32(0x1)) &&
  65008                         ((Uint32((instr >> 16)) & Uint32(0xf)) ==
  65009                          Uint32(0xd)) &&
  65010                         ((instr & 0xf0000000) != 0xf0000000)) {
  65011                       Condition condition((instr >> 28) & 0xf);
  65012                       unsigned first = ExtractDRegister(instr, 22, 12);
  65013                       unsigned imm8 = (instr & 0xff);
  65014                       unsigned len = imm8 / 2;
  65015                       unsigned end = first + len;
  65016                       // VPOP{<c>}{<q>}{.<size>} <dreglist> ; A1
  65017                       vpop(condition,
  65018                            kDataTypeValueNone,
  65019                            DRegisterList(DRegister(first), len));
  65020                       if ((len == 0) || (len > 16) ||
  65021                           (end > kMaxNumberOfDRegisters)) {
  65022                         UnpredictableA32(instr);
  65023                       }
  65024                       return;
  65025                     }
  65026                     Condition condition((instr >> 28) & 0xf);
  65027                     unsigned rn = (instr >> 16) & 0xf;
  65028                     WriteBack write_back((instr >> 21) & 0x1);
  65029                     unsigned first = ExtractDRegister(instr, 22, 12);
  65030                     unsigned imm8 = (instr & 0xff);
  65031                     unsigned len = imm8 / 2;
  65032                     unsigned end = first + len;
  65033                     // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; A1
  65034                     vldm(condition,
  65035                          kDataTypeValueNone,
  65036                          Register(rn),
  65037                          write_back,
  65038                          DRegisterList(DRegister(first), len));
  65039                     if ((len == 0) || (len > 16) ||
  65040                         (end > kMaxNumberOfDRegisters)) {
  65041                       UnpredictableA32(instr);
  65042                     }
  65043                     break;
  65044                   }
  65045                   case 0x00000001: {
  65046                     // 0x0c900b01
  65047                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65048                       UnallocatedA32(instr);
  65049                       return;
  65050                     }
  65051                     Condition condition((instr >> 28) & 0xf);
  65052                     unsigned rn = (instr >> 16) & 0xf;
  65053                     WriteBack write_back((instr >> 21) & 0x1);
  65054                     unsigned first = ExtractDRegister(instr, 22, 12);
  65055                     unsigned imm8 = (instr & 0xff);
  65056                     unsigned len = imm8 / 2;
  65057                     unsigned end = first + len;
  65058                     // FLDMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; A1
  65059                     fldmiax(condition,
  65060                             Register(rn),
  65061                             write_back,
  65062                             DRegisterList(DRegister(first), len));
  65063                     if ((len == 0) || (len > 16) || (end > 16)) {
  65064                       UnpredictableA32(instr);
  65065                     }
  65066                     break;
  65067                   }
  65068                 }
  65069                 break;
  65070               }
  65071             }
  65072             break;
  65073           }
  65074           case 0x00100e00: {
  65075             // 0x0c100e00
  65076             switch (instr & 0x00600000) {
  65077               case 0x00000000: {
  65078                 // 0x0c100e00
  65079                 switch (instr & 0x0080f100) {
  65080                   case 0x00805000: {
  65081                     // 0x0c905e00
  65082                     switch (instr & 0x000f0000) {
  65083                       case 0x000f0000: {
  65084                         // 0x0c9f5e00
  65085                         if (((instr & 0xf0000000) == 0xf0000000)) {
  65086                           UnallocatedA32(instr);
  65087                           return;
  65088                         }
  65089                         UnimplementedA32("LDC", instr);
  65090                         break;
  65091                       }
  65092                       default: {
  65093                         if (((instr & 0xf0000000) == 0xf0000000) ||
  65094                             ((instr & 0xf0000) == 0xf0000)) {
  65095                           UnallocatedA32(instr);
  65096                           return;
  65097                         }
  65098                         UnimplementedA32("LDC", instr);
  65099                         break;
  65100                       }
  65101                     }
  65102                     break;
  65103                   }
  65104                   default:
  65105                     UnallocatedA32(instr);
  65106                     break;
  65107                 }
  65108                 break;
  65109               }
  65110               case 0x00200000: {
  65111                 // 0x0c300e00
  65112                 if ((instr & 0x0000f100) == 0x00005000) {
  65113                   if (((instr & 0xf0000000) == 0xf0000000) ||
  65114                       ((instr & 0xf0000) == 0xf0000)) {
  65115                     UnallocatedA32(instr);
  65116                     return;
  65117                   }
  65118                   UnimplementedA32("LDC", instr);
  65119                 } else {
  65120                   UnallocatedA32(instr);
  65121                 }
  65122                 break;
  65123               }
  65124               case 0x00400000: {
  65125                 // 0x0c500e00
  65126                 if ((instr & 0x00800000) == 0x00000000) {
  65127                   if (((instr & 0xf0000000) == 0xf0000000)) {
  65128                     UnallocatedA32(instr);
  65129                     return;
  65130                   }
  65131                   UnimplementedA32("MRRC", instr);
  65132                 } else {
  65133                   UnallocatedA32(instr);
  65134                 }
  65135                 break;
  65136               }
  65137               default:
  65138                 UnallocatedA32(instr);
  65139                 break;
  65140             }
  65141             break;
  65142           }
  65143           case 0x01000a00: {
  65144             // 0x0d000a00
  65145             switch (instr & 0x00200100) {
  65146               case 0x00000000: {
  65147                 // 0x0d000a00
  65148                 if (((instr & 0xf0000000) == 0xf0000000)) {
  65149                   UnallocatedA32(instr);
  65150                   return;
  65151                 }
  65152                 Condition condition((instr >> 28) & 0xf);
  65153                 unsigned rd = ExtractSRegister(instr, 22, 12);
  65154                 unsigned rn = (instr >> 16) & 0xf;
  65155                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  65156                 int32_t offset = (instr & 0xff) << 2;
  65157                 // VSTR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; A2
  65158                 vstr(condition,
  65159                      Untyped32,
  65160                      SRegister(rd),
  65161                      MemOperand(Register(rn), sign, offset, Offset));
  65162                 break;
  65163               }
  65164               case 0x00000100: {
  65165                 // 0x0d000b00
  65166                 if (((instr & 0xf0000000) == 0xf0000000)) {
  65167                   UnallocatedA32(instr);
  65168                   return;
  65169                 }
  65170                 Condition condition((instr >> 28) & 0xf);
  65171                 unsigned rd = ExtractDRegister(instr, 22, 12);
  65172                 unsigned rn = (instr >> 16) & 0xf;
  65173                 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  65174                 int32_t offset = (instr & 0xff) << 2;
  65175                 // VSTR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; A1
  65176                 vstr(condition,
  65177                      Untyped64,
  65178                      DRegister(rd),
  65179                      MemOperand(Register(rn), sign, offset, Offset));
  65180                 break;
  65181               }
  65182               case 0x00200000: {
  65183                 // 0x0d200a00
  65184                 if ((instr & 0x00800000) == 0x00000000) {
  65185                   if (((instr & 0xf0000000) == 0xf0000000)) {
  65186                     UnallocatedA32(instr);
  65187                     return;
  65188                   }
  65189                   if (((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) &&
  65190                       ((instr & 0xf0000000) != 0xf0000000)) {
  65191                     Condition condition((instr >> 28) & 0xf);
  65192                     unsigned first = ExtractSRegister(instr, 22, 12);
  65193                     unsigned len = instr & 0xff;
  65194                     // VPUSH{<c>}{<q>}{.<size>} <sreglist> ; A2
  65195                     vpush(condition,
  65196                           kDataTypeValueNone,
  65197                           SRegisterList(SRegister(first), len));
  65198                     if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
  65199                       UnpredictableA32(instr);
  65200                     }
  65201                     return;
  65202                   }
  65203                   Condition condition((instr >> 28) & 0xf);
  65204                   unsigned rn = (instr >> 16) & 0xf;
  65205                   unsigned first = ExtractSRegister(instr, 22, 12);
  65206                   unsigned len = instr & 0xff;
  65207                   // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; A2
  65208                   vstmdb(condition,
  65209                          kDataTypeValueNone,
  65210                          Register(rn),
  65211                          WriteBack(WRITE_BACK),
  65212                          SRegisterList(SRegister(first), len));
  65213                   if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
  65214                     UnpredictableA32(instr);
  65215                   }
  65216                 } else {
  65217                   UnallocatedA32(instr);
  65218                 }
  65219                 break;
  65220               }
  65221               case 0x00200100: {
  65222                 // 0x0d200b00
  65223                 switch (instr & 0x00800001) {
  65224                   case 0x00000000: {
  65225                     // 0x0d200b00
  65226                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65227                       UnallocatedA32(instr);
  65228                       return;
  65229                     }
  65230                     if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
  65231                          Uint32(0xd)) &&
  65232                         ((instr & 0xf0000000) != 0xf0000000)) {
  65233                       Condition condition((instr >> 28) & 0xf);
  65234                       unsigned first = ExtractDRegister(instr, 22, 12);
  65235                       unsigned imm8 = (instr & 0xff);
  65236                       unsigned len = imm8 / 2;
  65237                       unsigned end = first + len;
  65238                       // VPUSH{<c>}{<q>}{.<size>} <dreglist> ; A1
  65239                       vpush(condition,
  65240                             kDataTypeValueNone,
  65241                             DRegisterList(DRegister(first), len));
  65242                       if ((len == 0) || (len > 16) ||
  65243                           (end > kMaxNumberOfDRegisters)) {
  65244                         UnpredictableA32(instr);
  65245                       }
  65246                       return;
  65247                     }
  65248                     Condition condition((instr >> 28) & 0xf);
  65249                     unsigned rn = (instr >> 16) & 0xf;
  65250                     unsigned first = ExtractDRegister(instr, 22, 12);
  65251                     unsigned imm8 = (instr & 0xff);
  65252                     unsigned len = imm8 / 2;
  65253                     unsigned end = first + len;
  65254                     // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; A1
  65255                     vstmdb(condition,
  65256                            kDataTypeValueNone,
  65257                            Register(rn),
  65258                            WriteBack(WRITE_BACK),
  65259                            DRegisterList(DRegister(first), len));
  65260                     if ((len == 0) || (len > 16) ||
  65261                         (end > kMaxNumberOfDRegisters)) {
  65262                       UnpredictableA32(instr);
  65263                     }
  65264                     break;
  65265                   }
  65266                   case 0x00000001: {
  65267                     // 0x0d200b01
  65268                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65269                       UnallocatedA32(instr);
  65270                       return;
  65271                     }
  65272                     Condition condition((instr >> 28) & 0xf);
  65273                     unsigned rn = (instr >> 16) & 0xf;
  65274                     unsigned first = ExtractDRegister(instr, 22, 12);
  65275                     unsigned imm8 = (instr & 0xff);
  65276                     unsigned len = imm8 / 2;
  65277                     unsigned end = first + len;
  65278                     // FSTMDBX{<c>}{<q>} <Rn>!, <dreglist> ; A1
  65279                     fstmdbx(condition,
  65280                             Register(rn),
  65281                             WriteBack(WRITE_BACK),
  65282                             DRegisterList(DRegister(first), len));
  65283                     if ((len == 0) || (len > 16) || (end > 16)) {
  65284                       UnpredictableA32(instr);
  65285                     }
  65286                     break;
  65287                   }
  65288                   default:
  65289                     UnallocatedA32(instr);
  65290                     break;
  65291                 }
  65292                 break;
  65293               }
  65294             }
  65295             break;
  65296           }
  65297           case 0x01000e00: {
  65298             // 0x0d000e00
  65299             switch (instr & 0x0060f100) {
  65300               case 0x00005000: {
  65301                 // 0x0d005e00
  65302                 if (((instr & 0xf0000000) == 0xf0000000)) {
  65303                   UnallocatedA32(instr);
  65304                   return;
  65305                 }
  65306                 UnimplementedA32("STC", instr);
  65307                 break;
  65308               }
  65309               case 0x00205000: {
  65310                 // 0x0d205e00
  65311                 if (((instr & 0xf0000000) == 0xf0000000)) {
  65312                   UnallocatedA32(instr);
  65313                   return;
  65314                 }
  65315                 UnimplementedA32("STC", instr);
  65316                 break;
  65317               }
  65318               default:
  65319                 UnallocatedA32(instr);
  65320                 break;
  65321             }
  65322             break;
  65323           }
  65324           case 0x01100a00: {
  65325             // 0x0d100a00
  65326             switch (instr & 0x00200100) {
  65327               case 0x00000000: {
  65328                 // 0x0d100a00
  65329                 switch (instr & 0x000f0000) {
  65330                   case 0x000f0000: {
  65331                     // 0x0d1f0a00
  65332                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65333                       UnallocatedA32(instr);
  65334                       return;
  65335                     }
  65336                     Condition condition((instr >> 28) & 0xf);
  65337                     unsigned rd = ExtractSRegister(instr, 22, 12);
  65338                     uint32_t U = (instr >> 23) & 0x1;
  65339                     int32_t imm = instr & 0xff;
  65340                     imm <<= 2;
  65341                     if (U == 0) imm = -imm;
  65342                     bool minus_zero = (imm == 0) && (U == 0);
  65343                     Location location(imm, kA32PcDelta);
  65344                     // VLDR{<c>}{<q>}{.32} <Sd>, <label> ; A2
  65345                     if (minus_zero) {
  65346                       vldr(condition,
  65347                            Untyped32,
  65348                            SRegister(rd),
  65349                            MemOperand(pc, minus, 0));
  65350                     } else {
  65351                       vldr(condition, Untyped32, SRegister(rd), &location);
  65352                     }
  65353                     break;
  65354                   }
  65355                   default: {
  65356                     if (((instr & 0xf0000000) == 0xf0000000) ||
  65357                         ((instr & 0xf0000) == 0xf0000)) {
  65358                       UnallocatedA32(instr);
  65359                       return;
  65360                     }
  65361                     Condition condition((instr >> 28) & 0xf);
  65362                     unsigned rd = ExtractSRegister(instr, 22, 12);
  65363                     unsigned rn = (instr >> 16) & 0xf;
  65364                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  65365                     int32_t offset = (instr & 0xff) << 2;
  65366                     // VLDR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; A2
  65367                     vldr(condition,
  65368                          Untyped32,
  65369                          SRegister(rd),
  65370                          MemOperand(Register(rn), sign, offset, Offset));
  65371                     break;
  65372                   }
  65373                 }
  65374                 break;
  65375               }
  65376               case 0x00000100: {
  65377                 // 0x0d100b00
  65378                 switch (instr & 0x000f0000) {
  65379                   case 0x000f0000: {
  65380                     // 0x0d1f0b00
  65381                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65382                       UnallocatedA32(instr);
  65383                       return;
  65384                     }
  65385                     Condition condition((instr >> 28) & 0xf);
  65386                     unsigned rd = ExtractDRegister(instr, 22, 12);
  65387                     uint32_t U = (instr >> 23) & 0x1;
  65388                     int32_t imm = instr & 0xff;
  65389                     imm <<= 2;
  65390                     if (U == 0) imm = -imm;
  65391                     bool minus_zero = (imm == 0) && (U == 0);
  65392                     Location location(imm, kA32PcDelta);
  65393                     // VLDR{<c>}{<q>}{.64} <Dd>, <label> ; A1
  65394                     if (minus_zero) {
  65395                       vldr(condition,
  65396                            Untyped64,
  65397                            DRegister(rd),
  65398                            MemOperand(pc, minus, 0));
  65399                     } else {
  65400                       vldr(condition, Untyped64, DRegister(rd), &location);
  65401                     }
  65402                     break;
  65403                   }
  65404                   default: {
  65405                     if (((instr & 0xf0000000) == 0xf0000000) ||
  65406                         ((instr & 0xf0000) == 0xf0000)) {
  65407                       UnallocatedA32(instr);
  65408                       return;
  65409                     }
  65410                     Condition condition((instr >> 28) & 0xf);
  65411                     unsigned rd = ExtractDRegister(instr, 22, 12);
  65412                     unsigned rn = (instr >> 16) & 0xf;
  65413                     Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus);
  65414                     int32_t offset = (instr & 0xff) << 2;
  65415                     // VLDR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; A1
  65416                     vldr(condition,
  65417                          Untyped64,
  65418                          DRegister(rd),
  65419                          MemOperand(Register(rn), sign, offset, Offset));
  65420                     break;
  65421                   }
  65422                 }
  65423                 break;
  65424               }
  65425               case 0x00200000: {
  65426                 // 0x0d300a00
  65427                 if ((instr & 0x00800000) == 0x00000000) {
  65428                   if (((instr & 0xf0000000) == 0xf0000000)) {
  65429                     UnallocatedA32(instr);
  65430                     return;
  65431                   }
  65432                   Condition condition((instr >> 28) & 0xf);
  65433                   unsigned rn = (instr >> 16) & 0xf;
  65434                   unsigned first = ExtractSRegister(instr, 22, 12);
  65435                   unsigned len = instr & 0xff;
  65436                   // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; A2
  65437                   vldmdb(condition,
  65438                          kDataTypeValueNone,
  65439                          Register(rn),
  65440                          WriteBack(WRITE_BACK),
  65441                          SRegisterList(SRegister(first), len));
  65442                   if ((len == 0) || ((first + len) > kNumberOfSRegisters)) {
  65443                     UnpredictableA32(instr);
  65444                   }
  65445                 } else {
  65446                   UnallocatedA32(instr);
  65447                 }
  65448                 break;
  65449               }
  65450               case 0x00200100: {
  65451                 // 0x0d300b00
  65452                 switch (instr & 0x00800001) {
  65453                   case 0x00000000: {
  65454                     // 0x0d300b00
  65455                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65456                       UnallocatedA32(instr);
  65457                       return;
  65458                     }
  65459                     Condition condition((instr >> 28) & 0xf);
  65460                     unsigned rn = (instr >> 16) & 0xf;
  65461                     unsigned first = ExtractDRegister(instr, 22, 12);
  65462                     unsigned imm8 = (instr & 0xff);
  65463                     unsigned len = imm8 / 2;
  65464                     unsigned end = first + len;
  65465                     // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; A1
  65466                     vldmdb(condition,
  65467                            kDataTypeValueNone,
  65468                            Register(rn),
  65469                            WriteBack(WRITE_BACK),
  65470                            DRegisterList(DRegister(first), len));
  65471                     if ((len == 0) || (len > 16) ||
  65472                         (end > kMaxNumberOfDRegisters)) {
  65473                       UnpredictableA32(instr);
  65474                     }
  65475                     break;
  65476                   }
  65477                   case 0x00000001: {
  65478                     // 0x0d300b01
  65479                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65480                       UnallocatedA32(instr);
  65481                       return;
  65482                     }
  65483                     Condition condition((instr >> 28) & 0xf);
  65484                     unsigned rn = (instr >> 16) & 0xf;
  65485                     unsigned first = ExtractDRegister(instr, 22, 12);
  65486                     unsigned imm8 = (instr & 0xff);
  65487                     unsigned len = imm8 / 2;
  65488                     unsigned end = first + len;
  65489                     // FLDMDBX{<c>}{<q>} <Rn>!, <dreglist> ; A1
  65490                     fldmdbx(condition,
  65491                             Register(rn),
  65492                             WriteBack(WRITE_BACK),
  65493                             DRegisterList(DRegister(first), len));
  65494                     if ((len == 0) || (len > 16) || (end > 16)) {
  65495                       UnpredictableA32(instr);
  65496                     }
  65497                     break;
  65498                   }
  65499                   default:
  65500                     UnallocatedA32(instr);
  65501                     break;
  65502                 }
  65503                 break;
  65504               }
  65505             }
  65506             break;
  65507           }
  65508           case 0x01100e00: {
  65509             // 0x0d100e00
  65510             switch (instr & 0x0060f100) {
  65511               case 0x00005000: {
  65512                 // 0x0d105e00
  65513                 switch (instr & 0x000f0000) {
  65514                   case 0x000f0000: {
  65515                     // 0x0d1f5e00
  65516                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65517                       UnallocatedA32(instr);
  65518                       return;
  65519                     }
  65520                     UnimplementedA32("LDC", instr);
  65521                     break;
  65522                   }
  65523                   default: {
  65524                     if (((instr & 0xf0000000) == 0xf0000000) ||
  65525                         ((instr & 0xf0000) == 0xf0000)) {
  65526                       UnallocatedA32(instr);
  65527                       return;
  65528                     }
  65529                     UnimplementedA32("LDC", instr);
  65530                     break;
  65531                   }
  65532                 }
  65533                 break;
  65534               }
  65535               case 0x00205000: {
  65536                 // 0x0d305e00
  65537                 if (((instr & 0xf0000000) == 0xf0000000) ||
  65538                     ((instr & 0xf0000) == 0xf0000)) {
  65539                   UnallocatedA32(instr);
  65540                   return;
  65541                 }
  65542                 UnimplementedA32("LDC", instr);
  65543                 break;
  65544               }
  65545               default:
  65546                 UnallocatedA32(instr);
  65547                 break;
  65548             }
  65549             break;
  65550           }
  65551           default:
  65552             UnallocatedA32(instr);
  65553             break;
  65554         }
  65555         break;
  65556       }
  65557       case 0x0e000000: {
  65558         // 0x0e000000
  65559         switch (instr & 0x01000000) {
  65560           case 0x00000000: {
  65561             // 0x0e000000
  65562             switch (instr & 0x00100e10) {
  65563               case 0x00000a00: {
  65564                 // 0x0e000a00
  65565                 switch (instr & 0x00a00140) {
  65566                   case 0x00000000: {
  65567                     // 0x0e000a00
  65568                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65569                       UnallocatedA32(instr);
  65570                       return;
  65571                     }
  65572                     Condition condition((instr >> 28) & 0xf);
  65573                     unsigned rd = ExtractSRegister(instr, 22, 12);
  65574                     unsigned rn = ExtractSRegister(instr, 7, 16);
  65575                     unsigned rm = ExtractSRegister(instr, 5, 0);
  65576                     // VMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
  65577                     vmla(condition,
  65578                          F32,
  65579                          SRegister(rd),
  65580                          SRegister(rn),
  65581                          SRegister(rm));
  65582                     break;
  65583                   }
  65584                   case 0x00000040: {
  65585                     // 0x0e000a40
  65586                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65587                       UnallocatedA32(instr);
  65588                       return;
  65589                     }
  65590                     Condition condition((instr >> 28) & 0xf);
  65591                     unsigned rd = ExtractSRegister(instr, 22, 12);
  65592                     unsigned rn = ExtractSRegister(instr, 7, 16);
  65593                     unsigned rm = ExtractSRegister(instr, 5, 0);
  65594                     // VMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
  65595                     vmls(condition,
  65596                          F32,
  65597                          SRegister(rd),
  65598                          SRegister(rn),
  65599                          SRegister(rm));
  65600                     break;
  65601                   }
  65602                   case 0x00000100: {
  65603                     // 0x0e000b00
  65604                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65605                       UnallocatedA32(instr);
  65606                       return;
  65607                     }
  65608                     Condition condition((instr >> 28) & 0xf);
  65609                     unsigned rd = ExtractDRegister(instr, 22, 12);
  65610                     unsigned rn = ExtractDRegister(instr, 7, 16);
  65611                     unsigned rm = ExtractDRegister(instr, 5, 0);
  65612                     // VMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
  65613                     vmla(condition,
  65614                          F64,
  65615                          DRegister(rd),
  65616                          DRegister(rn),
  65617                          DRegister(rm));
  65618                     break;
  65619                   }
  65620                   case 0x00000140: {
  65621                     // 0x0e000b40
  65622                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65623                       UnallocatedA32(instr);
  65624                       return;
  65625                     }
  65626                     Condition condition((instr >> 28) & 0xf);
  65627                     unsigned rd = ExtractDRegister(instr, 22, 12);
  65628                     unsigned rn = ExtractDRegister(instr, 7, 16);
  65629                     unsigned rm = ExtractDRegister(instr, 5, 0);
  65630                     // VMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
  65631                     vmls(condition,
  65632                          F64,
  65633                          DRegister(rd),
  65634                          DRegister(rn),
  65635                          DRegister(rm));
  65636                     break;
  65637                   }
  65638                   case 0x00200000: {
  65639                     // 0x0e200a00
  65640                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65641                       UnallocatedA32(instr);
  65642                       return;
  65643                     }
  65644                     Condition condition((instr >> 28) & 0xf);
  65645                     unsigned rd = ExtractSRegister(instr, 22, 12);
  65646                     unsigned rn = ExtractSRegister(instr, 7, 16);
  65647                     unsigned rm = ExtractSRegister(instr, 5, 0);
  65648                     // VMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
  65649                     vmul(condition,
  65650                          F32,
  65651                          SRegister(rd),
  65652                          SRegister(rn),
  65653                          SRegister(rm));
  65654                     break;
  65655                   }
  65656                   case 0x00200040: {
  65657                     // 0x0e200a40
  65658                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65659                       UnallocatedA32(instr);
  65660                       return;
  65661                     }
  65662                     Condition condition((instr >> 28) & 0xf);
  65663                     unsigned rd = ExtractSRegister(instr, 22, 12);
  65664                     unsigned rn = ExtractSRegister(instr, 7, 16);
  65665                     unsigned rm = ExtractSRegister(instr, 5, 0);
  65666                     // VNMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A1
  65667                     vnmul(condition,
  65668                           F32,
  65669                           SRegister(rd),
  65670                           SRegister(rn),
  65671                           SRegister(rm));
  65672                     break;
  65673                   }
  65674                   case 0x00200100: {
  65675                     // 0x0e200b00
  65676                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65677                       UnallocatedA32(instr);
  65678                       return;
  65679                     }
  65680                     Condition condition((instr >> 28) & 0xf);
  65681                     unsigned rd = ExtractDRegister(instr, 22, 12);
  65682                     unsigned rn = ExtractDRegister(instr, 7, 16);
  65683                     unsigned rm = ExtractDRegister(instr, 5, 0);
  65684                     // VMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
  65685                     vmul(condition,
  65686                          F64,
  65687                          DRegister(rd),
  65688                          DRegister(rn),
  65689                          DRegister(rm));
  65690                     break;
  65691                   }
  65692                   case 0x00200140: {
  65693                     // 0x0e200b40
  65694                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65695                       UnallocatedA32(instr);
  65696                       return;
  65697                     }
  65698                     Condition condition((instr >> 28) & 0xf);
  65699                     unsigned rd = ExtractDRegister(instr, 22, 12);
  65700                     unsigned rn = ExtractDRegister(instr, 7, 16);
  65701                     unsigned rm = ExtractDRegister(instr, 5, 0);
  65702                     // VNMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A1
  65703                     vnmul(condition,
  65704                           F64,
  65705                           DRegister(rd),
  65706                           DRegister(rn),
  65707                           DRegister(rm));
  65708                     break;
  65709                   }
  65710                   case 0x00800000: {
  65711                     // 0x0e800a00
  65712                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65713                       UnallocatedA32(instr);
  65714                       return;
  65715                     }
  65716                     Condition condition((instr >> 28) & 0xf);
  65717                     unsigned rd = ExtractSRegister(instr, 22, 12);
  65718                     unsigned rn = ExtractSRegister(instr, 7, 16);
  65719                     unsigned rm = ExtractSRegister(instr, 5, 0);
  65720                     // VDIV{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A1
  65721                     vdiv(condition,
  65722                          F32,
  65723                          SRegister(rd),
  65724                          SRegister(rn),
  65725                          SRegister(rm));
  65726                     break;
  65727                   }
  65728                   case 0x00800100: {
  65729                     // 0x0e800b00
  65730                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65731                       UnallocatedA32(instr);
  65732                       return;
  65733                     }
  65734                     Condition condition((instr >> 28) & 0xf);
  65735                     unsigned rd = ExtractDRegister(instr, 22, 12);
  65736                     unsigned rn = ExtractDRegister(instr, 7, 16);
  65737                     unsigned rm = ExtractDRegister(instr, 5, 0);
  65738                     // VDIV{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A1
  65739                     vdiv(condition,
  65740                          F64,
  65741                          DRegister(rd),
  65742                          DRegister(rn),
  65743                          DRegister(rm));
  65744                     break;
  65745                   }
  65746                   case 0x00a00000: {
  65747                     // 0x0ea00a00
  65748                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65749                       UnallocatedA32(instr);
  65750                       return;
  65751                     }
  65752                     Condition condition((instr >> 28) & 0xf);
  65753                     unsigned rd = ExtractSRegister(instr, 22, 12);
  65754                     unsigned rn = ExtractSRegister(instr, 7, 16);
  65755                     unsigned rm = ExtractSRegister(instr, 5, 0);
  65756                     // VFMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
  65757                     vfma(condition,
  65758                          F32,
  65759                          SRegister(rd),
  65760                          SRegister(rn),
  65761                          SRegister(rm));
  65762                     break;
  65763                   }
  65764                   case 0x00a00040: {
  65765                     // 0x0ea00a40
  65766                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65767                       UnallocatedA32(instr);
  65768                       return;
  65769                     }
  65770                     Condition condition((instr >> 28) & 0xf);
  65771                     unsigned rd = ExtractSRegister(instr, 22, 12);
  65772                     unsigned rn = ExtractSRegister(instr, 7, 16);
  65773                     unsigned rm = ExtractSRegister(instr, 5, 0);
  65774                     // VFMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2
  65775                     vfms(condition,
  65776                          F32,
  65777                          SRegister(rd),
  65778                          SRegister(rn),
  65779                          SRegister(rm));
  65780                     break;
  65781                   }
  65782                   case 0x00a00100: {
  65783                     // 0x0ea00b00
  65784                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65785                       UnallocatedA32(instr);
  65786                       return;
  65787                     }
  65788                     Condition condition((instr >> 28) & 0xf);
  65789                     unsigned rd = ExtractDRegister(instr, 22, 12);
  65790                     unsigned rn = ExtractDRegister(instr, 7, 16);
  65791                     unsigned rm = ExtractDRegister(instr, 5, 0);
  65792                     // VFMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
  65793                     vfma(condition,
  65794                          F64,
  65795                          DRegister(rd),
  65796                          DRegister(rn),
  65797                          DRegister(rm));
  65798                     break;
  65799                   }
  65800                   case 0x00a00140: {
  65801                     // 0x0ea00b40
  65802                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65803                       UnallocatedA32(instr);
  65804                       return;
  65805                     }
  65806                     Condition condition((instr >> 28) & 0xf);
  65807                     unsigned rd = ExtractDRegister(instr, 22, 12);
  65808                     unsigned rn = ExtractDRegister(instr, 7, 16);
  65809                     unsigned rm = ExtractDRegister(instr, 5, 0);
  65810                     // VFMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2
  65811                     vfms(condition,
  65812                          F64,
  65813                          DRegister(rd),
  65814                          DRegister(rn),
  65815                          DRegister(rm));
  65816                     break;
  65817                   }
  65818                   default:
  65819                     UnallocatedA32(instr);
  65820                     break;
  65821                 }
  65822                 break;
  65823               }
  65824               case 0x00000a10: {
  65825                 // 0x0e000a10
  65826                 switch (instr & 0x00800100) {
  65827                   case 0x00000000: {
  65828                     // 0x0e000a10
  65829                     if ((instr & 0x00600000) == 0x00000000) {
  65830                       if (((instr & 0xf0000000) == 0xf0000000)) {
  65831                         UnallocatedA32(instr);
  65832                         return;
  65833                       }
  65834                       Condition condition((instr >> 28) & 0xf);
  65835                       unsigned rn = ExtractSRegister(instr, 7, 16);
  65836                       unsigned rt = (instr >> 12) & 0xf;
  65837                       // VMOV{<c>}{<q>} <Sn>, <Rt> ; A1
  65838                       vmov(condition, SRegister(rn), Register(rt));
  65839                       if (((instr & 0xff00f7f) != 0xe000a10)) {
  65840                         UnpredictableA32(instr);
  65841                       }
  65842                     } else {
  65843                       UnallocatedA32(instr);
  65844                     }
  65845                     break;
  65846                   }
  65847                   case 0x00000100: {
  65848                     // 0x0e000b10
  65849                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65850                       UnallocatedA32(instr);
  65851                       return;
  65852                     }
  65853                     Condition condition((instr >> 28) & 0xf);
  65854                     unsigned lane;
  65855                     DataType dt =
  65856                         Dt_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
  65857                                                   ((instr >> 19) & 0xc),
  65858                                               &lane);
  65859                     if (dt.Is(kDataTypeValueInvalid)) {
  65860                       UnallocatedA32(instr);
  65861                       return;
  65862                     }
  65863                     unsigned rd = ExtractDRegister(instr, 7, 16);
  65864                     unsigned rt = (instr >> 12) & 0xf;
  65865                     // VMOV{<c>}{<q>}{.<size>} <Dd[x]>, <Rt> ; A1
  65866                     vmov(condition, dt, DRegisterLane(rd, lane), Register(rt));
  65867                     if (((instr & 0xf900f1f) != 0xe000b10)) {
  65868                       UnpredictableA32(instr);
  65869                     }
  65870                     break;
  65871                   }
  65872                   case 0x00800000: {
  65873                     // 0x0e800a10
  65874                     if ((instr & 0x00600000) == 0x00600000) {
  65875                       if (((instr & 0xf0000000) == 0xf0000000)) {
  65876                         UnallocatedA32(instr);
  65877                         return;
  65878                       }
  65879                       Condition condition((instr >> 28) & 0xf);
  65880                       unsigned spec_reg = (instr >> 16) & 0xf;
  65881                       unsigned rt = (instr >> 12) & 0xf;
  65882                       switch (spec_reg) {
  65883                         case 0x0:
  65884                         case 0x1:
  65885                         case 0x8: {
  65886                           // VMSR{<c>}{<q>} <spec_reg>, <Rt> ; A1
  65887                           vmsr(condition,
  65888                                SpecialFPRegister(spec_reg),
  65889                                Register(rt));
  65890                           if (((instr & 0xff00fff) != 0xee00a10)) {
  65891                             UnpredictableA32(instr);
  65892                           }
  65893                           break;
  65894                         }
  65895                         default:
  65896                           UnallocatedA32(instr);
  65897                           break;
  65898                       }
  65899                     } else {
  65900                       UnallocatedA32(instr);
  65901                     }
  65902                     break;
  65903                   }
  65904                   case 0x00800100: {
  65905                     // 0x0e800b10
  65906                     switch (instr & 0x00200040) {
  65907                       case 0x00000000: {
  65908                         // 0x0e800b10
  65909                         if (((instr & 0xf0000000) == 0xf0000000)) {
  65910                           UnallocatedA32(instr);
  65911                           return;
  65912                         }
  65913                         Condition condition((instr >> 28) & 0xf);
  65914                         DataType dt = Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
  65915                                                       ((instr >> 21) & 0x2));
  65916                         if (dt.Is(kDataTypeValueInvalid)) {
  65917                           UnallocatedA32(instr);
  65918                           return;
  65919                         }
  65920                         unsigned rd = ExtractDRegister(instr, 7, 16);
  65921                         unsigned rt = (instr >> 12) & 0xf;
  65922                         // VDUP{<c>}{<q>}.<dt> <Dd>, <Rt> ; A1
  65923                         vdup(condition, dt, DRegister(rd), Register(rt));
  65924                         if (((instr & 0xfb00f5f) != 0xe800b10)) {
  65925                           UnpredictableA32(instr);
  65926                         }
  65927                         break;
  65928                       }
  65929                       case 0x00200000: {
  65930                         // 0x0ea00b10
  65931                         if (((instr & 0xf0000000) == 0xf0000000)) {
  65932                           UnallocatedA32(instr);
  65933                           return;
  65934                         }
  65935                         Condition condition((instr >> 28) & 0xf);
  65936                         DataType dt = Dt_B_E_1_Decode(((instr >> 5) & 0x1) |
  65937                                                       ((instr >> 21) & 0x2));
  65938                         if (dt.Is(kDataTypeValueInvalid)) {
  65939                           UnallocatedA32(instr);
  65940                           return;
  65941                         }
  65942                         if (((instr >> 16) & 1) != 0) {
  65943                           UnallocatedA32(instr);
  65944                           return;
  65945                         }
  65946                         unsigned rd = ExtractQRegister(instr, 7, 16);
  65947                         unsigned rt = (instr >> 12) & 0xf;
  65948                         // VDUP{<c>}{<q>}.<dt> <Qd>, <Rt> ; A1
  65949                         vdup(condition, dt, QRegister(rd), Register(rt));
  65950                         if (((instr & 0xfb00f5f) != 0xea00b10)) {
  65951                           UnpredictableA32(instr);
  65952                         }
  65953                         break;
  65954                       }
  65955                       default:
  65956                         UnallocatedA32(instr);
  65957                         break;
  65958                     }
  65959                     break;
  65960                   }
  65961                 }
  65962                 break;
  65963               }
  65964               case 0x00000e10: {
  65965                 // 0x0e000e10
  65966                 if (((instr & 0xf0000000) == 0xf0000000)) {
  65967                   UnallocatedA32(instr);
  65968                   return;
  65969                 }
  65970                 UnimplementedA32("MCR", instr);
  65971                 break;
  65972               }
  65973               case 0x00100a00: {
  65974                 // 0x0e100a00
  65975                 switch (instr & 0x00a00140) {
  65976                   case 0x00000000: {
  65977                     // 0x0e100a00
  65978                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65979                       UnallocatedA32(instr);
  65980                       return;
  65981                     }
  65982                     Condition condition((instr >> 28) & 0xf);
  65983                     unsigned rd = ExtractSRegister(instr, 22, 12);
  65984                     unsigned rn = ExtractSRegister(instr, 7, 16);
  65985                     unsigned rm = ExtractSRegister(instr, 5, 0);
  65986                     // VNMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
  65987                     vnmls(condition,
  65988                           F32,
  65989                           SRegister(rd),
  65990                           SRegister(rn),
  65991                           SRegister(rm));
  65992                     break;
  65993                   }
  65994                   case 0x00000040: {
  65995                     // 0x0e100a40
  65996                     if (((instr & 0xf0000000) == 0xf0000000)) {
  65997                       UnallocatedA32(instr);
  65998                       return;
  65999                     }
  66000                     Condition condition((instr >> 28) & 0xf);
  66001                     unsigned rd = ExtractSRegister(instr, 22, 12);
  66002                     unsigned rn = ExtractSRegister(instr, 7, 16);
  66003                     unsigned rm = ExtractSRegister(instr, 5, 0);
  66004                     // VNMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
  66005                     vnmla(condition,
  66006                           F32,
  66007                           SRegister(rd),
  66008                           SRegister(rn),
  66009                           SRegister(rm));
  66010                     break;
  66011                   }
  66012                   case 0x00000100: {
  66013                     // 0x0e100b00
  66014                     if (((instr & 0xf0000000) == 0xf0000000)) {
  66015                       UnallocatedA32(instr);
  66016                       return;
  66017                     }
  66018                     Condition condition((instr >> 28) & 0xf);
  66019                     unsigned rd = ExtractDRegister(instr, 22, 12);
  66020                     unsigned rn = ExtractDRegister(instr, 7, 16);
  66021                     unsigned rm = ExtractDRegister(instr, 5, 0);
  66022                     // VNMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
  66023                     vnmls(condition,
  66024                           F64,
  66025                           DRegister(rd),
  66026                           DRegister(rn),
  66027                           DRegister(rm));
  66028                     break;
  66029                   }
  66030                   case 0x00000140: {
  66031                     // 0x0e100b40
  66032                     if (((instr & 0xf0000000) == 0xf0000000)) {
  66033                       UnallocatedA32(instr);
  66034                       return;
  66035                     }
  66036                     Condition condition((instr >> 28) & 0xf);
  66037                     unsigned rd = ExtractDRegister(instr, 22, 12);
  66038                     unsigned rn = ExtractDRegister(instr, 7, 16);
  66039                     unsigned rm = ExtractDRegister(instr, 5, 0);
  66040                     // VNMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
  66041                     vnmla(condition,
  66042                           F64,
  66043                           DRegister(rd),
  66044                           DRegister(rn),
  66045                           DRegister(rm));
  66046                     break;
  66047                   }
  66048                   case 0x00200000: {
  66049                     // 0x0e300a00
  66050                     if (((instr & 0xf0000000) == 0xf0000000)) {
  66051                       UnallocatedA32(instr);
  66052                       return;
  66053                     }
  66054                     Condition condition((instr >> 28) & 0xf);
  66055                     unsigned rd = ExtractSRegister(instr, 22, 12);
  66056                     unsigned rn = ExtractSRegister(instr, 7, 16);
  66057                     unsigned rm = ExtractSRegister(instr, 5, 0);
  66058                     // VADD{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
  66059                     vadd(condition,
  66060                          F32,
  66061                          SRegister(rd),
  66062                          SRegister(rn),
  66063                          SRegister(rm));
  66064                     break;
  66065                   }
  66066                   case 0x00200040: {
  66067                     // 0x0e300a40
  66068                     if (((instr & 0xf0000000) == 0xf0000000)) {
  66069                       UnallocatedA32(instr);
  66070                       return;
  66071                     }
  66072                     Condition condition((instr >> 28) & 0xf);
  66073                     unsigned rd = ExtractSRegister(instr, 22, 12);
  66074                     unsigned rn = ExtractSRegister(instr, 7, 16);
  66075                     unsigned rm = ExtractSRegister(instr, 5, 0);
  66076                     // VSUB{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2
  66077                     vsub(condition,
  66078                          F32,
  66079                          SRegister(rd),
  66080                          SRegister(rn),
  66081                          SRegister(rm));
  66082                     break;
  66083                   }
  66084                   case 0x00200100: {
  66085                     // 0x0e300b00
  66086                     if (((instr & 0xf0000000) == 0xf0000000)) {
  66087                       UnallocatedA32(instr);
  66088                       return;
  66089                     }
  66090                     Condition condition((instr >> 28) & 0xf);
  66091                     unsigned rd = ExtractDRegister(instr, 22, 12);
  66092                     unsigned rn = ExtractDRegister(instr, 7, 16);
  66093                     unsigned rm = ExtractDRegister(instr, 5, 0);
  66094                     // VADD{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
  66095                     vadd(condition,
  66096                          F64,
  66097                          DRegister(rd),
  66098                          DRegister(rn),
  66099                          DRegister(rm));
  66100                     break;
  66101                   }
  66102                   case 0x00200140: {
  66103                     // 0x0e300b40
  66104                     if (((instr & 0xf0000000) == 0xf0000000)) {
  66105                       UnallocatedA32(instr);
  66106                       return;
  66107                     }
  66108                     Condition condition((instr >> 28) & 0xf);
  66109                     unsigned rd = ExtractDRegister(instr, 22, 12);
  66110                     unsigned rn = ExtractDRegister(instr, 7, 16);
  66111                     unsigned rm = ExtractDRegister(instr, 5, 0);
  66112                     // VSUB{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2
  66113                     vsub(condition,
  66114                          F64,
  66115                          DRegister(rd),
  66116                          DRegister(rn),
  66117                          DRegister(rm));
  66118                     break;
  66119                   }
  66120                   case 0x00800000: {
  66121                     // 0x0e900a00
  66122                     if (((instr & 0xf0000000) == 0xf0000000)) {
  66123                       UnallocatedA32(instr);
  66124                       return;
  66125                     }
  66126                     Condition condition((instr >> 28) & 0xf);
  66127                     unsigned rd = ExtractSRegister(instr, 22, 12);
  66128                     unsigned rn = ExtractSRegister(instr, 7, 16);
  66129                     unsigned rm = ExtractSRegister(instr, 5, 0);
  66130                     // VFNMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
  66131                     vfnms(condition,
  66132                           F32,
  66133                           SRegister(rd),
  66134                           SRegister(rn),
  66135                           SRegister(rm));
  66136                     break;
  66137                   }
  66138                   case 0x00800040: {
  66139                     // 0x0e900a40
  66140                     if (((instr & 0xf0000000) == 0xf0000000)) {
  66141                       UnallocatedA32(instr);
  66142                       return;
  66143                     }
  66144                     Condition condition((instr >> 28) & 0xf);
  66145                     unsigned rd = ExtractSRegister(instr, 22, 12);
  66146                     unsigned rn = ExtractSRegister(instr, 7, 16);
  66147                     unsigned rm = ExtractSRegister(instr, 5, 0);
  66148                     // VFNMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1
  66149                     vfnma(condition,
  66150                           F32,
  66151                           SRegister(rd),
  66152                           SRegister(rn),
  66153                           SRegister(rm));
  66154                     break;
  66155                   }
  66156                   case 0x00800100: {
  66157                     // 0x0e900b00
  66158                     if (((instr & 0xf0000000) == 0xf0000000)) {
  66159                       UnallocatedA32(instr);
  66160                       return;
  66161                     }
  66162                     Condition condition((instr >> 28) & 0xf);
  66163                     unsigned rd = ExtractDRegister(instr, 22, 12);
  66164                     unsigned rn = ExtractDRegister(instr, 7, 16);
  66165                     unsigned rm = ExtractDRegister(instr, 5, 0);
  66166                     // VFNMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
  66167                     vfnms(condition,
  66168                           F64,
  66169                           DRegister(rd),
  66170                           DRegister(rn),
  66171                           DRegister(rm));
  66172                     break;
  66173                   }
  66174                   case 0x00800140: {
  66175                     // 0x0e900b40
  66176                     if (((instr & 0xf0000000) == 0xf0000000)) {
  66177                       UnallocatedA32(instr);
  66178                       return;
  66179                     }
  66180                     Condition condition((instr >> 28) & 0xf);
  66181                     unsigned rd = ExtractDRegister(instr, 22, 12);
  66182                     unsigned rn = ExtractDRegister(instr, 7, 16);
  66183                     unsigned rm = ExtractDRegister(instr, 5, 0);
  66184                     // VFNMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1
  66185                     vfnma(condition,
  66186                           F64,
  66187                           DRegister(rd),
  66188                           DRegister(rn),
  66189                           DRegister(rm));
  66190                     break;
  66191                   }
  66192                   case 0x00a00000: {
  66193                     // 0x0eb00a00
  66194                     if (((instr & 0xf0000000) == 0xf0000000)) {
  66195                       UnallocatedA32(instr);
  66196                       return;
  66197                     }
  66198                     Condition condition((instr >> 28) & 0xf);
  66199                     unsigned rd = ExtractSRegister(instr, 22, 12);
  66200                     uint32_t encoded_imm =
  66201                         (instr & 0xf) | ((instr >> 12) & 0xf0);
  66202                     NeonImmediate imm =
  66203                         ImmediateVFP::Decode<float>(encoded_imm);
  66204                     // VMOV{<c>}{<q>}.F32 <Sd>, #<imm> ; A2
  66205                     vmov(condition, F32, SRegister(rd), imm);
  66206                     if (((instr & 0xfb00ff0) != 0xeb00a00)) {
  66207                       UnpredictableA32(instr);
  66208                     }
  66209                     break;
  66210                   }
  66211                   case 0x00a00040: {
  66212                     // 0x0eb00a40
  66213                     switch (instr & 0x000e0000) {
  66214                       case 0x00000000: {
  66215                         // 0x0eb00a40
  66216                         switch (instr & 0x00010080) {
  66217                           case 0x00000000: {
  66218                             // 0x0eb00a40
  66219                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66220                               UnallocatedA32(instr);
  66221                               return;
  66222                             }
  66223                             Condition condition((instr >> 28) & 0xf);
  66224                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66225                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66226                             // VMOV{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
  66227                             vmov(condition, F32, SRegister(rd), SRegister(rm));
  66228                             break;
  66229                           }
  66230                           case 0x00000080: {
  66231                             // 0x0eb00ac0
  66232                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66233                               UnallocatedA32(instr);
  66234                               return;
  66235                             }
  66236                             Condition condition((instr >> 28) & 0xf);
  66237                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66238                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66239                             // VABS{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
  66240                             vabs(condition, F32, SRegister(rd), SRegister(rm));
  66241                             break;
  66242                           }
  66243                           case 0x00010000: {
  66244                             // 0x0eb10a40
  66245                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66246                               UnallocatedA32(instr);
  66247                               return;
  66248                             }
  66249                             Condition condition((instr >> 28) & 0xf);
  66250                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66251                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66252                             // VNEG{<c>}{<q>}.F32 <Sd>, <Sm> ; A2
  66253                             vneg(condition, F32, SRegister(rd), SRegister(rm));
  66254                             break;
  66255                           }
  66256                           case 0x00010080: {
  66257                             // 0x0eb10ac0
  66258                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66259                               UnallocatedA32(instr);
  66260                               return;
  66261                             }
  66262                             Condition condition((instr >> 28) & 0xf);
  66263                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66264                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66265                             // VSQRT{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
  66266                             vsqrt(condition, F32, SRegister(rd), SRegister(rm));
  66267                             break;
  66268                           }
  66269                         }
  66270                         break;
  66271                       }
  66272                       case 0x00020000: {
  66273                         // 0x0eb20a40
  66274                         switch (instr & 0x00010080) {
  66275                           case 0x00000000: {
  66276                             // 0x0eb20a40
  66277                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66278                               UnallocatedA32(instr);
  66279                               return;
  66280                             }
  66281                             Condition condition((instr >> 28) & 0xf);
  66282                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66283                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66284                             // VCVTB{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; A1
  66285                             vcvtb(condition,
  66286                                   F32,
  66287                                   F16,
  66288                                   SRegister(rd),
  66289                                   SRegister(rm));
  66290                             break;
  66291                           }
  66292                           case 0x00000080: {
  66293                             // 0x0eb20ac0
  66294                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66295                               UnallocatedA32(instr);
  66296                               return;
  66297                             }
  66298                             Condition condition((instr >> 28) & 0xf);
  66299                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66300                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66301                             // VCVTT{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; A1
  66302                             vcvtt(condition,
  66303                                   F32,
  66304                                   F16,
  66305                                   SRegister(rd),
  66306                                   SRegister(rm));
  66307                             break;
  66308                           }
  66309                           case 0x00010000: {
  66310                             // 0x0eb30a40
  66311                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66312                               UnallocatedA32(instr);
  66313                               return;
  66314                             }
  66315                             Condition condition((instr >> 28) & 0xf);
  66316                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66317                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66318                             // VCVTB{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; A1
  66319                             vcvtb(condition,
  66320                                   F16,
  66321                                   F32,
  66322                                   SRegister(rd),
  66323                                   SRegister(rm));
  66324                             break;
  66325                           }
  66326                           case 0x00010080: {
  66327                             // 0x0eb30ac0
  66328                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66329                               UnallocatedA32(instr);
  66330                               return;
  66331                             }
  66332                             Condition condition((instr >> 28) & 0xf);
  66333                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66334                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66335                             // VCVTT{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; A1
  66336                             vcvtt(condition,
  66337                                   F16,
  66338                                   F32,
  66339                                   SRegister(rd),
  66340                                   SRegister(rm));
  66341                             break;
  66342                           }
  66343                         }
  66344                         break;
  66345                       }
  66346                       case 0x00040000: {
  66347                         // 0x0eb40a40
  66348                         switch (instr & 0x00010080) {
  66349                           case 0x00000000: {
  66350                             // 0x0eb40a40
  66351                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66352                               UnallocatedA32(instr);
  66353                               return;
  66354                             }
  66355                             Condition condition((instr >> 28) & 0xf);
  66356                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66357                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66358                             // VCMP{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
  66359                             vcmp(condition, F32, SRegister(rd), SRegister(rm));
  66360                             break;
  66361                           }
  66362                           case 0x00000080: {
  66363                             // 0x0eb40ac0
  66364                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66365                               UnallocatedA32(instr);
  66366                               return;
  66367                             }
  66368                             Condition condition((instr >> 28) & 0xf);
  66369                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66370                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66371                             // VCMPE{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
  66372                             vcmpe(condition, F32, SRegister(rd), SRegister(rm));
  66373                             break;
  66374                           }
  66375                           case 0x00010000: {
  66376                             // 0x0eb50a40
  66377                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66378                               UnallocatedA32(instr);
  66379                               return;
  66380                             }
  66381                             Condition condition((instr >> 28) & 0xf);
  66382                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66383                             // VCMP{<c>}{<q>}.F32 <Sd>, #0.0 ; A2
  66384                             vcmp(condition, F32, SRegister(rd), 0.0);
  66385                             if (((instr & 0xfbf0fff) != 0xeb50a40)) {
  66386                               UnpredictableA32(instr);
  66387                             }
  66388                             break;
  66389                           }
  66390                           case 0x00010080: {
  66391                             // 0x0eb50ac0
  66392                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66393                               UnallocatedA32(instr);
  66394                               return;
  66395                             }
  66396                             Condition condition((instr >> 28) & 0xf);
  66397                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66398                             // VCMPE{<c>}{<q>}.F32 <Sd>, #0.0 ; A2
  66399                             vcmpe(condition, F32, SRegister(rd), 0.0);
  66400                             if (((instr & 0xfbf0fff) != 0xeb50ac0)) {
  66401                               UnpredictableA32(instr);
  66402                             }
  66403                             break;
  66404                           }
  66405                         }
  66406                         break;
  66407                       }
  66408                       case 0x00060000: {
  66409                         // 0x0eb60a40
  66410                         switch (instr & 0x00010080) {
  66411                           case 0x00000000: {
  66412                             // 0x0eb60a40
  66413                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66414                               UnallocatedA32(instr);
  66415                               return;
  66416                             }
  66417                             Condition condition((instr >> 28) & 0xf);
  66418                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66419                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66420                             // VRINTR{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
  66421                             vrintr(condition,
  66422                                    F32,
  66423                                    SRegister(rd),
  66424                                    SRegister(rm));
  66425                             break;
  66426                           }
  66427                           case 0x00000080: {
  66428                             // 0x0eb60ac0
  66429                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66430                               UnallocatedA32(instr);
  66431                               return;
  66432                             }
  66433                             Condition condition((instr >> 28) & 0xf);
  66434                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66435                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66436                             // VRINTZ{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
  66437                             vrintz(condition,
  66438                                    F32,
  66439                                    SRegister(rd),
  66440                                    SRegister(rm));
  66441                             break;
  66442                           }
  66443                           case 0x00010000: {
  66444                             // 0x0eb70a40
  66445                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66446                               UnallocatedA32(instr);
  66447                               return;
  66448                             }
  66449                             Condition condition((instr >> 28) & 0xf);
  66450                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66451                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66452                             // VRINTX{<c>}{<q>}.F32 <Sd>, <Sm> ; A1
  66453                             vrintx(condition,
  66454                                    F32,
  66455                                    SRegister(rd),
  66456                                    SRegister(rm));
  66457                             break;
  66458                           }
  66459                           case 0x00010080: {
  66460                             // 0x0eb70ac0
  66461                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66462                               UnallocatedA32(instr);
  66463                               return;
  66464                             }
  66465                             Condition condition((instr >> 28) & 0xf);
  66466                             unsigned rd = ExtractDRegister(instr, 22, 12);
  66467                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66468                             // VCVT{<c>}{<q>}.F64.F32 <Dd>, <Sm> ; A1
  66469                             vcvt(condition,
  66470                                  F64,
  66471                                  F32,
  66472                                  DRegister(rd),
  66473                                  SRegister(rm));
  66474                             break;
  66475                           }
  66476                         }
  66477                         break;
  66478                       }
  66479                       case 0x00080000: {
  66480                         // 0x0eb80a40
  66481                         if ((instr & 0x00010000) == 0x00000000) {
  66482                           if (((instr & 0xf0000000) == 0xf0000000)) {
  66483                             UnallocatedA32(instr);
  66484                             return;
  66485                           }
  66486                           Condition condition((instr >> 28) & 0xf);
  66487                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  66488                           if (dt.Is(kDataTypeValueInvalid)) {
  66489                             UnallocatedA32(instr);
  66490                             return;
  66491                           }
  66492                           unsigned rd = ExtractSRegister(instr, 22, 12);
  66493                           unsigned rm = ExtractSRegister(instr, 5, 0);
  66494                           // VCVT{<c>}{<q>}.F32.<dt> <Sd>, <Sm> ; A1
  66495                           vcvt(condition,
  66496                                F32,
  66497                                dt,
  66498                                SRegister(rd),
  66499                                SRegister(rm));
  66500                         } else {
  66501                           UnallocatedA32(instr);
  66502                         }
  66503                         break;
  66504                       }
  66505                       case 0x000a0000: {
  66506                         // 0x0eba0a40
  66507                         if (((instr & 0xf0000000) == 0xf0000000)) {
  66508                           UnallocatedA32(instr);
  66509                           return;
  66510                         }
  66511                         Condition condition((instr >> 28) & 0xf);
  66512                         DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
  66513                                                        ((instr >> 15) & 0x2));
  66514                         if (dt.Is(kDataTypeValueInvalid)) {
  66515                           UnallocatedA32(instr);
  66516                           return;
  66517                         }
  66518                         unsigned rd = ExtractSRegister(instr, 22, 12);
  66519                         unsigned offset = 32;
  66520                         if (dt.Is(S16) || dt.Is(U16)) {
  66521                           offset = 16;
  66522                         }
  66523                         uint32_t fbits = offset - (((instr >> 5) & 0x1) |
  66524                                                    ((instr << 1) & 0x1e));
  66525                         // VCVT{<c>}{<q>}.F32.<dt> <Sdm>, <Sdm>, #<fbits> ; A1
  66526                         vcvt(condition,
  66527                              F32,
  66528                              dt,
  66529                              SRegister(rd),
  66530                              SRegister(rd),
  66531                              fbits);
  66532                         break;
  66533                       }
  66534                       case 0x000c0000: {
  66535                         // 0x0ebc0a40
  66536                         switch (instr & 0x00010080) {
  66537                           case 0x00000000: {
  66538                             // 0x0ebc0a40
  66539                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66540                               UnallocatedA32(instr);
  66541                               return;
  66542                             }
  66543                             Condition condition((instr >> 28) & 0xf);
  66544                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66545                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66546                             // VCVTR{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; A1
  66547                             vcvtr(condition,
  66548                                   U32,
  66549                                   F32,
  66550                                   SRegister(rd),
  66551                                   SRegister(rm));
  66552                             break;
  66553                           }
  66554                           case 0x00000080: {
  66555                             // 0x0ebc0ac0
  66556                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66557                               UnallocatedA32(instr);
  66558                               return;
  66559                             }
  66560                             Condition condition((instr >> 28) & 0xf);
  66561                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66562                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66563                             // VCVT{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; A1
  66564                             vcvt(condition,
  66565                                  U32,
  66566                                  F32,
  66567                                  SRegister(rd),
  66568                                  SRegister(rm));
  66569                             break;
  66570                           }
  66571                           case 0x00010000: {
  66572                             // 0x0ebd0a40
  66573                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66574                               UnallocatedA32(instr);
  66575                               return;
  66576                             }
  66577                             Condition condition((instr >> 28) & 0xf);
  66578                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66579                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66580                             // VCVTR{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; A1
  66581                             vcvtr(condition,
  66582                                   S32,
  66583                                   F32,
  66584                                   SRegister(rd),
  66585                                   SRegister(rm));
  66586                             break;
  66587                           }
  66588                           case 0x00010080: {
  66589                             // 0x0ebd0ac0
  66590                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66591                               UnallocatedA32(instr);
  66592                               return;
  66593                             }
  66594                             Condition condition((instr >> 28) & 0xf);
  66595                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66596                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66597                             // VCVT{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; A1
  66598                             vcvt(condition,
  66599                                  S32,
  66600                                  F32,
  66601                                  SRegister(rd),
  66602                                  SRegister(rm));
  66603                             break;
  66604                           }
  66605                         }
  66606                         break;
  66607                       }
  66608                       case 0x000e0000: {
  66609                         // 0x0ebe0a40
  66610                         if (((instr & 0xf0000000) == 0xf0000000)) {
  66611                           UnallocatedA32(instr);
  66612                           return;
  66613                         }
  66614                         Condition condition((instr >> 28) & 0xf);
  66615                         DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
  66616                                                        ((instr >> 15) & 0x2));
  66617                         if (dt.Is(kDataTypeValueInvalid)) {
  66618                           UnallocatedA32(instr);
  66619                           return;
  66620                         }
  66621                         unsigned rd = ExtractSRegister(instr, 22, 12);
  66622                         unsigned offset = 32;
  66623                         if (dt.Is(S16) || dt.Is(U16)) {
  66624                           offset = 16;
  66625                         }
  66626                         uint32_t fbits = offset - (((instr >> 5) & 0x1) |
  66627                                                    ((instr << 1) & 0x1e));
  66628                         // VCVT{<c>}{<q>}.<dt>.F32 <Sdm>, <Sdm>, #<fbits> ; A1
  66629                         vcvt(condition,
  66630                              dt,
  66631                              F32,
  66632                              SRegister(rd),
  66633                              SRegister(rd),
  66634                              fbits);
  66635                         break;
  66636                       }
  66637                     }
  66638                     break;
  66639                   }
  66640                   case 0x00a00100: {
  66641                     // 0x0eb00b00
  66642                     if (((instr & 0xf0000000) == 0xf0000000)) {
  66643                       UnallocatedA32(instr);
  66644                       return;
  66645                     }
  66646                     Condition condition((instr >> 28) & 0xf);
  66647                     unsigned rd = ExtractDRegister(instr, 22, 12);
  66648                     uint32_t encoded_imm =
  66649                         (instr & 0xf) | ((instr >> 12) & 0xf0);
  66650                     NeonImmediate imm =
  66651                         ImmediateVFP::Decode<double>(encoded_imm);
  66652                     // VMOV{<c>}{<q>}.F64 <Dd>, #<imm> ; A2
  66653                     vmov(condition, F64, DRegister(rd), imm);
  66654                     if (((instr & 0xfb00ff0) != 0xeb00b00)) {
  66655                       UnpredictableA32(instr);
  66656                     }
  66657                     break;
  66658                   }
  66659                   case 0x00a00140: {
  66660                     // 0x0eb00b40
  66661                     switch (instr & 0x000e0000) {
  66662                       case 0x00000000: {
  66663                         // 0x0eb00b40
  66664                         switch (instr & 0x00010080) {
  66665                           case 0x00000000: {
  66666                             // 0x0eb00b40
  66667                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66668                               UnallocatedA32(instr);
  66669                               return;
  66670                             }
  66671                             Condition condition((instr >> 28) & 0xf);
  66672                             unsigned rd = ExtractDRegister(instr, 22, 12);
  66673                             unsigned rm = ExtractDRegister(instr, 5, 0);
  66674                             // VMOV{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
  66675                             vmov(condition, F64, DRegister(rd), DRegister(rm));
  66676                             break;
  66677                           }
  66678                           case 0x00000080: {
  66679                             // 0x0eb00bc0
  66680                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66681                               UnallocatedA32(instr);
  66682                               return;
  66683                             }
  66684                             Condition condition((instr >> 28) & 0xf);
  66685                             unsigned rd = ExtractDRegister(instr, 22, 12);
  66686                             unsigned rm = ExtractDRegister(instr, 5, 0);
  66687                             // VABS{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
  66688                             vabs(condition, F64, DRegister(rd), DRegister(rm));
  66689                             break;
  66690                           }
  66691                           case 0x00010000: {
  66692                             // 0x0eb10b40
  66693                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66694                               UnallocatedA32(instr);
  66695                               return;
  66696                             }
  66697                             Condition condition((instr >> 28) & 0xf);
  66698                             unsigned rd = ExtractDRegister(instr, 22, 12);
  66699                             unsigned rm = ExtractDRegister(instr, 5, 0);
  66700                             // VNEG{<c>}{<q>}.F64 <Dd>, <Dm> ; A2
  66701                             vneg(condition, F64, DRegister(rd), DRegister(rm));
  66702                             break;
  66703                           }
  66704                           case 0x00010080: {
  66705                             // 0x0eb10bc0
  66706                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66707                               UnallocatedA32(instr);
  66708                               return;
  66709                             }
  66710                             Condition condition((instr >> 28) & 0xf);
  66711                             unsigned rd = ExtractDRegister(instr, 22, 12);
  66712                             unsigned rm = ExtractDRegister(instr, 5, 0);
  66713                             // VSQRT{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
  66714                             vsqrt(condition, F64, DRegister(rd), DRegister(rm));
  66715                             break;
  66716                           }
  66717                         }
  66718                         break;
  66719                       }
  66720                       case 0x00020000: {
  66721                         // 0x0eb20b40
  66722                         switch (instr & 0x00010080) {
  66723                           case 0x00000000: {
  66724                             // 0x0eb20b40
  66725                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66726                               UnallocatedA32(instr);
  66727                               return;
  66728                             }
  66729                             Condition condition((instr >> 28) & 0xf);
  66730                             unsigned rd = ExtractDRegister(instr, 22, 12);
  66731                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66732                             // VCVTB{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; A1
  66733                             vcvtb(condition,
  66734                                   F64,
  66735                                   F16,
  66736                                   DRegister(rd),
  66737                                   SRegister(rm));
  66738                             break;
  66739                           }
  66740                           case 0x00000080: {
  66741                             // 0x0eb20bc0
  66742                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66743                               UnallocatedA32(instr);
  66744                               return;
  66745                             }
  66746                             Condition condition((instr >> 28) & 0xf);
  66747                             unsigned rd = ExtractDRegister(instr, 22, 12);
  66748                             unsigned rm = ExtractSRegister(instr, 5, 0);
  66749                             // VCVTT{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; A1
  66750                             vcvtt(condition,
  66751                                   F64,
  66752                                   F16,
  66753                                   DRegister(rd),
  66754                                   SRegister(rm));
  66755                             break;
  66756                           }
  66757                           case 0x00010000: {
  66758                             // 0x0eb30b40
  66759                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66760                               UnallocatedA32(instr);
  66761                               return;
  66762                             }
  66763                             Condition condition((instr >> 28) & 0xf);
  66764                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66765                             unsigned rm = ExtractDRegister(instr, 5, 0);
  66766                             // VCVTB{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; A1
  66767                             vcvtb(condition,
  66768                                   F16,
  66769                                   F64,
  66770                                   SRegister(rd),
  66771                                   DRegister(rm));
  66772                             break;
  66773                           }
  66774                           case 0x00010080: {
  66775                             // 0x0eb30bc0
  66776                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66777                               UnallocatedA32(instr);
  66778                               return;
  66779                             }
  66780                             Condition condition((instr >> 28) & 0xf);
  66781                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66782                             unsigned rm = ExtractDRegister(instr, 5, 0);
  66783                             // VCVTT{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; A1
  66784                             vcvtt(condition,
  66785                                   F16,
  66786                                   F64,
  66787                                   SRegister(rd),
  66788                                   DRegister(rm));
  66789                             break;
  66790                           }
  66791                         }
  66792                         break;
  66793                       }
  66794                       case 0x00040000: {
  66795                         // 0x0eb40b40
  66796                         switch (instr & 0x00010080) {
  66797                           case 0x00000000: {
  66798                             // 0x0eb40b40
  66799                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66800                               UnallocatedA32(instr);
  66801                               return;
  66802                             }
  66803                             Condition condition((instr >> 28) & 0xf);
  66804                             unsigned rd = ExtractDRegister(instr, 22, 12);
  66805                             unsigned rm = ExtractDRegister(instr, 5, 0);
  66806                             // VCMP{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
  66807                             vcmp(condition, F64, DRegister(rd), DRegister(rm));
  66808                             break;
  66809                           }
  66810                           case 0x00000080: {
  66811                             // 0x0eb40bc0
  66812                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66813                               UnallocatedA32(instr);
  66814                               return;
  66815                             }
  66816                             Condition condition((instr >> 28) & 0xf);
  66817                             unsigned rd = ExtractDRegister(instr, 22, 12);
  66818                             unsigned rm = ExtractDRegister(instr, 5, 0);
  66819                             // VCMPE{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
  66820                             vcmpe(condition, F64, DRegister(rd), DRegister(rm));
  66821                             break;
  66822                           }
  66823                           case 0x00010000: {
  66824                             // 0x0eb50b40
  66825                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66826                               UnallocatedA32(instr);
  66827                               return;
  66828                             }
  66829                             Condition condition((instr >> 28) & 0xf);
  66830                             unsigned rd = ExtractDRegister(instr, 22, 12);
  66831                             // VCMP{<c>}{<q>}.F64 <Dd>, #0.0 ; A2
  66832                             vcmp(condition, F64, DRegister(rd), 0.0);
  66833                             if (((instr & 0xfbf0fff) != 0xeb50b40)) {
  66834                               UnpredictableA32(instr);
  66835                             }
  66836                             break;
  66837                           }
  66838                           case 0x00010080: {
  66839                             // 0x0eb50bc0
  66840                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66841                               UnallocatedA32(instr);
  66842                               return;
  66843                             }
  66844                             Condition condition((instr >> 28) & 0xf);
  66845                             unsigned rd = ExtractDRegister(instr, 22, 12);
  66846                             // VCMPE{<c>}{<q>}.F64 <Dd>, #0.0 ; A2
  66847                             vcmpe(condition, F64, DRegister(rd), 0.0);
  66848                             if (((instr & 0xfbf0fff) != 0xeb50bc0)) {
  66849                               UnpredictableA32(instr);
  66850                             }
  66851                             break;
  66852                           }
  66853                         }
  66854                         break;
  66855                       }
  66856                       case 0x00060000: {
  66857                         // 0x0eb60b40
  66858                         switch (instr & 0x00010080) {
  66859                           case 0x00000000: {
  66860                             // 0x0eb60b40
  66861                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66862                               UnallocatedA32(instr);
  66863                               return;
  66864                             }
  66865                             Condition condition((instr >> 28) & 0xf);
  66866                             unsigned rd = ExtractDRegister(instr, 22, 12);
  66867                             unsigned rm = ExtractDRegister(instr, 5, 0);
  66868                             // VRINTR{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
  66869                             vrintr(condition,
  66870                                    F64,
  66871                                    DRegister(rd),
  66872                                    DRegister(rm));
  66873                             break;
  66874                           }
  66875                           case 0x00000080: {
  66876                             // 0x0eb60bc0
  66877                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66878                               UnallocatedA32(instr);
  66879                               return;
  66880                             }
  66881                             Condition condition((instr >> 28) & 0xf);
  66882                             unsigned rd = ExtractDRegister(instr, 22, 12);
  66883                             unsigned rm = ExtractDRegister(instr, 5, 0);
  66884                             // VRINTZ{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
  66885                             vrintz(condition,
  66886                                    F64,
  66887                                    DRegister(rd),
  66888                                    DRegister(rm));
  66889                             break;
  66890                           }
  66891                           case 0x00010000: {
  66892                             // 0x0eb70b40
  66893                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66894                               UnallocatedA32(instr);
  66895                               return;
  66896                             }
  66897                             Condition condition((instr >> 28) & 0xf);
  66898                             unsigned rd = ExtractDRegister(instr, 22, 12);
  66899                             unsigned rm = ExtractDRegister(instr, 5, 0);
  66900                             // VRINTX{<c>}{<q>}.F64 <Dd>, <Dm> ; A1
  66901                             vrintx(condition,
  66902                                    F64,
  66903                                    DRegister(rd),
  66904                                    DRegister(rm));
  66905                             break;
  66906                           }
  66907                           case 0x00010080: {
  66908                             // 0x0eb70bc0
  66909                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66910                               UnallocatedA32(instr);
  66911                               return;
  66912                             }
  66913                             Condition condition((instr >> 28) & 0xf);
  66914                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66915                             unsigned rm = ExtractDRegister(instr, 5, 0);
  66916                             // VCVT{<c>}{<q>}.F32.F64 <Sd>, <Dm> ; A1
  66917                             vcvt(condition,
  66918                                  F32,
  66919                                  F64,
  66920                                  SRegister(rd),
  66921                                  DRegister(rm));
  66922                             break;
  66923                           }
  66924                         }
  66925                         break;
  66926                       }
  66927                       case 0x00080000: {
  66928                         // 0x0eb80b40
  66929                         if ((instr & 0x00010000) == 0x00000000) {
  66930                           if (((instr & 0xf0000000) == 0xf0000000)) {
  66931                             UnallocatedA32(instr);
  66932                             return;
  66933                           }
  66934                           Condition condition((instr >> 28) & 0xf);
  66935                           DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1);
  66936                           if (dt.Is(kDataTypeValueInvalid)) {
  66937                             UnallocatedA32(instr);
  66938                             return;
  66939                           }
  66940                           unsigned rd = ExtractDRegister(instr, 22, 12);
  66941                           unsigned rm = ExtractSRegister(instr, 5, 0);
  66942                           // VCVT{<c>}{<q>}.F64.<dt> <Dd>, <Sm> ; A1
  66943                           vcvt(condition,
  66944                                F64,
  66945                                dt,
  66946                                DRegister(rd),
  66947                                SRegister(rm));
  66948                         } else {
  66949                           UnallocatedA32(instr);
  66950                         }
  66951                         break;
  66952                       }
  66953                       case 0x000a0000: {
  66954                         // 0x0eba0b40
  66955                         if (((instr & 0xf0000000) == 0xf0000000)) {
  66956                           UnallocatedA32(instr);
  66957                           return;
  66958                         }
  66959                         Condition condition((instr >> 28) & 0xf);
  66960                         DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
  66961                                                        ((instr >> 15) & 0x2));
  66962                         if (dt.Is(kDataTypeValueInvalid)) {
  66963                           UnallocatedA32(instr);
  66964                           return;
  66965                         }
  66966                         unsigned rd = ExtractDRegister(instr, 22, 12);
  66967                         unsigned offset = 32;
  66968                         if (dt.Is(S16) || dt.Is(U16)) {
  66969                           offset = 16;
  66970                         }
  66971                         uint32_t fbits = offset - (((instr >> 5) & 0x1) |
  66972                                                    ((instr << 1) & 0x1e));
  66973                         // VCVT{<c>}{<q>}.F64.<dt> <Ddm>, <Ddm>, #<fbits> ; A1
  66974                         vcvt(condition,
  66975                              F64,
  66976                              dt,
  66977                              DRegister(rd),
  66978                              DRegister(rd),
  66979                              fbits);
  66980                         break;
  66981                       }
  66982                       case 0x000c0000: {
  66983                         // 0x0ebc0b40
  66984                         switch (instr & 0x00010080) {
  66985                           case 0x00000000: {
  66986                             // 0x0ebc0b40
  66987                             if (((instr & 0xf0000000) == 0xf0000000)) {
  66988                               UnallocatedA32(instr);
  66989                               return;
  66990                             }
  66991                             Condition condition((instr >> 28) & 0xf);
  66992                             unsigned rd = ExtractSRegister(instr, 22, 12);
  66993                             unsigned rm = ExtractDRegister(instr, 5, 0);
  66994                             // VCVTR{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; A1
  66995                             vcvtr(condition,
  66996                                   U32,
  66997                                   F64,
  66998                                   SRegister(rd),
  66999                                   DRegister(rm));
  67000                             break;
  67001                           }
  67002                           case 0x00000080: {
  67003                             // 0x0ebc0bc0
  67004                             if (((instr & 0xf0000000) == 0xf0000000)) {
  67005                               UnallocatedA32(instr);
  67006                               return;
  67007                             }
  67008                             Condition condition((instr >> 28) & 0xf);
  67009                             unsigned rd = ExtractSRegister(instr, 22, 12);
  67010                             unsigned rm = ExtractDRegister(instr, 5, 0);
  67011                             // VCVT{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; A1
  67012                             vcvt(condition,
  67013                                  U32,
  67014                                  F64,
  67015                                  SRegister(rd),
  67016                                  DRegister(rm));
  67017                             break;
  67018                           }
  67019                           case 0x00010000: {
  67020                             // 0x0ebd0b40
  67021                             if (((instr & 0xf0000000) == 0xf0000000)) {
  67022                               UnallocatedA32(instr);
  67023                               return;
  67024                             }
  67025                             Condition condition((instr >> 28) & 0xf);
  67026                             unsigned rd = ExtractSRegister(instr, 22, 12);
  67027                             unsigned rm = ExtractDRegister(instr, 5, 0);
  67028                             // VCVTR{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; A1
  67029                             vcvtr(condition,
  67030                                   S32,
  67031                                   F64,
  67032                                   SRegister(rd),
  67033                                   DRegister(rm));
  67034                             break;
  67035                           }
  67036                           case 0x00010080: {
  67037                             // 0x0ebd0bc0
  67038                             if (((instr & 0xf0000000) == 0xf0000000)) {
  67039                               UnallocatedA32(instr);
  67040                               return;
  67041                             }
  67042                             Condition condition((instr >> 28) & 0xf);
  67043                             unsigned rd = ExtractSRegister(instr, 22, 12);
  67044                             unsigned rm = ExtractDRegister(instr, 5, 0);
  67045                             // VCVT{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; A1
  67046                             vcvt(condition,
  67047                                  S32,
  67048                                  F64,
  67049                                  SRegister(rd),
  67050                                  DRegister(rm));
  67051                             break;
  67052                           }
  67053                         }
  67054                         break;
  67055                       }
  67056                       case 0x000e0000: {
  67057                         // 0x0ebe0b40
  67058                         if (((instr & 0xf0000000) == 0xf0000000)) {
  67059                           UnallocatedA32(instr);
  67060                           return;
  67061                         }
  67062                         Condition condition((instr >> 28) & 0xf);
  67063                         DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) |
  67064                                                        ((instr >> 15) & 0x2));
  67065                         if (dt.Is(kDataTypeValueInvalid)) {
  67066                           UnallocatedA32(instr);
  67067                           return;
  67068                         }
  67069                         unsigned rd = ExtractDRegister(instr, 22, 12);
  67070                         unsigned offset = 32;
  67071                         if (dt.Is(S16) || dt.Is(U16)) {
  67072                           offset = 16;
  67073                         }
  67074                         uint32_t fbits = offset - (((instr >> 5) & 0x1) |
  67075                                                    ((instr << 1) & 0x1e));
  67076                         // VCVT{<c>}{<q>}.<dt>.F64 <Ddm>, <Ddm>, #<fbits> ; A1
  67077                         vcvt(condition,
  67078                              dt,
  67079                              F64,
  67080                              DRegister(rd),
  67081                              DRegister(rd),
  67082                              fbits);
  67083                         break;
  67084                       }
  67085                     }
  67086                     break;
  67087                   }
  67088                 }
  67089                 break;
  67090               }
  67091               case 0x00100a10: {
  67092                 // 0x0e100a10
  67093                 switch (instr & 0x00000100) {
  67094                   case 0x00000000: {
  67095                     // 0x0e100a10
  67096                     switch (instr & 0x00e00000) {
  67097                       case 0x00000000: {
  67098                         // 0x0e100a10
  67099                         if (((instr & 0xf0000000) == 0xf0000000)) {
  67100                           UnallocatedA32(instr);
  67101                           return;
  67102                         }
  67103                         Condition condition((instr >> 28) & 0xf);
  67104                         unsigned rt = (instr >> 12) & 0xf;
  67105                         unsigned rn = ExtractSRegister(instr, 7, 16);
  67106                         // VMOV{<c>}{<q>} <Rt>, <Sn> ; A1
  67107                         vmov(condition, Register(rt), SRegister(rn));
  67108                         if (((instr & 0xff00f7f) != 0xe100a10)) {
  67109                           UnpredictableA32(instr);
  67110                         }
  67111                         break;
  67112                       }
  67113                       case 0x00e00000: {
  67114                         // 0x0ef00a10
  67115                         if (((instr & 0xf0000000) == 0xf0000000)) {
  67116                           UnallocatedA32(instr);
  67117                           return;
  67118                         }
  67119                         Condition condition((instr >> 28) & 0xf);
  67120                         unsigned rt = (instr >> 12) & 0xf;
  67121                         unsigned spec_reg = (instr >> 16) & 0xf;
  67122                         switch (spec_reg) {
  67123                           case 0x0:
  67124                           case 0x1:
  67125                           case 0x5:
  67126                           case 0x6:
  67127                           case 0x7:
  67128                           case 0x8: {
  67129                             // VMRS{<c>}{<q>} <Rt>, <spec_reg> ; A1
  67130                             vmrs(condition,
  67131                                  RegisterOrAPSR_nzcv(rt),
  67132                                  SpecialFPRegister(spec_reg));
  67133                             if (((instr & 0xff00fff) != 0xef00a10)) {
  67134                               UnpredictableA32(instr);
  67135                             }
  67136                             break;
  67137                           }
  67138                           default:
  67139                             UnallocatedA32(instr);
  67140                             break;
  67141                         }
  67142                         break;
  67143                       }
  67144                       default:
  67145                         UnallocatedA32(instr);
  67146                         break;
  67147                     }
  67148                     break;
  67149                   }
  67150                   case 0x00000100: {
  67151                     // 0x0e100b10
  67152                     if (((instr & 0xf0000000) == 0xf0000000)) {
  67153                       UnallocatedA32(instr);
  67154                       return;
  67155                     }
  67156                     Condition condition((instr >> 28) & 0xf);
  67157                     unsigned lane;
  67158                     DataType dt =
  67159                         Dt_U_opc1_opc2_1_Decode(((instr >> 5) & 0x3) |
  67160                                                     ((instr >> 19) & 0xc) |
  67161                                                     ((instr >> 19) & 0x10),
  67162                                                 &lane);
  67163                     if (dt.Is(kDataTypeValueInvalid)) {
  67164                       UnallocatedA32(instr);
  67165                       return;
  67166                     }
  67167                     unsigned rt = (instr >> 12) & 0xf;
  67168                     unsigned rn = ExtractDRegister(instr, 7, 16);
  67169                     // VMOV{<c>}{<q>}{.<dt>} <Rt>, <Dn[x]> ; A1
  67170                     vmov(condition, dt, Register(rt), DRegisterLane(rn, lane));
  67171                     if (((instr & 0xf100f1f) != 0xe100b10)) {
  67172                       UnpredictableA32(instr);
  67173                     }
  67174                     break;
  67175                   }
  67176                 }
  67177                 break;
  67178               }
  67179               case 0x00100e10: {
  67180                 // 0x0e100e10
  67181                 if (((instr & 0xf0000000) == 0xf0000000)) {
  67182                   UnallocatedA32(instr);
  67183                   return;
  67184                 }
  67185                 UnimplementedA32("MRC", instr);
  67186                 break;
  67187               }
  67188               default:
  67189                 UnallocatedA32(instr);
  67190                 break;
  67191             }
  67192             break;
  67193           }
  67194           case 0x01000000: {
  67195             // 0x0f000000
  67196             if (((instr & 0xf0000000) == 0xf0000000)) {
  67197               UnallocatedA32(instr);
  67198               return;
  67199             }
  67200             Condition condition((instr >> 28) & 0xf);
  67201             uint32_t imm = instr & 0xffffff;
  67202             // SVC{<c>}{<q>} {#}<imm> ; A1
  67203             svc(condition, imm);
  67204             break;
  67205           }
  67206         }
  67207         break;
  67208       }
  67209     }
  67210   }
  67211 }  // NOLINT(readability/fn_size)
  67212 // End of generated code.
  67213 
  67214 const uint16_t* PrintDisassembler::DecodeT32At(
  67215     const uint16_t* instruction_address, const uint16_t* buffer_end) {
  67216   uint32_t instruction = *instruction_address++ << 16;
  67217 
  67218   if (instruction >= kLowestT32_32Opcode) {
  67219     if (instruction_address >= buffer_end) {
  67220       os() << "?\n";
  67221       return instruction_address;
  67222     }
  67223     instruction |= *instruction_address++;
  67224   }
  67225 
  67226   DecodeT32(instruction);
  67227   return instruction_address;
  67228 }
  67229 
  67230 void PrintDisassembler::DecodeT32(uint32_t instruction) {
  67231   PrintCodeAddress(GetCodeAddress());
  67232   if (T32Size(instruction) == 2) {
  67233     PrintOpcode16(instruction >> 16);
  67234     Disassembler::DecodeT32(instruction);
  67235   } else {
  67236     PrintOpcode32(instruction);
  67237     Disassembler::DecodeT32(instruction);
  67238   }
  67239   os() << "\n";
  67240 }
  67241 
  67242 
  67243 void PrintDisassembler::DecodeA32(uint32_t instruction) {
  67244   PrintCodeAddress(GetCodeAddress());
  67245   PrintOpcode32(instruction);
  67246   Disassembler::DecodeA32(instruction);
  67247   os() << "\n";
  67248 }
  67249 
  67250 
  67251 void PrintDisassembler::DisassembleA32Buffer(const uint32_t* buffer,
  67252                                              size_t size_in_bytes) {
  67253   VIXL_ASSERT(IsAligned<sizeof(buffer[0])>(buffer));
  67254   VIXL_ASSERT(IsMultiple<sizeof(buffer[0])>(size_in_bytes));
  67255   const uint32_t* const end_buffer =
  67256       buffer + (size_in_bytes / sizeof(uint32_t));
  67257   while (buffer < end_buffer) {
  67258     DecodeA32(*buffer++);
  67259   }
  67260 }
  67261 
  67262 
  67263 void PrintDisassembler::DisassembleT32Buffer(const uint16_t* buffer,
  67264                                              size_t size_in_bytes) {
  67265   VIXL_ASSERT(IsAligned<sizeof(buffer[0])>(buffer));
  67266   VIXL_ASSERT(IsMultiple<sizeof(buffer[0])>(size_in_bytes));
  67267   const uint16_t* const end_buffer =
  67268       buffer + (size_in_bytes / sizeof(uint16_t));
  67269   while (buffer < end_buffer) {
  67270     buffer = DecodeT32At(buffer, end_buffer);
  67271   }
  67272   VIXL_ASSERT(buffer == end_buffer);
  67273 }
  67274 
  67275 }  // namespace aarch32
  67276 }  // namespace vixl