Home | History | Annotate | Download | only in aarch32
      1 // Copyright 2015, VIXL authors
      2 // All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are met:
      6 //
      7 //   * Redistributions of source code must retain the above copyright notice,
      8 //     this list of conditions and the following disclaimer.
      9 //   * Redistributions in binary form must reproduce the above copyright notice,
     10 //     this list of conditions and the following disclaimer in the documentation
     11 //     and/or other materials provided with the distribution.
     12 //   * Neither the name of ARM Limited nor the names of its contributors may be
     13 //     used to endorse or promote products derived from this software without
     14 //     specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
     17 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     18 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     19 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
     20 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     21 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     22 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
     23 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26 
     27 extern "C" {
     28 #include <stdint.h>
     29 }
     30 
     31 #include <cassert>
     32 #include <cstdio>
     33 #include <cstdlib>
     34 #include <cstring>
     35 #include <iomanip>
     36 #include <iostream>
     37 
     38 #include "utils-vixl.h"
     39 #include "aarch32/constants-aarch32.h"
     40 #include "aarch32/disasm-aarch32.h"
     41 #include "aarch32/instructions-aarch32.h"
     42 #include "aarch32/operands-aarch32.h"
     43 
     44 namespace vixl {
     45 namespace aarch32 {
     46 
     47 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 = -1;
    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 = -1;
    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 = -1;
    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 firstcond = (instr >> 20) & 0xf;
   8292                           unsigned mask = (instr >> 16) & 0xf;
   8293                           bool wasInITBlock = InITBlock();
   8294                           SetIT(Condition(firstcond), mask);
   8295                           it(Condition(firstcond), mask);
   8296                           if (wasInITBlock || (firstcond == 15) ||
   8297                               ((firstcond == 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(-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
   67277