Home | History | Annotate | Download | only in aarch32
      1 // Copyright 2015, VIXL authors
      2 // All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are met:
      6 //
      7 //   * Redistributions of source code must retain the above copyright notice,
      8 //     this list of conditions and the following disclaimer.
      9 //   * Redistributions in binary form must reproduce the above copyright notice,
     10 //     this list of conditions and the following disclaimer in the documentation
     11 //     and/or other materials provided with the distribution.
     12 //   * Neither the name of ARM Limited nor the names of its contributors may be
     13 //     used to endorse or promote products derived from this software without
     14 //     specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
     17 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     18 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     19 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
     20 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     21 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     22 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
     23 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26 
     27 extern "C" {
     28 #include <stdint.h>
     29 }
     30 
     31 #include <cassert>
     32 #include <cstdio>
     33 #include <cstdlib>
     34 #include <cstring>
     35 #include <iomanip>
     36 #include <iostream>
     37 
     38 #include "utils-vixl.h"
     39 #include "aarch32/constants-aarch32.h"
     40 #include "aarch32/instructions-aarch32.h"
     41 #include "aarch32/operands-aarch32.h"
     42 #include "aarch32/disasm-aarch32.h"
     43 
     44 namespace vixl {
     45 namespace aarch32 {
     46 
     47 class T32CodeAddressIncrementer {
     48   uint32_t* code_address_;
     49   uint32_t increment_;
     50 
     51  public:
     52   T32CodeAddressIncrementer(uint32_t instr, uint32_t* code_address)
     53       : code_address_(code_address),
     54         increment_(Disassembler::Is16BitEncoding(instr) ? 2 : 4) {}
     55   ~T32CodeAddressIncrementer() { *code_address_ += increment_; }
     56 };
     57 
     58 class A32CodeAddressIncrementer {
     59   uint32_t* code_address_;
     60 
     61  public:
     62   explicit A32CodeAddressIncrementer(uint32_t* code_address)
     63       : code_address_(code_address) {}
     64   ~A32CodeAddressIncrementer() { *code_address_ += 4; }
     65 };
     66 
     67 class DecodeNeon {
     68   int lane_;
     69   SpacingType spacing_;
     70   bool valid_;
     71 
     72  public:
     73   DecodeNeon(int lane, SpacingType spacing)
     74       : lane_(lane), spacing_(spacing), valid_(true) {}
     75   DecodeNeon() : lane_(0), spacing_(kSingle), valid_(false) {}
     76   int GetLane() const { return lane_; }
     77   SpacingType GetSpacing() const { return spacing_; }
     78   bool IsValid() const { return valid_; }
     79 };
     80 
     81 class DecodeNeonAndAlign : public DecodeNeon {
     82  public:
     83   Alignment align_;
     84   DecodeNeonAndAlign(int lanes, SpacingType spacing, Alignment align)
     85       : DecodeNeon(lanes, spacing), align_(align) {}
     86   DecodeNeonAndAlign() : align_(kBadAlignment) {}
     87   Alignment GetAlign() const { return align_; }
     88 };
     89 
     90 // Start of generated code.
     91 DataTypeValue Dt_L_imm6_1_Decode(uint32_t value, uint32_t type_value) {
     92   if ((value & 0xf) == 0x1) {
     93     switch (type_value) {
     94       case 0x0:
     95         return S8;
     96       case 0x1:
     97         return U8;
     98     }
     99   } else if ((value & 0xe) == 0x2) {
    100     switch (type_value) {
    101       case 0x0:
    102         return S16;
    103       case 0x1:
    104         return U16;
    105     }
    106   } else if ((value & 0xc) == 0x4) {
    107     switch (type_value) {
    108       case 0x0:
    109         return S32;
    110       case 0x1:
    111         return U32;
    112     }
    113   } else if ((value & 0x8) == 0x8) {
    114     switch (type_value) {
    115       case 0x0:
    116         return S64;
    117       case 0x1:
    118         return U64;
    119     }
    120   }
    121   return kDataTypeValueInvalid;
    122 }
    123 
    124 DataTypeValue Dt_L_imm6_2_Decode(uint32_t value, uint32_t type_value) {
    125   if ((value & 0xf) == 0x1) {
    126     if (type_value == 0x1) return S8;
    127   } else if ((value & 0xe) == 0x2) {
    128     if (type_value == 0x1) return S16;
    129   } else if ((value & 0xc) == 0x4) {
    130     if (type_value == 0x1) return S32;
    131   } else if ((value & 0x8) == 0x8) {
    132     if (type_value == 0x1) return S64;
    133   }
    134   return kDataTypeValueInvalid;
    135 }
    136 
    137 DataTypeValue Dt_L_imm6_3_Decode(uint32_t value) {
    138   if ((value & 0xf) == 0x1) {
    139     return I8;
    140   } else if ((value & 0xe) == 0x2) {
    141     return I16;
    142   } else if ((value & 0xc) == 0x4) {
    143     return I32;
    144   } else if ((value & 0x8) == 0x8) {
    145     return I64;
    146   }
    147   return kDataTypeValueInvalid;
    148 }
    149 
    150 DataTypeValue Dt_L_imm6_4_Decode(uint32_t value) {
    151   if ((value & 0xf) == 0x1) {
    152     return Untyped8;
    153   } else if ((value & 0xe) == 0x2) {
    154     return Untyped16;
    155   } else if ((value & 0xc) == 0x4) {
    156     return Untyped32;
    157   } else if ((value & 0x8) == 0x8) {
    158     return Untyped64;
    159   }
    160   return kDataTypeValueInvalid;
    161 }
    162 
    163 DataTypeValue Dt_imm6_1_Decode(uint32_t value, uint32_t type_value) {
    164   if ((value & 0x7) == 0x1) {
    165     switch (type_value) {
    166       case 0x0:
    167         return S16;
    168       case 0x1:
    169         return U16;
    170     }
    171   } else if ((value & 0x6) == 0x2) {
    172     switch (type_value) {
    173       case 0x0:
    174         return S32;
    175       case 0x1:
    176         return U32;
    177     }
    178   } else if ((value & 0x4) == 0x4) {
    179     switch (type_value) {
    180       case 0x0:
    181         return S64;
    182       case 0x1:
    183         return U64;
    184     }
    185   }
    186   return kDataTypeValueInvalid;
    187 }
    188 
    189 DataTypeValue Dt_imm6_2_Decode(uint32_t value, uint32_t type_value) {
    190   if ((value & 0x7) == 0x1) {
    191     if (type_value == 0x1) return S16;
    192   } else if ((value & 0x6) == 0x2) {
    193     if (type_value == 0x1) return S32;
    194   } else if ((value & 0x4) == 0x4) {
    195     if (type_value == 0x1) return S64;
    196   }
    197   return kDataTypeValueInvalid;
    198 }
    199 
    200 DataTypeValue Dt_imm6_3_Decode(uint32_t value) {
    201   if ((value & 0x7) == 0x1) {
    202     return I16;
    203   } else if ((value & 0x6) == 0x2) {
    204     return I32;
    205   } else if ((value & 0x4) == 0x4) {
    206     return I64;
    207   }
    208   return kDataTypeValueInvalid;
    209 }
    210 
    211 DataTypeValue Dt_imm6_4_Decode(uint32_t value, uint32_t type_value) {
    212   if ((value & 0x7) == 0x1) {
    213     switch (type_value) {
    214       case 0x0:
    215         return S8;
    216       case 0x1:
    217         return U8;
    218     }
    219   } else if ((value & 0x6) == 0x2) {
    220     switch (type_value) {
    221       case 0x0:
    222         return S16;
    223       case 0x1:
    224         return U16;
    225     }
    226   } else if ((value & 0x4) == 0x4) {
    227     switch (type_value) {
    228       case 0x0:
    229         return S32;
    230       case 0x1:
    231         return U32;
    232     }
    233   }
    234   return kDataTypeValueInvalid;
    235 }
    236 
    237 DataTypeValue Dt_op_U_size_1_Decode(uint32_t value) {
    238   switch (value) {
    239     case 0x0:
    240       return S8;
    241     case 0x1:
    242       return S16;
    243     case 0x2:
    244       return S32;
    245     case 0x4:
    246       return U8;
    247     case 0x5:
    248       return U16;
    249     case 0x6:
    250       return U32;
    251     case 0x8:
    252       return P8;
    253     case 0xa:
    254       return P64;
    255   }
    256   return kDataTypeValueInvalid;
    257 }
    258 
    259 DataTypeValue Dt_op_size_1_Decode(uint32_t value) {
    260   switch (value) {
    261     case 0x0:
    262       return I8;
    263     case 0x1:
    264       return I16;
    265     case 0x2:
    266       return I32;
    267     case 0x4:
    268       return P8;
    269   }
    270   return kDataTypeValueInvalid;
    271 }
    272 
    273 DataTypeValue Dt_op_size_2_Decode(uint32_t value) {
    274   switch (value) {
    275     case 0x0:
    276       return S8;
    277     case 0x1:
    278       return S16;
    279     case 0x2:
    280       return S32;
    281     case 0x4:
    282       return U8;
    283     case 0x5:
    284       return U16;
    285     case 0x6:
    286       return U32;
    287   }
    288   return kDataTypeValueInvalid;
    289 }
    290 
    291 DataTypeValue Dt_op_size_3_Decode(uint32_t value) {
    292   switch (value) {
    293     case 0x0:
    294       return S16;
    295     case 0x1:
    296       return S32;
    297     case 0x2:
    298       return S64;
    299     case 0x4:
    300       return U16;
    301     case 0x5:
    302       return U32;
    303     case 0x6:
    304       return U64;
    305   }
    306   return kDataTypeValueInvalid;
    307 }
    308 
    309 DataTypeValue Dt_U_imm3H_1_Decode(uint32_t value) {
    310   switch (value) {
    311     case 0x1:
    312       return S8;
    313     case 0x2:
    314       return S16;
    315     case 0x4:
    316       return S32;
    317     case 0x9:
    318       return U8;
    319     case 0xa:
    320       return U16;
    321     case 0xc:
    322       return U32;
    323   }
    324   return kDataTypeValueInvalid;
    325 }
    326 
    327 DataTypeValue Dt_U_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) {
    328   if ((value & 0x18) == 0x8) {
    329     *lane = value & 7;
    330     return S8;
    331   }
    332   if ((value & 0x19) == 0x1) {
    333     *lane = (value >> 1) & 3;
    334     return S16;
    335   }
    336   if ((value & 0x18) == 0x18) {
    337     *lane = value & 7;
    338     return U8;
    339   }
    340   if ((value & 0x19) == 0x11) {
    341     *lane = (value >> 1) & 3;
    342     return U16;
    343   }
    344   if ((value & 0x1b) == 0x0) {
    345     *lane = (value >> 2) & 1;
    346     return Untyped32;
    347   }
    348   *lane = -1;
    349   return kDataTypeValueInvalid;
    350 }
    351 
    352 DataTypeValue Dt_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) {
    353   if ((value & 0x8) == 0x8) {
    354     *lane = value & 7;
    355     return Untyped8;
    356   }
    357   if ((value & 0x9) == 0x1) {
    358     *lane = (value >> 1) & 3;
    359     return Untyped16;
    360   }
    361   if ((value & 0xb) == 0x0) {
    362     *lane = (value >> 2) & 1;
    363     return Untyped32;
    364   }
    365   *lane = -1;
    366   return kDataTypeValueInvalid;
    367 }
    368 
    369 DataTypeValue Dt_imm4_1_Decode(uint32_t value, unsigned* lane) {
    370   if ((value & 0x1) == 0x1) {
    371     *lane = (value >> 1) & 7;
    372     return Untyped8;
    373   }
    374   if ((value & 0x3) == 0x2) {
    375     *lane = (value >> 2) & 3;
    376     return Untyped16;
    377   }
    378   if ((value & 0x7) == 0x4) {
    379     *lane = (value >> 3) & 1;
    380     return Untyped32;
    381   }
    382   *lane = -1;
    383   return kDataTypeValueInvalid;
    384 }
    385 
    386 DataTypeValue Dt_B_E_1_Decode(uint32_t value) {
    387   switch (value) {
    388     case 0x2:
    389       return Untyped8;
    390     case 0x1:
    391       return Untyped16;
    392     case 0x0:
    393       return Untyped32;
    394   }
    395   return kDataTypeValueInvalid;
    396 }
    397 
    398 DataTypeValue Dt_op_1_Decode1(uint32_t value) {
    399   switch (value) {
    400     case 0x0:
    401       return F32;
    402     case 0x1:
    403       return F32;
    404     case 0x2:
    405       return S32;
    406     case 0x3:
    407       return U32;
    408   }
    409   return kDataTypeValueInvalid;
    410 }
    411 
    412 DataTypeValue Dt_op_1_Decode2(uint32_t value) {
    413   switch (value) {
    414     case 0x0:
    415       return S32;
    416     case 0x1:
    417       return U32;
    418     case 0x2:
    419       return F32;
    420     case 0x3:
    421       return F32;
    422   }
    423   return kDataTypeValueInvalid;
    424 }
    425 
    426 DataTypeValue Dt_op_2_Decode(uint32_t value) {
    427   switch (value) {
    428     case 0x0:
    429       return U32;
    430     case 0x1:
    431       return S32;
    432   }
    433   return kDataTypeValueInvalid;
    434 }
    435 
    436 DataTypeValue Dt_op_3_Decode(uint32_t value) {
    437   switch (value) {
    438     case 0x0:
    439       return S32;
    440     case 0x1:
    441       return U32;
    442   }
    443   return kDataTypeValueInvalid;
    444 }
    445 
    446 DataTypeValue Dt_U_sx_1_Decode(uint32_t value) {
    447   switch (value) {
    448     case 0x0:
    449       return S16;
    450     case 0x1:
    451       return S32;
    452     case 0x2:
    453       return U16;
    454     case 0x3:
    455       return U32;
    456   }
    457   return kDataTypeValueInvalid;
    458 }
    459 
    460 DataTypeValue Dt_op_U_1_Decode1(uint32_t value) {
    461   switch (value) {
    462     case 0x0:
    463       return F32;
    464     case 0x1:
    465       return F32;
    466     case 0x2:
    467       return S32;
    468     case 0x3:
    469       return U32;
    470   }
    471   return kDataTypeValueInvalid;
    472 }
    473 
    474 DataTypeValue Dt_op_U_1_Decode2(uint32_t value) {
    475   switch (value) {
    476     case 0x0:
    477       return S32;
    478     case 0x1:
    479       return U32;
    480     case 0x2:
    481       return F32;
    482     case 0x3:
    483       return F32;
    484   }
    485   return kDataTypeValueInvalid;
    486 }
    487 
    488 DataTypeValue Dt_sz_1_Decode(uint32_t value) {
    489   switch (value) {
    490     case 0x0:
    491       return F32;
    492   }
    493   return kDataTypeValueInvalid;
    494 }
    495 
    496 DataTypeValue Dt_F_size_1_Decode(uint32_t value) {
    497   switch (value) {
    498     case 0x0:
    499       return S8;
    500     case 0x1:
    501       return S16;
    502     case 0x2:
    503       return S32;
    504     case 0x6:
    505       return F32;
    506   }
    507   return kDataTypeValueInvalid;
    508 }
    509 
    510 DataTypeValue Dt_F_size_2_Decode(uint32_t value) {
    511   switch (value) {
    512     case 0x0:
    513       return I8;
    514     case 0x1:
    515       return I16;
    516     case 0x2:
    517       return I32;
    518     case 0x6:
    519       return F32;
    520   }
    521   return kDataTypeValueInvalid;
    522 }
    523 
    524 DataTypeValue Dt_F_size_3_Decode(uint32_t value) {
    525   switch (value) {
    526     case 0x1:
    527       return I16;
    528     case 0x2:
    529       return I32;
    530     case 0x6:
    531       return F32;
    532   }
    533   return kDataTypeValueInvalid;
    534 }
    535 
    536 DataTypeValue Dt_F_size_4_Decode(uint32_t value) {
    537   switch (value) {
    538     case 0x2:
    539       return U32;
    540     case 0x6:
    541       return F32;
    542   }
    543   return kDataTypeValueInvalid;
    544 }
    545 
    546 DataTypeValue Dt_U_size_1_Decode(uint32_t value) {
    547   switch (value) {
    548     case 0x0:
    549       return S8;
    550     case 0x1:
    551       return S16;
    552     case 0x2:
    553       return S32;
    554     case 0x4:
    555       return U8;
    556     case 0x5:
    557       return U16;
    558     case 0x6:
    559       return U32;
    560   }
    561   return kDataTypeValueInvalid;
    562 }
    563 
    564 DataTypeValue Dt_U_size_2_Decode(uint32_t value) {
    565   switch (value) {
    566     case 0x1:
    567       return S16;
    568     case 0x2:
    569       return S32;
    570     case 0x5:
    571       return U16;
    572     case 0x6:
    573       return U32;
    574   }
    575   return kDataTypeValueInvalid;
    576 }
    577 
    578 DataTypeValue Dt_U_size_3_Decode(uint32_t value) {
    579   switch (value) {
    580     case 0x0:
    581       return S8;
    582     case 0x1:
    583       return S16;
    584     case 0x2:
    585       return S32;
    586     case 0x3:
    587       return S64;
    588     case 0x4:
    589       return U8;
    590     case 0x5:
    591       return U16;
    592     case 0x6:
    593       return U32;
    594     case 0x7:
    595       return U64;
    596   }
    597   return kDataTypeValueInvalid;
    598 }
    599 
    600 DataTypeValue Dt_size_1_Decode(uint32_t value) {
    601   switch (value) {
    602     case 0x0:
    603       return Untyped8;
    604   }
    605   return kDataTypeValueInvalid;
    606 }
    607 
    608 DataTypeValue Dt_size_2_Decode(uint32_t value) {
    609   switch (value) {
    610     case 0x0:
    611       return I8;
    612     case 0x1:
    613       return I16;
    614     case 0x2:
    615       return I32;
    616     case 0x3:
    617       return I64;
    618   }
    619   return kDataTypeValueInvalid;
    620 }
    621 
    622 DataTypeValue Dt_size_3_Decode(uint32_t value) {
    623   switch (value) {
    624     case 0x0:
    625       return I16;
    626     case 0x1:
    627       return I32;
    628     case 0x2:
    629       return I64;
    630   }
    631   return kDataTypeValueInvalid;
    632 }
    633 
    634 DataTypeValue Dt_size_4_Decode(uint32_t value) {
    635   switch (value) {
    636     case 0x0:
    637       return I8;
    638     case 0x1:
    639       return I16;
    640     case 0x2:
    641       return I32;
    642   }
    643   return kDataTypeValueInvalid;
    644 }
    645 
    646 DataTypeValue Dt_size_5_Decode(uint32_t value) {
    647   switch (value) {
    648     case 0x0:
    649       return S8;
    650     case 0x1:
    651       return S16;
    652     case 0x2:
    653       return S32;
    654   }
    655   return kDataTypeValueInvalid;
    656 }
    657 
    658 DataTypeValue Dt_size_6_Decode(uint32_t value) {
    659   switch (value) {
    660     case 0x0:
    661       return Untyped8;
    662     case 0x1:
    663       return Untyped16;
    664     case 0x2:
    665       return Untyped32;
    666     case 0x3:
    667       return Untyped64;
    668   }
    669   return kDataTypeValueInvalid;
    670 }
    671 
    672 DataTypeValue Dt_size_7_Decode(uint32_t value) {
    673   switch (value) {
    674     case 0x0:
    675       return Untyped8;
    676     case 0x1:
    677       return Untyped16;
    678     case 0x2:
    679       return Untyped32;
    680   }
    681   return kDataTypeValueInvalid;
    682 }
    683 
    684 DataTypeValue Dt_size_8_Decode(uint32_t value) {
    685   switch (value) {
    686     case 0x0:
    687       return Untyped8;
    688     case 0x1:
    689       return Untyped16;
    690     case 0x2:
    691       return Untyped32;
    692     case 0x3:
    693       return Untyped32;
    694   }
    695   return kDataTypeValueInvalid;
    696 }
    697 
    698 DataTypeValue Dt_size_9_Decode(uint32_t value, uint32_t type_value) {
    699   switch (value) {
    700     case 0x1:
    701       switch (type_value) {
    702         case 0x0:
    703           return I16;
    704       }
    705       break;
    706     case 0x2:
    707       switch (type_value) {
    708         case 0x0:
    709           return I32;
    710         case 0x1:
    711           return F32;
    712       }
    713       break;
    714   }
    715   return kDataTypeValueInvalid;
    716 }
    717 
    718 DataTypeValue Dt_size_10_Decode(uint32_t value) {
    719   switch (value) {
    720     case 0x0:
    721       return I8;
    722     case 0x1:
    723       return I16;
    724     case 0x2:
    725       return I32;
    726   }
    727   return kDataTypeValueInvalid;
    728 }
    729 
    730 DataTypeValue Dt_size_11_Decode(uint32_t value, uint32_t type_value) {
    731   switch (value) {
    732     case 0x1:
    733       switch (type_value) {
    734         case 0x0:
    735           return S16;
    736         case 0x1:
    737           return U16;
    738       }
    739       break;
    740     case 0x2:
    741       switch (type_value) {
    742         case 0x0:
    743           return S32;
    744         case 0x1:
    745           return U32;
    746       }
    747       break;
    748   }
    749   return kDataTypeValueInvalid;
    750 }
    751 
    752 DataTypeValue Dt_size_12_Decode(uint32_t value, uint32_t type_value) {
    753   switch (value) {
    754     case 0x0:
    755       switch (type_value) {
    756         case 0x0:
    757           return S8;
    758         case 0x1:
    759           return U8;
    760       }
    761       break;
    762     case 0x1:
    763       switch (type_value) {
    764         case 0x0:
    765           return S16;
    766         case 0x1:
    767           return U16;
    768       }
    769       break;
    770     case 0x2:
    771       switch (type_value) {
    772         case 0x0:
    773           return S32;
    774         case 0x1:
    775           return U32;
    776       }
    777       break;
    778   }
    779   return kDataTypeValueInvalid;
    780 }
    781 
    782 DataTypeValue Dt_size_13_Decode(uint32_t value) {
    783   switch (value) {
    784     case 0x1:
    785       return S16;
    786     case 0x2:
    787       return S32;
    788   }
    789   return kDataTypeValueInvalid;
    790 }
    791 
    792 DataTypeValue Dt_size_14_Decode(uint32_t value) {
    793   switch (value) {
    794     case 0x0:
    795       return S16;
    796     case 0x1:
    797       return S32;
    798     case 0x2:
    799       return S64;
    800   }
    801   return kDataTypeValueInvalid;
    802 }
    803 
    804 DataTypeValue Dt_size_15_Decode(uint32_t value) {
    805   switch (value) {
    806     case 0x0:
    807       return Untyped8;
    808     case 0x1:
    809       return Untyped16;
    810   }
    811   return kDataTypeValueInvalid;
    812 }
    813 
    814 DataTypeValue Dt_size_16_Decode(uint32_t value) {
    815   switch (value) {
    816     case 0x0:
    817       return I8;
    818     case 0x1:
    819       return I16;
    820     case 0x2:
    821       return I32;
    822   }
    823   return kDataTypeValueInvalid;
    824 }
    825 
    826 DecodeNeon Index_1_Decode(uint32_t value, DataType dt) {
    827   switch (dt.GetValue()) {
    828     case Untyped8: {
    829       int lane = (value >> 1) & 0x7;
    830       if ((value & 1) != 0) break;
    831       SpacingType spacing = kSingle;
    832       return DecodeNeon(lane, spacing);
    833     }
    834     case Untyped16: {
    835       int lane = (value >> 2) & 0x3;
    836       if ((value & 1) != 0) break;
    837       SpacingType spacing = ((value & 3) == 2) ? kDouble : kSingle;
    838       return DecodeNeon(lane, spacing);
    839     }
    840     case Untyped32: {
    841       int lane = (value >> 3) & 0x1;
    842       if ((value & 3) != 0) break;
    843       SpacingType spacing = ((value & 7) == 4) ? kDouble : kSingle;
    844       return DecodeNeon(lane, spacing);
    845     }
    846     default:
    847       break;
    848   }
    849   return DecodeNeon();
    850 }
    851 
    852 DecodeNeonAndAlign Align_index_align_1_Decode(uint32_t value, DataType dt) {
    853   switch (dt.GetValue()) {
    854     case Untyped8: {
    855       AlignmentType align;
    856       if ((value & 1) == 0) {
    857         align = kNoAlignment;
    858       } else {
    859         break;
    860       }
    861       int lane = (value >> 1) & 0x7;
    862       SpacingType spacing = kSingle;
    863       return DecodeNeonAndAlign(lane, spacing, align);
    864     }
    865     case Untyped16: {
    866       AlignmentType align;
    867       if ((value & 3) == 1) {
    868         align = k16BitAlign;
    869       } else if ((value & 3) == 0) {
    870         align = kNoAlignment;
    871       } else {
    872         break;
    873       }
    874       int lane = (value >> 2) & 0x3;
    875       SpacingType spacing = kSingle;
    876       return DecodeNeonAndAlign(lane, spacing, align);
    877     }
    878     case Untyped32: {
    879       AlignmentType align;
    880       if ((value & 7) == 3) {
    881         align = k32BitAlign;
    882       } else if ((value & 7) == 0) {
    883         align = kNoAlignment;
    884       } else {
    885         break;
    886       }
    887       int lane = (value >> 3) & 0x1;
    888       SpacingType spacing = kSingle;
    889       return DecodeNeonAndAlign(lane, spacing, align);
    890     }
    891     default:
    892       break;
    893   }
    894   return DecodeNeonAndAlign();
    895 }
    896 
    897 DecodeNeonAndAlign Align_index_align_2_Decode(uint32_t value, DataType dt) {
    898   switch (dt.GetValue()) {
    899     case Untyped8: {
    900       AlignmentType align;
    901       if ((value & 1) == 1) {
    902         align = k16BitAlign;
    903       } else if ((value & 1) == 0) {
    904         align = kNoAlignment;
    905       } else {
    906         break;
    907       }
    908       int lane = (value >> 1) & 0x7;
    909       SpacingType spacing = kSingle;
    910       return DecodeNeonAndAlign(lane, spacing, align);
    911     }
    912     case Untyped16: {
    913       AlignmentType align;
    914       if ((value & 1) == 1) {
    915         align = k32BitAlign;
    916       } else if ((value & 1) == 0) {
    917         align = kNoAlignment;
    918       } else {
    919         break;
    920       }
    921       int lane = (value >> 2) & 0x3;
    922       SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle;
    923       return DecodeNeonAndAlign(lane, spacing, align);
    924     }
    925     case Untyped32: {
    926       AlignmentType align;
    927       if ((value & 3) == 1) {
    928         align = k64BitAlign;
    929       } else if ((value & 3) == 0) {
    930         align = kNoAlignment;
    931       } else {
    932         break;
    933       }
    934       int lane = (value >> 3) & 0x1;
    935       SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle;
    936       return DecodeNeonAndAlign(lane, spacing, align);
    937     }
    938     default:
    939       break;
    940   }
    941   return DecodeNeonAndAlign();
    942 }
    943 
    944 DecodeNeonAndAlign Align_index_align_3_Decode(uint32_t value, DataType dt) {
    945   switch (dt.GetValue()) {
    946     case Untyped8: {
    947       AlignmentType align;
    948       if ((value & 1) == 1) {
    949         align = k32BitAlign;
    950       } else if ((value & 1) == 0) {
    951         align = kNoAlignment;
    952       } else {
    953         break;
    954       }
    955       int lane = (value >> 1) & 0x7;
    956       SpacingType spacing = kSingle;
    957       return DecodeNeonAndAlign(lane, spacing, align);
    958     }
    959     case Untyped16: {
    960       AlignmentType align;
    961       if ((value & 1) == 1) {
    962         align = k64BitAlign;
    963       } else if ((value & 1) == 0) {
    964         align = kNoAlignment;
    965       } else {
    966         break;
    967       }
    968       int lane = (value >> 2) & 0x3;
    969       SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle;
    970       return DecodeNeonAndAlign(lane, spacing, align);
    971     }
    972     case Untyped32: {
    973       AlignmentType align;
    974       if ((value & 3) == 1) {
    975         align = k64BitAlign;
    976       } else if ((value & 3) == 2) {
    977         align = k128BitAlign;
    978       } else if ((value & 3) == 0) {
    979         align = kNoAlignment;
    980       } else {
    981         break;
    982       }
    983       int lane = (value >> 3) & 0x1;
    984       SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle;
    985       return DecodeNeonAndAlign(lane, spacing, align);
    986     }
    987     default:
    988       break;
    989   }
    990   return DecodeNeonAndAlign();
    991 }
    992 
    993 Alignment Align_a_1_Decode(uint32_t value, DataType dt) {
    994   switch (value) {
    995     case 0:
    996       return kNoAlignment;
    997     case 1:
    998       if (dt.Is(Untyped16)) return k16BitAlign;
    999       if (dt.Is(Untyped32)) return k32BitAlign;
   1000       break;
   1001     default:
   1002       break;
   1003   }
   1004   return kBadAlignment;
   1005 }
   1006 
   1007 Alignment Align_a_2_Decode(uint32_t value, DataType dt) {
   1008   switch (value) {
   1009     case 0:
   1010       return kNoAlignment;
   1011     case 1:
   1012       if (dt.Is(Untyped8)) return k16BitAlign;
   1013       if (dt.Is(Untyped16)) return k32BitAlign;
   1014       if (dt.Is(Untyped32)) return k64BitAlign;
   1015       break;
   1016     default:
   1017       break;
   1018   }
   1019   return kBadAlignment;
   1020 }
   1021 
   1022 Alignment Align_a_3_Decode(uint32_t value, DataType dt, uint32_t size) {
   1023   switch (value) {
   1024     case 0:
   1025       if (size != 3) return kNoAlignment;
   1026       break;
   1027     case 1:
   1028       if (dt.Is(Untyped8)) return k32BitAlign;
   1029       if (dt.Is(Untyped16)) return k64BitAlign;
   1030       if (size == 2) return k64BitAlign;
   1031       if (size == 3) return k128BitAlign;
   1032       break;
   1033     default:
   1034       break;
   1035   }
   1036   return kBadAlignment;
   1037 }
   1038 
   1039 Alignment Align_align_1_Decode(uint32_t value) {
   1040   switch (value) {
   1041     case 0:
   1042       return kNoAlignment;
   1043     case 1:
   1044       return k64BitAlign;
   1045     case 2:
   1046       return k128BitAlign;
   1047     case 3:
   1048       return k256BitAlign;
   1049     default:
   1050       break;
   1051   }
   1052   return kBadAlignment;
   1053 }
   1054 
   1055 Alignment Align_align_2_Decode(uint32_t value) {
   1056   switch (value) {
   1057     case 0:
   1058       return kNoAlignment;
   1059     case 1:
   1060       return k64BitAlign;
   1061     case 2:
   1062       return k128BitAlign;
   1063     case 3:
   1064       return k256BitAlign;
   1065     default:
   1066       break;
   1067   }
   1068   return kBadAlignment;
   1069 }
   1070 
   1071 Alignment Align_align_3_Decode(uint32_t value) {
   1072   switch (value) {
   1073     case 0:
   1074       return kNoAlignment;
   1075     case 1:
   1076       return k64BitAlign;
   1077     default:
   1078       break;
   1079   }
   1080   return kBadAlignment;
   1081 }
   1082 
   1083 Alignment Align_align_4_Decode(uint32_t value) {
   1084   switch (value) {
   1085     case 0:
   1086       return kNoAlignment;
   1087     case 1:
   1088       return k64BitAlign;
   1089     case 2:
   1090       return k128BitAlign;
   1091     case 3:
   1092       return k256BitAlign;
   1093     default:
   1094       break;
   1095   }
   1096   return kBadAlignment;
   1097 }
   1098 
   1099 Alignment Align_align_5_Decode(uint32_t value) {
   1100   switch (value) {
   1101     case 0:
   1102       return kNoAlignment;
   1103     case 1:
   1104       return k64BitAlign;
   1105     case 2:
   1106       return k128BitAlign;
   1107     case 3:
   1108       return k256BitAlign;
   1109     default:
   1110       break;
   1111   }
   1112   return kBadAlignment;
   1113 }
   1114 
   1115 
   1116 void Disassembler::adc(Condition cond,
   1117                        EncodingSize size,
   1118                        Register rd,
   1119                        Register rn,
   1120                        const Operand& operand) {
   1121   os().SetCurrentInstruction(kAdc, kArithmetic);
   1122   os() << ToCString(kAdc) << ConditionPrinter(it_block_, cond) << size;
   1123   os() << " ";
   1124   if (!rd.Is(rn)) {
   1125     os() << rd << ", ";
   1126   }
   1127   os() << rn << ", " << operand;
   1128 }
   1129 
   1130 void Disassembler::adcs(Condition cond,
   1131                         EncodingSize size,
   1132                         Register rd,
   1133                         Register rn,
   1134                         const Operand& operand) {
   1135   os().SetCurrentInstruction(kAdcs, kArithmetic);
   1136   os() << ToCString(kAdcs) << ConditionPrinter(it_block_, cond) << size;
   1137   os() << " ";
   1138   if (!rd.Is(rn)) {
   1139     os() << rd << ", ";
   1140   }
   1141   os() << rn << ", " << operand;
   1142 }
   1143 
   1144 void Disassembler::add(Condition cond,
   1145                        EncodingSize size,
   1146                        Register rd,
   1147                        Register rn,
   1148                        const Operand& operand) {
   1149   os().SetCurrentInstruction(kAdd, kArithmetic);
   1150   os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << size;
   1151   os() << " ";
   1152   if (!rd.Is(rn)) {
   1153     os() << rd << ", ";
   1154   }
   1155   os() << rn << ", " << operand;
   1156 }
   1157 
   1158 void Disassembler::add(Condition cond, Register rd, const Operand& operand) {
   1159   os().SetCurrentInstruction(kAdd, kArithmetic);
   1160   os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << " " << rd
   1161        << ", " << operand;
   1162 }
   1163 
   1164 void Disassembler::adds(Condition cond,
   1165                         EncodingSize size,
   1166                         Register rd,
   1167                         Register rn,
   1168                         const Operand& operand) {
   1169   os().SetCurrentInstruction(kAdds, kArithmetic);
   1170   os() << ToCString(kAdds) << ConditionPrinter(it_block_, cond) << size;
   1171   os() << " ";
   1172   if (!rd.Is(rn)) {
   1173     os() << rd << ", ";
   1174   }
   1175   os() << rn << ", " << operand;
   1176 }
   1177 
   1178 void Disassembler::adds(Register rd, const Operand& operand) {
   1179   os().SetCurrentInstruction(kAdds, kArithmetic);
   1180   os() << ToCString(kAdds) << " " << rd << ", " << operand;
   1181 }
   1182 
   1183 void Disassembler::addw(Condition cond,
   1184                         Register rd,
   1185                         Register rn,
   1186                         const Operand& operand) {
   1187   os().SetCurrentInstruction(kAddw, kArithmetic);
   1188   os() << ToCString(kAddw) << ConditionPrinter(it_block_, cond);
   1189   os() << " ";
   1190   if (!rd.Is(rn)) {
   1191     os() << rd << ", ";
   1192   }
   1193   os() << rn << ", " << operand;
   1194 }
   1195 
   1196 void Disassembler::adr(Condition cond,
   1197                        EncodingSize size,
   1198                        Register rd,
   1199                        Label* label) {
   1200   os().SetCurrentInstruction(kAdr, kAddress);
   1201   os() << ToCString(kAdr) << ConditionPrinter(it_block_, cond) << size << " "
   1202        << rd << ", " << PrintLabel(kAnyLocation, label, GetCodeAddress() & ~3);
   1203 }
   1204 
   1205 void Disassembler::and_(Condition cond,
   1206                         EncodingSize size,
   1207                         Register rd,
   1208                         Register rn,
   1209                         const Operand& operand) {
   1210   os().SetCurrentInstruction(kAnd, kBitwise);
   1211   os() << ToCString(kAnd) << ConditionPrinter(it_block_, cond) << size;
   1212   os() << " ";
   1213   if (!rd.Is(rn)) {
   1214     os() << rd << ", ";
   1215   }
   1216   os() << rn << ", " << operand;
   1217 }
   1218 
   1219 void Disassembler::ands(Condition cond,
   1220                         EncodingSize size,
   1221                         Register rd,
   1222                         Register rn,
   1223                         const Operand& operand) {
   1224   os().SetCurrentInstruction(kAnds, kBitwise);
   1225   os() << ToCString(kAnds) << ConditionPrinter(it_block_, cond) << size;
   1226   os() << " ";
   1227   if (!rd.Is(rn)) {
   1228     os() << rd << ", ";
   1229   }
   1230   os() << rn << ", " << operand;
   1231 }
   1232 
   1233 void Disassembler::asr(Condition cond,
   1234                        EncodingSize size,
   1235                        Register rd,
   1236                        Register rm,
   1237                        const Operand& operand) {
   1238   os().SetCurrentInstruction(kAsr, kShift);
   1239   os() << ToCString(kAsr) << ConditionPrinter(it_block_, cond) << size;
   1240   os() << " ";
   1241   if (!rd.Is(rm)) {
   1242     os() << rd << ", ";
   1243   }
   1244   os() << rm << ", " << operand;
   1245 }
   1246 
   1247 void Disassembler::asrs(Condition cond,
   1248                         EncodingSize size,
   1249                         Register rd,
   1250                         Register rm,
   1251                         const Operand& operand) {
   1252   os().SetCurrentInstruction(kAsrs, kShift);
   1253   os() << ToCString(kAsrs) << ConditionPrinter(it_block_, cond) << size;
   1254   os() << " ";
   1255   if (!rd.Is(rm)) {
   1256     os() << rd << ", ";
   1257   }
   1258   os() << rm << ", " << operand;
   1259 }
   1260 
   1261 void Disassembler::b(Condition cond, EncodingSize size, Label* label) {
   1262   os().SetCurrentInstruction(kB, kAddress | kBranch);
   1263   os() << ToCString(kB) << ConditionPrinter(it_block_, cond) << size << " "
   1264        << PrintLabel(kCodeLocation, label, GetCodeAddress());
   1265 }
   1266 
   1267 void Disassembler::bfc(Condition cond,
   1268                        Register rd,
   1269                        uint32_t lsb,
   1270                        const Operand& operand) {
   1271   os().SetCurrentInstruction(kBfc, kShift);
   1272   os() << ToCString(kBfc) << ConditionPrinter(it_block_, cond) << " " << rd
   1273        << ", "
   1274        << "#" << lsb << ", " << operand;
   1275 }
   1276 
   1277 void Disassembler::bfi(Condition cond,
   1278                        Register rd,
   1279                        Register rn,
   1280                        uint32_t lsb,
   1281                        const Operand& operand) {
   1282   os().SetCurrentInstruction(kBfi, kShift);
   1283   os() << ToCString(kBfi) << ConditionPrinter(it_block_, cond) << " " << rd
   1284        << ", " << rn << ", "
   1285        << "#" << lsb << ", " << operand;
   1286 }
   1287 
   1288 void Disassembler::bic(Condition cond,
   1289                        EncodingSize size,
   1290                        Register rd,
   1291                        Register rn,
   1292                        const Operand& operand) {
   1293   os().SetCurrentInstruction(kBic, kBitwise);
   1294   os() << ToCString(kBic) << ConditionPrinter(it_block_, cond) << size;
   1295   os() << " ";
   1296   if (!rd.Is(rn)) {
   1297     os() << rd << ", ";
   1298   }
   1299   os() << rn << ", " << operand;
   1300 }
   1301 
   1302 void Disassembler::bics(Condition cond,
   1303                         EncodingSize size,
   1304                         Register rd,
   1305                         Register rn,
   1306                         const Operand& operand) {
   1307   os().SetCurrentInstruction(kBics, kBitwise);
   1308   os() << ToCString(kBics) << ConditionPrinter(it_block_, cond) << size;
   1309   os() << " ";
   1310   if (!rd.Is(rn)) {
   1311     os() << rd << ", ";
   1312   }
   1313   os() << rn << ", " << operand;
   1314 }
   1315 
   1316 void Disassembler::bkpt(Condition cond, uint32_t imm) {
   1317   os().SetCurrentInstruction(kBkpt, kSystem);
   1318   os() << ToCString(kBkpt) << ConditionPrinter(it_block_, cond) << " " << imm;
   1319 }
   1320 
   1321 void Disassembler::bl(Condition cond, Label* label) {
   1322   os().SetCurrentInstruction(kBl, kAddress | kBranch);
   1323   os() << ToCString(kBl) << ConditionPrinter(it_block_, cond) << " "
   1324        << PrintLabel(kCodeLocation, label, GetCodeAddress());
   1325 }
   1326 
   1327 void Disassembler::blx(Condition cond, Label* label) {
   1328   os().SetCurrentInstruction(kBlx, kAddress | kBranch);
   1329   os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " "
   1330        << PrintLabel(kCodeLocation, label, GetCodeAddress() & ~3);
   1331 }
   1332 
   1333 void Disassembler::blx(Condition cond, Register rm) {
   1334   os().SetCurrentInstruction(kBlx, kAddress | kBranch);
   1335   os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " " << rm;
   1336 }
   1337 
   1338 void Disassembler::bx(Condition cond, Register rm) {
   1339   os().SetCurrentInstruction(kBx, kAddress | kBranch);
   1340   os() << ToCString(kBx) << ConditionPrinter(it_block_, cond) << " " << rm;
   1341 }
   1342 
   1343 void Disassembler::bxj(Condition cond, Register rm) {
   1344   os().SetCurrentInstruction(kBxj, kAddress | kBranch);
   1345   os() << ToCString(kBxj) << ConditionPrinter(it_block_, cond) << " " << rm;
   1346 }
   1347 
   1348 void Disassembler::cbnz(Register rn, Label* label) {
   1349   os().SetCurrentInstruction(kCbnz, kAddress | kBranch);
   1350   os() << ToCString(kCbnz) << " " << rn << ", "
   1351        << PrintLabel(kCodeLocation, label, GetCodeAddress());
   1352 }
   1353 
   1354 void Disassembler::cbz(Register rn, Label* label) {
   1355   os().SetCurrentInstruction(kCbz, kAddress | kBranch);
   1356   os() << ToCString(kCbz) << " " << rn << ", "
   1357        << PrintLabel(kCodeLocation, label, GetCodeAddress());
   1358 }
   1359 
   1360 void Disassembler::clrex(Condition cond) {
   1361   os().SetCurrentInstruction(kClrex, kNoAttribute);
   1362   os() << ToCString(kClrex) << ConditionPrinter(it_block_, cond);
   1363 }
   1364 
   1365 void Disassembler::clz(Condition cond, Register rd, Register rm) {
   1366   os().SetCurrentInstruction(kClz, kNoAttribute);
   1367   os() << ToCString(kClz) << ConditionPrinter(it_block_, cond) << " " << rd
   1368        << ", " << rm;
   1369 }
   1370 
   1371 void Disassembler::cmn(Condition cond,
   1372                        EncodingSize size,
   1373                        Register rn,
   1374                        const Operand& operand) {
   1375   os().SetCurrentInstruction(kCmn, kArithmetic);
   1376   os() << ToCString(kCmn) << ConditionPrinter(it_block_, cond) << size << " "
   1377        << rn << ", " << operand;
   1378 }
   1379 
   1380 void Disassembler::cmp(Condition cond,
   1381                        EncodingSize size,
   1382                        Register rn,
   1383                        const Operand& operand) {
   1384   os().SetCurrentInstruction(kCmp, kArithmetic);
   1385   os() << ToCString(kCmp) << ConditionPrinter(it_block_, cond) << size << " "
   1386        << rn << ", " << operand;
   1387 }
   1388 
   1389 void Disassembler::crc32b(Condition cond,
   1390                           Register rd,
   1391                           Register rn,
   1392                           Register rm) {
   1393   os().SetCurrentInstruction(kCrc32b, kNoAttribute);
   1394   os() << ToCString(kCrc32b) << ConditionPrinter(it_block_, cond) << " " << rd
   1395        << ", " << rn << ", " << rm;
   1396 }
   1397 
   1398 void Disassembler::crc32cb(Condition cond,
   1399                            Register rd,
   1400                            Register rn,
   1401                            Register rm) {
   1402   os().SetCurrentInstruction(kCrc32cb, kNoAttribute);
   1403   os() << ToCString(kCrc32cb) << ConditionPrinter(it_block_, cond) << " " << rd
   1404        << ", " << rn << ", " << rm;
   1405 }
   1406 
   1407 void Disassembler::crc32ch(Condition cond,
   1408                            Register rd,
   1409                            Register rn,
   1410                            Register rm) {
   1411   os().SetCurrentInstruction(kCrc32ch, kNoAttribute);
   1412   os() << ToCString(kCrc32ch) << ConditionPrinter(it_block_, cond) << " " << rd
   1413        << ", " << rn << ", " << rm;
   1414 }
   1415 
   1416 void Disassembler::crc32cw(Condition cond,
   1417                            Register rd,
   1418                            Register rn,
   1419                            Register rm) {
   1420   os().SetCurrentInstruction(kCrc32cw, kNoAttribute);
   1421   os() << ToCString(kCrc32cw) << ConditionPrinter(it_block_, cond) << " " << rd
   1422        << ", " << rn << ", " << rm;
   1423 }
   1424 
   1425 void Disassembler::crc32h(Condition cond,
   1426                           Register rd,
   1427                           Register rn,
   1428                           Register rm) {
   1429   os().SetCurrentInstruction(kCrc32h, kNoAttribute);
   1430   os() << ToCString(kCrc32h) << ConditionPrinter(it_block_, cond) << " " << rd
   1431        << ", " << rn << ", " << rm;
   1432 }
   1433 
   1434 void Disassembler::crc32w(Condition cond,
   1435                           Register rd,
   1436                           Register rn,
   1437                           Register rm) {
   1438   os().SetCurrentInstruction(kCrc32w, kNoAttribute);
   1439   os() << ToCString(kCrc32w) << ConditionPrinter(it_block_, cond) << " " << rd
   1440        << ", " << rn << ", " << rm;
   1441 }
   1442 
   1443 void Disassembler::dmb(Condition cond, MemoryBarrier option) {
   1444   os().SetCurrentInstruction(kDmb, kNoAttribute);
   1445   os() << ToCString(kDmb) << ConditionPrinter(it_block_, cond) << " " << option;
   1446 }
   1447 
   1448 void Disassembler::dsb(Condition cond, MemoryBarrier option) {
   1449   os().SetCurrentInstruction(kDsb, kNoAttribute);
   1450   os() << ToCString(kDsb) << ConditionPrinter(it_block_, cond) << " " << option;
   1451 }
   1452 
   1453 void Disassembler::eor(Condition cond,
   1454                        EncodingSize size,
   1455                        Register rd,
   1456                        Register rn,
   1457                        const Operand& operand) {
   1458   os().SetCurrentInstruction(kEor, kBitwise);
   1459   os() << ToCString(kEor) << ConditionPrinter(it_block_, cond) << size;
   1460   os() << " ";
   1461   if (!rd.Is(rn)) {
   1462     os() << rd << ", ";
   1463   }
   1464   os() << rn << ", " << operand;
   1465 }
   1466 
   1467 void Disassembler::eors(Condition cond,
   1468                         EncodingSize size,
   1469                         Register rd,
   1470                         Register rn,
   1471                         const Operand& operand) {
   1472   os().SetCurrentInstruction(kEors, kBitwise);
   1473   os() << ToCString(kEors) << ConditionPrinter(it_block_, cond) << size;
   1474   os() << " ";
   1475   if (!rd.Is(rn)) {
   1476     os() << rd << ", ";
   1477   }
   1478   os() << rn << ", " << operand;
   1479 }
   1480 
   1481 void Disassembler::fldmdbx(Condition cond,
   1482                            Register rn,
   1483                            WriteBack write_back,
   1484                            DRegisterList dreglist) {
   1485   os().SetCurrentInstruction(kFldmdbx,
   1486                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   1487   os() << ToCString(kFldmdbx) << ConditionPrinter(it_block_, cond) << " " << rn
   1488        << write_back << ", " << dreglist;
   1489 }
   1490 
   1491 void Disassembler::fldmiax(Condition cond,
   1492                            Register rn,
   1493                            WriteBack write_back,
   1494                            DRegisterList dreglist) {
   1495   os().SetCurrentInstruction(kFldmiax,
   1496                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   1497   os() << ToCString(kFldmiax) << ConditionPrinter(it_block_, cond) << " " << rn
   1498        << write_back << ", " << dreglist;
   1499 }
   1500 
   1501 void Disassembler::fstmdbx(Condition cond,
   1502                            Register rn,
   1503                            WriteBack write_back,
   1504                            DRegisterList dreglist) {
   1505   os().SetCurrentInstruction(kFstmdbx,
   1506                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   1507   os() << ToCString(kFstmdbx) << ConditionPrinter(it_block_, cond) << " " << rn
   1508        << write_back << ", " << dreglist;
   1509 }
   1510 
   1511 void Disassembler::fstmiax(Condition cond,
   1512                            Register rn,
   1513                            WriteBack write_back,
   1514                            DRegisterList dreglist) {
   1515   os().SetCurrentInstruction(kFstmiax,
   1516                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   1517   os() << ToCString(kFstmiax) << ConditionPrinter(it_block_, cond) << " " << rn
   1518        << write_back << ", " << dreglist;
   1519 }
   1520 
   1521 void Disassembler::hlt(Condition cond, uint32_t imm) {
   1522   os().SetCurrentInstruction(kHlt, kSystem);
   1523   os() << ToCString(kHlt) << ConditionPrinter(it_block_, cond) << " " << imm;
   1524 }
   1525 
   1526 void Disassembler::hvc(Condition cond, uint32_t imm) {
   1527   os().SetCurrentInstruction(kHvc, kSystem);
   1528   os() << ToCString(kHvc) << ConditionPrinter(it_block_, cond) << " " << imm;
   1529 }
   1530 
   1531 void Disassembler::isb(Condition cond, MemoryBarrier option) {
   1532   os().SetCurrentInstruction(kIsb, kNoAttribute);
   1533   os() << ToCString(kIsb) << ConditionPrinter(it_block_, cond) << " " << option;
   1534 }
   1535 
   1536 void Disassembler::it(Condition cond, uint16_t mask) {
   1537   os().SetCurrentInstruction(kIt, kNoAttribute);
   1538   os() << ToCString(kIt);
   1539   int count;
   1540   if ((mask & 0x1) != 0) {
   1541     count = 3;
   1542   } else if ((mask & 0x2) != 0) {
   1543     count = 2;
   1544   } else if ((mask & 0x4) != 0) {
   1545     count = 1;
   1546   } else {
   1547     count = 0;
   1548   }
   1549   uint16_t tmp = 0x8;
   1550   uint16_t ref = (cond.GetCondition() & 0x1) << 3;
   1551   while (count-- > 0) {
   1552     os() << (((mask & tmp) == ref) ? "t" : "e");
   1553     tmp >>= 1;
   1554     ref >>= 1;
   1555   }
   1556   if (cond.Is(al)) {
   1557     os() << " al";
   1558   } else {
   1559     os() << " " << cond;
   1560   }
   1561 }
   1562 
   1563 void Disassembler::lda(Condition cond, Register rt, const MemOperand& operand) {
   1564   os().SetCurrentInstruction(kLda, kAddress | kLoadStore);
   1565   os() << ToCString(kLda) << ConditionPrinter(it_block_, cond) << " " << rt
   1566        << ", " << PrintMemOperand(kLoadWordLocation, operand);
   1567 }
   1568 
   1569 void Disassembler::ldab(Condition cond,
   1570                         Register rt,
   1571                         const MemOperand& operand) {
   1572   os().SetCurrentInstruction(kLdab, kAddress | kLoadStore);
   1573   os() << ToCString(kLdab) << ConditionPrinter(it_block_, cond) << " " << rt
   1574        << ", " << PrintMemOperand(kLoadByteLocation, operand);
   1575 }
   1576 
   1577 void Disassembler::ldaex(Condition cond,
   1578                          Register rt,
   1579                          const MemOperand& operand) {
   1580   os().SetCurrentInstruction(kLdaex, kAddress | kLoadStore);
   1581   os() << ToCString(kLdaex) << ConditionPrinter(it_block_, cond) << " " << rt
   1582        << ", " << PrintMemOperand(kLoadWordLocation, operand);
   1583 }
   1584 
   1585 void Disassembler::ldaexb(Condition cond,
   1586                           Register rt,
   1587                           const MemOperand& operand) {
   1588   os().SetCurrentInstruction(kLdaexb, kAddress | kLoadStore);
   1589   os() << ToCString(kLdaexb) << ConditionPrinter(it_block_, cond) << " " << rt
   1590        << ", " << PrintMemOperand(kLoadByteLocation, operand);
   1591 }
   1592 
   1593 void Disassembler::ldaexd(Condition cond,
   1594                           Register rt,
   1595                           Register rt2,
   1596                           const MemOperand& operand) {
   1597   os().SetCurrentInstruction(kLdaexd, kAddress | kLoadStore);
   1598   os() << ToCString(kLdaexd) << ConditionPrinter(it_block_, cond) << " " << rt
   1599        << ", " << rt2 << ", "
   1600        << PrintMemOperand(kLoadDoubleWordLocation, operand);
   1601 }
   1602 
   1603 void Disassembler::ldaexh(Condition cond,
   1604                           Register rt,
   1605                           const MemOperand& operand) {
   1606   os().SetCurrentInstruction(kLdaexh, kAddress | kLoadStore);
   1607   os() << ToCString(kLdaexh) << ConditionPrinter(it_block_, cond) << " " << rt
   1608        << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
   1609 }
   1610 
   1611 void Disassembler::ldah(Condition cond,
   1612                         Register rt,
   1613                         const MemOperand& operand) {
   1614   os().SetCurrentInstruction(kLdah, kAddress | kLoadStore);
   1615   os() << ToCString(kLdah) << ConditionPrinter(it_block_, cond) << " " << rt
   1616        << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
   1617 }
   1618 
   1619 void Disassembler::ldm(Condition cond,
   1620                        EncodingSize size,
   1621                        Register rn,
   1622                        WriteBack write_back,
   1623                        RegisterList registers) {
   1624   os().SetCurrentInstruction(kLdm, kLoadStore | kLoadStoreMultiple);
   1625   os() << ToCString(kLdm) << ConditionPrinter(it_block_, cond) << size << " "
   1626        << rn << write_back << ", " << registers;
   1627 }
   1628 
   1629 void Disassembler::ldmda(Condition cond,
   1630                          Register rn,
   1631                          WriteBack write_back,
   1632                          RegisterList registers) {
   1633   os().SetCurrentInstruction(kLdmda, kLoadStore | kLoadStoreMultiple);
   1634   os() << ToCString(kLdmda) << ConditionPrinter(it_block_, cond) << " " << rn
   1635        << write_back << ", " << registers;
   1636 }
   1637 
   1638 void Disassembler::ldmdb(Condition cond,
   1639                          Register rn,
   1640                          WriteBack write_back,
   1641                          RegisterList registers) {
   1642   os().SetCurrentInstruction(kLdmdb, kLoadStore | kLoadStoreMultiple);
   1643   os() << ToCString(kLdmdb) << ConditionPrinter(it_block_, cond) << " " << rn
   1644        << write_back << ", " << registers;
   1645 }
   1646 
   1647 void Disassembler::ldmea(Condition cond,
   1648                          Register rn,
   1649                          WriteBack write_back,
   1650                          RegisterList registers) {
   1651   os().SetCurrentInstruction(kLdmea, kLoadStore | kLoadStoreMultiple);
   1652   os() << ToCString(kLdmea) << ConditionPrinter(it_block_, cond) << " " << rn
   1653        << write_back << ", " << registers;
   1654 }
   1655 
   1656 void Disassembler::ldmed(Condition cond,
   1657                          Register rn,
   1658                          WriteBack write_back,
   1659                          RegisterList registers) {
   1660   os().SetCurrentInstruction(kLdmed, kLoadStore | kLoadStoreMultiple);
   1661   os() << ToCString(kLdmed) << ConditionPrinter(it_block_, cond) << " " << rn
   1662        << write_back << ", " << registers;
   1663 }
   1664 
   1665 void Disassembler::ldmfa(Condition cond,
   1666                          Register rn,
   1667                          WriteBack write_back,
   1668                          RegisterList registers) {
   1669   os().SetCurrentInstruction(kLdmfa, kLoadStore | kLoadStoreMultiple);
   1670   os() << ToCString(kLdmfa) << ConditionPrinter(it_block_, cond) << " " << rn
   1671        << write_back << ", " << registers;
   1672 }
   1673 
   1674 void Disassembler::ldmfd(Condition cond,
   1675                          EncodingSize size,
   1676                          Register rn,
   1677                          WriteBack write_back,
   1678                          RegisterList registers) {
   1679   os().SetCurrentInstruction(kLdmfd, kLoadStore | kLoadStoreMultiple);
   1680   os() << ToCString(kLdmfd) << ConditionPrinter(it_block_, cond) << size << " "
   1681        << rn << write_back << ", " << registers;
   1682 }
   1683 
   1684 void Disassembler::ldmib(Condition cond,
   1685                          Register rn,
   1686                          WriteBack write_back,
   1687                          RegisterList registers) {
   1688   os().SetCurrentInstruction(kLdmib, kLoadStore | kLoadStoreMultiple);
   1689   os() << ToCString(kLdmib) << ConditionPrinter(it_block_, cond) << " " << rn
   1690        << write_back << ", " << registers;
   1691 }
   1692 
   1693 void Disassembler::ldr(Condition cond,
   1694                        EncodingSize size,
   1695                        Register rt,
   1696                        const MemOperand& operand) {
   1697   os().SetCurrentInstruction(kLdr, kAddress | kLoadStore);
   1698   os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " "
   1699        << rt << ", " << PrintMemOperand(kLoadWordLocation, operand);
   1700 }
   1701 
   1702 void Disassembler::ldr(Condition cond,
   1703                        EncodingSize size,
   1704                        Register rt,
   1705                        Label* label) {
   1706   os().SetCurrentInstruction(kLdr, kAddress | kLoadStore);
   1707   os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " "
   1708        << rt << ", "
   1709        << PrintLabel(kLoadWordLocation, label, GetCodeAddress() & ~3);
   1710 }
   1711 
   1712 void Disassembler::ldrb(Condition cond,
   1713                         EncodingSize size,
   1714                         Register rt,
   1715                         const MemOperand& operand) {
   1716   os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore);
   1717   os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << size << " "
   1718        << rt << ", " << PrintMemOperand(kLoadByteLocation, operand);
   1719 }
   1720 
   1721 void Disassembler::ldrb(Condition cond, Register rt, Label* label) {
   1722   os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore);
   1723   os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << " " << rt
   1724        << ", " << PrintLabel(kLoadByteLocation, label, GetCodeAddress() & ~3);
   1725 }
   1726 
   1727 void Disassembler::ldrd(Condition cond,
   1728                         Register rt,
   1729                         Register rt2,
   1730                         const MemOperand& operand) {
   1731   os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore);
   1732   os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt
   1733        << ", " << rt2 << ", "
   1734        << PrintMemOperand(kLoadDoubleWordLocation, operand);
   1735 }
   1736 
   1737 void Disassembler::ldrd(Condition cond,
   1738                         Register rt,
   1739                         Register rt2,
   1740                         Label* label) {
   1741   os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore);
   1742   os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt
   1743        << ", " << rt2 << ", "
   1744        << PrintLabel(kLoadDoubleWordLocation, label, GetCodeAddress() & ~3);
   1745 }
   1746 
   1747 void Disassembler::ldrex(Condition cond,
   1748                          Register rt,
   1749                          const MemOperand& operand) {
   1750   os().SetCurrentInstruction(kLdrex, kAddress | kLoadStore);
   1751   os() << ToCString(kLdrex) << ConditionPrinter(it_block_, cond) << " " << rt
   1752        << ", " << PrintMemOperand(kLoadWordLocation, operand);
   1753 }
   1754 
   1755 void Disassembler::ldrexb(Condition cond,
   1756                           Register rt,
   1757                           const MemOperand& operand) {
   1758   os().SetCurrentInstruction(kLdrexb, kAddress | kLoadStore);
   1759   os() << ToCString(kLdrexb) << ConditionPrinter(it_block_, cond) << " " << rt
   1760        << ", " << PrintMemOperand(kLoadByteLocation, operand);
   1761 }
   1762 
   1763 void Disassembler::ldrexd(Condition cond,
   1764                           Register rt,
   1765                           Register rt2,
   1766                           const MemOperand& operand) {
   1767   os().SetCurrentInstruction(kLdrexd, kAddress | kLoadStore);
   1768   os() << ToCString(kLdrexd) << ConditionPrinter(it_block_, cond) << " " << rt
   1769        << ", " << rt2 << ", "
   1770        << PrintMemOperand(kLoadDoubleWordLocation, operand);
   1771 }
   1772 
   1773 void Disassembler::ldrexh(Condition cond,
   1774                           Register rt,
   1775                           const MemOperand& operand) {
   1776   os().SetCurrentInstruction(kLdrexh, kAddress | kLoadStore);
   1777   os() << ToCString(kLdrexh) << ConditionPrinter(it_block_, cond) << " " << rt
   1778        << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
   1779 }
   1780 
   1781 void Disassembler::ldrh(Condition cond,
   1782                         EncodingSize size,
   1783                         Register rt,
   1784                         const MemOperand& operand) {
   1785   os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore);
   1786   os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << size << " "
   1787        << rt << ", " << PrintMemOperand(kLoadHalfWordLocation, operand);
   1788 }
   1789 
   1790 void Disassembler::ldrh(Condition cond, Register rt, Label* label) {
   1791   os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore);
   1792   os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << " " << rt
   1793        << ", "
   1794        << PrintLabel(kLoadHalfWordLocation, label, GetCodeAddress() & ~3);
   1795 }
   1796 
   1797 void Disassembler::ldrsb(Condition cond,
   1798                          EncodingSize size,
   1799                          Register rt,
   1800                          const MemOperand& operand) {
   1801   os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore);
   1802   os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << size << " "
   1803        << rt << ", " << PrintMemOperand(kLoadSignedByteLocation, operand);
   1804 }
   1805 
   1806 void Disassembler::ldrsb(Condition cond, Register rt, Label* label) {
   1807   os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore);
   1808   os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << " " << rt
   1809        << ", "
   1810        << PrintLabel(kLoadSignedByteLocation, label, GetCodeAddress() & ~3);
   1811 }
   1812 
   1813 void Disassembler::ldrsh(Condition cond,
   1814                          EncodingSize size,
   1815                          Register rt,
   1816                          const MemOperand& operand) {
   1817   os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore);
   1818   os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << size << " "
   1819        << rt << ", " << PrintMemOperand(kLoadSignedHalfWordLocation, operand);
   1820 }
   1821 
   1822 void Disassembler::ldrsh(Condition cond, Register rt, Label* label) {
   1823   os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore);
   1824   os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << " " << rt
   1825        << ", "
   1826        << PrintLabel(kLoadSignedHalfWordLocation, label, GetCodeAddress() & ~3);
   1827 }
   1828 
   1829 void Disassembler::lsl(Condition cond,
   1830                        EncodingSize size,
   1831                        Register rd,
   1832                        Register rm,
   1833                        const Operand& operand) {
   1834   os().SetCurrentInstruction(kLsl, kShift);
   1835   os() << ToCString(kLsl) << ConditionPrinter(it_block_, cond) << size;
   1836   os() << " ";
   1837   if (!rd.Is(rm)) {
   1838     os() << rd << ", ";
   1839   }
   1840   os() << rm << ", " << operand;
   1841 }
   1842 
   1843 void Disassembler::lsls(Condition cond,
   1844                         EncodingSize size,
   1845                         Register rd,
   1846                         Register rm,
   1847                         const Operand& operand) {
   1848   os().SetCurrentInstruction(kLsls, kShift);
   1849   os() << ToCString(kLsls) << ConditionPrinter(it_block_, cond) << size;
   1850   os() << " ";
   1851   if (!rd.Is(rm)) {
   1852     os() << rd << ", ";
   1853   }
   1854   os() << rm << ", " << operand;
   1855 }
   1856 
   1857 void Disassembler::lsr(Condition cond,
   1858                        EncodingSize size,
   1859                        Register rd,
   1860                        Register rm,
   1861                        const Operand& operand) {
   1862   os().SetCurrentInstruction(kLsr, kShift);
   1863   os() << ToCString(kLsr) << ConditionPrinter(it_block_, cond) << size;
   1864   os() << " ";
   1865   if (!rd.Is(rm)) {
   1866     os() << rd << ", ";
   1867   }
   1868   os() << rm << ", " << operand;
   1869 }
   1870 
   1871 void Disassembler::lsrs(Condition cond,
   1872                         EncodingSize size,
   1873                         Register rd,
   1874                         Register rm,
   1875                         const Operand& operand) {
   1876   os().SetCurrentInstruction(kLsrs, kShift);
   1877   os() << ToCString(kLsrs) << ConditionPrinter(it_block_, cond) << size;
   1878   os() << " ";
   1879   if (!rd.Is(rm)) {
   1880     os() << rd << ", ";
   1881   }
   1882   os() << rm << ", " << operand;
   1883 }
   1884 
   1885 void Disassembler::mla(
   1886     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   1887   os().SetCurrentInstruction(kMla, kArithmetic);
   1888   os() << ToCString(kMla) << ConditionPrinter(it_block_, cond) << " " << rd
   1889        << ", " << rn << ", " << rm << ", " << ra;
   1890 }
   1891 
   1892 void Disassembler::mlas(
   1893     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   1894   os().SetCurrentInstruction(kMlas, kArithmetic);
   1895   os() << ToCString(kMlas) << ConditionPrinter(it_block_, cond) << " " << rd
   1896        << ", " << rn << ", " << rm << ", " << ra;
   1897 }
   1898 
   1899 void Disassembler::mls(
   1900     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   1901   os().SetCurrentInstruction(kMls, kArithmetic);
   1902   os() << ToCString(kMls) << ConditionPrinter(it_block_, cond) << " " << rd
   1903        << ", " << rn << ", " << rm << ", " << ra;
   1904 }
   1905 
   1906 void Disassembler::mov(Condition cond,
   1907                        EncodingSize size,
   1908                        Register rd,
   1909                        const Operand& operand) {
   1910   os().SetCurrentInstruction(kMov, kNoAttribute);
   1911   os() << ToCString(kMov) << ConditionPrinter(it_block_, cond) << size << " "
   1912        << rd << ", " << operand;
   1913 }
   1914 
   1915 void Disassembler::movs(Condition cond,
   1916                         EncodingSize size,
   1917                         Register rd,
   1918                         const Operand& operand) {
   1919   os().SetCurrentInstruction(kMovs, kNoAttribute);
   1920   os() << ToCString(kMovs) << ConditionPrinter(it_block_, cond) << size << " "
   1921        << rd << ", " << operand;
   1922 }
   1923 
   1924 void Disassembler::movt(Condition cond, Register rd, const Operand& operand) {
   1925   os().SetCurrentInstruction(kMovt, kNoAttribute);
   1926   os() << ToCString(kMovt) << ConditionPrinter(it_block_, cond) << " " << rd
   1927        << ", " << operand;
   1928 }
   1929 
   1930 void Disassembler::movw(Condition cond, Register rd, const Operand& operand) {
   1931   os().SetCurrentInstruction(kMovw, kNoAttribute);
   1932   os() << ToCString(kMovw) << ConditionPrinter(it_block_, cond) << " " << rd
   1933        << ", " << operand;
   1934 }
   1935 
   1936 void Disassembler::mrs(Condition cond, Register rd, SpecialRegister spec_reg) {
   1937   os().SetCurrentInstruction(kMrs, kNoAttribute);
   1938   os() << ToCString(kMrs) << ConditionPrinter(it_block_, cond) << " " << rd
   1939        << ", " << spec_reg;
   1940 }
   1941 
   1942 void Disassembler::msr(Condition cond,
   1943                        MaskedSpecialRegister spec_reg,
   1944                        const Operand& operand) {
   1945   os().SetCurrentInstruction(kMsr, kNoAttribute);
   1946   os() << ToCString(kMsr) << ConditionPrinter(it_block_, cond) << " "
   1947        << spec_reg << ", " << operand;
   1948 }
   1949 
   1950 void Disassembler::mul(
   1951     Condition cond, EncodingSize size, Register rd, Register rn, Register rm) {
   1952   os().SetCurrentInstruction(kMul, kArithmetic);
   1953   os() << ToCString(kMul) << ConditionPrinter(it_block_, cond) << size << " "
   1954        << rd << ", " << rn << ", " << rm;
   1955 }
   1956 
   1957 void Disassembler::muls(Condition cond, Register rd, Register rn, Register rm) {
   1958   os().SetCurrentInstruction(kMuls, kArithmetic);
   1959   os() << ToCString(kMuls) << ConditionPrinter(it_block_, cond) << " " << rd
   1960        << ", " << rn << ", " << rm;
   1961 }
   1962 
   1963 void Disassembler::mvn(Condition cond,
   1964                        EncodingSize size,
   1965                        Register rd,
   1966                        const Operand& operand) {
   1967   os().SetCurrentInstruction(kMvn, kNoAttribute);
   1968   os() << ToCString(kMvn) << ConditionPrinter(it_block_, cond) << size << " "
   1969        << rd << ", " << operand;
   1970 }
   1971 
   1972 void Disassembler::mvns(Condition cond,
   1973                         EncodingSize size,
   1974                         Register rd,
   1975                         const Operand& operand) {
   1976   os().SetCurrentInstruction(kMvns, kNoAttribute);
   1977   os() << ToCString(kMvns) << ConditionPrinter(it_block_, cond) << size << " "
   1978        << rd << ", " << operand;
   1979 }
   1980 
   1981 void Disassembler::nop(Condition cond, EncodingSize size) {
   1982   os().SetCurrentInstruction(kNop, kNoAttribute);
   1983   os() << ToCString(kNop) << ConditionPrinter(it_block_, cond) << size;
   1984 }
   1985 
   1986 void Disassembler::orn(Condition cond,
   1987                        Register rd,
   1988                        Register rn,
   1989                        const Operand& operand) {
   1990   os().SetCurrentInstruction(kOrn, kBitwise);
   1991   os() << ToCString(kOrn) << ConditionPrinter(it_block_, cond);
   1992   os() << " ";
   1993   if (!rd.Is(rn)) {
   1994     os() << rd << ", ";
   1995   }
   1996   os() << rn << ", " << operand;
   1997 }
   1998 
   1999 void Disassembler::orns(Condition cond,
   2000                         Register rd,
   2001                         Register rn,
   2002                         const Operand& operand) {
   2003   os().SetCurrentInstruction(kOrns, kBitwise);
   2004   os() << ToCString(kOrns) << ConditionPrinter(it_block_, cond);
   2005   os() << " ";
   2006   if (!rd.Is(rn)) {
   2007     os() << rd << ", ";
   2008   }
   2009   os() << rn << ", " << operand;
   2010 }
   2011 
   2012 void Disassembler::orr(Condition cond,
   2013                        EncodingSize size,
   2014                        Register rd,
   2015                        Register rn,
   2016                        const Operand& operand) {
   2017   os().SetCurrentInstruction(kOrr, kBitwise);
   2018   os() << ToCString(kOrr) << ConditionPrinter(it_block_, cond) << size;
   2019   os() << " ";
   2020   if (!rd.Is(rn)) {
   2021     os() << rd << ", ";
   2022   }
   2023   os() << rn << ", " << operand;
   2024 }
   2025 
   2026 void Disassembler::orrs(Condition cond,
   2027                         EncodingSize size,
   2028                         Register rd,
   2029                         Register rn,
   2030                         const Operand& operand) {
   2031   os().SetCurrentInstruction(kOrrs, kBitwise);
   2032   os() << ToCString(kOrrs) << ConditionPrinter(it_block_, cond) << size;
   2033   os() << " ";
   2034   if (!rd.Is(rn)) {
   2035     os() << rd << ", ";
   2036   }
   2037   os() << rn << ", " << operand;
   2038 }
   2039 
   2040 void Disassembler::pkhbt(Condition cond,
   2041                          Register rd,
   2042                          Register rn,
   2043                          const Operand& operand) {
   2044   os().SetCurrentInstruction(kPkhbt, kNoAttribute);
   2045   os() << ToCString(kPkhbt) << ConditionPrinter(it_block_, cond);
   2046   os() << " ";
   2047   if (!rd.Is(rn)) {
   2048     os() << rd << ", ";
   2049   }
   2050   os() << rn << ", " << operand;
   2051 }
   2052 
   2053 void Disassembler::pkhtb(Condition cond,
   2054                          Register rd,
   2055                          Register rn,
   2056                          const Operand& operand) {
   2057   os().SetCurrentInstruction(kPkhtb, kNoAttribute);
   2058   os() << ToCString(kPkhtb) << ConditionPrinter(it_block_, cond);
   2059   os() << " ";
   2060   if (!rd.Is(rn)) {
   2061     os() << rd << ", ";
   2062   }
   2063   os() << rn << ", " << operand;
   2064 }
   2065 
   2066 void Disassembler::pld(Condition cond, Label* label) {
   2067   os().SetCurrentInstruction(kPld, kAddress);
   2068   os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " "
   2069        << PrintLabel(kDataLocation, label, GetCodeAddress() & ~3);
   2070 }
   2071 
   2072 void Disassembler::pld(Condition cond, const MemOperand& operand) {
   2073   os().SetCurrentInstruction(kPld, kAddress);
   2074   os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " "
   2075        << PrintMemOperand(kDataLocation, operand);
   2076 }
   2077 
   2078 void Disassembler::pldw(Condition cond, const MemOperand& operand) {
   2079   os().SetCurrentInstruction(kPldw, kAddress);
   2080   os() << ToCString(kPldw) << ConditionPrinter(it_block_, cond) << " "
   2081        << PrintMemOperand(kDataLocation, operand);
   2082 }
   2083 
   2084 void Disassembler::pli(Condition cond, const MemOperand& operand) {
   2085   os().SetCurrentInstruction(kPli, kAddress);
   2086   os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " "
   2087        << PrintMemOperand(kCodeLocation, operand);
   2088 }
   2089 
   2090 void Disassembler::pli(Condition cond, Label* label) {
   2091   os().SetCurrentInstruction(kPli, kAddress);
   2092   os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " "
   2093        << PrintLabel(kCodeLocation, label, GetCodeAddress() & ~3);
   2094 }
   2095 
   2096 void Disassembler::pop(Condition cond,
   2097                        EncodingSize size,
   2098                        RegisterList registers) {
   2099   os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple);
   2100   os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " "
   2101        << registers;
   2102 }
   2103 
   2104 void Disassembler::pop(Condition cond, EncodingSize size, Register rt) {
   2105   os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple);
   2106   os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " "
   2107        << "{" << rt << "}";
   2108 }
   2109 
   2110 void Disassembler::push(Condition cond,
   2111                         EncodingSize size,
   2112                         RegisterList registers) {
   2113   os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple);
   2114   os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " "
   2115        << registers;
   2116 }
   2117 
   2118 void Disassembler::push(Condition cond, EncodingSize size, Register rt) {
   2119   os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple);
   2120   os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " "
   2121        << "{" << rt << "}";
   2122 }
   2123 
   2124 void Disassembler::qadd(Condition cond, Register rd, Register rm, Register rn) {
   2125   os().SetCurrentInstruction(kQadd, kArithmetic);
   2126   os() << ToCString(kQadd) << ConditionPrinter(it_block_, cond);
   2127   os() << " ";
   2128   if (!rd.Is(rm)) {
   2129     os() << rd << ", ";
   2130   }
   2131   os() << rm << ", " << rn;
   2132 }
   2133 
   2134 void Disassembler::qadd16(Condition cond,
   2135                           Register rd,
   2136                           Register rn,
   2137                           Register rm) {
   2138   os().SetCurrentInstruction(kQadd16, kArithmetic);
   2139   os() << ToCString(kQadd16) << ConditionPrinter(it_block_, cond);
   2140   os() << " ";
   2141   if (!rd.Is(rn)) {
   2142     os() << rd << ", ";
   2143   }
   2144   os() << rn << ", " << rm;
   2145 }
   2146 
   2147 void Disassembler::qadd8(Condition cond,
   2148                          Register rd,
   2149                          Register rn,
   2150                          Register rm) {
   2151   os().SetCurrentInstruction(kQadd8, kArithmetic);
   2152   os() << ToCString(kQadd8) << ConditionPrinter(it_block_, cond);
   2153   os() << " ";
   2154   if (!rd.Is(rn)) {
   2155     os() << rd << ", ";
   2156   }
   2157   os() << rn << ", " << rm;
   2158 }
   2159 
   2160 void Disassembler::qasx(Condition cond, Register rd, Register rn, Register rm) {
   2161   os().SetCurrentInstruction(kQasx, kArithmetic);
   2162   os() << ToCString(kQasx) << ConditionPrinter(it_block_, cond);
   2163   os() << " ";
   2164   if (!rd.Is(rn)) {
   2165     os() << rd << ", ";
   2166   }
   2167   os() << rn << ", " << rm;
   2168 }
   2169 
   2170 void Disassembler::qdadd(Condition cond,
   2171                          Register rd,
   2172                          Register rm,
   2173                          Register rn) {
   2174   os().SetCurrentInstruction(kQdadd, kArithmetic);
   2175   os() << ToCString(kQdadd) << ConditionPrinter(it_block_, cond);
   2176   os() << " ";
   2177   if (!rd.Is(rm)) {
   2178     os() << rd << ", ";
   2179   }
   2180   os() << rm << ", " << rn;
   2181 }
   2182 
   2183 void Disassembler::qdsub(Condition cond,
   2184                          Register rd,
   2185                          Register rm,
   2186                          Register rn) {
   2187   os().SetCurrentInstruction(kQdsub, kArithmetic);
   2188   os() << ToCString(kQdsub) << ConditionPrinter(it_block_, cond);
   2189   os() << " ";
   2190   if (!rd.Is(rm)) {
   2191     os() << rd << ", ";
   2192   }
   2193   os() << rm << ", " << rn;
   2194 }
   2195 
   2196 void Disassembler::qsax(Condition cond, Register rd, Register rn, Register rm) {
   2197   os().SetCurrentInstruction(kQsax, kArithmetic);
   2198   os() << ToCString(kQsax) << ConditionPrinter(it_block_, cond);
   2199   os() << " ";
   2200   if (!rd.Is(rn)) {
   2201     os() << rd << ", ";
   2202   }
   2203   os() << rn << ", " << rm;
   2204 }
   2205 
   2206 void Disassembler::qsub(Condition cond, Register rd, Register rm, Register rn) {
   2207   os().SetCurrentInstruction(kQsub, kArithmetic);
   2208   os() << ToCString(kQsub) << ConditionPrinter(it_block_, cond);
   2209   os() << " ";
   2210   if (!rd.Is(rm)) {
   2211     os() << rd << ", ";
   2212   }
   2213   os() << rm << ", " << rn;
   2214 }
   2215 
   2216 void Disassembler::qsub16(Condition cond,
   2217                           Register rd,
   2218                           Register rn,
   2219                           Register rm) {
   2220   os().SetCurrentInstruction(kQsub16, kArithmetic);
   2221   os() << ToCString(kQsub16) << ConditionPrinter(it_block_, cond);
   2222   os() << " ";
   2223   if (!rd.Is(rn)) {
   2224     os() << rd << ", ";
   2225   }
   2226   os() << rn << ", " << rm;
   2227 }
   2228 
   2229 void Disassembler::qsub8(Condition cond,
   2230                          Register rd,
   2231                          Register rn,
   2232                          Register rm) {
   2233   os().SetCurrentInstruction(kQsub8, kArithmetic);
   2234   os() << ToCString(kQsub8) << ConditionPrinter(it_block_, cond);
   2235   os() << " ";
   2236   if (!rd.Is(rn)) {
   2237     os() << rd << ", ";
   2238   }
   2239   os() << rn << ", " << rm;
   2240 }
   2241 
   2242 void Disassembler::rbit(Condition cond, Register rd, Register rm) {
   2243   os().SetCurrentInstruction(kRbit, kNoAttribute);
   2244   os() << ToCString(kRbit) << ConditionPrinter(it_block_, cond) << " " << rd
   2245        << ", " << rm;
   2246 }
   2247 
   2248 void Disassembler::rev(Condition cond,
   2249                        EncodingSize size,
   2250                        Register rd,
   2251                        Register rm) {
   2252   os().SetCurrentInstruction(kRev, kNoAttribute);
   2253   os() << ToCString(kRev) << ConditionPrinter(it_block_, cond) << size << " "
   2254        << rd << ", " << rm;
   2255 }
   2256 
   2257 void Disassembler::rev16(Condition cond,
   2258                          EncodingSize size,
   2259                          Register rd,
   2260                          Register rm) {
   2261   os().SetCurrentInstruction(kRev16, kNoAttribute);
   2262   os() << ToCString(kRev16) << ConditionPrinter(it_block_, cond) << size << " "
   2263        << rd << ", " << rm;
   2264 }
   2265 
   2266 void Disassembler::revsh(Condition cond,
   2267                          EncodingSize size,
   2268                          Register rd,
   2269                          Register rm) {
   2270   os().SetCurrentInstruction(kRevsh, kNoAttribute);
   2271   os() << ToCString(kRevsh) << ConditionPrinter(it_block_, cond) << size << " "
   2272        << rd << ", " << rm;
   2273 }
   2274 
   2275 void Disassembler::ror(Condition cond,
   2276                        EncodingSize size,
   2277                        Register rd,
   2278                        Register rm,
   2279                        const Operand& operand) {
   2280   os().SetCurrentInstruction(kRor, kShift);
   2281   os() << ToCString(kRor) << ConditionPrinter(it_block_, cond) << size;
   2282   os() << " ";
   2283   if (!rd.Is(rm)) {
   2284     os() << rd << ", ";
   2285   }
   2286   os() << rm << ", " << operand;
   2287 }
   2288 
   2289 void Disassembler::rors(Condition cond,
   2290                         EncodingSize size,
   2291                         Register rd,
   2292                         Register rm,
   2293                         const Operand& operand) {
   2294   os().SetCurrentInstruction(kRors, kShift);
   2295   os() << ToCString(kRors) << ConditionPrinter(it_block_, cond) << size;
   2296   os() << " ";
   2297   if (!rd.Is(rm)) {
   2298     os() << rd << ", ";
   2299   }
   2300   os() << rm << ", " << operand;
   2301 }
   2302 
   2303 void Disassembler::rrx(Condition cond, Register rd, Register rm) {
   2304   os().SetCurrentInstruction(kRrx, kShift);
   2305   os() << ToCString(kRrx) << ConditionPrinter(it_block_, cond);
   2306   os() << " ";
   2307   if (!rd.Is(rm)) {
   2308     os() << rd << ", ";
   2309   }
   2310   os() << rm;
   2311 }
   2312 
   2313 void Disassembler::rrxs(Condition cond, Register rd, Register rm) {
   2314   os().SetCurrentInstruction(kRrxs, kShift);
   2315   os() << ToCString(kRrxs) << ConditionPrinter(it_block_, cond);
   2316   os() << " ";
   2317   if (!rd.Is(rm)) {
   2318     os() << rd << ", ";
   2319   }
   2320   os() << rm;
   2321 }
   2322 
   2323 void Disassembler::rsb(Condition cond,
   2324                        EncodingSize size,
   2325                        Register rd,
   2326                        Register rn,
   2327                        const Operand& operand) {
   2328   os().SetCurrentInstruction(kRsb, kArithmetic);
   2329   os() << ToCString(kRsb) << ConditionPrinter(it_block_, cond) << size;
   2330   os() << " ";
   2331   if (!rd.Is(rn)) {
   2332     os() << rd << ", ";
   2333   }
   2334   os() << rn << ", " << operand;
   2335 }
   2336 
   2337 void Disassembler::rsbs(Condition cond,
   2338                         EncodingSize size,
   2339                         Register rd,
   2340                         Register rn,
   2341                         const Operand& operand) {
   2342   os().SetCurrentInstruction(kRsbs, kArithmetic);
   2343   os() << ToCString(kRsbs) << ConditionPrinter(it_block_, cond) << size;
   2344   os() << " ";
   2345   if (!rd.Is(rn)) {
   2346     os() << rd << ", ";
   2347   }
   2348   os() << rn << ", " << operand;
   2349 }
   2350 
   2351 void Disassembler::rsc(Condition cond,
   2352                        Register rd,
   2353                        Register rn,
   2354                        const Operand& operand) {
   2355   os().SetCurrentInstruction(kRsc, kArithmetic);
   2356   os() << ToCString(kRsc) << ConditionPrinter(it_block_, cond);
   2357   os() << " ";
   2358   if (!rd.Is(rn)) {
   2359     os() << rd << ", ";
   2360   }
   2361   os() << rn << ", " << operand;
   2362 }
   2363 
   2364 void Disassembler::rscs(Condition cond,
   2365                         Register rd,
   2366                         Register rn,
   2367                         const Operand& operand) {
   2368   os().SetCurrentInstruction(kRscs, kArithmetic);
   2369   os() << ToCString(kRscs) << ConditionPrinter(it_block_, cond);
   2370   os() << " ";
   2371   if (!rd.Is(rn)) {
   2372     os() << rd << ", ";
   2373   }
   2374   os() << rn << ", " << operand;
   2375 }
   2376 
   2377 void Disassembler::sadd16(Condition cond,
   2378                           Register rd,
   2379                           Register rn,
   2380                           Register rm) {
   2381   os().SetCurrentInstruction(kSadd16, kArithmetic);
   2382   os() << ToCString(kSadd16) << ConditionPrinter(it_block_, cond);
   2383   os() << " ";
   2384   if (!rd.Is(rn)) {
   2385     os() << rd << ", ";
   2386   }
   2387   os() << rn << ", " << rm;
   2388 }
   2389 
   2390 void Disassembler::sadd8(Condition cond,
   2391                          Register rd,
   2392                          Register rn,
   2393                          Register rm) {
   2394   os().SetCurrentInstruction(kSadd8, kArithmetic);
   2395   os() << ToCString(kSadd8) << ConditionPrinter(it_block_, cond);
   2396   os() << " ";
   2397   if (!rd.Is(rn)) {
   2398     os() << rd << ", ";
   2399   }
   2400   os() << rn << ", " << rm;
   2401 }
   2402 
   2403 void Disassembler::sasx(Condition cond, Register rd, Register rn, Register rm) {
   2404   os().SetCurrentInstruction(kSasx, kArithmetic);
   2405   os() << ToCString(kSasx) << ConditionPrinter(it_block_, cond);
   2406   os() << " ";
   2407   if (!rd.Is(rn)) {
   2408     os() << rd << ", ";
   2409   }
   2410   os() << rn << ", " << rm;
   2411 }
   2412 
   2413 void Disassembler::sbc(Condition cond,
   2414                        EncodingSize size,
   2415                        Register rd,
   2416                        Register rn,
   2417                        const Operand& operand) {
   2418   os().SetCurrentInstruction(kSbc, kArithmetic);
   2419   os() << ToCString(kSbc) << ConditionPrinter(it_block_, cond) << size;
   2420   os() << " ";
   2421   if (!rd.Is(rn)) {
   2422     os() << rd << ", ";
   2423   }
   2424   os() << rn << ", " << operand;
   2425 }
   2426 
   2427 void Disassembler::sbcs(Condition cond,
   2428                         EncodingSize size,
   2429                         Register rd,
   2430                         Register rn,
   2431                         const Operand& operand) {
   2432   os().SetCurrentInstruction(kSbcs, kArithmetic);
   2433   os() << ToCString(kSbcs) << ConditionPrinter(it_block_, cond) << size;
   2434   os() << " ";
   2435   if (!rd.Is(rn)) {
   2436     os() << rd << ", ";
   2437   }
   2438   os() << rn << ", " << operand;
   2439 }
   2440 
   2441 void Disassembler::sbfx(Condition cond,
   2442                         Register rd,
   2443                         Register rn,
   2444                         uint32_t lsb,
   2445                         const Operand& operand) {
   2446   os().SetCurrentInstruction(kSbfx, kShift);
   2447   os() << ToCString(kSbfx) << ConditionPrinter(it_block_, cond) << " " << rd
   2448        << ", " << rn << ", "
   2449        << "#" << lsb << ", " << operand;
   2450 }
   2451 
   2452 void Disassembler::sdiv(Condition cond, Register rd, Register rn, Register rm) {
   2453   os().SetCurrentInstruction(kSdiv, kArithmetic);
   2454   os() << ToCString(kSdiv) << ConditionPrinter(it_block_, cond);
   2455   os() << " ";
   2456   if (!rd.Is(rn)) {
   2457     os() << rd << ", ";
   2458   }
   2459   os() << rn << ", " << rm;
   2460 }
   2461 
   2462 void Disassembler::sel(Condition cond, Register rd, Register rn, Register rm) {
   2463   os().SetCurrentInstruction(kSel, kNoAttribute);
   2464   os() << ToCString(kSel) << ConditionPrinter(it_block_, cond);
   2465   os() << " ";
   2466   if (!rd.Is(rn)) {
   2467     os() << rd << ", ";
   2468   }
   2469   os() << rn << ", " << rm;
   2470 }
   2471 
   2472 void Disassembler::shadd16(Condition cond,
   2473                            Register rd,
   2474                            Register rn,
   2475                            Register rm) {
   2476   os().SetCurrentInstruction(kShadd16, kArithmetic);
   2477   os() << ToCString(kShadd16) << ConditionPrinter(it_block_, cond);
   2478   os() << " ";
   2479   if (!rd.Is(rn)) {
   2480     os() << rd << ", ";
   2481   }
   2482   os() << rn << ", " << rm;
   2483 }
   2484 
   2485 void Disassembler::shadd8(Condition cond,
   2486                           Register rd,
   2487                           Register rn,
   2488                           Register rm) {
   2489   os().SetCurrentInstruction(kShadd8, kArithmetic);
   2490   os() << ToCString(kShadd8) << ConditionPrinter(it_block_, cond);
   2491   os() << " ";
   2492   if (!rd.Is(rn)) {
   2493     os() << rd << ", ";
   2494   }
   2495   os() << rn << ", " << rm;
   2496 }
   2497 
   2498 void Disassembler::shasx(Condition cond,
   2499                          Register rd,
   2500                          Register rn,
   2501                          Register rm) {
   2502   os().SetCurrentInstruction(kShasx, kArithmetic);
   2503   os() << ToCString(kShasx) << ConditionPrinter(it_block_, cond);
   2504   os() << " ";
   2505   if (!rd.Is(rn)) {
   2506     os() << rd << ", ";
   2507   }
   2508   os() << rn << ", " << rm;
   2509 }
   2510 
   2511 void Disassembler::shsax(Condition cond,
   2512                          Register rd,
   2513                          Register rn,
   2514                          Register rm) {
   2515   os().SetCurrentInstruction(kShsax, kArithmetic);
   2516   os() << ToCString(kShsax) << ConditionPrinter(it_block_, cond);
   2517   os() << " ";
   2518   if (!rd.Is(rn)) {
   2519     os() << rd << ", ";
   2520   }
   2521   os() << rn << ", " << rm;
   2522 }
   2523 
   2524 void Disassembler::shsub16(Condition cond,
   2525                            Register rd,
   2526                            Register rn,
   2527                            Register rm) {
   2528   os().SetCurrentInstruction(kShsub16, kArithmetic);
   2529   os() << ToCString(kShsub16) << ConditionPrinter(it_block_, cond);
   2530   os() << " ";
   2531   if (!rd.Is(rn)) {
   2532     os() << rd << ", ";
   2533   }
   2534   os() << rn << ", " << rm;
   2535 }
   2536 
   2537 void Disassembler::shsub8(Condition cond,
   2538                           Register rd,
   2539                           Register rn,
   2540                           Register rm) {
   2541   os().SetCurrentInstruction(kShsub8, kArithmetic);
   2542   os() << ToCString(kShsub8) << ConditionPrinter(it_block_, cond);
   2543   os() << " ";
   2544   if (!rd.Is(rn)) {
   2545     os() << rd << ", ";
   2546   }
   2547   os() << rn << ", " << rm;
   2548 }
   2549 
   2550 void Disassembler::smlabb(
   2551     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2552   os().SetCurrentInstruction(kSmlabb, kArithmetic);
   2553   os() << ToCString(kSmlabb) << ConditionPrinter(it_block_, cond) << " " << rd
   2554        << ", " << rn << ", " << rm << ", " << ra;
   2555 }
   2556 
   2557 void Disassembler::smlabt(
   2558     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2559   os().SetCurrentInstruction(kSmlabt, kArithmetic);
   2560   os() << ToCString(kSmlabt) << ConditionPrinter(it_block_, cond) << " " << rd
   2561        << ", " << rn << ", " << rm << ", " << ra;
   2562 }
   2563 
   2564 void Disassembler::smlad(
   2565     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2566   os().SetCurrentInstruction(kSmlad, kArithmetic);
   2567   os() << ToCString(kSmlad) << ConditionPrinter(it_block_, cond) << " " << rd
   2568        << ", " << rn << ", " << rm << ", " << ra;
   2569 }
   2570 
   2571 void Disassembler::smladx(
   2572     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2573   os().SetCurrentInstruction(kSmladx, kArithmetic);
   2574   os() << ToCString(kSmladx) << ConditionPrinter(it_block_, cond) << " " << rd
   2575        << ", " << rn << ", " << rm << ", " << ra;
   2576 }
   2577 
   2578 void Disassembler::smlal(
   2579     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2580   os().SetCurrentInstruction(kSmlal, kArithmetic);
   2581   os() << ToCString(kSmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2582        << ", " << rdhi << ", " << rn << ", " << rm;
   2583 }
   2584 
   2585 void Disassembler::smlalbb(
   2586     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2587   os().SetCurrentInstruction(kSmlalbb, kArithmetic);
   2588   os() << ToCString(kSmlalbb) << ConditionPrinter(it_block_, cond) << " "
   2589        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2590 }
   2591 
   2592 void Disassembler::smlalbt(
   2593     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2594   os().SetCurrentInstruction(kSmlalbt, kArithmetic);
   2595   os() << ToCString(kSmlalbt) << ConditionPrinter(it_block_, cond) << " "
   2596        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2597 }
   2598 
   2599 void Disassembler::smlald(
   2600     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2601   os().SetCurrentInstruction(kSmlald, kArithmetic);
   2602   os() << ToCString(kSmlald) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2603        << ", " << rdhi << ", " << rn << ", " << rm;
   2604 }
   2605 
   2606 void Disassembler::smlaldx(
   2607     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2608   os().SetCurrentInstruction(kSmlaldx, kArithmetic);
   2609   os() << ToCString(kSmlaldx) << ConditionPrinter(it_block_, cond) << " "
   2610        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2611 }
   2612 
   2613 void Disassembler::smlals(
   2614     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2615   os().SetCurrentInstruction(kSmlals, kArithmetic);
   2616   os() << ToCString(kSmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2617        << ", " << rdhi << ", " << rn << ", " << rm;
   2618 }
   2619 
   2620 void Disassembler::smlaltb(
   2621     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2622   os().SetCurrentInstruction(kSmlaltb, kArithmetic);
   2623   os() << ToCString(kSmlaltb) << ConditionPrinter(it_block_, cond) << " "
   2624        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2625 }
   2626 
   2627 void Disassembler::smlaltt(
   2628     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2629   os().SetCurrentInstruction(kSmlaltt, kArithmetic);
   2630   os() << ToCString(kSmlaltt) << ConditionPrinter(it_block_, cond) << " "
   2631        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2632 }
   2633 
   2634 void Disassembler::smlatb(
   2635     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2636   os().SetCurrentInstruction(kSmlatb, kArithmetic);
   2637   os() << ToCString(kSmlatb) << ConditionPrinter(it_block_, cond) << " " << rd
   2638        << ", " << rn << ", " << rm << ", " << ra;
   2639 }
   2640 
   2641 void Disassembler::smlatt(
   2642     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2643   os().SetCurrentInstruction(kSmlatt, kArithmetic);
   2644   os() << ToCString(kSmlatt) << ConditionPrinter(it_block_, cond) << " " << rd
   2645        << ", " << rn << ", " << rm << ", " << ra;
   2646 }
   2647 
   2648 void Disassembler::smlawb(
   2649     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2650   os().SetCurrentInstruction(kSmlawb, kArithmetic);
   2651   os() << ToCString(kSmlawb) << ConditionPrinter(it_block_, cond) << " " << rd
   2652        << ", " << rn << ", " << rm << ", " << ra;
   2653 }
   2654 
   2655 void Disassembler::smlawt(
   2656     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2657   os().SetCurrentInstruction(kSmlawt, kArithmetic);
   2658   os() << ToCString(kSmlawt) << ConditionPrinter(it_block_, cond) << " " << rd
   2659        << ", " << rn << ", " << rm << ", " << ra;
   2660 }
   2661 
   2662 void Disassembler::smlsd(
   2663     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2664   os().SetCurrentInstruction(kSmlsd, kArithmetic);
   2665   os() << ToCString(kSmlsd) << ConditionPrinter(it_block_, cond) << " " << rd
   2666        << ", " << rn << ", " << rm << ", " << ra;
   2667 }
   2668 
   2669 void Disassembler::smlsdx(
   2670     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2671   os().SetCurrentInstruction(kSmlsdx, kArithmetic);
   2672   os() << ToCString(kSmlsdx) << ConditionPrinter(it_block_, cond) << " " << rd
   2673        << ", " << rn << ", " << rm << ", " << ra;
   2674 }
   2675 
   2676 void Disassembler::smlsld(
   2677     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2678   os().SetCurrentInstruction(kSmlsld, kArithmetic);
   2679   os() << ToCString(kSmlsld) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2680        << ", " << rdhi << ", " << rn << ", " << rm;
   2681 }
   2682 
   2683 void Disassembler::smlsldx(
   2684     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2685   os().SetCurrentInstruction(kSmlsldx, kArithmetic);
   2686   os() << ToCString(kSmlsldx) << ConditionPrinter(it_block_, cond) << " "
   2687        << rdlo << ", " << rdhi << ", " << rn << ", " << rm;
   2688 }
   2689 
   2690 void Disassembler::smmla(
   2691     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2692   os().SetCurrentInstruction(kSmmla, kArithmetic);
   2693   os() << ToCString(kSmmla) << ConditionPrinter(it_block_, cond) << " " << rd
   2694        << ", " << rn << ", " << rm << ", " << ra;
   2695 }
   2696 
   2697 void Disassembler::smmlar(
   2698     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2699   os().SetCurrentInstruction(kSmmlar, kArithmetic);
   2700   os() << ToCString(kSmmlar) << ConditionPrinter(it_block_, cond) << " " << rd
   2701        << ", " << rn << ", " << rm << ", " << ra;
   2702 }
   2703 
   2704 void Disassembler::smmls(
   2705     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2706   os().SetCurrentInstruction(kSmmls, kArithmetic);
   2707   os() << ToCString(kSmmls) << ConditionPrinter(it_block_, cond) << " " << rd
   2708        << ", " << rn << ", " << rm << ", " << ra;
   2709 }
   2710 
   2711 void Disassembler::smmlsr(
   2712     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   2713   os().SetCurrentInstruction(kSmmlsr, kArithmetic);
   2714   os() << ToCString(kSmmlsr) << ConditionPrinter(it_block_, cond) << " " << rd
   2715        << ", " << rn << ", " << rm << ", " << ra;
   2716 }
   2717 
   2718 void Disassembler::smmul(Condition cond,
   2719                          Register rd,
   2720                          Register rn,
   2721                          Register rm) {
   2722   os().SetCurrentInstruction(kSmmul, kArithmetic);
   2723   os() << ToCString(kSmmul) << ConditionPrinter(it_block_, cond);
   2724   os() << " ";
   2725   if (!rd.Is(rn)) {
   2726     os() << rd << ", ";
   2727   }
   2728   os() << rn << ", " << rm;
   2729 }
   2730 
   2731 void Disassembler::smmulr(Condition cond,
   2732                           Register rd,
   2733                           Register rn,
   2734                           Register rm) {
   2735   os().SetCurrentInstruction(kSmmulr, kArithmetic);
   2736   os() << ToCString(kSmmulr) << ConditionPrinter(it_block_, cond);
   2737   os() << " ";
   2738   if (!rd.Is(rn)) {
   2739     os() << rd << ", ";
   2740   }
   2741   os() << rn << ", " << rm;
   2742 }
   2743 
   2744 void Disassembler::smuad(Condition cond,
   2745                          Register rd,
   2746                          Register rn,
   2747                          Register rm) {
   2748   os().SetCurrentInstruction(kSmuad, kArithmetic);
   2749   os() << ToCString(kSmuad) << ConditionPrinter(it_block_, cond);
   2750   os() << " ";
   2751   if (!rd.Is(rn)) {
   2752     os() << rd << ", ";
   2753   }
   2754   os() << rn << ", " << rm;
   2755 }
   2756 
   2757 void Disassembler::smuadx(Condition cond,
   2758                           Register rd,
   2759                           Register rn,
   2760                           Register rm) {
   2761   os().SetCurrentInstruction(kSmuadx, kArithmetic);
   2762   os() << ToCString(kSmuadx) << ConditionPrinter(it_block_, cond);
   2763   os() << " ";
   2764   if (!rd.Is(rn)) {
   2765     os() << rd << ", ";
   2766   }
   2767   os() << rn << ", " << rm;
   2768 }
   2769 
   2770 void Disassembler::smulbb(Condition cond,
   2771                           Register rd,
   2772                           Register rn,
   2773                           Register rm) {
   2774   os().SetCurrentInstruction(kSmulbb, kArithmetic);
   2775   os() << ToCString(kSmulbb) << ConditionPrinter(it_block_, cond);
   2776   os() << " ";
   2777   if (!rd.Is(rn)) {
   2778     os() << rd << ", ";
   2779   }
   2780   os() << rn << ", " << rm;
   2781 }
   2782 
   2783 void Disassembler::smulbt(Condition cond,
   2784                           Register rd,
   2785                           Register rn,
   2786                           Register rm) {
   2787   os().SetCurrentInstruction(kSmulbt, kArithmetic);
   2788   os() << ToCString(kSmulbt) << ConditionPrinter(it_block_, cond);
   2789   os() << " ";
   2790   if (!rd.Is(rn)) {
   2791     os() << rd << ", ";
   2792   }
   2793   os() << rn << ", " << rm;
   2794 }
   2795 
   2796 void Disassembler::smull(
   2797     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2798   os().SetCurrentInstruction(kSmull, kArithmetic);
   2799   os() << ToCString(kSmull) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2800        << ", " << rdhi << ", " << rn << ", " << rm;
   2801 }
   2802 
   2803 void Disassembler::smulls(
   2804     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   2805   os().SetCurrentInstruction(kSmulls, kArithmetic);
   2806   os() << ToCString(kSmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo
   2807        << ", " << rdhi << ", " << rn << ", " << rm;
   2808 }
   2809 
   2810 void Disassembler::smultb(Condition cond,
   2811                           Register rd,
   2812                           Register rn,
   2813                           Register rm) {
   2814   os().SetCurrentInstruction(kSmultb, kArithmetic);
   2815   os() << ToCString(kSmultb) << ConditionPrinter(it_block_, cond);
   2816   os() << " ";
   2817   if (!rd.Is(rn)) {
   2818     os() << rd << ", ";
   2819   }
   2820   os() << rn << ", " << rm;
   2821 }
   2822 
   2823 void Disassembler::smultt(Condition cond,
   2824                           Register rd,
   2825                           Register rn,
   2826                           Register rm) {
   2827   os().SetCurrentInstruction(kSmultt, kArithmetic);
   2828   os() << ToCString(kSmultt) << ConditionPrinter(it_block_, cond);
   2829   os() << " ";
   2830   if (!rd.Is(rn)) {
   2831     os() << rd << ", ";
   2832   }
   2833   os() << rn << ", " << rm;
   2834 }
   2835 
   2836 void Disassembler::smulwb(Condition cond,
   2837                           Register rd,
   2838                           Register rn,
   2839                           Register rm) {
   2840   os().SetCurrentInstruction(kSmulwb, kArithmetic);
   2841   os() << ToCString(kSmulwb) << ConditionPrinter(it_block_, cond);
   2842   os() << " ";
   2843   if (!rd.Is(rn)) {
   2844     os() << rd << ", ";
   2845   }
   2846   os() << rn << ", " << rm;
   2847 }
   2848 
   2849 void Disassembler::smulwt(Condition cond,
   2850                           Register rd,
   2851                           Register rn,
   2852                           Register rm) {
   2853   os().SetCurrentInstruction(kSmulwt, kArithmetic);
   2854   os() << ToCString(kSmulwt) << ConditionPrinter(it_block_, cond);
   2855   os() << " ";
   2856   if (!rd.Is(rn)) {
   2857     os() << rd << ", ";
   2858   }
   2859   os() << rn << ", " << rm;
   2860 }
   2861 
   2862 void Disassembler::smusd(Condition cond,
   2863                          Register rd,
   2864                          Register rn,
   2865                          Register rm) {
   2866   os().SetCurrentInstruction(kSmusd, kArithmetic);
   2867   os() << ToCString(kSmusd) << ConditionPrinter(it_block_, cond);
   2868   os() << " ";
   2869   if (!rd.Is(rn)) {
   2870     os() << rd << ", ";
   2871   }
   2872   os() << rn << ", " << rm;
   2873 }
   2874 
   2875 void Disassembler::smusdx(Condition cond,
   2876                           Register rd,
   2877                           Register rn,
   2878                           Register rm) {
   2879   os().SetCurrentInstruction(kSmusdx, kArithmetic);
   2880   os() << ToCString(kSmusdx) << ConditionPrinter(it_block_, cond);
   2881   os() << " ";
   2882   if (!rd.Is(rn)) {
   2883     os() << rd << ", ";
   2884   }
   2885   os() << rn << ", " << rm;
   2886 }
   2887 
   2888 void Disassembler::ssat(Condition cond,
   2889                         Register rd,
   2890                         uint32_t imm,
   2891                         const Operand& operand) {
   2892   os().SetCurrentInstruction(kSsat, kArithmetic);
   2893   os() << ToCString(kSsat) << ConditionPrinter(it_block_, cond) << " " << rd
   2894        << ", "
   2895        << "#" << imm << ", " << operand;
   2896 }
   2897 
   2898 void Disassembler::ssat16(Condition cond,
   2899                           Register rd,
   2900                           uint32_t imm,
   2901                           Register rn) {
   2902   os().SetCurrentInstruction(kSsat16, kArithmetic);
   2903   os() << ToCString(kSsat16) << ConditionPrinter(it_block_, cond) << " " << rd
   2904        << ", "
   2905        << "#" << imm << ", " << rn;
   2906 }
   2907 
   2908 void Disassembler::ssax(Condition cond, Register rd, Register rn, Register rm) {
   2909   os().SetCurrentInstruction(kSsax, kArithmetic);
   2910   os() << ToCString(kSsax) << ConditionPrinter(it_block_, cond);
   2911   os() << " ";
   2912   if (!rd.Is(rn)) {
   2913     os() << rd << ", ";
   2914   }
   2915   os() << rn << ", " << rm;
   2916 }
   2917 
   2918 void Disassembler::ssub16(Condition cond,
   2919                           Register rd,
   2920                           Register rn,
   2921                           Register rm) {
   2922   os().SetCurrentInstruction(kSsub16, kArithmetic);
   2923   os() << ToCString(kSsub16) << ConditionPrinter(it_block_, cond);
   2924   os() << " ";
   2925   if (!rd.Is(rn)) {
   2926     os() << rd << ", ";
   2927   }
   2928   os() << rn << ", " << rm;
   2929 }
   2930 
   2931 void Disassembler::ssub8(Condition cond,
   2932                          Register rd,
   2933                          Register rn,
   2934                          Register rm) {
   2935   os().SetCurrentInstruction(kSsub8, kArithmetic);
   2936   os() << ToCString(kSsub8) << ConditionPrinter(it_block_, cond);
   2937   os() << " ";
   2938   if (!rd.Is(rn)) {
   2939     os() << rd << ", ";
   2940   }
   2941   os() << rn << ", " << rm;
   2942 }
   2943 
   2944 void Disassembler::stl(Condition cond, Register rt, const MemOperand& operand) {
   2945   os().SetCurrentInstruction(kStl, kAddress | kLoadStore);
   2946   os() << ToCString(kStl) << ConditionPrinter(it_block_, cond) << " " << rt
   2947        << ", " << PrintMemOperand(kStoreWordLocation, operand);
   2948 }
   2949 
   2950 void Disassembler::stlb(Condition cond,
   2951                         Register rt,
   2952                         const MemOperand& operand) {
   2953   os().SetCurrentInstruction(kStlb, kAddress | kLoadStore);
   2954   os() << ToCString(kStlb) << ConditionPrinter(it_block_, cond) << " " << rt
   2955        << ", " << PrintMemOperand(kStoreByteLocation, operand);
   2956 }
   2957 
   2958 void Disassembler::stlex(Condition cond,
   2959                          Register rd,
   2960                          Register rt,
   2961                          const MemOperand& operand) {
   2962   os().SetCurrentInstruction(kStlex, kAddress | kLoadStore);
   2963   os() << ToCString(kStlex) << ConditionPrinter(it_block_, cond) << " " << rd
   2964        << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
   2965 }
   2966 
   2967 void Disassembler::stlexb(Condition cond,
   2968                           Register rd,
   2969                           Register rt,
   2970                           const MemOperand& operand) {
   2971   os().SetCurrentInstruction(kStlexb, kAddress | kLoadStore);
   2972   os() << ToCString(kStlexb) << ConditionPrinter(it_block_, cond) << " " << rd
   2973        << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
   2974 }
   2975 
   2976 void Disassembler::stlexd(Condition cond,
   2977                           Register rd,
   2978                           Register rt,
   2979                           Register rt2,
   2980                           const MemOperand& operand) {
   2981   os().SetCurrentInstruction(kStlexd, kAddress | kLoadStore);
   2982   os() << ToCString(kStlexd) << ConditionPrinter(it_block_, cond) << " " << rd
   2983        << ", " << rt << ", " << rt2 << ", "
   2984        << PrintMemOperand(kStoreDoubleWordLocation, operand);
   2985 }
   2986 
   2987 void Disassembler::stlexh(Condition cond,
   2988                           Register rd,
   2989                           Register rt,
   2990                           const MemOperand& operand) {
   2991   os().SetCurrentInstruction(kStlexh, kAddress | kLoadStore);
   2992   os() << ToCString(kStlexh) << ConditionPrinter(it_block_, cond) << " " << rd
   2993        << ", " << rt << ", "
   2994        << PrintMemOperand(kStoreHalfWordLocation, operand);
   2995 }
   2996 
   2997 void Disassembler::stlh(Condition cond,
   2998                         Register rt,
   2999                         const MemOperand& operand) {
   3000   os().SetCurrentInstruction(kStlh, kAddress | kLoadStore);
   3001   os() << ToCString(kStlh) << ConditionPrinter(it_block_, cond) << " " << rt
   3002        << ", " << PrintMemOperand(kStoreHalfWordLocation, operand);
   3003 }
   3004 
   3005 void Disassembler::stm(Condition cond,
   3006                        EncodingSize size,
   3007                        Register rn,
   3008                        WriteBack write_back,
   3009                        RegisterList registers) {
   3010   os().SetCurrentInstruction(kStm, kLoadStore | kLoadStoreMultiple);
   3011   os() << ToCString(kStm) << ConditionPrinter(it_block_, cond) << size << " "
   3012        << rn << write_back << ", " << registers;
   3013 }
   3014 
   3015 void Disassembler::stmda(Condition cond,
   3016                          Register rn,
   3017                          WriteBack write_back,
   3018                          RegisterList registers) {
   3019   os().SetCurrentInstruction(kStmda, kLoadStore | kLoadStoreMultiple);
   3020   os() << ToCString(kStmda) << ConditionPrinter(it_block_, cond) << " " << rn
   3021        << write_back << ", " << registers;
   3022 }
   3023 
   3024 void Disassembler::stmdb(Condition cond,
   3025                          EncodingSize size,
   3026                          Register rn,
   3027                          WriteBack write_back,
   3028                          RegisterList registers) {
   3029   os().SetCurrentInstruction(kStmdb, kLoadStore | kLoadStoreMultiple);
   3030   os() << ToCString(kStmdb) << ConditionPrinter(it_block_, cond) << size << " "
   3031        << rn << write_back << ", " << registers;
   3032 }
   3033 
   3034 void Disassembler::stmea(Condition cond,
   3035                          EncodingSize size,
   3036                          Register rn,
   3037                          WriteBack write_back,
   3038                          RegisterList registers) {
   3039   os().SetCurrentInstruction(kStmea, kLoadStore | kLoadStoreMultiple);
   3040   os() << ToCString(kStmea) << ConditionPrinter(it_block_, cond) << size << " "
   3041        << rn << write_back << ", " << registers;
   3042 }
   3043 
   3044 void Disassembler::stmed(Condition cond,
   3045                          Register rn,
   3046                          WriteBack write_back,
   3047                          RegisterList registers) {
   3048   os().SetCurrentInstruction(kStmed, kLoadStore | kLoadStoreMultiple);
   3049   os() << ToCString(kStmed) << ConditionPrinter(it_block_, cond) << " " << rn
   3050        << write_back << ", " << registers;
   3051 }
   3052 
   3053 void Disassembler::stmfa(Condition cond,
   3054                          Register rn,
   3055                          WriteBack write_back,
   3056                          RegisterList registers) {
   3057   os().SetCurrentInstruction(kStmfa, kLoadStore | kLoadStoreMultiple);
   3058   os() << ToCString(kStmfa) << ConditionPrinter(it_block_, cond) << " " << rn
   3059        << write_back << ", " << registers;
   3060 }
   3061 
   3062 void Disassembler::stmfd(Condition cond,
   3063                          Register rn,
   3064                          WriteBack write_back,
   3065                          RegisterList registers) {
   3066   os().SetCurrentInstruction(kStmfd, kLoadStore | kLoadStoreMultiple);
   3067   os() << ToCString(kStmfd) << ConditionPrinter(it_block_, cond) << " " << rn
   3068        << write_back << ", " << registers;
   3069 }
   3070 
   3071 void Disassembler::stmib(Condition cond,
   3072                          Register rn,
   3073                          WriteBack write_back,
   3074                          RegisterList registers) {
   3075   os().SetCurrentInstruction(kStmib, kLoadStore | kLoadStoreMultiple);
   3076   os() << ToCString(kStmib) << ConditionPrinter(it_block_, cond) << " " << rn
   3077        << write_back << ", " << registers;
   3078 }
   3079 
   3080 void Disassembler::str(Condition cond,
   3081                        EncodingSize size,
   3082                        Register rt,
   3083                        const MemOperand& operand) {
   3084   os().SetCurrentInstruction(kStr, kAddress | kLoadStore);
   3085   os() << ToCString(kStr) << ConditionPrinter(it_block_, cond) << size << " "
   3086        << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
   3087 }
   3088 
   3089 void Disassembler::strb(Condition cond,
   3090                         EncodingSize size,
   3091                         Register rt,
   3092                         const MemOperand& operand) {
   3093   os().SetCurrentInstruction(kStrb, kAddress | kLoadStore);
   3094   os() << ToCString(kStrb) << ConditionPrinter(it_block_, cond) << size << " "
   3095        << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
   3096 }
   3097 
   3098 void Disassembler::strd(Condition cond,
   3099                         Register rt,
   3100                         Register rt2,
   3101                         const MemOperand& operand) {
   3102   os().SetCurrentInstruction(kStrd, kAddress | kLoadStore);
   3103   os() << ToCString(kStrd) << ConditionPrinter(it_block_, cond) << " " << rt
   3104        << ", " << rt2 << ", "
   3105        << PrintMemOperand(kStoreDoubleWordLocation, operand);
   3106 }
   3107 
   3108 void Disassembler::strex(Condition cond,
   3109                          Register rd,
   3110                          Register rt,
   3111                          const MemOperand& operand) {
   3112   os().SetCurrentInstruction(kStrex, kAddress | kLoadStore);
   3113   os() << ToCString(kStrex) << ConditionPrinter(it_block_, cond) << " " << rd
   3114        << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand);
   3115 }
   3116 
   3117 void Disassembler::strexb(Condition cond,
   3118                           Register rd,
   3119                           Register rt,
   3120                           const MemOperand& operand) {
   3121   os().SetCurrentInstruction(kStrexb, kAddress | kLoadStore);
   3122   os() << ToCString(kStrexb) << ConditionPrinter(it_block_, cond) << " " << rd
   3123        << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand);
   3124 }
   3125 
   3126 void Disassembler::strexd(Condition cond,
   3127                           Register rd,
   3128                           Register rt,
   3129                           Register rt2,
   3130                           const MemOperand& operand) {
   3131   os().SetCurrentInstruction(kStrexd, kAddress | kLoadStore);
   3132   os() << ToCString(kStrexd) << ConditionPrinter(it_block_, cond) << " " << rd
   3133        << ", " << rt << ", " << rt2 << ", "
   3134        << PrintMemOperand(kStoreDoubleWordLocation, operand);
   3135 }
   3136 
   3137 void Disassembler::strexh(Condition cond,
   3138                           Register rd,
   3139                           Register rt,
   3140                           const MemOperand& operand) {
   3141   os().SetCurrentInstruction(kStrexh, kAddress | kLoadStore);
   3142   os() << ToCString(kStrexh) << ConditionPrinter(it_block_, cond) << " " << rd
   3143        << ", " << rt << ", "
   3144        << PrintMemOperand(kStoreHalfWordLocation, operand);
   3145 }
   3146 
   3147 void Disassembler::strh(Condition cond,
   3148                         EncodingSize size,
   3149                         Register rt,
   3150                         const MemOperand& operand) {
   3151   os().SetCurrentInstruction(kStrh, kAddress | kLoadStore);
   3152   os() << ToCString(kStrh) << ConditionPrinter(it_block_, cond) << size << " "
   3153        << rt << ", " << PrintMemOperand(kStoreHalfWordLocation, operand);
   3154 }
   3155 
   3156 void Disassembler::sub(Condition cond,
   3157                        EncodingSize size,
   3158                        Register rd,
   3159                        Register rn,
   3160                        const Operand& operand) {
   3161   os().SetCurrentInstruction(kSub, kArithmetic);
   3162   os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << size;
   3163   os() << " ";
   3164   if (!rd.Is(rn)) {
   3165     os() << rd << ", ";
   3166   }
   3167   os() << rn << ", " << operand;
   3168 }
   3169 
   3170 void Disassembler::sub(Condition cond, Register rd, const Operand& operand) {
   3171   os().SetCurrentInstruction(kSub, kArithmetic);
   3172   os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << " " << rd
   3173        << ", " << operand;
   3174 }
   3175 
   3176 void Disassembler::subs(Condition cond,
   3177                         EncodingSize size,
   3178                         Register rd,
   3179                         Register rn,
   3180                         const Operand& operand) {
   3181   os().SetCurrentInstruction(kSubs, kArithmetic);
   3182   os() << ToCString(kSubs) << ConditionPrinter(it_block_, cond) << size;
   3183   os() << " ";
   3184   if (!rd.Is(rn)) {
   3185     os() << rd << ", ";
   3186   }
   3187   os() << rn << ", " << operand;
   3188 }
   3189 
   3190 void Disassembler::subs(Register rd, const Operand& operand) {
   3191   os().SetCurrentInstruction(kSubs, kArithmetic);
   3192   os() << ToCString(kSubs) << " " << rd << ", " << operand;
   3193 }
   3194 
   3195 void Disassembler::subw(Condition cond,
   3196                         Register rd,
   3197                         Register rn,
   3198                         const Operand& operand) {
   3199   os().SetCurrentInstruction(kSubw, kArithmetic);
   3200   os() << ToCString(kSubw) << ConditionPrinter(it_block_, cond);
   3201   os() << " ";
   3202   if (!rd.Is(rn)) {
   3203     os() << rd << ", ";
   3204   }
   3205   os() << rn << ", " << operand;
   3206 }
   3207 
   3208 void Disassembler::svc(Condition cond, uint32_t imm) {
   3209   os().SetCurrentInstruction(kSvc, kSystem);
   3210   os() << ToCString(kSvc) << ConditionPrinter(it_block_, cond) << " " << imm;
   3211 }
   3212 
   3213 void Disassembler::sxtab(Condition cond,
   3214                          Register rd,
   3215                          Register rn,
   3216                          const Operand& operand) {
   3217   os().SetCurrentInstruction(kSxtab, kArithmetic);
   3218   os() << ToCString(kSxtab) << ConditionPrinter(it_block_, cond);
   3219   os() << " ";
   3220   if (!rd.Is(rn)) {
   3221     os() << rd << ", ";
   3222   }
   3223   os() << rn << ", " << operand;
   3224 }
   3225 
   3226 void Disassembler::sxtab16(Condition cond,
   3227                            Register rd,
   3228                            Register rn,
   3229                            const Operand& operand) {
   3230   os().SetCurrentInstruction(kSxtab16, kArithmetic);
   3231   os() << ToCString(kSxtab16) << ConditionPrinter(it_block_, cond);
   3232   os() << " ";
   3233   if (!rd.Is(rn)) {
   3234     os() << rd << ", ";
   3235   }
   3236   os() << rn << ", " << operand;
   3237 }
   3238 
   3239 void Disassembler::sxtah(Condition cond,
   3240                          Register rd,
   3241                          Register rn,
   3242                          const Operand& operand) {
   3243   os().SetCurrentInstruction(kSxtah, kArithmetic);
   3244   os() << ToCString(kSxtah) << ConditionPrinter(it_block_, cond);
   3245   os() << " ";
   3246   if (!rd.Is(rn)) {
   3247     os() << rd << ", ";
   3248   }
   3249   os() << rn << ", " << operand;
   3250 }
   3251 
   3252 void Disassembler::sxtb(Condition cond,
   3253                         EncodingSize size,
   3254                         Register rd,
   3255                         const Operand& operand) {
   3256   os().SetCurrentInstruction(kSxtb, kArithmetic);
   3257   os() << ToCString(kSxtb) << ConditionPrinter(it_block_, cond) << size;
   3258   os() << " ";
   3259   if (!rd.Is(operand.GetBaseRegister())) {
   3260     os() << rd << ", ";
   3261   }
   3262   os() << operand;
   3263 }
   3264 
   3265 void Disassembler::sxtb16(Condition cond, Register rd, const Operand& operand) {
   3266   os().SetCurrentInstruction(kSxtb16, kArithmetic);
   3267   os() << ToCString(kSxtb16) << ConditionPrinter(it_block_, cond);
   3268   os() << " ";
   3269   if (!rd.Is(operand.GetBaseRegister())) {
   3270     os() << rd << ", ";
   3271   }
   3272   os() << operand;
   3273 }
   3274 
   3275 void Disassembler::sxth(Condition cond,
   3276                         EncodingSize size,
   3277                         Register rd,
   3278                         const Operand& operand) {
   3279   os().SetCurrentInstruction(kSxth, kArithmetic);
   3280   os() << ToCString(kSxth) << ConditionPrinter(it_block_, cond) << size;
   3281   os() << " ";
   3282   if (!rd.Is(operand.GetBaseRegister())) {
   3283     os() << rd << ", ";
   3284   }
   3285   os() << operand;
   3286 }
   3287 
   3288 void Disassembler::tbb(Condition cond, Register rn, Register rm) {
   3289   os().SetCurrentInstruction(kTbb, kBranch);
   3290   os() << ToCString(kTbb) << ConditionPrinter(it_block_, cond) << " "
   3291        << MemOperand(rn, rm);
   3292 }
   3293 
   3294 void Disassembler::tbh(Condition cond, Register rn, Register rm) {
   3295   os().SetCurrentInstruction(kTbh, kBranch);
   3296   os() << ToCString(kTbh) << ConditionPrinter(it_block_, cond) << " "
   3297        << MemOperand(rn, plus, rm, LSL, 1);
   3298 }
   3299 
   3300 void Disassembler::teq(Condition cond, Register rn, const Operand& operand) {
   3301   os().SetCurrentInstruction(kTeq, kBitwise);
   3302   os() << ToCString(kTeq) << ConditionPrinter(it_block_, cond) << " " << rn
   3303        << ", " << operand;
   3304 }
   3305 
   3306 void Disassembler::tst(Condition cond,
   3307                        EncodingSize size,
   3308                        Register rn,
   3309                        const Operand& operand) {
   3310   os().SetCurrentInstruction(kTst, kBitwise);
   3311   os() << ToCString(kTst) << ConditionPrinter(it_block_, cond) << size << " "
   3312        << rn << ", " << operand;
   3313 }
   3314 
   3315 void Disassembler::uadd16(Condition cond,
   3316                           Register rd,
   3317                           Register rn,
   3318                           Register rm) {
   3319   os().SetCurrentInstruction(kUadd16, kArithmetic);
   3320   os() << ToCString(kUadd16) << ConditionPrinter(it_block_, cond);
   3321   os() << " ";
   3322   if (!rd.Is(rn)) {
   3323     os() << rd << ", ";
   3324   }
   3325   os() << rn << ", " << rm;
   3326 }
   3327 
   3328 void Disassembler::uadd8(Condition cond,
   3329                          Register rd,
   3330                          Register rn,
   3331                          Register rm) {
   3332   os().SetCurrentInstruction(kUadd8, kArithmetic);
   3333   os() << ToCString(kUadd8) << ConditionPrinter(it_block_, cond);
   3334   os() << " ";
   3335   if (!rd.Is(rn)) {
   3336     os() << rd << ", ";
   3337   }
   3338   os() << rn << ", " << rm;
   3339 }
   3340 
   3341 void Disassembler::uasx(Condition cond, Register rd, Register rn, Register rm) {
   3342   os().SetCurrentInstruction(kUasx, kArithmetic);
   3343   os() << ToCString(kUasx) << ConditionPrinter(it_block_, cond);
   3344   os() << " ";
   3345   if (!rd.Is(rn)) {
   3346     os() << rd << ", ";
   3347   }
   3348   os() << rn << ", " << rm;
   3349 }
   3350 
   3351 void Disassembler::ubfx(Condition cond,
   3352                         Register rd,
   3353                         Register rn,
   3354                         uint32_t lsb,
   3355                         const Operand& operand) {
   3356   os().SetCurrentInstruction(kUbfx, kShift);
   3357   os() << ToCString(kUbfx) << ConditionPrinter(it_block_, cond) << " " << rd
   3358        << ", " << rn << ", "
   3359        << "#" << lsb << ", " << operand;
   3360 }
   3361 
   3362 void Disassembler::udf(Condition cond, EncodingSize size, uint32_t imm) {
   3363   os().SetCurrentInstruction(kUdf, kNoAttribute);
   3364   os() << ToCString(kUdf) << ConditionPrinter(it_block_, cond) << size << " "
   3365        << imm;
   3366 }
   3367 
   3368 void Disassembler::udiv(Condition cond, Register rd, Register rn, Register rm) {
   3369   os().SetCurrentInstruction(kUdiv, kArithmetic);
   3370   os() << ToCString(kUdiv) << ConditionPrinter(it_block_, cond);
   3371   os() << " ";
   3372   if (!rd.Is(rn)) {
   3373     os() << rd << ", ";
   3374   }
   3375   os() << rn << ", " << rm;
   3376 }
   3377 
   3378 void Disassembler::uhadd16(Condition cond,
   3379                            Register rd,
   3380                            Register rn,
   3381                            Register rm) {
   3382   os().SetCurrentInstruction(kUhadd16, kArithmetic);
   3383   os() << ToCString(kUhadd16) << ConditionPrinter(it_block_, cond);
   3384   os() << " ";
   3385   if (!rd.Is(rn)) {
   3386     os() << rd << ", ";
   3387   }
   3388   os() << rn << ", " << rm;
   3389 }
   3390 
   3391 void Disassembler::uhadd8(Condition cond,
   3392                           Register rd,
   3393                           Register rn,
   3394                           Register rm) {
   3395   os().SetCurrentInstruction(kUhadd8, kArithmetic);
   3396   os() << ToCString(kUhadd8) << ConditionPrinter(it_block_, cond);
   3397   os() << " ";
   3398   if (!rd.Is(rn)) {
   3399     os() << rd << ", ";
   3400   }
   3401   os() << rn << ", " << rm;
   3402 }
   3403 
   3404 void Disassembler::uhasx(Condition cond,
   3405                          Register rd,
   3406                          Register rn,
   3407                          Register rm) {
   3408   os().SetCurrentInstruction(kUhasx, kArithmetic);
   3409   os() << ToCString(kUhasx) << ConditionPrinter(it_block_, cond);
   3410   os() << " ";
   3411   if (!rd.Is(rn)) {
   3412     os() << rd << ", ";
   3413   }
   3414   os() << rn << ", " << rm;
   3415 }
   3416 
   3417 void Disassembler::uhsax(Condition cond,
   3418                          Register rd,
   3419                          Register rn,
   3420                          Register rm) {
   3421   os().SetCurrentInstruction(kUhsax, kArithmetic);
   3422   os() << ToCString(kUhsax) << ConditionPrinter(it_block_, cond);
   3423   os() << " ";
   3424   if (!rd.Is(rn)) {
   3425     os() << rd << ", ";
   3426   }
   3427   os() << rn << ", " << rm;
   3428 }
   3429 
   3430 void Disassembler::uhsub16(Condition cond,
   3431                            Register rd,
   3432                            Register rn,
   3433                            Register rm) {
   3434   os().SetCurrentInstruction(kUhsub16, kArithmetic);
   3435   os() << ToCString(kUhsub16) << ConditionPrinter(it_block_, cond);
   3436   os() << " ";
   3437   if (!rd.Is(rn)) {
   3438     os() << rd << ", ";
   3439   }
   3440   os() << rn << ", " << rm;
   3441 }
   3442 
   3443 void Disassembler::uhsub8(Condition cond,
   3444                           Register rd,
   3445                           Register rn,
   3446                           Register rm) {
   3447   os().SetCurrentInstruction(kUhsub8, kArithmetic);
   3448   os() << ToCString(kUhsub8) << ConditionPrinter(it_block_, cond);
   3449   os() << " ";
   3450   if (!rd.Is(rn)) {
   3451     os() << rd << ", ";
   3452   }
   3453   os() << rn << ", " << rm;
   3454 }
   3455 
   3456 void Disassembler::umaal(
   3457     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3458   os().SetCurrentInstruction(kUmaal, kArithmetic);
   3459   os() << ToCString(kUmaal) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3460        << ", " << rdhi << ", " << rn << ", " << rm;
   3461 }
   3462 
   3463 void Disassembler::umlal(
   3464     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3465   os().SetCurrentInstruction(kUmlal, kArithmetic);
   3466   os() << ToCString(kUmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3467        << ", " << rdhi << ", " << rn << ", " << rm;
   3468 }
   3469 
   3470 void Disassembler::umlals(
   3471     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3472   os().SetCurrentInstruction(kUmlals, kArithmetic);
   3473   os() << ToCString(kUmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3474        << ", " << rdhi << ", " << rn << ", " << rm;
   3475 }
   3476 
   3477 void Disassembler::umull(
   3478     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3479   os().SetCurrentInstruction(kUmull, kArithmetic);
   3480   os() << ToCString(kUmull) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3481        << ", " << rdhi << ", " << rn << ", " << rm;
   3482 }
   3483 
   3484 void Disassembler::umulls(
   3485     Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
   3486   os().SetCurrentInstruction(kUmulls, kArithmetic);
   3487   os() << ToCString(kUmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo
   3488        << ", " << rdhi << ", " << rn << ", " << rm;
   3489 }
   3490 
   3491 void Disassembler::uqadd16(Condition cond,
   3492                            Register rd,
   3493                            Register rn,
   3494                            Register rm) {
   3495   os().SetCurrentInstruction(kUqadd16, kArithmetic);
   3496   os() << ToCString(kUqadd16) << ConditionPrinter(it_block_, cond);
   3497   os() << " ";
   3498   if (!rd.Is(rn)) {
   3499     os() << rd << ", ";
   3500   }
   3501   os() << rn << ", " << rm;
   3502 }
   3503 
   3504 void Disassembler::uqadd8(Condition cond,
   3505                           Register rd,
   3506                           Register rn,
   3507                           Register rm) {
   3508   os().SetCurrentInstruction(kUqadd8, kArithmetic);
   3509   os() << ToCString(kUqadd8) << ConditionPrinter(it_block_, cond);
   3510   os() << " ";
   3511   if (!rd.Is(rn)) {
   3512     os() << rd << ", ";
   3513   }
   3514   os() << rn << ", " << rm;
   3515 }
   3516 
   3517 void Disassembler::uqasx(Condition cond,
   3518                          Register rd,
   3519                          Register rn,
   3520                          Register rm) {
   3521   os().SetCurrentInstruction(kUqasx, kArithmetic);
   3522   os() << ToCString(kUqasx) << ConditionPrinter(it_block_, cond);
   3523   os() << " ";
   3524   if (!rd.Is(rn)) {
   3525     os() << rd << ", ";
   3526   }
   3527   os() << rn << ", " << rm;
   3528 }
   3529 
   3530 void Disassembler::uqsax(Condition cond,
   3531                          Register rd,
   3532                          Register rn,
   3533                          Register rm) {
   3534   os().SetCurrentInstruction(kUqsax, kArithmetic);
   3535   os() << ToCString(kUqsax) << ConditionPrinter(it_block_, cond);
   3536   os() << " ";
   3537   if (!rd.Is(rn)) {
   3538     os() << rd << ", ";
   3539   }
   3540   os() << rn << ", " << rm;
   3541 }
   3542 
   3543 void Disassembler::uqsub16(Condition cond,
   3544                            Register rd,
   3545                            Register rn,
   3546                            Register rm) {
   3547   os().SetCurrentInstruction(kUqsub16, kArithmetic);
   3548   os() << ToCString(kUqsub16) << ConditionPrinter(it_block_, cond);
   3549   os() << " ";
   3550   if (!rd.Is(rn)) {
   3551     os() << rd << ", ";
   3552   }
   3553   os() << rn << ", " << rm;
   3554 }
   3555 
   3556 void Disassembler::uqsub8(Condition cond,
   3557                           Register rd,
   3558                           Register rn,
   3559                           Register rm) {
   3560   os().SetCurrentInstruction(kUqsub8, kArithmetic);
   3561   os() << ToCString(kUqsub8) << ConditionPrinter(it_block_, cond);
   3562   os() << " ";
   3563   if (!rd.Is(rn)) {
   3564     os() << rd << ", ";
   3565   }
   3566   os() << rn << ", " << rm;
   3567 }
   3568 
   3569 void Disassembler::usad8(Condition cond,
   3570                          Register rd,
   3571                          Register rn,
   3572                          Register rm) {
   3573   os().SetCurrentInstruction(kUsad8, kArithmetic);
   3574   os() << ToCString(kUsad8) << ConditionPrinter(it_block_, cond);
   3575   os() << " ";
   3576   if (!rd.Is(rn)) {
   3577     os() << rd << ", ";
   3578   }
   3579   os() << rn << ", " << rm;
   3580 }
   3581 
   3582 void Disassembler::usada8(
   3583     Condition cond, Register rd, Register rn, Register rm, Register ra) {
   3584   os().SetCurrentInstruction(kUsada8, kArithmetic);
   3585   os() << ToCString(kUsada8) << ConditionPrinter(it_block_, cond) << " " << rd
   3586        << ", " << rn << ", " << rm << ", " << ra;
   3587 }
   3588 
   3589 void Disassembler::usat(Condition cond,
   3590                         Register rd,
   3591                         uint32_t imm,
   3592                         const Operand& operand) {
   3593   os().SetCurrentInstruction(kUsat, kArithmetic);
   3594   os() << ToCString(kUsat) << ConditionPrinter(it_block_, cond) << " " << rd
   3595        << ", "
   3596        << "#" << imm << ", " << operand;
   3597 }
   3598 
   3599 void Disassembler::usat16(Condition cond,
   3600                           Register rd,
   3601                           uint32_t imm,
   3602                           Register rn) {
   3603   os().SetCurrentInstruction(kUsat16, kArithmetic);
   3604   os() << ToCString(kUsat16) << ConditionPrinter(it_block_, cond) << " " << rd
   3605        << ", "
   3606        << "#" << imm << ", " << rn;
   3607 }
   3608 
   3609 void Disassembler::usax(Condition cond, Register rd, Register rn, Register rm) {
   3610   os().SetCurrentInstruction(kUsax, kArithmetic);
   3611   os() << ToCString(kUsax) << ConditionPrinter(it_block_, cond);
   3612   os() << " ";
   3613   if (!rd.Is(rn)) {
   3614     os() << rd << ", ";
   3615   }
   3616   os() << rn << ", " << rm;
   3617 }
   3618 
   3619 void Disassembler::usub16(Condition cond,
   3620                           Register rd,
   3621                           Register rn,
   3622                           Register rm) {
   3623   os().SetCurrentInstruction(kUsub16, kArithmetic);
   3624   os() << ToCString(kUsub16) << ConditionPrinter(it_block_, cond);
   3625   os() << " ";
   3626   if (!rd.Is(rn)) {
   3627     os() << rd << ", ";
   3628   }
   3629   os() << rn << ", " << rm;
   3630 }
   3631 
   3632 void Disassembler::usub8(Condition cond,
   3633                          Register rd,
   3634                          Register rn,
   3635                          Register rm) {
   3636   os().SetCurrentInstruction(kUsub8, kArithmetic);
   3637   os() << ToCString(kUsub8) << ConditionPrinter(it_block_, cond);
   3638   os() << " ";
   3639   if (!rd.Is(rn)) {
   3640     os() << rd << ", ";
   3641   }
   3642   os() << rn << ", " << rm;
   3643 }
   3644 
   3645 void Disassembler::uxtab(Condition cond,
   3646                          Register rd,
   3647                          Register rn,
   3648                          const Operand& operand) {
   3649   os().SetCurrentInstruction(kUxtab, kArithmetic);
   3650   os() << ToCString(kUxtab) << ConditionPrinter(it_block_, cond);
   3651   os() << " ";
   3652   if (!rd.Is(rn)) {
   3653     os() << rd << ", ";
   3654   }
   3655   os() << rn << ", " << operand;
   3656 }
   3657 
   3658 void Disassembler::uxtab16(Condition cond,
   3659                            Register rd,
   3660                            Register rn,
   3661                            const Operand& operand) {
   3662   os().SetCurrentInstruction(kUxtab16, kArithmetic);
   3663   os() << ToCString(kUxtab16) << ConditionPrinter(it_block_, cond);
   3664   os() << " ";
   3665   if (!rd.Is(rn)) {
   3666     os() << rd << ", ";
   3667   }
   3668   os() << rn << ", " << operand;
   3669 }
   3670 
   3671 void Disassembler::uxtah(Condition cond,
   3672                          Register rd,
   3673                          Register rn,
   3674                          const Operand& operand) {
   3675   os().SetCurrentInstruction(kUxtah, kArithmetic);
   3676   os() << ToCString(kUxtah) << ConditionPrinter(it_block_, cond);
   3677   os() << " ";
   3678   if (!rd.Is(rn)) {
   3679     os() << rd << ", ";
   3680   }
   3681   os() << rn << ", " << operand;
   3682 }
   3683 
   3684 void Disassembler::uxtb(Condition cond,
   3685                         EncodingSize size,
   3686                         Register rd,
   3687                         const Operand& operand) {
   3688   os().SetCurrentInstruction(kUxtb, kArithmetic);
   3689   os() << ToCString(kUxtb) << ConditionPrinter(it_block_, cond) << size;
   3690   os() << " ";
   3691   if (!rd.Is(operand.GetBaseRegister())) {
   3692     os() << rd << ", ";
   3693   }
   3694   os() << operand;
   3695 }
   3696 
   3697 void Disassembler::uxtb16(Condition cond, Register rd, const Operand& operand) {
   3698   os().SetCurrentInstruction(kUxtb16, kArithmetic);
   3699   os() << ToCString(kUxtb16) << ConditionPrinter(it_block_, cond);
   3700   os() << " ";
   3701   if (!rd.Is(operand.GetBaseRegister())) {
   3702     os() << rd << ", ";
   3703   }
   3704   os() << operand;
   3705 }
   3706 
   3707 void Disassembler::uxth(Condition cond,
   3708                         EncodingSize size,
   3709                         Register rd,
   3710                         const Operand& operand) {
   3711   os().SetCurrentInstruction(kUxth, kArithmetic);
   3712   os() << ToCString(kUxth) << ConditionPrinter(it_block_, cond) << size;
   3713   os() << " ";
   3714   if (!rd.Is(operand.GetBaseRegister())) {
   3715     os() << rd << ", ";
   3716   }
   3717   os() << operand;
   3718 }
   3719 
   3720 void Disassembler::vaba(
   3721     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3722   os().SetCurrentInstruction(kVaba, kFpNeon);
   3723   os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " "
   3724        << rd << ", " << rn << ", " << rm;
   3725 }
   3726 
   3727 void Disassembler::vaba(
   3728     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3729   os().SetCurrentInstruction(kVaba, kFpNeon);
   3730   os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " "
   3731        << rd << ", " << rn << ", " << rm;
   3732 }
   3733 
   3734 void Disassembler::vabal(
   3735     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   3736   os().SetCurrentInstruction(kVabal, kFpNeon);
   3737   os() << ToCString(kVabal) << ConditionPrinter(it_block_, cond) << dt << " "
   3738        << rd << ", " << rn << ", " << rm;
   3739 }
   3740 
   3741 void Disassembler::vabd(
   3742     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3743   os().SetCurrentInstruction(kVabd, kFpNeon);
   3744   os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt;
   3745   os() << " ";
   3746   if (!rd.Is(rn)) {
   3747     os() << rd << ", ";
   3748   }
   3749   os() << rn << ", " << rm;
   3750 }
   3751 
   3752 void Disassembler::vabd(
   3753     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3754   os().SetCurrentInstruction(kVabd, kFpNeon);
   3755   os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt;
   3756   os() << " ";
   3757   if (!rd.Is(rn)) {
   3758     os() << rd << ", ";
   3759   }
   3760   os() << rn << ", " << rm;
   3761 }
   3762 
   3763 void Disassembler::vabdl(
   3764     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   3765   os().SetCurrentInstruction(kVabdl, kFpNeon);
   3766   os() << ToCString(kVabdl) << ConditionPrinter(it_block_, cond) << dt << " "
   3767        << rd << ", " << rn << ", " << rm;
   3768 }
   3769 
   3770 void Disassembler::vabs(Condition cond,
   3771                         DataType dt,
   3772                         DRegister rd,
   3773                         DRegister rm) {
   3774   os().SetCurrentInstruction(kVabs, kFpNeon);
   3775   os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
   3776        << rd << ", " << rm;
   3777 }
   3778 
   3779 void Disassembler::vabs(Condition cond,
   3780                         DataType dt,
   3781                         QRegister rd,
   3782                         QRegister rm) {
   3783   os().SetCurrentInstruction(kVabs, kFpNeon);
   3784   os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
   3785        << rd << ", " << rm;
   3786 }
   3787 
   3788 void Disassembler::vabs(Condition cond,
   3789                         DataType dt,
   3790                         SRegister rd,
   3791                         SRegister rm) {
   3792   os().SetCurrentInstruction(kVabs, kFpNeon);
   3793   os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " "
   3794        << rd << ", " << rm;
   3795 }
   3796 
   3797 void Disassembler::vacge(
   3798     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3799   os().SetCurrentInstruction(kVacge, kFpNeon);
   3800   os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt;
   3801   os() << " ";
   3802   if (!rd.Is(rn)) {
   3803     os() << rd << ", ";
   3804   }
   3805   os() << rn << ", " << rm;
   3806 }
   3807 
   3808 void Disassembler::vacge(
   3809     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3810   os().SetCurrentInstruction(kVacge, kFpNeon);
   3811   os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt;
   3812   os() << " ";
   3813   if (!rd.Is(rn)) {
   3814     os() << rd << ", ";
   3815   }
   3816   os() << rn << ", " << rm;
   3817 }
   3818 
   3819 void Disassembler::vacgt(
   3820     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3821   os().SetCurrentInstruction(kVacgt, kFpNeon);
   3822   os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt;
   3823   os() << " ";
   3824   if (!rd.Is(rn)) {
   3825     os() << rd << ", ";
   3826   }
   3827   os() << rn << ", " << rm;
   3828 }
   3829 
   3830 void Disassembler::vacgt(
   3831     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3832   os().SetCurrentInstruction(kVacgt, kFpNeon);
   3833   os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt;
   3834   os() << " ";
   3835   if (!rd.Is(rn)) {
   3836     os() << rd << ", ";
   3837   }
   3838   os() << rn << ", " << rm;
   3839 }
   3840 
   3841 void Disassembler::vacle(
   3842     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3843   os().SetCurrentInstruction(kVacle, kFpNeon);
   3844   os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt;
   3845   os() << " ";
   3846   if (!rd.Is(rn)) {
   3847     os() << rd << ", ";
   3848   }
   3849   os() << rn << ", " << rm;
   3850 }
   3851 
   3852 void Disassembler::vacle(
   3853     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3854   os().SetCurrentInstruction(kVacle, kFpNeon);
   3855   os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt;
   3856   os() << " ";
   3857   if (!rd.Is(rn)) {
   3858     os() << rd << ", ";
   3859   }
   3860   os() << rn << ", " << rm;
   3861 }
   3862 
   3863 void Disassembler::vaclt(
   3864     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3865   os().SetCurrentInstruction(kVaclt, kFpNeon);
   3866   os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt;
   3867   os() << " ";
   3868   if (!rd.Is(rn)) {
   3869     os() << rd << ", ";
   3870   }
   3871   os() << rn << ", " << rm;
   3872 }
   3873 
   3874 void Disassembler::vaclt(
   3875     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3876   os().SetCurrentInstruction(kVaclt, kFpNeon);
   3877   os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt;
   3878   os() << " ";
   3879   if (!rd.Is(rn)) {
   3880     os() << rd << ", ";
   3881   }
   3882   os() << rn << ", " << rm;
   3883 }
   3884 
   3885 void Disassembler::vadd(
   3886     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   3887   os().SetCurrentInstruction(kVadd, kFpNeon);
   3888   os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
   3889   os() << " ";
   3890   if (!rd.Is(rn)) {
   3891     os() << rd << ", ";
   3892   }
   3893   os() << rn << ", " << rm;
   3894 }
   3895 
   3896 void Disassembler::vadd(
   3897     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   3898   os().SetCurrentInstruction(kVadd, kFpNeon);
   3899   os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
   3900   os() << " ";
   3901   if (!rd.Is(rn)) {
   3902     os() << rd << ", ";
   3903   }
   3904   os() << rn << ", " << rm;
   3905 }
   3906 
   3907 void Disassembler::vadd(
   3908     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   3909   os().SetCurrentInstruction(kVadd, kFpNeon);
   3910   os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt;
   3911   os() << " ";
   3912   if (!rd.Is(rn)) {
   3913     os() << rd << ", ";
   3914   }
   3915   os() << rn << ", " << rm;
   3916 }
   3917 
   3918 void Disassembler::vaddhn(
   3919     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
   3920   os().SetCurrentInstruction(kVaddhn, kFpNeon);
   3921   os() << ToCString(kVaddhn) << ConditionPrinter(it_block_, cond) << dt << " "
   3922        << rd << ", " << rn << ", " << rm;
   3923 }
   3924 
   3925 void Disassembler::vaddl(
   3926     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   3927   os().SetCurrentInstruction(kVaddl, kFpNeon);
   3928   os() << ToCString(kVaddl) << ConditionPrinter(it_block_, cond) << dt << " "
   3929        << rd << ", " << rn << ", " << rm;
   3930 }
   3931 
   3932 void Disassembler::vaddw(
   3933     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
   3934   os().SetCurrentInstruction(kVaddw, kFpNeon);
   3935   os() << ToCString(kVaddw) << ConditionPrinter(it_block_, cond) << dt;
   3936   os() << " ";
   3937   if (!rd.Is(rn)) {
   3938     os() << rd << ", ";
   3939   }
   3940   os() << rn << ", " << rm;
   3941 }
   3942 
   3943 void Disassembler::vand(Condition cond,
   3944                         DataType dt,
   3945                         DRegister rd,
   3946                         DRegister rn,
   3947                         const DOperand& operand) {
   3948   os().SetCurrentInstruction(kVand, kFpNeon);
   3949   os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt;
   3950   os() << " ";
   3951   if (!rd.Is(rn)) {
   3952     os() << rd << ", ";
   3953   }
   3954   os() << rn << ", " << operand;
   3955 }
   3956 
   3957 void Disassembler::vand(Condition cond,
   3958                         DataType dt,
   3959                         QRegister rd,
   3960                         QRegister rn,
   3961                         const QOperand& operand) {
   3962   os().SetCurrentInstruction(kVand, kFpNeon);
   3963   os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt;
   3964   os() << " ";
   3965   if (!rd.Is(rn)) {
   3966     os() << rd << ", ";
   3967   }
   3968   os() << rn << ", " << operand;
   3969 }
   3970 
   3971 void Disassembler::vbic(Condition cond,
   3972                         DataType dt,
   3973                         DRegister rd,
   3974                         DRegister rn,
   3975                         const DOperand& operand) {
   3976   os().SetCurrentInstruction(kVbic, kFpNeon);
   3977   os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt;
   3978   os() << " ";
   3979   if (!rd.Is(rn)) {
   3980     os() << rd << ", ";
   3981   }
   3982   os() << rn << ", " << operand;
   3983 }
   3984 
   3985 void Disassembler::vbic(Condition cond,
   3986                         DataType dt,
   3987                         QRegister rd,
   3988                         QRegister rn,
   3989                         const QOperand& operand) {
   3990   os().SetCurrentInstruction(kVbic, kFpNeon);
   3991   os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt;
   3992   os() << " ";
   3993   if (!rd.Is(rn)) {
   3994     os() << rd << ", ";
   3995   }
   3996   os() << rn << ", " << operand;
   3997 }
   3998 
   3999 void Disassembler::vbif(
   4000     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4001   os().SetCurrentInstruction(kVbif, kFpNeon);
   4002   os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt;
   4003   os() << " ";
   4004   if (!rd.Is(rn)) {
   4005     os() << rd << ", ";
   4006   }
   4007   os() << rn << ", " << rm;
   4008 }
   4009 
   4010 void Disassembler::vbif(
   4011     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4012   os().SetCurrentInstruction(kVbif, kFpNeon);
   4013   os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt;
   4014   os() << " ";
   4015   if (!rd.Is(rn)) {
   4016     os() << rd << ", ";
   4017   }
   4018   os() << rn << ", " << rm;
   4019 }
   4020 
   4021 void Disassembler::vbit(
   4022     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4023   os().SetCurrentInstruction(kVbit, kFpNeon);
   4024   os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt;
   4025   os() << " ";
   4026   if (!rd.Is(rn)) {
   4027     os() << rd << ", ";
   4028   }
   4029   os() << rn << ", " << rm;
   4030 }
   4031 
   4032 void Disassembler::vbit(
   4033     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4034   os().SetCurrentInstruction(kVbit, kFpNeon);
   4035   os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt;
   4036   os() << " ";
   4037   if (!rd.Is(rn)) {
   4038     os() << rd << ", ";
   4039   }
   4040   os() << rn << ", " << rm;
   4041 }
   4042 
   4043 void Disassembler::vbsl(
   4044     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4045   os().SetCurrentInstruction(kVbsl, kFpNeon);
   4046   os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt;
   4047   os() << " ";
   4048   if (!rd.Is(rn)) {
   4049     os() << rd << ", ";
   4050   }
   4051   os() << rn << ", " << rm;
   4052 }
   4053 
   4054 void Disassembler::vbsl(
   4055     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4056   os().SetCurrentInstruction(kVbsl, kFpNeon);
   4057   os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt;
   4058   os() << " ";
   4059   if (!rd.Is(rn)) {
   4060     os() << rd << ", ";
   4061   }
   4062   os() << rn << ", " << rm;
   4063 }
   4064 
   4065 void Disassembler::vceq(Condition cond,
   4066                         DataType dt,
   4067                         DRegister rd,
   4068                         DRegister rm,
   4069                         const DOperand& operand) {
   4070   os().SetCurrentInstruction(kVceq, kFpNeon);
   4071   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
   4072   os() << " ";
   4073   if (!rd.Is(rm)) {
   4074     os() << rd << ", ";
   4075   }
   4076   os() << rm << ", " << operand;
   4077 }
   4078 
   4079 void Disassembler::vceq(Condition cond,
   4080                         DataType dt,
   4081                         QRegister rd,
   4082                         QRegister rm,
   4083                         const QOperand& operand) {
   4084   os().SetCurrentInstruction(kVceq, kFpNeon);
   4085   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
   4086   os() << " ";
   4087   if (!rd.Is(rm)) {
   4088     os() << rd << ", ";
   4089   }
   4090   os() << rm << ", " << operand;
   4091 }
   4092 
   4093 void Disassembler::vceq(
   4094     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4095   os().SetCurrentInstruction(kVceq, kFpNeon);
   4096   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
   4097   os() << " ";
   4098   if (!rd.Is(rn)) {
   4099     os() << rd << ", ";
   4100   }
   4101   os() << rn << ", " << rm;
   4102 }
   4103 
   4104 void Disassembler::vceq(
   4105     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4106   os().SetCurrentInstruction(kVceq, kFpNeon);
   4107   os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt;
   4108   os() << " ";
   4109   if (!rd.Is(rn)) {
   4110     os() << rd << ", ";
   4111   }
   4112   os() << rn << ", " << rm;
   4113 }
   4114 
   4115 void Disassembler::vcge(Condition cond,
   4116                         DataType dt,
   4117                         DRegister rd,
   4118                         DRegister rm,
   4119                         const DOperand& operand) {
   4120   os().SetCurrentInstruction(kVcge, kFpNeon);
   4121   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
   4122   os() << " ";
   4123   if (!rd.Is(rm)) {
   4124     os() << rd << ", ";
   4125   }
   4126   os() << rm << ", " << operand;
   4127 }
   4128 
   4129 void Disassembler::vcge(Condition cond,
   4130                         DataType dt,
   4131                         QRegister rd,
   4132                         QRegister rm,
   4133                         const QOperand& operand) {
   4134   os().SetCurrentInstruction(kVcge, kFpNeon);
   4135   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
   4136   os() << " ";
   4137   if (!rd.Is(rm)) {
   4138     os() << rd << ", ";
   4139   }
   4140   os() << rm << ", " << operand;
   4141 }
   4142 
   4143 void Disassembler::vcge(
   4144     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4145   os().SetCurrentInstruction(kVcge, kFpNeon);
   4146   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
   4147   os() << " ";
   4148   if (!rd.Is(rn)) {
   4149     os() << rd << ", ";
   4150   }
   4151   os() << rn << ", " << rm;
   4152 }
   4153 
   4154 void Disassembler::vcge(
   4155     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4156   os().SetCurrentInstruction(kVcge, kFpNeon);
   4157   os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt;
   4158   os() << " ";
   4159   if (!rd.Is(rn)) {
   4160     os() << rd << ", ";
   4161   }
   4162   os() << rn << ", " << rm;
   4163 }
   4164 
   4165 void Disassembler::vcgt(Condition cond,
   4166                         DataType dt,
   4167                         DRegister rd,
   4168                         DRegister rm,
   4169                         const DOperand& operand) {
   4170   os().SetCurrentInstruction(kVcgt, kFpNeon);
   4171   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
   4172   os() << " ";
   4173   if (!rd.Is(rm)) {
   4174     os() << rd << ", ";
   4175   }
   4176   os() << rm << ", " << operand;
   4177 }
   4178 
   4179 void Disassembler::vcgt(Condition cond,
   4180                         DataType dt,
   4181                         QRegister rd,
   4182                         QRegister rm,
   4183                         const QOperand& operand) {
   4184   os().SetCurrentInstruction(kVcgt, kFpNeon);
   4185   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
   4186   os() << " ";
   4187   if (!rd.Is(rm)) {
   4188     os() << rd << ", ";
   4189   }
   4190   os() << rm << ", " << operand;
   4191 }
   4192 
   4193 void Disassembler::vcgt(
   4194     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4195   os().SetCurrentInstruction(kVcgt, kFpNeon);
   4196   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
   4197   os() << " ";
   4198   if (!rd.Is(rn)) {
   4199     os() << rd << ", ";
   4200   }
   4201   os() << rn << ", " << rm;
   4202 }
   4203 
   4204 void Disassembler::vcgt(
   4205     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4206   os().SetCurrentInstruction(kVcgt, kFpNeon);
   4207   os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt;
   4208   os() << " ";
   4209   if (!rd.Is(rn)) {
   4210     os() << rd << ", ";
   4211   }
   4212   os() << rn << ", " << rm;
   4213 }
   4214 
   4215 void Disassembler::vcle(Condition cond,
   4216                         DataType dt,
   4217                         DRegister rd,
   4218                         DRegister rm,
   4219                         const DOperand& operand) {
   4220   os().SetCurrentInstruction(kVcle, kFpNeon);
   4221   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
   4222   os() << " ";
   4223   if (!rd.Is(rm)) {
   4224     os() << rd << ", ";
   4225   }
   4226   os() << rm << ", " << operand;
   4227 }
   4228 
   4229 void Disassembler::vcle(Condition cond,
   4230                         DataType dt,
   4231                         QRegister rd,
   4232                         QRegister rm,
   4233                         const QOperand& operand) {
   4234   os().SetCurrentInstruction(kVcle, kFpNeon);
   4235   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
   4236   os() << " ";
   4237   if (!rd.Is(rm)) {
   4238     os() << rd << ", ";
   4239   }
   4240   os() << rm << ", " << operand;
   4241 }
   4242 
   4243 void Disassembler::vcle(
   4244     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4245   os().SetCurrentInstruction(kVcle, kFpNeon);
   4246   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
   4247   os() << " ";
   4248   if (!rd.Is(rn)) {
   4249     os() << rd << ", ";
   4250   }
   4251   os() << rn << ", " << rm;
   4252 }
   4253 
   4254 void Disassembler::vcle(
   4255     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4256   os().SetCurrentInstruction(kVcle, kFpNeon);
   4257   os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt;
   4258   os() << " ";
   4259   if (!rd.Is(rn)) {
   4260     os() << rd << ", ";
   4261   }
   4262   os() << rn << ", " << rm;
   4263 }
   4264 
   4265 void Disassembler::vcls(Condition cond,
   4266                         DataType dt,
   4267                         DRegister rd,
   4268                         DRegister rm) {
   4269   os().SetCurrentInstruction(kVcls, kFpNeon);
   4270   os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " "
   4271        << rd << ", " << rm;
   4272 }
   4273 
   4274 void Disassembler::vcls(Condition cond,
   4275                         DataType dt,
   4276                         QRegister rd,
   4277                         QRegister rm) {
   4278   os().SetCurrentInstruction(kVcls, kFpNeon);
   4279   os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " "
   4280        << rd << ", " << rm;
   4281 }
   4282 
   4283 void Disassembler::vclt(Condition cond,
   4284                         DataType dt,
   4285                         DRegister rd,
   4286                         DRegister rm,
   4287                         const DOperand& operand) {
   4288   os().SetCurrentInstruction(kVclt, kFpNeon);
   4289   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
   4290   os() << " ";
   4291   if (!rd.Is(rm)) {
   4292     os() << rd << ", ";
   4293   }
   4294   os() << rm << ", " << operand;
   4295 }
   4296 
   4297 void Disassembler::vclt(Condition cond,
   4298                         DataType dt,
   4299                         QRegister rd,
   4300                         QRegister rm,
   4301                         const QOperand& operand) {
   4302   os().SetCurrentInstruction(kVclt, kFpNeon);
   4303   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
   4304   os() << " ";
   4305   if (!rd.Is(rm)) {
   4306     os() << rd << ", ";
   4307   }
   4308   os() << rm << ", " << operand;
   4309 }
   4310 
   4311 void Disassembler::vclt(
   4312     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4313   os().SetCurrentInstruction(kVclt, kFpNeon);
   4314   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
   4315   os() << " ";
   4316   if (!rd.Is(rn)) {
   4317     os() << rd << ", ";
   4318   }
   4319   os() << rn << ", " << rm;
   4320 }
   4321 
   4322 void Disassembler::vclt(
   4323     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4324   os().SetCurrentInstruction(kVclt, kFpNeon);
   4325   os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt;
   4326   os() << " ";
   4327   if (!rd.Is(rn)) {
   4328     os() << rd << ", ";
   4329   }
   4330   os() << rn << ", " << rm;
   4331 }
   4332 
   4333 void Disassembler::vclz(Condition cond,
   4334                         DataType dt,
   4335                         DRegister rd,
   4336                         DRegister rm) {
   4337   os().SetCurrentInstruction(kVclz, kFpNeon);
   4338   os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " "
   4339        << rd << ", " << rm;
   4340 }
   4341 
   4342 void Disassembler::vclz(Condition cond,
   4343                         DataType dt,
   4344                         QRegister rd,
   4345                         QRegister rm) {
   4346   os().SetCurrentInstruction(kVclz, kFpNeon);
   4347   os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " "
   4348        << rd << ", " << rm;
   4349 }
   4350 
   4351 void Disassembler::vcmp(Condition cond,
   4352                         DataType dt,
   4353                         SRegister rd,
   4354                         SRegister rm) {
   4355   os().SetCurrentInstruction(kVcmp, kFpNeon);
   4356   os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
   4357        << rd << ", " << rm;
   4358 }
   4359 
   4360 void Disassembler::vcmp(Condition cond,
   4361                         DataType dt,
   4362                         DRegister rd,
   4363                         DRegister rm) {
   4364   os().SetCurrentInstruction(kVcmp, kFpNeon);
   4365   os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
   4366        << rd << ", " << rm;
   4367 }
   4368 
   4369 void Disassembler::vcmp(Condition cond, DataType dt, SRegister rd, double imm) {
   4370   os().SetCurrentInstruction(kVcmp, kFpNeon);
   4371   os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
   4372        << rd << ", "
   4373        << "#" << std::fixed << std::setprecision(1) << imm
   4374        << std::resetiosflags(std::ios_base::floatfield);
   4375 }
   4376 
   4377 void Disassembler::vcmp(Condition cond, DataType dt, DRegister rd, double imm) {
   4378   os().SetCurrentInstruction(kVcmp, kFpNeon);
   4379   os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " "
   4380        << rd << ", "
   4381        << "#" << std::fixed << std::setprecision(1) << imm
   4382        << std::resetiosflags(std::ios_base::floatfield);
   4383 }
   4384 
   4385 void Disassembler::vcmpe(Condition cond,
   4386                          DataType dt,
   4387                          SRegister rd,
   4388                          SRegister rm) {
   4389   os().SetCurrentInstruction(kVcmpe, kFpNeon);
   4390   os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
   4391        << rd << ", " << rm;
   4392 }
   4393 
   4394 void Disassembler::vcmpe(Condition cond,
   4395                          DataType dt,
   4396                          DRegister rd,
   4397                          DRegister rm) {
   4398   os().SetCurrentInstruction(kVcmpe, kFpNeon);
   4399   os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
   4400        << rd << ", " << rm;
   4401 }
   4402 
   4403 void Disassembler::vcmpe(Condition cond,
   4404                          DataType dt,
   4405                          SRegister rd,
   4406                          double imm) {
   4407   os().SetCurrentInstruction(kVcmpe, kFpNeon);
   4408   os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
   4409        << rd << ", "
   4410        << "#" << std::fixed << std::setprecision(1) << imm
   4411        << std::resetiosflags(std::ios_base::floatfield);
   4412 }
   4413 
   4414 void Disassembler::vcmpe(Condition cond,
   4415                          DataType dt,
   4416                          DRegister rd,
   4417                          double imm) {
   4418   os().SetCurrentInstruction(kVcmpe, kFpNeon);
   4419   os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " "
   4420        << rd << ", "
   4421        << "#" << std::fixed << std::setprecision(1) << imm
   4422        << std::resetiosflags(std::ios_base::floatfield);
   4423 }
   4424 
   4425 void Disassembler::vcnt(Condition cond,
   4426                         DataType dt,
   4427                         DRegister rd,
   4428                         DRegister rm) {
   4429   os().SetCurrentInstruction(kVcnt, kFpNeon);
   4430   os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " "
   4431        << rd << ", " << rm;
   4432 }
   4433 
   4434 void Disassembler::vcnt(Condition cond,
   4435                         DataType dt,
   4436                         QRegister rd,
   4437                         QRegister rm) {
   4438   os().SetCurrentInstruction(kVcnt, kFpNeon);
   4439   os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " "
   4440        << rd << ", " << rm;
   4441 }
   4442 
   4443 void Disassembler::vcvt(
   4444     Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
   4445   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4446   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4447        << " " << rd << ", " << rm;
   4448 }
   4449 
   4450 void Disassembler::vcvt(
   4451     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
   4452   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4453   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4454        << " " << rd << ", " << rm;
   4455 }
   4456 
   4457 void Disassembler::vcvt(Condition cond,
   4458                         DataType dt1,
   4459                         DataType dt2,
   4460                         DRegister rd,
   4461                         DRegister rm,
   4462                         int32_t fbits) {
   4463   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4464   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4465        << " " << rd << ", " << rm << ", "
   4466        << "#" << fbits;
   4467 }
   4468 
   4469 void Disassembler::vcvt(Condition cond,
   4470                         DataType dt1,
   4471                         DataType dt2,
   4472                         QRegister rd,
   4473                         QRegister rm,
   4474                         int32_t fbits) {
   4475   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4476   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4477        << " " << rd << ", " << rm << ", "
   4478        << "#" << fbits;
   4479 }
   4480 
   4481 void Disassembler::vcvt(Condition cond,
   4482                         DataType dt1,
   4483                         DataType dt2,
   4484                         SRegister rd,
   4485                         SRegister rm,
   4486                         int32_t fbits) {
   4487   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4488   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4489        << " " << rd << ", " << rm << ", "
   4490        << "#" << fbits;
   4491 }
   4492 
   4493 void Disassembler::vcvt(
   4494     Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
   4495   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4496   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4497        << " " << rd << ", " << rm;
   4498 }
   4499 
   4500 void Disassembler::vcvt(
   4501     Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
   4502   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4503   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4504        << " " << rd << ", " << rm;
   4505 }
   4506 
   4507 void Disassembler::vcvt(
   4508     Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
   4509   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4510   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4511        << " " << rd << ", " << rm;
   4512 }
   4513 
   4514 void Disassembler::vcvt(
   4515     Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
   4516   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4517   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4518        << " " << rd << ", " << rm;
   4519 }
   4520 
   4521 void Disassembler::vcvt(
   4522     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   4523   os().SetCurrentInstruction(kVcvt, kFpNeon);
   4524   os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4525        << " " << rd << ", " << rm;
   4526 }
   4527 
   4528 void Disassembler::vcvta(DataType dt1,
   4529                          DataType dt2,
   4530                          DRegister rd,
   4531                          DRegister rm) {
   4532   os().SetCurrentInstruction(kVcvta, kFpNeon);
   4533   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
   4534 }
   4535 
   4536 void Disassembler::vcvta(DataType dt1,
   4537                          DataType dt2,
   4538                          QRegister rd,
   4539                          QRegister rm) {
   4540   os().SetCurrentInstruction(kVcvta, kFpNeon);
   4541   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
   4542 }
   4543 
   4544 void Disassembler::vcvta(DataType dt1,
   4545                          DataType dt2,
   4546                          SRegister rd,
   4547                          SRegister rm) {
   4548   os().SetCurrentInstruction(kVcvta, kFpNeon);
   4549   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
   4550 }
   4551 
   4552 void Disassembler::vcvta(DataType dt1,
   4553                          DataType dt2,
   4554                          SRegister rd,
   4555                          DRegister rm) {
   4556   os().SetCurrentInstruction(kVcvta, kFpNeon);
   4557   os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm;
   4558 }
   4559 
   4560 void Disassembler::vcvtb(
   4561     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   4562   os().SetCurrentInstruction(kVcvtb, kFpNeon);
   4563   os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4564        << " " << rd << ", " << rm;
   4565 }
   4566 
   4567 void Disassembler::vcvtb(
   4568     Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
   4569   os().SetCurrentInstruction(kVcvtb, kFpNeon);
   4570   os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4571        << " " << rd << ", " << rm;
   4572 }
   4573 
   4574 void Disassembler::vcvtb(
   4575     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
   4576   os().SetCurrentInstruction(kVcvtb, kFpNeon);
   4577   os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4578        << " " << rd << ", " << rm;
   4579 }
   4580 
   4581 void Disassembler::vcvtm(DataType dt1,
   4582                          DataType dt2,
   4583                          DRegister rd,
   4584                          DRegister rm) {
   4585   os().SetCurrentInstruction(kVcvtm, kFpNeon);
   4586   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
   4587 }
   4588 
   4589 void Disassembler::vcvtm(DataType dt1,
   4590                          DataType dt2,
   4591                          QRegister rd,
   4592                          QRegister rm) {
   4593   os().SetCurrentInstruction(kVcvtm, kFpNeon);
   4594   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
   4595 }
   4596 
   4597 void Disassembler::vcvtm(DataType dt1,
   4598                          DataType dt2,
   4599                          SRegister rd,
   4600                          SRegister rm) {
   4601   os().SetCurrentInstruction(kVcvtm, kFpNeon);
   4602   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
   4603 }
   4604 
   4605 void Disassembler::vcvtm(DataType dt1,
   4606                          DataType dt2,
   4607                          SRegister rd,
   4608                          DRegister rm) {
   4609   os().SetCurrentInstruction(kVcvtm, kFpNeon);
   4610   os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm;
   4611 }
   4612 
   4613 void Disassembler::vcvtn(DataType dt1,
   4614                          DataType dt2,
   4615                          DRegister rd,
   4616                          DRegister rm) {
   4617   os().SetCurrentInstruction(kVcvtn, kFpNeon);
   4618   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
   4619 }
   4620 
   4621 void Disassembler::vcvtn(DataType dt1,
   4622                          DataType dt2,
   4623                          QRegister rd,
   4624                          QRegister rm) {
   4625   os().SetCurrentInstruction(kVcvtn, kFpNeon);
   4626   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
   4627 }
   4628 
   4629 void Disassembler::vcvtn(DataType dt1,
   4630                          DataType dt2,
   4631                          SRegister rd,
   4632                          SRegister rm) {
   4633   os().SetCurrentInstruction(kVcvtn, kFpNeon);
   4634   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
   4635 }
   4636 
   4637 void Disassembler::vcvtn(DataType dt1,
   4638                          DataType dt2,
   4639                          SRegister rd,
   4640                          DRegister rm) {
   4641   os().SetCurrentInstruction(kVcvtn, kFpNeon);
   4642   os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm;
   4643 }
   4644 
   4645 void Disassembler::vcvtp(DataType dt1,
   4646                          DataType dt2,
   4647                          DRegister rd,
   4648                          DRegister rm) {
   4649   os().SetCurrentInstruction(kVcvtp, kFpNeon);
   4650   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
   4651 }
   4652 
   4653 void Disassembler::vcvtp(DataType dt1,
   4654                          DataType dt2,
   4655                          QRegister rd,
   4656                          QRegister rm) {
   4657   os().SetCurrentInstruction(kVcvtp, kFpNeon);
   4658   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
   4659 }
   4660 
   4661 void Disassembler::vcvtp(DataType dt1,
   4662                          DataType dt2,
   4663                          SRegister rd,
   4664                          SRegister rm) {
   4665   os().SetCurrentInstruction(kVcvtp, kFpNeon);
   4666   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
   4667 }
   4668 
   4669 void Disassembler::vcvtp(DataType dt1,
   4670                          DataType dt2,
   4671                          SRegister rd,
   4672                          DRegister rm) {
   4673   os().SetCurrentInstruction(kVcvtp, kFpNeon);
   4674   os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm;
   4675 }
   4676 
   4677 void Disassembler::vcvtr(
   4678     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   4679   os().SetCurrentInstruction(kVcvtr, kFpNeon);
   4680   os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4681        << " " << rd << ", " << rm;
   4682 }
   4683 
   4684 void Disassembler::vcvtr(
   4685     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
   4686   os().SetCurrentInstruction(kVcvtr, kFpNeon);
   4687   os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4688        << " " << rd << ", " << rm;
   4689 }
   4690 
   4691 void Disassembler::vcvtt(
   4692     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   4693   os().SetCurrentInstruction(kVcvtt, kFpNeon);
   4694   os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4695        << " " << rd << ", " << rm;
   4696 }
   4697 
   4698 void Disassembler::vcvtt(
   4699     Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
   4700   os().SetCurrentInstruction(kVcvtt, kFpNeon);
   4701   os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4702        << " " << rd << ", " << rm;
   4703 }
   4704 
   4705 void Disassembler::vcvtt(
   4706     Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
   4707   os().SetCurrentInstruction(kVcvtt, kFpNeon);
   4708   os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   4709        << " " << rd << ", " << rm;
   4710 }
   4711 
   4712 void Disassembler::vdiv(
   4713     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4714   os().SetCurrentInstruction(kVdiv, kFpNeon);
   4715   os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt;
   4716   os() << " ";
   4717   if (!rd.Is(rn)) {
   4718     os() << rd << ", ";
   4719   }
   4720   os() << rn << ", " << rm;
   4721 }
   4722 
   4723 void Disassembler::vdiv(
   4724     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4725   os().SetCurrentInstruction(kVdiv, kFpNeon);
   4726   os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt;
   4727   os() << " ";
   4728   if (!rd.Is(rn)) {
   4729     os() << rd << ", ";
   4730   }
   4731   os() << rn << ", " << rm;
   4732 }
   4733 
   4734 void Disassembler::vdup(Condition cond,
   4735                         DataType dt,
   4736                         QRegister rd,
   4737                         Register rt) {
   4738   os().SetCurrentInstruction(kVdup, kFpNeon);
   4739   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
   4740        << rd << ", " << rt;
   4741 }
   4742 
   4743 void Disassembler::vdup(Condition cond,
   4744                         DataType dt,
   4745                         DRegister rd,
   4746                         Register rt) {
   4747   os().SetCurrentInstruction(kVdup, kFpNeon);
   4748   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
   4749        << rd << ", " << rt;
   4750 }
   4751 
   4752 void Disassembler::vdup(Condition cond,
   4753                         DataType dt,
   4754                         DRegister rd,
   4755                         DRegisterLane rm) {
   4756   os().SetCurrentInstruction(kVdup, kFpNeon);
   4757   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
   4758        << rd << ", " << rm;
   4759 }
   4760 
   4761 void Disassembler::vdup(Condition cond,
   4762                         DataType dt,
   4763                         QRegister rd,
   4764                         DRegisterLane rm) {
   4765   os().SetCurrentInstruction(kVdup, kFpNeon);
   4766   os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " "
   4767        << rd << ", " << rm;
   4768 }
   4769 
   4770 void Disassembler::veor(
   4771     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4772   os().SetCurrentInstruction(kVeor, kFpNeon);
   4773   os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt;
   4774   os() << " ";
   4775   if (!rd.Is(rn)) {
   4776     os() << rd << ", ";
   4777   }
   4778   os() << rn << ", " << rm;
   4779 }
   4780 
   4781 void Disassembler::veor(
   4782     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4783   os().SetCurrentInstruction(kVeor, kFpNeon);
   4784   os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt;
   4785   os() << " ";
   4786   if (!rd.Is(rn)) {
   4787     os() << rd << ", ";
   4788   }
   4789   os() << rn << ", " << rm;
   4790 }
   4791 
   4792 void Disassembler::vext(Condition cond,
   4793                         DataType dt,
   4794                         DRegister rd,
   4795                         DRegister rn,
   4796                         DRegister rm,
   4797                         const DOperand& operand) {
   4798   os().SetCurrentInstruction(kVext, kFpNeon);
   4799   os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt;
   4800   os() << " ";
   4801   if (!rd.Is(rn)) {
   4802     os() << rd << ", ";
   4803   }
   4804   os() << rn << ", " << rm << ", " << operand;
   4805 }
   4806 
   4807 void Disassembler::vext(Condition cond,
   4808                         DataType dt,
   4809                         QRegister rd,
   4810                         QRegister rn,
   4811                         QRegister rm,
   4812                         const QOperand& operand) {
   4813   os().SetCurrentInstruction(kVext, kFpNeon);
   4814   os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt;
   4815   os() << " ";
   4816   if (!rd.Is(rn)) {
   4817     os() << rd << ", ";
   4818   }
   4819   os() << rn << ", " << rm << ", " << operand;
   4820 }
   4821 
   4822 void Disassembler::vfma(
   4823     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4824   os().SetCurrentInstruction(kVfma, kFpNeon);
   4825   os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
   4826        << rd << ", " << rn << ", " << rm;
   4827 }
   4828 
   4829 void Disassembler::vfma(
   4830     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4831   os().SetCurrentInstruction(kVfma, kFpNeon);
   4832   os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
   4833        << rd << ", " << rn << ", " << rm;
   4834 }
   4835 
   4836 void Disassembler::vfma(
   4837     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4838   os().SetCurrentInstruction(kVfma, kFpNeon);
   4839   os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " "
   4840        << rd << ", " << rn << ", " << rm;
   4841 }
   4842 
   4843 void Disassembler::vfms(
   4844     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4845   os().SetCurrentInstruction(kVfms, kFpNeon);
   4846   os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
   4847        << rd << ", " << rn << ", " << rm;
   4848 }
   4849 
   4850 void Disassembler::vfms(
   4851     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4852   os().SetCurrentInstruction(kVfms, kFpNeon);
   4853   os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
   4854        << rd << ", " << rn << ", " << rm;
   4855 }
   4856 
   4857 void Disassembler::vfms(
   4858     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4859   os().SetCurrentInstruction(kVfms, kFpNeon);
   4860   os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " "
   4861        << rd << ", " << rn << ", " << rm;
   4862 }
   4863 
   4864 void Disassembler::vfnma(
   4865     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4866   os().SetCurrentInstruction(kVfnma, kFpNeon);
   4867   os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " "
   4868        << rd << ", " << rn << ", " << rm;
   4869 }
   4870 
   4871 void Disassembler::vfnma(
   4872     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4873   os().SetCurrentInstruction(kVfnma, kFpNeon);
   4874   os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " "
   4875        << rd << ", " << rn << ", " << rm;
   4876 }
   4877 
   4878 void Disassembler::vfnms(
   4879     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   4880   os().SetCurrentInstruction(kVfnms, kFpNeon);
   4881   os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " "
   4882        << rd << ", " << rn << ", " << rm;
   4883 }
   4884 
   4885 void Disassembler::vfnms(
   4886     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4887   os().SetCurrentInstruction(kVfnms, kFpNeon);
   4888   os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " "
   4889        << rd << ", " << rn << ", " << rm;
   4890 }
   4891 
   4892 void Disassembler::vhadd(
   4893     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4894   os().SetCurrentInstruction(kVhadd, kFpNeon);
   4895   os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt;
   4896   os() << " ";
   4897   if (!rd.Is(rn)) {
   4898     os() << rd << ", ";
   4899   }
   4900   os() << rn << ", " << rm;
   4901 }
   4902 
   4903 void Disassembler::vhadd(
   4904     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4905   os().SetCurrentInstruction(kVhadd, kFpNeon);
   4906   os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt;
   4907   os() << " ";
   4908   if (!rd.Is(rn)) {
   4909     os() << rd << ", ";
   4910   }
   4911   os() << rn << ", " << rm;
   4912 }
   4913 
   4914 void Disassembler::vhsub(
   4915     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   4916   os().SetCurrentInstruction(kVhsub, kFpNeon);
   4917   os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt;
   4918   os() << " ";
   4919   if (!rd.Is(rn)) {
   4920     os() << rd << ", ";
   4921   }
   4922   os() << rn << ", " << rm;
   4923 }
   4924 
   4925 void Disassembler::vhsub(
   4926     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   4927   os().SetCurrentInstruction(kVhsub, kFpNeon);
   4928   os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt;
   4929   os() << " ";
   4930   if (!rd.Is(rn)) {
   4931     os() << rd << ", ";
   4932   }
   4933   os() << rn << ", " << rm;
   4934 }
   4935 
   4936 void Disassembler::vld1(Condition cond,
   4937                         DataType dt,
   4938                         const NeonRegisterList& nreglist,
   4939                         const AlignedMemOperand& operand) {
   4940   os().SetCurrentInstruction(kVld1, kFpNeon);
   4941   os() << ToCString(kVld1) << ConditionPrinter(it_block_, cond) << dt << " "
   4942        << nreglist << ", " << PrintAlignedMemOperand(kVld1Location, operand);
   4943 }
   4944 
   4945 void Disassembler::vld2(Condition cond,
   4946                         DataType dt,
   4947                         const NeonRegisterList& nreglist,
   4948                         const AlignedMemOperand& operand) {
   4949   os().SetCurrentInstruction(kVld2, kFpNeon);
   4950   os() << ToCString(kVld2) << ConditionPrinter(it_block_, cond) << dt << " "
   4951        << nreglist << ", " << PrintAlignedMemOperand(kVld2Location, operand);
   4952 }
   4953 
   4954 void Disassembler::vld3(Condition cond,
   4955                         DataType dt,
   4956                         const NeonRegisterList& nreglist,
   4957                         const AlignedMemOperand& operand) {
   4958   os().SetCurrentInstruction(kVld3, kFpNeon);
   4959   os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " "
   4960        << nreglist << ", " << PrintAlignedMemOperand(kVld3Location, operand);
   4961 }
   4962 
   4963 void Disassembler::vld3(Condition cond,
   4964                         DataType dt,
   4965                         const NeonRegisterList& nreglist,
   4966                         const MemOperand& operand) {
   4967   os().SetCurrentInstruction(kVld3, kFpNeon);
   4968   os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " "
   4969        << nreglist << ", " << PrintMemOperand(kVld3Location, operand);
   4970 }
   4971 
   4972 void Disassembler::vld4(Condition cond,
   4973                         DataType dt,
   4974                         const NeonRegisterList& nreglist,
   4975                         const AlignedMemOperand& operand) {
   4976   os().SetCurrentInstruction(kVld4, kFpNeon);
   4977   os() << ToCString(kVld4) << ConditionPrinter(it_block_, cond) << dt << " "
   4978        << nreglist << ", " << PrintAlignedMemOperand(kVld4Location, operand);
   4979 }
   4980 
   4981 void Disassembler::vldm(Condition cond,
   4982                         DataType dt,
   4983                         Register rn,
   4984                         WriteBack write_back,
   4985                         DRegisterList dreglist) {
   4986   os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon);
   4987   os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " "
   4988        << rn << write_back << ", " << dreglist;
   4989 }
   4990 
   4991 void Disassembler::vldm(Condition cond,
   4992                         DataType dt,
   4993                         Register rn,
   4994                         WriteBack write_back,
   4995                         SRegisterList sreglist) {
   4996   os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon);
   4997   os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " "
   4998        << rn << write_back << ", " << sreglist;
   4999 }
   5000 
   5001 void Disassembler::vldmdb(Condition cond,
   5002                           DataType dt,
   5003                           Register rn,
   5004                           WriteBack write_back,
   5005                           DRegisterList dreglist) {
   5006   os().SetCurrentInstruction(kVldmdb,
   5007                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   5008   os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " "
   5009        << rn << write_back << ", " << dreglist;
   5010 }
   5011 
   5012 void Disassembler::vldmdb(Condition cond,
   5013                           DataType dt,
   5014                           Register rn,
   5015                           WriteBack write_back,
   5016                           SRegisterList sreglist) {
   5017   os().SetCurrentInstruction(kVldmdb,
   5018                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   5019   os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " "
   5020        << rn << write_back << ", " << sreglist;
   5021 }
   5022 
   5023 void Disassembler::vldmia(Condition cond,
   5024                           DataType dt,
   5025                           Register rn,
   5026                           WriteBack write_back,
   5027                           DRegisterList dreglist) {
   5028   os().SetCurrentInstruction(kVldmia,
   5029                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   5030   os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " "
   5031        << rn << write_back << ", " << dreglist;
   5032 }
   5033 
   5034 void Disassembler::vldmia(Condition cond,
   5035                           DataType dt,
   5036                           Register rn,
   5037                           WriteBack write_back,
   5038                           SRegisterList sreglist) {
   5039   os().SetCurrentInstruction(kVldmia,
   5040                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   5041   os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " "
   5042        << rn << write_back << ", " << sreglist;
   5043 }
   5044 
   5045 void Disassembler::vldr(Condition cond,
   5046                         DataType dt,
   5047                         DRegister rd,
   5048                         Label* label) {
   5049   os().SetCurrentInstruction(kVldr, kFpNeon);
   5050   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << dt << " "
   5051        << rd << ", " << PrintLabel(kLoadDoublePrecisionLocation,
   5052                                    label,
   5053                                    GetCodeAddress() & ~3);
   5054 }
   5055 
   5056 void Disassembler::vldr(Condition cond,
   5057                         DataType dt,
   5058                         DRegister rd,
   5059                         const MemOperand& operand) {
   5060   os().SetCurrentInstruction(kVldr, kFpNeon);
   5061   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << dt << " "
   5062        << rd << ", " << PrintMemOperand(kLoadDoublePrecisionLocation, operand);
   5063 }
   5064 
   5065 void Disassembler::vldr(Condition cond,
   5066                         DataType dt,
   5067                         SRegister rd,
   5068                         Label* label) {
   5069   os().SetCurrentInstruction(kVldr, kFpNeon);
   5070   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << dt << " "
   5071        << rd << ", " << PrintLabel(kLoadSinglePrecisionLocation,
   5072                                    label,
   5073                                    GetCodeAddress() & ~3);
   5074 }
   5075 
   5076 void Disassembler::vldr(Condition cond,
   5077                         DataType dt,
   5078                         SRegister rd,
   5079                         const MemOperand& operand) {
   5080   os().SetCurrentInstruction(kVldr, kFpNeon);
   5081   os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << dt << " "
   5082        << rd << ", " << PrintMemOperand(kLoadSinglePrecisionLocation, operand);
   5083 }
   5084 
   5085 void Disassembler::vmax(
   5086     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5087   os().SetCurrentInstruction(kVmax, kFpNeon);
   5088   os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt;
   5089   os() << " ";
   5090   if (!rd.Is(rn)) {
   5091     os() << rd << ", ";
   5092   }
   5093   os() << rn << ", " << rm;
   5094 }
   5095 
   5096 void Disassembler::vmax(
   5097     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5098   os().SetCurrentInstruction(kVmax, kFpNeon);
   5099   os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt;
   5100   os() << " ";
   5101   if (!rd.Is(rn)) {
   5102     os() << rd << ", ";
   5103   }
   5104   os() << rn << ", " << rm;
   5105 }
   5106 
   5107 void Disassembler::vmaxnm(DataType dt,
   5108                           DRegister rd,
   5109                           DRegister rn,
   5110                           DRegister rm) {
   5111   os().SetCurrentInstruction(kVmaxnm, kFpNeon);
   5112   os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5113 }
   5114 
   5115 void Disassembler::vmaxnm(DataType dt,
   5116                           QRegister rd,
   5117                           QRegister rn,
   5118                           QRegister rm) {
   5119   os().SetCurrentInstruction(kVmaxnm, kFpNeon);
   5120   os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5121 }
   5122 
   5123 void Disassembler::vmaxnm(DataType dt,
   5124                           SRegister rd,
   5125                           SRegister rn,
   5126                           SRegister rm) {
   5127   os().SetCurrentInstruction(kVmaxnm, kFpNeon);
   5128   os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5129 }
   5130 
   5131 void Disassembler::vmin(
   5132     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5133   os().SetCurrentInstruction(kVmin, kFpNeon);
   5134   os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt;
   5135   os() << " ";
   5136   if (!rd.Is(rn)) {
   5137     os() << rd << ", ";
   5138   }
   5139   os() << rn << ", " << rm;
   5140 }
   5141 
   5142 void Disassembler::vmin(
   5143     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5144   os().SetCurrentInstruction(kVmin, kFpNeon);
   5145   os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt;
   5146   os() << " ";
   5147   if (!rd.Is(rn)) {
   5148     os() << rd << ", ";
   5149   }
   5150   os() << rn << ", " << rm;
   5151 }
   5152 
   5153 void Disassembler::vminnm(DataType dt,
   5154                           DRegister rd,
   5155                           DRegister rn,
   5156                           DRegister rm) {
   5157   os().SetCurrentInstruction(kVminnm, kFpNeon);
   5158   os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5159 }
   5160 
   5161 void Disassembler::vminnm(DataType dt,
   5162                           QRegister rd,
   5163                           QRegister rn,
   5164                           QRegister rm) {
   5165   os().SetCurrentInstruction(kVminnm, kFpNeon);
   5166   os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5167 }
   5168 
   5169 void Disassembler::vminnm(DataType dt,
   5170                           SRegister rd,
   5171                           SRegister rn,
   5172                           SRegister rm) {
   5173   os().SetCurrentInstruction(kVminnm, kFpNeon);
   5174   os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm;
   5175 }
   5176 
   5177 void Disassembler::vmla(
   5178     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
   5179   os().SetCurrentInstruction(kVmla, kFpNeon);
   5180   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5181        << rd << ", " << rn << ", " << rm;
   5182 }
   5183 
   5184 void Disassembler::vmla(
   5185     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
   5186   os().SetCurrentInstruction(kVmla, kFpNeon);
   5187   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5188        << rd << ", " << rn << ", " << rm;
   5189 }
   5190 
   5191 void Disassembler::vmla(
   5192     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5193   os().SetCurrentInstruction(kVmla, kFpNeon);
   5194   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5195        << rd << ", " << rn << ", " << rm;
   5196 }
   5197 
   5198 void Disassembler::vmla(
   5199     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5200   os().SetCurrentInstruction(kVmla, kFpNeon);
   5201   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5202        << rd << ", " << rn << ", " << rm;
   5203 }
   5204 
   5205 void Disassembler::vmla(
   5206     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5207   os().SetCurrentInstruction(kVmla, kFpNeon);
   5208   os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5209        << rd << ", " << rn << ", " << rm;
   5210 }
   5211 
   5212 void Disassembler::vmlal(
   5213     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
   5214   os().SetCurrentInstruction(kVmlal, kFpNeon);
   5215   os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " "
   5216        << rd << ", " << rn << ", " << rm;
   5217 }
   5218 
   5219 void Disassembler::vmlal(
   5220     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5221   os().SetCurrentInstruction(kVmlal, kFpNeon);
   5222   os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " "
   5223        << rd << ", " << rn << ", " << rm;
   5224 }
   5225 
   5226 void Disassembler::vmls(
   5227     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
   5228   os().SetCurrentInstruction(kVmls, kFpNeon);
   5229   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5230        << rd << ", " << rn << ", " << rm;
   5231 }
   5232 
   5233 void Disassembler::vmls(
   5234     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
   5235   os().SetCurrentInstruction(kVmls, kFpNeon);
   5236   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5237        << rd << ", " << rn << ", " << rm;
   5238 }
   5239 
   5240 void Disassembler::vmls(
   5241     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5242   os().SetCurrentInstruction(kVmls, kFpNeon);
   5243   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5244        << rd << ", " << rn << ", " << rm;
   5245 }
   5246 
   5247 void Disassembler::vmls(
   5248     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5249   os().SetCurrentInstruction(kVmls, kFpNeon);
   5250   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5251        << rd << ", " << rn << ", " << rm;
   5252 }
   5253 
   5254 void Disassembler::vmls(
   5255     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5256   os().SetCurrentInstruction(kVmls, kFpNeon);
   5257   os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5258        << rd << ", " << rn << ", " << rm;
   5259 }
   5260 
   5261 void Disassembler::vmlsl(
   5262     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
   5263   os().SetCurrentInstruction(kVmlsl, kFpNeon);
   5264   os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
   5265        << rd << ", " << rn << ", " << rm;
   5266 }
   5267 
   5268 void Disassembler::vmlsl(
   5269     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5270   os().SetCurrentInstruction(kVmlsl, kFpNeon);
   5271   os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
   5272        << rd << ", " << rn << ", " << rm;
   5273 }
   5274 
   5275 void Disassembler::vmov(Condition cond, Register rt, SRegister rn) {
   5276   os().SetCurrentInstruction(kVmov, kFpNeon);
   5277   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
   5278        << ", " << rn;
   5279 }
   5280 
   5281 void Disassembler::vmov(Condition cond, SRegister rn, Register rt) {
   5282   os().SetCurrentInstruction(kVmov, kFpNeon);
   5283   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rn
   5284        << ", " << rt;
   5285 }
   5286 
   5287 void Disassembler::vmov(Condition cond,
   5288                         Register rt,
   5289                         Register rt2,
   5290                         DRegister rm) {
   5291   os().SetCurrentInstruction(kVmov, kFpNeon);
   5292   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
   5293        << ", " << rt2 << ", " << rm;
   5294 }
   5295 
   5296 void Disassembler::vmov(Condition cond,
   5297                         DRegister rm,
   5298                         Register rt,
   5299                         Register rt2) {
   5300   os().SetCurrentInstruction(kVmov, kFpNeon);
   5301   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm
   5302        << ", " << rt << ", " << rt2;
   5303 }
   5304 
   5305 void Disassembler::vmov(
   5306     Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) {
   5307   os().SetCurrentInstruction(kVmov, kFpNeon);
   5308   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt
   5309        << ", " << rt2 << ", " << rm << ", " << rm1;
   5310 }
   5311 
   5312 void Disassembler::vmov(
   5313     Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) {
   5314   os().SetCurrentInstruction(kVmov, kFpNeon);
   5315   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm
   5316        << ", " << rm1 << ", " << rt << ", " << rt2;
   5317 }
   5318 
   5319 void Disassembler::vmov(Condition cond,
   5320                         DataType dt,
   5321                         DRegisterLane rd,
   5322                         Register rt) {
   5323   os().SetCurrentInstruction(kVmov, kFpNeon);
   5324   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5325        << rd << ", " << rt;
   5326 }
   5327 
   5328 void Disassembler::vmov(Condition cond,
   5329                         DataType dt,
   5330                         DRegister rd,
   5331                         const DOperand& operand) {
   5332   os().SetCurrentInstruction(kVmov, kFpNeon);
   5333   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5334        << rd << ", " << operand;
   5335 }
   5336 
   5337 void Disassembler::vmov(Condition cond,
   5338                         DataType dt,
   5339                         QRegister rd,
   5340                         const QOperand& operand) {
   5341   os().SetCurrentInstruction(kVmov, kFpNeon);
   5342   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5343        << rd << ", " << operand;
   5344 }
   5345 
   5346 void Disassembler::vmov(Condition cond,
   5347                         DataType dt,
   5348                         SRegister rd,
   5349                         const SOperand& operand) {
   5350   os().SetCurrentInstruction(kVmov, kFpNeon);
   5351   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5352        << rd << ", " << operand;
   5353 }
   5354 
   5355 void Disassembler::vmov(Condition cond,
   5356                         DataType dt,
   5357                         Register rt,
   5358                         DRegisterLane rn) {
   5359   os().SetCurrentInstruction(kVmov, kFpNeon);
   5360   os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " "
   5361        << rt << ", " << rn;
   5362 }
   5363 
   5364 void Disassembler::vmovl(Condition cond,
   5365                          DataType dt,
   5366                          QRegister rd,
   5367                          DRegister rm) {
   5368   os().SetCurrentInstruction(kVmovl, kFpNeon);
   5369   os() << ToCString(kVmovl) << ConditionPrinter(it_block_, cond) << dt << " "
   5370        << rd << ", " << rm;
   5371 }
   5372 
   5373 void Disassembler::vmovn(Condition cond,
   5374                          DataType dt,
   5375                          DRegister rd,
   5376                          QRegister rm) {
   5377   os().SetCurrentInstruction(kVmovn, kFpNeon);
   5378   os() << ToCString(kVmovn) << ConditionPrinter(it_block_, cond) << dt << " "
   5379        << rd << ", " << rm;
   5380 }
   5381 
   5382 void Disassembler::vmrs(Condition cond,
   5383                         RegisterOrAPSR_nzcv rt,
   5384                         SpecialFPRegister spec_reg) {
   5385   os().SetCurrentInstruction(kVmrs, kFpNeon);
   5386   os() << ToCString(kVmrs) << ConditionPrinter(it_block_, cond) << " " << rt
   5387        << ", " << spec_reg;
   5388 }
   5389 
   5390 void Disassembler::vmsr(Condition cond,
   5391                         SpecialFPRegister spec_reg,
   5392                         Register rt) {
   5393   os().SetCurrentInstruction(kVmsr, kFpNeon);
   5394   os() << ToCString(kVmsr) << ConditionPrinter(it_block_, cond) << " "
   5395        << spec_reg << ", " << rt;
   5396 }
   5397 
   5398 void Disassembler::vmul(Condition cond,
   5399                         DataType dt,
   5400                         DRegister rd,
   5401                         DRegister rn,
   5402                         DRegister dm,
   5403                         unsigned index) {
   5404   os().SetCurrentInstruction(kVmul, kFpNeon);
   5405   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5406   os() << " ";
   5407   if (!rd.Is(rn)) {
   5408     os() << rd << ", ";
   5409   }
   5410   os() << rn << ", " << dm << "[" << index << "]";
   5411 }
   5412 
   5413 void Disassembler::vmul(Condition cond,
   5414                         DataType dt,
   5415                         QRegister rd,
   5416                         QRegister rn,
   5417                         DRegister dm,
   5418                         unsigned index) {
   5419   os().SetCurrentInstruction(kVmul, kFpNeon);
   5420   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5421   os() << " ";
   5422   if (!rd.Is(rn)) {
   5423     os() << rd << ", ";
   5424   }
   5425   os() << rn << ", " << dm << "[" << index << "]";
   5426 }
   5427 
   5428 void Disassembler::vmul(
   5429     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5430   os().SetCurrentInstruction(kVmul, kFpNeon);
   5431   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5432   os() << " ";
   5433   if (!rd.Is(rn)) {
   5434     os() << rd << ", ";
   5435   }
   5436   os() << rn << ", " << rm;
   5437 }
   5438 
   5439 void Disassembler::vmul(
   5440     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5441   os().SetCurrentInstruction(kVmul, kFpNeon);
   5442   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5443   os() << " ";
   5444   if (!rd.Is(rn)) {
   5445     os() << rd << ", ";
   5446   }
   5447   os() << rn << ", " << rm;
   5448 }
   5449 
   5450 void Disassembler::vmul(
   5451     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5452   os().SetCurrentInstruction(kVmul, kFpNeon);
   5453   os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt;
   5454   os() << " ";
   5455   if (!rd.Is(rn)) {
   5456     os() << rd << ", ";
   5457   }
   5458   os() << rn << ", " << rm;
   5459 }
   5460 
   5461 void Disassembler::vmull(Condition cond,
   5462                          DataType dt,
   5463                          QRegister rd,
   5464                          DRegister rn,
   5465                          DRegister dm,
   5466                          unsigned index) {
   5467   os().SetCurrentInstruction(kVmull, kFpNeon);
   5468   os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " "
   5469        << rd << ", " << rn << ", " << dm << "[" << index << "]";
   5470 }
   5471 
   5472 void Disassembler::vmull(
   5473     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5474   os().SetCurrentInstruction(kVmull, kFpNeon);
   5475   os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " "
   5476        << rd << ", " << rn << ", " << rm;
   5477 }
   5478 
   5479 void Disassembler::vmvn(Condition cond,
   5480                         DataType dt,
   5481                         DRegister rd,
   5482                         const DOperand& operand) {
   5483   os().SetCurrentInstruction(kVmvn, kFpNeon);
   5484   os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " "
   5485        << rd << ", " << operand;
   5486 }
   5487 
   5488 void Disassembler::vmvn(Condition cond,
   5489                         DataType dt,
   5490                         QRegister rd,
   5491                         const QOperand& operand) {
   5492   os().SetCurrentInstruction(kVmvn, kFpNeon);
   5493   os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " "
   5494        << rd << ", " << operand;
   5495 }
   5496 
   5497 void Disassembler::vneg(Condition cond,
   5498                         DataType dt,
   5499                         DRegister rd,
   5500                         DRegister rm) {
   5501   os().SetCurrentInstruction(kVneg, kFpNeon);
   5502   os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5503        << rd << ", " << rm;
   5504 }
   5505 
   5506 void Disassembler::vneg(Condition cond,
   5507                         DataType dt,
   5508                         QRegister rd,
   5509                         QRegister rm) {
   5510   os().SetCurrentInstruction(kVneg, kFpNeon);
   5511   os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5512        << rd << ", " << rm;
   5513 }
   5514 
   5515 void Disassembler::vneg(Condition cond,
   5516                         DataType dt,
   5517                         SRegister rd,
   5518                         SRegister rm) {
   5519   os().SetCurrentInstruction(kVneg, kFpNeon);
   5520   os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5521        << rd << ", " << rm;
   5522 }
   5523 
   5524 void Disassembler::vnmla(
   5525     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5526   os().SetCurrentInstruction(kVnmla, kFpNeon);
   5527   os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5528        << rd << ", " << rn << ", " << rm;
   5529 }
   5530 
   5531 void Disassembler::vnmla(
   5532     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5533   os().SetCurrentInstruction(kVnmla, kFpNeon);
   5534   os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " "
   5535        << rd << ", " << rn << ", " << rm;
   5536 }
   5537 
   5538 void Disassembler::vnmls(
   5539     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5540   os().SetCurrentInstruction(kVnmls, kFpNeon);
   5541   os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5542        << rd << ", " << rn << ", " << rm;
   5543 }
   5544 
   5545 void Disassembler::vnmls(
   5546     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5547   os().SetCurrentInstruction(kVnmls, kFpNeon);
   5548   os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " "
   5549        << rd << ", " << rn << ", " << rm;
   5550 }
   5551 
   5552 void Disassembler::vnmul(
   5553     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   5554   os().SetCurrentInstruction(kVnmul, kFpNeon);
   5555   os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt;
   5556   os() << " ";
   5557   if (!rd.Is(rn)) {
   5558     os() << rd << ", ";
   5559   }
   5560   os() << rn << ", " << rm;
   5561 }
   5562 
   5563 void Disassembler::vnmul(
   5564     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5565   os().SetCurrentInstruction(kVnmul, kFpNeon);
   5566   os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt;
   5567   os() << " ";
   5568   if (!rd.Is(rn)) {
   5569     os() << rd << ", ";
   5570   }
   5571   os() << rn << ", " << rm;
   5572 }
   5573 
   5574 void Disassembler::vorn(Condition cond,
   5575                         DataType dt,
   5576                         DRegister rd,
   5577                         DRegister rn,
   5578                         const DOperand& operand) {
   5579   os().SetCurrentInstruction(kVorn, kFpNeon);
   5580   os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt;
   5581   os() << " ";
   5582   if (!rd.Is(rn)) {
   5583     os() << rd << ", ";
   5584   }
   5585   os() << rn << ", " << operand;
   5586 }
   5587 
   5588 void Disassembler::vorn(Condition cond,
   5589                         DataType dt,
   5590                         QRegister rd,
   5591                         QRegister rn,
   5592                         const QOperand& operand) {
   5593   os().SetCurrentInstruction(kVorn, kFpNeon);
   5594   os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt;
   5595   os() << " ";
   5596   if (!rd.Is(rn)) {
   5597     os() << rd << ", ";
   5598   }
   5599   os() << rn << ", " << operand;
   5600 }
   5601 
   5602 void Disassembler::vorr(Condition cond,
   5603                         DataType dt,
   5604                         DRegister rd,
   5605                         DRegister rn,
   5606                         const DOperand& operand) {
   5607   os().SetCurrentInstruction(kVorr, kFpNeon);
   5608   os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt;
   5609   os() << " ";
   5610   if (!rd.Is(rn)) {
   5611     os() << rd << ", ";
   5612   }
   5613   os() << rn << ", " << operand;
   5614 }
   5615 
   5616 void Disassembler::vorr(Condition cond,
   5617                         DataType dt,
   5618                         QRegister rd,
   5619                         QRegister rn,
   5620                         const QOperand& operand) {
   5621   os().SetCurrentInstruction(kVorr, kFpNeon);
   5622   os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt;
   5623   os() << " ";
   5624   if (!rd.Is(rn)) {
   5625     os() << rd << ", ";
   5626   }
   5627   os() << rn << ", " << operand;
   5628 }
   5629 
   5630 void Disassembler::vpadal(Condition cond,
   5631                           DataType dt,
   5632                           DRegister rd,
   5633                           DRegister rm) {
   5634   os().SetCurrentInstruction(kVpadal, kFpNeon);
   5635   os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " "
   5636        << rd << ", " << rm;
   5637 }
   5638 
   5639 void Disassembler::vpadal(Condition cond,
   5640                           DataType dt,
   5641                           QRegister rd,
   5642                           QRegister rm) {
   5643   os().SetCurrentInstruction(kVpadal, kFpNeon);
   5644   os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " "
   5645        << rd << ", " << rm;
   5646 }
   5647 
   5648 void Disassembler::vpadd(
   5649     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5650   os().SetCurrentInstruction(kVpadd, kFpNeon);
   5651   os() << ToCString(kVpadd) << ConditionPrinter(it_block_, cond) << dt;
   5652   os() << " ";
   5653   if (!rd.Is(rn)) {
   5654     os() << rd << ", ";
   5655   }
   5656   os() << rn << ", " << rm;
   5657 }
   5658 
   5659 void Disassembler::vpaddl(Condition cond,
   5660                           DataType dt,
   5661                           DRegister rd,
   5662                           DRegister rm) {
   5663   os().SetCurrentInstruction(kVpaddl, kFpNeon);
   5664   os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " "
   5665        << rd << ", " << rm;
   5666 }
   5667 
   5668 void Disassembler::vpaddl(Condition cond,
   5669                           DataType dt,
   5670                           QRegister rd,
   5671                           QRegister rm) {
   5672   os().SetCurrentInstruction(kVpaddl, kFpNeon);
   5673   os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " "
   5674        << rd << ", " << rm;
   5675 }
   5676 
   5677 void Disassembler::vpmax(
   5678     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5679   os().SetCurrentInstruction(kVpmax, kFpNeon);
   5680   os() << ToCString(kVpmax) << ConditionPrinter(it_block_, cond) << dt;
   5681   os() << " ";
   5682   if (!rd.Is(rn)) {
   5683     os() << rd << ", ";
   5684   }
   5685   os() << rn << ", " << rm;
   5686 }
   5687 
   5688 void Disassembler::vpmin(
   5689     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5690   os().SetCurrentInstruction(kVpmin, kFpNeon);
   5691   os() << ToCString(kVpmin) << ConditionPrinter(it_block_, cond) << dt;
   5692   os() << " ";
   5693   if (!rd.Is(rn)) {
   5694     os() << rd << ", ";
   5695   }
   5696   os() << rn << ", " << rm;
   5697 }
   5698 
   5699 void Disassembler::vpop(Condition cond, DataType dt, DRegisterList dreglist) {
   5700   os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon);
   5701   os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " "
   5702        << dreglist;
   5703 }
   5704 
   5705 void Disassembler::vpop(Condition cond, DataType dt, SRegisterList sreglist) {
   5706   os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon);
   5707   os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " "
   5708        << sreglist;
   5709 }
   5710 
   5711 void Disassembler::vpush(Condition cond, DataType dt, DRegisterList dreglist) {
   5712   os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon);
   5713   os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " "
   5714        << dreglist;
   5715 }
   5716 
   5717 void Disassembler::vpush(Condition cond, DataType dt, SRegisterList sreglist) {
   5718   os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon);
   5719   os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " "
   5720        << sreglist;
   5721 }
   5722 
   5723 void Disassembler::vqabs(Condition cond,
   5724                          DataType dt,
   5725                          DRegister rd,
   5726                          DRegister rm) {
   5727   os().SetCurrentInstruction(kVqabs, kFpNeon);
   5728   os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " "
   5729        << rd << ", " << rm;
   5730 }
   5731 
   5732 void Disassembler::vqabs(Condition cond,
   5733                          DataType dt,
   5734                          QRegister rd,
   5735                          QRegister rm) {
   5736   os().SetCurrentInstruction(kVqabs, kFpNeon);
   5737   os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " "
   5738        << rd << ", " << rm;
   5739 }
   5740 
   5741 void Disassembler::vqadd(
   5742     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5743   os().SetCurrentInstruction(kVqadd, kFpNeon);
   5744   os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt;
   5745   os() << " ";
   5746   if (!rd.Is(rn)) {
   5747     os() << rd << ", ";
   5748   }
   5749   os() << rn << ", " << rm;
   5750 }
   5751 
   5752 void Disassembler::vqadd(
   5753     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5754   os().SetCurrentInstruction(kVqadd, kFpNeon);
   5755   os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt;
   5756   os() << " ";
   5757   if (!rd.Is(rn)) {
   5758     os() << rd << ", ";
   5759   }
   5760   os() << rn << ", " << rm;
   5761 }
   5762 
   5763 void Disassembler::vqdmlal(
   5764     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5765   os().SetCurrentInstruction(kVqdmlal, kFpNeon);
   5766   os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " "
   5767        << rd << ", " << rn << ", " << rm;
   5768 }
   5769 
   5770 void Disassembler::vqdmlal(Condition cond,
   5771                            DataType dt,
   5772                            QRegister rd,
   5773                            DRegister rn,
   5774                            DRegister dm,
   5775                            unsigned index) {
   5776   os().SetCurrentInstruction(kVqdmlal, kFpNeon);
   5777   os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " "
   5778        << rd << ", " << rn << ", " << dm << "[" << index << "]";
   5779 }
   5780 
   5781 void Disassembler::vqdmlsl(
   5782     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5783   os().SetCurrentInstruction(kVqdmlsl, kFpNeon);
   5784   os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
   5785        << rd << ", " << rn << ", " << rm;
   5786 }
   5787 
   5788 void Disassembler::vqdmlsl(Condition cond,
   5789                            DataType dt,
   5790                            QRegister rd,
   5791                            DRegister rn,
   5792                            DRegister dm,
   5793                            unsigned index) {
   5794   os().SetCurrentInstruction(kVqdmlsl, kFpNeon);
   5795   os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " "
   5796        << rd << ", " << rn << ", " << dm << "[" << index << "]";
   5797 }
   5798 
   5799 void Disassembler::vqdmulh(
   5800     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5801   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
   5802   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5803   os() << " ";
   5804   if (!rd.Is(rn)) {
   5805     os() << rd << ", ";
   5806   }
   5807   os() << rn << ", " << rm;
   5808 }
   5809 
   5810 void Disassembler::vqdmulh(
   5811     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5812   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
   5813   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5814   os() << " ";
   5815   if (!rd.Is(rn)) {
   5816     os() << rd << ", ";
   5817   }
   5818   os() << rn << ", " << rm;
   5819 }
   5820 
   5821 void Disassembler::vqdmulh(
   5822     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
   5823   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
   5824   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5825   os() << " ";
   5826   if (!rd.Is(rn)) {
   5827     os() << rd << ", ";
   5828   }
   5829   os() << rn << ", " << rm;
   5830 }
   5831 
   5832 void Disassembler::vqdmulh(
   5833     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
   5834   os().SetCurrentInstruction(kVqdmulh, kFpNeon);
   5835   os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5836   os() << " ";
   5837   if (!rd.Is(rn)) {
   5838     os() << rd << ", ";
   5839   }
   5840   os() << rn << ", " << rm;
   5841 }
   5842 
   5843 void Disassembler::vqdmull(
   5844     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   5845   os().SetCurrentInstruction(kVqdmull, kFpNeon);
   5846   os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " "
   5847        << rd << ", " << rn << ", " << rm;
   5848 }
   5849 
   5850 void Disassembler::vqdmull(
   5851     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
   5852   os().SetCurrentInstruction(kVqdmull, kFpNeon);
   5853   os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " "
   5854        << rd << ", " << rn << ", " << rm;
   5855 }
   5856 
   5857 void Disassembler::vqmovn(Condition cond,
   5858                           DataType dt,
   5859                           DRegister rd,
   5860                           QRegister rm) {
   5861   os().SetCurrentInstruction(kVqmovn, kFpNeon);
   5862   os() << ToCString(kVqmovn) << ConditionPrinter(it_block_, cond) << dt << " "
   5863        << rd << ", " << rm;
   5864 }
   5865 
   5866 void Disassembler::vqmovun(Condition cond,
   5867                            DataType dt,
   5868                            DRegister rd,
   5869                            QRegister rm) {
   5870   os().SetCurrentInstruction(kVqmovun, kFpNeon);
   5871   os() << ToCString(kVqmovun) << ConditionPrinter(it_block_, cond) << dt << " "
   5872        << rd << ", " << rm;
   5873 }
   5874 
   5875 void Disassembler::vqneg(Condition cond,
   5876                          DataType dt,
   5877                          DRegister rd,
   5878                          DRegister rm) {
   5879   os().SetCurrentInstruction(kVqneg, kFpNeon);
   5880   os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5881        << rd << ", " << rm;
   5882 }
   5883 
   5884 void Disassembler::vqneg(Condition cond,
   5885                          DataType dt,
   5886                          QRegister rd,
   5887                          QRegister rm) {
   5888   os().SetCurrentInstruction(kVqneg, kFpNeon);
   5889   os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " "
   5890        << rd << ", " << rm;
   5891 }
   5892 
   5893 void Disassembler::vqrdmulh(
   5894     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   5895   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
   5896   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5897   os() << " ";
   5898   if (!rd.Is(rn)) {
   5899     os() << rd << ", ";
   5900   }
   5901   os() << rn << ", " << rm;
   5902 }
   5903 
   5904 void Disassembler::vqrdmulh(
   5905     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   5906   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
   5907   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5908   os() << " ";
   5909   if (!rd.Is(rn)) {
   5910     os() << rd << ", ";
   5911   }
   5912   os() << rn << ", " << rm;
   5913 }
   5914 
   5915 void Disassembler::vqrdmulh(
   5916     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
   5917   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
   5918   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5919   os() << " ";
   5920   if (!rd.Is(rn)) {
   5921     os() << rd << ", ";
   5922   }
   5923   os() << rn << ", " << rm;
   5924 }
   5925 
   5926 void Disassembler::vqrdmulh(
   5927     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
   5928   os().SetCurrentInstruction(kVqrdmulh, kFpNeon);
   5929   os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt;
   5930   os() << " ";
   5931   if (!rd.Is(rn)) {
   5932     os() << rd << ", ";
   5933   }
   5934   os() << rn << ", " << rm;
   5935 }
   5936 
   5937 void Disassembler::vqrshl(
   5938     Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
   5939   os().SetCurrentInstruction(kVqrshl, kFpNeon);
   5940   os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt;
   5941   os() << " ";
   5942   if (!rd.Is(rm)) {
   5943     os() << rd << ", ";
   5944   }
   5945   os() << rm << ", " << rn;
   5946 }
   5947 
   5948 void Disassembler::vqrshl(
   5949     Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
   5950   os().SetCurrentInstruction(kVqrshl, kFpNeon);
   5951   os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt;
   5952   os() << " ";
   5953   if (!rd.Is(rm)) {
   5954     os() << rd << ", ";
   5955   }
   5956   os() << rm << ", " << rn;
   5957 }
   5958 
   5959 void Disassembler::vqrshrn(Condition cond,
   5960                            DataType dt,
   5961                            DRegister rd,
   5962                            QRegister rm,
   5963                            const QOperand& operand) {
   5964   os().SetCurrentInstruction(kVqrshrn, kFpNeon);
   5965   os() << ToCString(kVqrshrn) << ConditionPrinter(it_block_, cond) << dt << " "
   5966        << rd << ", " << rm << ", " << operand;
   5967 }
   5968 
   5969 void Disassembler::vqrshrun(Condition cond,
   5970                             DataType dt,
   5971                             DRegister rd,
   5972                             QRegister rm,
   5973                             const QOperand& operand) {
   5974   os().SetCurrentInstruction(kVqrshrun, kFpNeon);
   5975   os() << ToCString(kVqrshrun) << ConditionPrinter(it_block_, cond) << dt << " "
   5976        << rd << ", " << rm << ", " << operand;
   5977 }
   5978 
   5979 void Disassembler::vqshl(Condition cond,
   5980                          DataType dt,
   5981                          DRegister rd,
   5982                          DRegister rm,
   5983                          const DOperand& operand) {
   5984   os().SetCurrentInstruction(kVqshl, kFpNeon);
   5985   os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt;
   5986   os() << " ";
   5987   if (!rd.Is(rm)) {
   5988     os() << rd << ", ";
   5989   }
   5990   os() << rm << ", " << operand;
   5991 }
   5992 
   5993 void Disassembler::vqshl(Condition cond,
   5994                          DataType dt,
   5995                          QRegister rd,
   5996                          QRegister rm,
   5997                          const QOperand& operand) {
   5998   os().SetCurrentInstruction(kVqshl, kFpNeon);
   5999   os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt;
   6000   os() << " ";
   6001   if (!rd.Is(rm)) {
   6002     os() << rd << ", ";
   6003   }
   6004   os() << rm << ", " << operand;
   6005 }
   6006 
   6007 void Disassembler::vqshlu(Condition cond,
   6008                           DataType dt,
   6009                           DRegister rd,
   6010                           DRegister rm,
   6011                           const DOperand& operand) {
   6012   os().SetCurrentInstruction(kVqshlu, kFpNeon);
   6013   os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt;
   6014   os() << " ";
   6015   if (!rd.Is(rm)) {
   6016     os() << rd << ", ";
   6017   }
   6018   os() << rm << ", " << operand;
   6019 }
   6020 
   6021 void Disassembler::vqshlu(Condition cond,
   6022                           DataType dt,
   6023                           QRegister rd,
   6024                           QRegister rm,
   6025                           const QOperand& operand) {
   6026   os().SetCurrentInstruction(kVqshlu, kFpNeon);
   6027   os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt;
   6028   os() << " ";
   6029   if (!rd.Is(rm)) {
   6030     os() << rd << ", ";
   6031   }
   6032   os() << rm << ", " << operand;
   6033 }
   6034 
   6035 void Disassembler::vqshrn(Condition cond,
   6036                           DataType dt,
   6037                           DRegister rd,
   6038                           QRegister rm,
   6039                           const QOperand& operand) {
   6040   os().SetCurrentInstruction(kVqshrn, kFpNeon);
   6041   os() << ToCString(kVqshrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6042        << rd << ", " << rm << ", " << operand;
   6043 }
   6044 
   6045 void Disassembler::vqshrun(Condition cond,
   6046                            DataType dt,
   6047                            DRegister rd,
   6048                            QRegister rm,
   6049                            const QOperand& operand) {
   6050   os().SetCurrentInstruction(kVqshrun, kFpNeon);
   6051   os() << ToCString(kVqshrun) << ConditionPrinter(it_block_, cond) << dt << " "
   6052        << rd << ", " << rm << ", " << operand;
   6053 }
   6054 
   6055 void Disassembler::vqsub(
   6056     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6057   os().SetCurrentInstruction(kVqsub, kFpNeon);
   6058   os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt;
   6059   os() << " ";
   6060   if (!rd.Is(rn)) {
   6061     os() << rd << ", ";
   6062   }
   6063   os() << rn << ", " << rm;
   6064 }
   6065 
   6066 void Disassembler::vqsub(
   6067     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6068   os().SetCurrentInstruction(kVqsub, kFpNeon);
   6069   os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt;
   6070   os() << " ";
   6071   if (!rd.Is(rn)) {
   6072     os() << rd << ", ";
   6073   }
   6074   os() << rn << ", " << rm;
   6075 }
   6076 
   6077 void Disassembler::vraddhn(
   6078     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
   6079   os().SetCurrentInstruction(kVraddhn, kFpNeon);
   6080   os() << ToCString(kVraddhn) << ConditionPrinter(it_block_, cond) << dt << " "
   6081        << rd << ", " << rn << ", " << rm;
   6082 }
   6083 
   6084 void Disassembler::vrecpe(Condition cond,
   6085                           DataType dt,
   6086                           DRegister rd,
   6087                           DRegister rm) {
   6088   os().SetCurrentInstruction(kVrecpe, kFpNeon);
   6089   os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " "
   6090        << rd << ", " << rm;
   6091 }
   6092 
   6093 void Disassembler::vrecpe(Condition cond,
   6094                           DataType dt,
   6095                           QRegister rd,
   6096                           QRegister rm) {
   6097   os().SetCurrentInstruction(kVrecpe, kFpNeon);
   6098   os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " "
   6099        << rd << ", " << rm;
   6100 }
   6101 
   6102 void Disassembler::vrecps(
   6103     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6104   os().SetCurrentInstruction(kVrecps, kFpNeon);
   6105   os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt;
   6106   os() << " ";
   6107   if (!rd.Is(rn)) {
   6108     os() << rd << ", ";
   6109   }
   6110   os() << rn << ", " << rm;
   6111 }
   6112 
   6113 void Disassembler::vrecps(
   6114     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6115   os().SetCurrentInstruction(kVrecps, kFpNeon);
   6116   os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt;
   6117   os() << " ";
   6118   if (!rd.Is(rn)) {
   6119     os() << rd << ", ";
   6120   }
   6121   os() << rn << ", " << rm;
   6122 }
   6123 
   6124 void Disassembler::vrev16(Condition cond,
   6125                           DataType dt,
   6126                           DRegister rd,
   6127                           DRegister rm) {
   6128   os().SetCurrentInstruction(kVrev16, kFpNeon);
   6129   os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " "
   6130        << rd << ", " << rm;
   6131 }
   6132 
   6133 void Disassembler::vrev16(Condition cond,
   6134                           DataType dt,
   6135                           QRegister rd,
   6136                           QRegister rm) {
   6137   os().SetCurrentInstruction(kVrev16, kFpNeon);
   6138   os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " "
   6139        << rd << ", " << rm;
   6140 }
   6141 
   6142 void Disassembler::vrev32(Condition cond,
   6143                           DataType dt,
   6144                           DRegister rd,
   6145                           DRegister rm) {
   6146   os().SetCurrentInstruction(kVrev32, kFpNeon);
   6147   os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " "
   6148        << rd << ", " << rm;
   6149 }
   6150 
   6151 void Disassembler::vrev32(Condition cond,
   6152                           DataType dt,
   6153                           QRegister rd,
   6154                           QRegister rm) {
   6155   os().SetCurrentInstruction(kVrev32, kFpNeon);
   6156   os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " "
   6157        << rd << ", " << rm;
   6158 }
   6159 
   6160 void Disassembler::vrev64(Condition cond,
   6161                           DataType dt,
   6162                           DRegister rd,
   6163                           DRegister rm) {
   6164   os().SetCurrentInstruction(kVrev64, kFpNeon);
   6165   os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " "
   6166        << rd << ", " << rm;
   6167 }
   6168 
   6169 void Disassembler::vrev64(Condition cond,
   6170                           DataType dt,
   6171                           QRegister rd,
   6172                           QRegister rm) {
   6173   os().SetCurrentInstruction(kVrev64, kFpNeon);
   6174   os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " "
   6175        << rd << ", " << rm;
   6176 }
   6177 
   6178 void Disassembler::vrhadd(
   6179     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6180   os().SetCurrentInstruction(kVrhadd, kFpNeon);
   6181   os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt;
   6182   os() << " ";
   6183   if (!rd.Is(rn)) {
   6184     os() << rd << ", ";
   6185   }
   6186   os() << rn << ", " << rm;
   6187 }
   6188 
   6189 void Disassembler::vrhadd(
   6190     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6191   os().SetCurrentInstruction(kVrhadd, kFpNeon);
   6192   os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt;
   6193   os() << " ";
   6194   if (!rd.Is(rn)) {
   6195     os() << rd << ", ";
   6196   }
   6197   os() << rn << ", " << rm;
   6198 }
   6199 
   6200 void Disassembler::vrinta(DataType dt1,
   6201                           DataType dt2,
   6202                           DRegister rd,
   6203                           DRegister rm) {
   6204   os().SetCurrentInstruction(kVrinta, kFpNeon);
   6205   os() << ToCString(kVrinta) << dt1 << dt2 << " " << rd << ", " << rm;
   6206 }
   6207 
   6208 void Disassembler::vrinta(DataType dt1,
   6209                           DataType dt2,
   6210                           QRegister rd,
   6211                           QRegister rm) {
   6212   os().SetCurrentInstruction(kVrinta, kFpNeon);
   6213   os() << ToCString(kVrinta) << dt1 << dt2 << " " << rd << ", " << rm;
   6214 }
   6215 
   6216 void Disassembler::vrinta(DataType dt1,
   6217                           DataType dt2,
   6218                           SRegister rd,
   6219                           SRegister rm) {
   6220   os().SetCurrentInstruction(kVrinta, kFpNeon);
   6221   os() << ToCString(kVrinta) << dt1 << dt2 << " " << rd << ", " << rm;
   6222 }
   6223 
   6224 void Disassembler::vrintm(DataType dt1,
   6225                           DataType dt2,
   6226                           DRegister rd,
   6227                           DRegister rm) {
   6228   os().SetCurrentInstruction(kVrintm, kFpNeon);
   6229   os() << ToCString(kVrintm) << dt1 << dt2 << " " << rd << ", " << rm;
   6230 }
   6231 
   6232 void Disassembler::vrintm(DataType dt1,
   6233                           DataType dt2,
   6234                           QRegister rd,
   6235                           QRegister rm) {
   6236   os().SetCurrentInstruction(kVrintm, kFpNeon);
   6237   os() << ToCString(kVrintm) << dt1 << dt2 << " " << rd << ", " << rm;
   6238 }
   6239 
   6240 void Disassembler::vrintm(DataType dt1,
   6241                           DataType dt2,
   6242                           SRegister rd,
   6243                           SRegister rm) {
   6244   os().SetCurrentInstruction(kVrintm, kFpNeon);
   6245   os() << ToCString(kVrintm) << dt1 << dt2 << " " << rd << ", " << rm;
   6246 }
   6247 
   6248 void Disassembler::vrintn(DataType dt1,
   6249                           DataType dt2,
   6250                           DRegister rd,
   6251                           DRegister rm) {
   6252   os().SetCurrentInstruction(kVrintn, kFpNeon);
   6253   os() << ToCString(kVrintn) << dt1 << dt2 << " " << rd << ", " << rm;
   6254 }
   6255 
   6256 void Disassembler::vrintn(DataType dt1,
   6257                           DataType dt2,
   6258                           QRegister rd,
   6259                           QRegister rm) {
   6260   os().SetCurrentInstruction(kVrintn, kFpNeon);
   6261   os() << ToCString(kVrintn) << dt1 << dt2 << " " << rd << ", " << rm;
   6262 }
   6263 
   6264 void Disassembler::vrintn(DataType dt1,
   6265                           DataType dt2,
   6266                           SRegister rd,
   6267                           SRegister rm) {
   6268   os().SetCurrentInstruction(kVrintn, kFpNeon);
   6269   os() << ToCString(kVrintn) << dt1 << dt2 << " " << rd << ", " << rm;
   6270 }
   6271 
   6272 void Disassembler::vrintp(DataType dt1,
   6273                           DataType dt2,
   6274                           DRegister rd,
   6275                           DRegister rm) {
   6276   os().SetCurrentInstruction(kVrintp, kFpNeon);
   6277   os() << ToCString(kVrintp) << dt1 << dt2 << " " << rd << ", " << rm;
   6278 }
   6279 
   6280 void Disassembler::vrintp(DataType dt1,
   6281                           DataType dt2,
   6282                           QRegister rd,
   6283                           QRegister rm) {
   6284   os().SetCurrentInstruction(kVrintp, kFpNeon);
   6285   os() << ToCString(kVrintp) << dt1 << dt2 << " " << rd << ", " << rm;
   6286 }
   6287 
   6288 void Disassembler::vrintp(DataType dt1,
   6289                           DataType dt2,
   6290                           SRegister rd,
   6291                           SRegister rm) {
   6292   os().SetCurrentInstruction(kVrintp, kFpNeon);
   6293   os() << ToCString(kVrintp) << dt1 << dt2 << " " << rd << ", " << rm;
   6294 }
   6295 
   6296 void Disassembler::vrintr(
   6297     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   6298   os().SetCurrentInstruction(kVrintr, kFpNeon);
   6299   os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   6300        << " " << rd << ", " << rm;
   6301 }
   6302 
   6303 void Disassembler::vrintr(
   6304     Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
   6305   os().SetCurrentInstruction(kVrintr, kFpNeon);
   6306   os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   6307        << " " << rd << ", " << rm;
   6308 }
   6309 
   6310 void Disassembler::vrintx(
   6311     Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
   6312   os().SetCurrentInstruction(kVrintx, kFpNeon);
   6313   os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   6314        << " " << rd << ", " << rm;
   6315 }
   6316 
   6317 void Disassembler::vrintx(DataType dt1,
   6318                           DataType dt2,
   6319                           QRegister rd,
   6320                           QRegister rm) {
   6321   os().SetCurrentInstruction(kVrintx, kFpNeon);
   6322   os() << ToCString(kVrintx) << dt1 << dt2 << " " << rd << ", " << rm;
   6323 }
   6324 
   6325 void Disassembler::vrintx(
   6326     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   6327   os().SetCurrentInstruction(kVrintx, kFpNeon);
   6328   os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   6329        << " " << rd << ", " << rm;
   6330 }
   6331 
   6332 void Disassembler::vrintz(
   6333     Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
   6334   os().SetCurrentInstruction(kVrintz, kFpNeon);
   6335   os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   6336        << " " << rd << ", " << rm;
   6337 }
   6338 
   6339 void Disassembler::vrintz(DataType dt1,
   6340                           DataType dt2,
   6341                           QRegister rd,
   6342                           QRegister rm) {
   6343   os().SetCurrentInstruction(kVrintz, kFpNeon);
   6344   os() << ToCString(kVrintz) << dt1 << dt2 << " " << rd << ", " << rm;
   6345 }
   6346 
   6347 void Disassembler::vrintz(
   6348     Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
   6349   os().SetCurrentInstruction(kVrintz, kFpNeon);
   6350   os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt1 << dt2
   6351        << " " << rd << ", " << rm;
   6352 }
   6353 
   6354 void Disassembler::vrshl(
   6355     Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
   6356   os().SetCurrentInstruction(kVrshl, kFpNeon);
   6357   os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt;
   6358   os() << " ";
   6359   if (!rd.Is(rm)) {
   6360     os() << rd << ", ";
   6361   }
   6362   os() << rm << ", " << rn;
   6363 }
   6364 
   6365 void Disassembler::vrshl(
   6366     Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
   6367   os().SetCurrentInstruction(kVrshl, kFpNeon);
   6368   os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt;
   6369   os() << " ";
   6370   if (!rd.Is(rm)) {
   6371     os() << rd << ", ";
   6372   }
   6373   os() << rm << ", " << rn;
   6374 }
   6375 
   6376 void Disassembler::vrshr(Condition cond,
   6377                          DataType dt,
   6378                          DRegister rd,
   6379                          DRegister rm,
   6380                          const DOperand& operand) {
   6381   os().SetCurrentInstruction(kVrshr, kFpNeon);
   6382   os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt;
   6383   os() << " ";
   6384   if (!rd.Is(rm)) {
   6385     os() << rd << ", ";
   6386   }
   6387   os() << rm << ", " << operand;
   6388 }
   6389 
   6390 void Disassembler::vrshr(Condition cond,
   6391                          DataType dt,
   6392                          QRegister rd,
   6393                          QRegister rm,
   6394                          const QOperand& operand) {
   6395   os().SetCurrentInstruction(kVrshr, kFpNeon);
   6396   os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt;
   6397   os() << " ";
   6398   if (!rd.Is(rm)) {
   6399     os() << rd << ", ";
   6400   }
   6401   os() << rm << ", " << operand;
   6402 }
   6403 
   6404 void Disassembler::vrshrn(Condition cond,
   6405                           DataType dt,
   6406                           DRegister rd,
   6407                           QRegister rm,
   6408                           const QOperand& operand) {
   6409   os().SetCurrentInstruction(kVrshrn, kFpNeon);
   6410   os() << ToCString(kVrshrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6411        << rd << ", " << rm << ", " << operand;
   6412 }
   6413 
   6414 void Disassembler::vrsqrte(Condition cond,
   6415                            DataType dt,
   6416                            DRegister rd,
   6417                            DRegister rm) {
   6418   os().SetCurrentInstruction(kVrsqrte, kFpNeon);
   6419   os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " "
   6420        << rd << ", " << rm;
   6421 }
   6422 
   6423 void Disassembler::vrsqrte(Condition cond,
   6424                            DataType dt,
   6425                            QRegister rd,
   6426                            QRegister rm) {
   6427   os().SetCurrentInstruction(kVrsqrte, kFpNeon);
   6428   os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " "
   6429        << rd << ", " << rm;
   6430 }
   6431 
   6432 void Disassembler::vrsqrts(
   6433     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6434   os().SetCurrentInstruction(kVrsqrts, kFpNeon);
   6435   os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt;
   6436   os() << " ";
   6437   if (!rd.Is(rn)) {
   6438     os() << rd << ", ";
   6439   }
   6440   os() << rn << ", " << rm;
   6441 }
   6442 
   6443 void Disassembler::vrsqrts(
   6444     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6445   os().SetCurrentInstruction(kVrsqrts, kFpNeon);
   6446   os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt;
   6447   os() << " ";
   6448   if (!rd.Is(rn)) {
   6449     os() << rd << ", ";
   6450   }
   6451   os() << rn << ", " << rm;
   6452 }
   6453 
   6454 void Disassembler::vrsra(Condition cond,
   6455                          DataType dt,
   6456                          DRegister rd,
   6457                          DRegister rm,
   6458                          const DOperand& operand) {
   6459   os().SetCurrentInstruction(kVrsra, kFpNeon);
   6460   os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt;
   6461   os() << " ";
   6462   if (!rd.Is(rm)) {
   6463     os() << rd << ", ";
   6464   }
   6465   os() << rm << ", " << operand;
   6466 }
   6467 
   6468 void Disassembler::vrsra(Condition cond,
   6469                          DataType dt,
   6470                          QRegister rd,
   6471                          QRegister rm,
   6472                          const QOperand& operand) {
   6473   os().SetCurrentInstruction(kVrsra, kFpNeon);
   6474   os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt;
   6475   os() << " ";
   6476   if (!rd.Is(rm)) {
   6477     os() << rd << ", ";
   6478   }
   6479   os() << rm << ", " << operand;
   6480 }
   6481 
   6482 void Disassembler::vrsubhn(
   6483     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
   6484   os().SetCurrentInstruction(kVrsubhn, kFpNeon);
   6485   os() << ToCString(kVrsubhn) << ConditionPrinter(it_block_, cond) << dt << " "
   6486        << rd << ", " << rn << ", " << rm;
   6487 }
   6488 
   6489 void Disassembler::vseleq(DataType dt,
   6490                           DRegister rd,
   6491                           DRegister rn,
   6492                           DRegister rm) {
   6493   os().SetCurrentInstruction(kVseleq, kFpNeon);
   6494   os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm;
   6495 }
   6496 
   6497 void Disassembler::vseleq(DataType dt,
   6498                           SRegister rd,
   6499                           SRegister rn,
   6500                           SRegister rm) {
   6501   os().SetCurrentInstruction(kVseleq, kFpNeon);
   6502   os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm;
   6503 }
   6504 
   6505 void Disassembler::vselge(DataType dt,
   6506                           DRegister rd,
   6507                           DRegister rn,
   6508                           DRegister rm) {
   6509   os().SetCurrentInstruction(kVselge, kFpNeon);
   6510   os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm;
   6511 }
   6512 
   6513 void Disassembler::vselge(DataType dt,
   6514                           SRegister rd,
   6515                           SRegister rn,
   6516                           SRegister rm) {
   6517   os().SetCurrentInstruction(kVselge, kFpNeon);
   6518   os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm;
   6519 }
   6520 
   6521 void Disassembler::vselgt(DataType dt,
   6522                           DRegister rd,
   6523                           DRegister rn,
   6524                           DRegister rm) {
   6525   os().SetCurrentInstruction(kVselgt, kFpNeon);
   6526   os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm;
   6527 }
   6528 
   6529 void Disassembler::vselgt(DataType dt,
   6530                           SRegister rd,
   6531                           SRegister rn,
   6532                           SRegister rm) {
   6533   os().SetCurrentInstruction(kVselgt, kFpNeon);
   6534   os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm;
   6535 }
   6536 
   6537 void Disassembler::vselvs(DataType dt,
   6538                           DRegister rd,
   6539                           DRegister rn,
   6540                           DRegister rm) {
   6541   os().SetCurrentInstruction(kVselvs, kFpNeon);
   6542   os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm;
   6543 }
   6544 
   6545 void Disassembler::vselvs(DataType dt,
   6546                           SRegister rd,
   6547                           SRegister rn,
   6548                           SRegister rm) {
   6549   os().SetCurrentInstruction(kVselvs, kFpNeon);
   6550   os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm;
   6551 }
   6552 
   6553 void Disassembler::vshl(Condition cond,
   6554                         DataType dt,
   6555                         DRegister rd,
   6556                         DRegister rm,
   6557                         const DOperand& operand) {
   6558   os().SetCurrentInstruction(kVshl, kFpNeon);
   6559   os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt;
   6560   os() << " ";
   6561   if (!rd.Is(rm)) {
   6562     os() << rd << ", ";
   6563   }
   6564   os() << rm << ", " << operand;
   6565 }
   6566 
   6567 void Disassembler::vshl(Condition cond,
   6568                         DataType dt,
   6569                         QRegister rd,
   6570                         QRegister rm,
   6571                         const QOperand& operand) {
   6572   os().SetCurrentInstruction(kVshl, kFpNeon);
   6573   os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt;
   6574   os() << " ";
   6575   if (!rd.Is(rm)) {
   6576     os() << rd << ", ";
   6577   }
   6578   os() << rm << ", " << operand;
   6579 }
   6580 
   6581 void Disassembler::vshll(Condition cond,
   6582                          DataType dt,
   6583                          QRegister rd,
   6584                          DRegister rm,
   6585                          const DOperand& operand) {
   6586   os().SetCurrentInstruction(kVshll, kFpNeon);
   6587   os() << ToCString(kVshll) << ConditionPrinter(it_block_, cond) << dt << " "
   6588        << rd << ", " << rm << ", " << operand;
   6589 }
   6590 
   6591 void Disassembler::vshr(Condition cond,
   6592                         DataType dt,
   6593                         DRegister rd,
   6594                         DRegister rm,
   6595                         const DOperand& operand) {
   6596   os().SetCurrentInstruction(kVshr, kFpNeon);
   6597   os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt;
   6598   os() << " ";
   6599   if (!rd.Is(rm)) {
   6600     os() << rd << ", ";
   6601   }
   6602   os() << rm << ", " << operand;
   6603 }
   6604 
   6605 void Disassembler::vshr(Condition cond,
   6606                         DataType dt,
   6607                         QRegister rd,
   6608                         QRegister rm,
   6609                         const QOperand& operand) {
   6610   os().SetCurrentInstruction(kVshr, kFpNeon);
   6611   os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt;
   6612   os() << " ";
   6613   if (!rd.Is(rm)) {
   6614     os() << rd << ", ";
   6615   }
   6616   os() << rm << ", " << operand;
   6617 }
   6618 
   6619 void Disassembler::vshrn(Condition cond,
   6620                          DataType dt,
   6621                          DRegister rd,
   6622                          QRegister rm,
   6623                          const QOperand& operand) {
   6624   os().SetCurrentInstruction(kVshrn, kFpNeon);
   6625   os() << ToCString(kVshrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6626        << rd << ", " << rm << ", " << operand;
   6627 }
   6628 
   6629 void Disassembler::vsli(Condition cond,
   6630                         DataType dt,
   6631                         DRegister rd,
   6632                         DRegister rm,
   6633                         const DOperand& operand) {
   6634   os().SetCurrentInstruction(kVsli, kFpNeon);
   6635   os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt;
   6636   os() << " ";
   6637   if (!rd.Is(rm)) {
   6638     os() << rd << ", ";
   6639   }
   6640   os() << rm << ", " << operand;
   6641 }
   6642 
   6643 void Disassembler::vsli(Condition cond,
   6644                         DataType dt,
   6645                         QRegister rd,
   6646                         QRegister rm,
   6647                         const QOperand& operand) {
   6648   os().SetCurrentInstruction(kVsli, kFpNeon);
   6649   os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt;
   6650   os() << " ";
   6651   if (!rd.Is(rm)) {
   6652     os() << rd << ", ";
   6653   }
   6654   os() << rm << ", " << operand;
   6655 }
   6656 
   6657 void Disassembler::vsqrt(Condition cond,
   6658                          DataType dt,
   6659                          SRegister rd,
   6660                          SRegister rm) {
   6661   os().SetCurrentInstruction(kVsqrt, kFpNeon);
   6662   os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " "
   6663        << rd << ", " << rm;
   6664 }
   6665 
   6666 void Disassembler::vsqrt(Condition cond,
   6667                          DataType dt,
   6668                          DRegister rd,
   6669                          DRegister rm) {
   6670   os().SetCurrentInstruction(kVsqrt, kFpNeon);
   6671   os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " "
   6672        << rd << ", " << rm;
   6673 }
   6674 
   6675 void Disassembler::vsra(Condition cond,
   6676                         DataType dt,
   6677                         DRegister rd,
   6678                         DRegister rm,
   6679                         const DOperand& operand) {
   6680   os().SetCurrentInstruction(kVsra, kFpNeon);
   6681   os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt;
   6682   os() << " ";
   6683   if (!rd.Is(rm)) {
   6684     os() << rd << ", ";
   6685   }
   6686   os() << rm << ", " << operand;
   6687 }
   6688 
   6689 void Disassembler::vsra(Condition cond,
   6690                         DataType dt,
   6691                         QRegister rd,
   6692                         QRegister rm,
   6693                         const QOperand& operand) {
   6694   os().SetCurrentInstruction(kVsra, kFpNeon);
   6695   os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt;
   6696   os() << " ";
   6697   if (!rd.Is(rm)) {
   6698     os() << rd << ", ";
   6699   }
   6700   os() << rm << ", " << operand;
   6701 }
   6702 
   6703 void Disassembler::vsri(Condition cond,
   6704                         DataType dt,
   6705                         DRegister rd,
   6706                         DRegister rm,
   6707                         const DOperand& operand) {
   6708   os().SetCurrentInstruction(kVsri, kFpNeon);
   6709   os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt;
   6710   os() << " ";
   6711   if (!rd.Is(rm)) {
   6712     os() << rd << ", ";
   6713   }
   6714   os() << rm << ", " << operand;
   6715 }
   6716 
   6717 void Disassembler::vsri(Condition cond,
   6718                         DataType dt,
   6719                         QRegister rd,
   6720                         QRegister rm,
   6721                         const QOperand& operand) {
   6722   os().SetCurrentInstruction(kVsri, kFpNeon);
   6723   os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt;
   6724   os() << " ";
   6725   if (!rd.Is(rm)) {
   6726     os() << rd << ", ";
   6727   }
   6728   os() << rm << ", " << operand;
   6729 }
   6730 
   6731 void Disassembler::vst1(Condition cond,
   6732                         DataType dt,
   6733                         const NeonRegisterList& nreglist,
   6734                         const AlignedMemOperand& operand) {
   6735   os().SetCurrentInstruction(kVst1, kFpNeon);
   6736   os() << ToCString(kVst1) << ConditionPrinter(it_block_, cond) << dt << " "
   6737        << nreglist << ", " << PrintAlignedMemOperand(kVst1Location, operand);
   6738 }
   6739 
   6740 void Disassembler::vst2(Condition cond,
   6741                         DataType dt,
   6742                         const NeonRegisterList& nreglist,
   6743                         const AlignedMemOperand& operand) {
   6744   os().SetCurrentInstruction(kVst2, kFpNeon);
   6745   os() << ToCString(kVst2) << ConditionPrinter(it_block_, cond) << dt << " "
   6746        << nreglist << ", " << PrintAlignedMemOperand(kVst2Location, operand);
   6747 }
   6748 
   6749 void Disassembler::vst3(Condition cond,
   6750                         DataType dt,
   6751                         const NeonRegisterList& nreglist,
   6752                         const AlignedMemOperand& operand) {
   6753   os().SetCurrentInstruction(kVst3, kFpNeon);
   6754   os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " "
   6755        << nreglist << ", " << PrintAlignedMemOperand(kVst3Location, operand);
   6756 }
   6757 
   6758 void Disassembler::vst3(Condition cond,
   6759                         DataType dt,
   6760                         const NeonRegisterList& nreglist,
   6761                         const MemOperand& operand) {
   6762   os().SetCurrentInstruction(kVst3, kFpNeon);
   6763   os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " "
   6764        << nreglist << ", " << PrintMemOperand(kVst3Location, operand);
   6765 }
   6766 
   6767 void Disassembler::vst4(Condition cond,
   6768                         DataType dt,
   6769                         const NeonRegisterList& nreglist,
   6770                         const AlignedMemOperand& operand) {
   6771   os().SetCurrentInstruction(kVst4, kFpNeon);
   6772   os() << ToCString(kVst4) << ConditionPrinter(it_block_, cond) << dt << " "
   6773        << nreglist << ", " << PrintAlignedMemOperand(kVst4Location, operand);
   6774 }
   6775 
   6776 void Disassembler::vstm(Condition cond,
   6777                         DataType dt,
   6778                         Register rn,
   6779                         WriteBack write_back,
   6780                         DRegisterList dreglist) {
   6781   os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon);
   6782   os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " "
   6783        << rn << write_back << ", " << dreglist;
   6784 }
   6785 
   6786 void Disassembler::vstm(Condition cond,
   6787                         DataType dt,
   6788                         Register rn,
   6789                         WriteBack write_back,
   6790                         SRegisterList sreglist) {
   6791   os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon);
   6792   os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " "
   6793        << rn << write_back << ", " << sreglist;
   6794 }
   6795 
   6796 void Disassembler::vstmdb(Condition cond,
   6797                           DataType dt,
   6798                           Register rn,
   6799                           WriteBack write_back,
   6800                           DRegisterList dreglist) {
   6801   os().SetCurrentInstruction(kVstmdb,
   6802                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   6803   os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " "
   6804        << rn << write_back << ", " << dreglist;
   6805 }
   6806 
   6807 void Disassembler::vstmdb(Condition cond,
   6808                           DataType dt,
   6809                           Register rn,
   6810                           WriteBack write_back,
   6811                           SRegisterList sreglist) {
   6812   os().SetCurrentInstruction(kVstmdb,
   6813                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   6814   os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " "
   6815        << rn << write_back << ", " << sreglist;
   6816 }
   6817 
   6818 void Disassembler::vstmia(Condition cond,
   6819                           DataType dt,
   6820                           Register rn,
   6821                           WriteBack write_back,
   6822                           DRegisterList dreglist) {
   6823   os().SetCurrentInstruction(kVstmia,
   6824                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   6825   os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " "
   6826        << rn << write_back << ", " << dreglist;
   6827 }
   6828 
   6829 void Disassembler::vstmia(Condition cond,
   6830                           DataType dt,
   6831                           Register rn,
   6832                           WriteBack write_back,
   6833                           SRegisterList sreglist) {
   6834   os().SetCurrentInstruction(kVstmia,
   6835                              kLoadStore | kLoadStoreMultiple | kFpNeon);
   6836   os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " "
   6837        << rn << write_back << ", " << sreglist;
   6838 }
   6839 
   6840 void Disassembler::vstr(Condition cond,
   6841                         DataType dt,
   6842                         DRegister rd,
   6843                         const MemOperand& operand) {
   6844   os().SetCurrentInstruction(kVstr, kFpNeon);
   6845   os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond) << dt << " "
   6846        << rd << ", " << PrintMemOperand(kStoreDoublePrecisionLocation, operand);
   6847 }
   6848 
   6849 void Disassembler::vstr(Condition cond,
   6850                         DataType dt,
   6851                         SRegister rd,
   6852                         const MemOperand& operand) {
   6853   os().SetCurrentInstruction(kVstr, kFpNeon);
   6854   os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond) << dt << " "
   6855        << rd << ", " << PrintMemOperand(kStoreSinglePrecisionLocation, operand);
   6856 }
   6857 
   6858 void Disassembler::vsub(
   6859     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6860   os().SetCurrentInstruction(kVsub, kFpNeon);
   6861   os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
   6862   os() << " ";
   6863   if (!rd.Is(rn)) {
   6864     os() << rd << ", ";
   6865   }
   6866   os() << rn << ", " << rm;
   6867 }
   6868 
   6869 void Disassembler::vsub(
   6870     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6871   os().SetCurrentInstruction(kVsub, kFpNeon);
   6872   os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
   6873   os() << " ";
   6874   if (!rd.Is(rn)) {
   6875     os() << rd << ", ";
   6876   }
   6877   os() << rn << ", " << rm;
   6878 }
   6879 
   6880 void Disassembler::vsub(
   6881     Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
   6882   os().SetCurrentInstruction(kVsub, kFpNeon);
   6883   os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt;
   6884   os() << " ";
   6885   if (!rd.Is(rn)) {
   6886     os() << rd << ", ";
   6887   }
   6888   os() << rn << ", " << rm;
   6889 }
   6890 
   6891 void Disassembler::vsubhn(
   6892     Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
   6893   os().SetCurrentInstruction(kVsubhn, kFpNeon);
   6894   os() << ToCString(kVsubhn) << ConditionPrinter(it_block_, cond) << dt << " "
   6895        << rd << ", " << rn << ", " << rm;
   6896 }
   6897 
   6898 void Disassembler::vsubl(
   6899     Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
   6900   os().SetCurrentInstruction(kVsubl, kFpNeon);
   6901   os() << ToCString(kVsubl) << ConditionPrinter(it_block_, cond) << dt << " "
   6902        << rd << ", " << rn << ", " << rm;
   6903 }
   6904 
   6905 void Disassembler::vsubw(
   6906     Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
   6907   os().SetCurrentInstruction(kVsubw, kFpNeon);
   6908   os() << ToCString(kVsubw) << ConditionPrinter(it_block_, cond) << dt;
   6909   os() << " ";
   6910   if (!rd.Is(rn)) {
   6911     os() << rd << ", ";
   6912   }
   6913   os() << rn << ", " << rm;
   6914 }
   6915 
   6916 void Disassembler::vswp(Condition cond,
   6917                         DataType dt,
   6918                         DRegister rd,
   6919                         DRegister rm) {
   6920   os().SetCurrentInstruction(kVswp, kFpNeon);
   6921   os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " "
   6922        << rd << ", " << rm;
   6923 }
   6924 
   6925 void Disassembler::vswp(Condition cond,
   6926                         DataType dt,
   6927                         QRegister rd,
   6928                         QRegister rm) {
   6929   os().SetCurrentInstruction(kVswp, kFpNeon);
   6930   os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " "
   6931        << rd << ", " << rm;
   6932 }
   6933 
   6934 void Disassembler::vtbl(Condition cond,
   6935                         DataType dt,
   6936                         DRegister rd,
   6937                         const NeonRegisterList& nreglist,
   6938                         DRegister rm) {
   6939   os().SetCurrentInstruction(kVtbl, kFpNeon);
   6940   os() << ToCString(kVtbl) << ConditionPrinter(it_block_, cond) << dt << " "
   6941        << rd << ", " << nreglist << ", " << rm;
   6942 }
   6943 
   6944 void Disassembler::vtbx(Condition cond,
   6945                         DataType dt,
   6946                         DRegister rd,
   6947                         const NeonRegisterList& nreglist,
   6948                         DRegister rm) {
   6949   os().SetCurrentInstruction(kVtbx, kFpNeon);
   6950   os() << ToCString(kVtbx) << ConditionPrinter(it_block_, cond) << dt << " "
   6951        << rd << ", " << nreglist << ", " << rm;
   6952 }
   6953 
   6954 void Disassembler::vtrn(Condition cond,
   6955                         DataType dt,
   6956                         DRegister rd,
   6957                         DRegister rm) {
   6958   os().SetCurrentInstruction(kVtrn, kFpNeon);
   6959   os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6960        << rd << ", " << rm;
   6961 }
   6962 
   6963 void Disassembler::vtrn(Condition cond,
   6964                         DataType dt,
   6965                         QRegister rd,
   6966                         QRegister rm) {
   6967   os().SetCurrentInstruction(kVtrn, kFpNeon);
   6968   os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " "
   6969        << rd << ", " << rm;
   6970 }
   6971 
   6972 void Disassembler::vtst(
   6973     Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
   6974   os().SetCurrentInstruction(kVtst, kFpNeon);
   6975   os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt;
   6976   os() << " ";
   6977   if (!rd.Is(rn)) {
   6978     os() << rd << ", ";
   6979   }
   6980   os() << rn << ", " << rm;
   6981 }
   6982 
   6983 void Disassembler::vtst(
   6984     Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
   6985   os().SetCurrentInstruction(kVtst, kFpNeon);
   6986   os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt;
   6987   os() << " ";
   6988   if (!rd.Is(rn)) {
   6989     os() << rd << ", ";
   6990   }
   6991   os() << rn << ", " << rm;
   6992 }
   6993 
   6994 void Disassembler::vuzp(Condition cond,
   6995                         DataType dt,
   6996                         DRegister rd,
   6997                         DRegister rm) {
   6998   os().SetCurrentInstruction(kVuzp, kFpNeon);
   6999   os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " "
   7000        << rd << ", " << rm;
   7001 }
   7002 
   7003 void Disassembler::vuzp(Condition cond,
   7004                         DataType dt,
   7005                         QRegister rd,
   7006                         QRegister rm) {
   7007   os().SetCurrentInstruction(kVuzp, kFpNeon);
   7008   os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " "
   7009        << rd << ", " << rm;
   7010 }
   7011 
   7012 void Disassembler::vzip(Condition cond,
   7013                         DataType dt,
   7014                         DRegister rd,
   7015                         DRegister rm) {
   7016   os().SetCurrentInstruction(kVzip, kFpNeon);
   7017   os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " "
   7018        << rd << ", " << rm;
   7019 }
   7020 
   7021 void Disassembler::vzip(Condition cond,
   7022                         DataType dt,
   7023                         QRegister rd,
   7024                         QRegister rm) {
   7025   os().SetCurrentInstruction(kVzip, kFpNeon);
   7026   os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " "
   7027        << rd << ", " << rm;
   7028 }
   7029 
   7030 void Disassembler::yield(Condition cond, EncodingSize size) {
   7031   os().SetCurrentInstruction(kYield, kNoAttribute);
   7032   os() << ToCString(kYield) << ConditionPrinter(it_block_, cond) << size;
   7033 }
   7034 
   7035 int Disassembler::T32Size(uint32_t instr) {
   7036   if ((instr & 0xe0000000) == 0xe0000000) {
   7037     switch (instr & 0x08000000) {
   7038       case 0x00000000:
   7039         if ((instr & 0x10000000) == 0x10000000) return 4;
   7040         return 2;
   7041       case 0x08000000:
   7042         return 4;
   7043       default:
   7044         return 2;
   7045     }
   7046   }
   7047   return 2;
   7048 }
   7049 
   7050 void Disassembler::DecodeT32(uint32_t instr) {
   7051   T32CodeAddressIncrementer incrementer(instr, &code_address_);
   7052   ITBlockScope it_scope(&it_block_);
   7053 
   7054   switch (instr & 0xe0000000) {
   7055     case 0x00000000: {
   7056       // 0x00000000
   7057       switch (instr & 0x18000000) {
   7058         case 0x18000000: {
   7059           // 0x18000000
   7060           switch (instr & 0x06000000) {
   7061             case 0x00000000: {
   7062               // 0x18000000
   7063               unsigned rd = (instr >> 16) & 0x7;
   7064               unsigned rn = (instr >> 19) & 0x7;
   7065               unsigned rm = (instr >> 22) & 0x7;
   7066               if (InITBlock()) {
   7067                 // ADD<c>{<q>} <Rd>, <Rn>, <Rm> ; T1
   7068                 add(CurrentCond(),
   7069                     Best,
   7070                     Register(rd),
   7071                     Register(rn),
   7072                     Register(rm));
   7073               } else {
   7074                 VIXL_ASSERT(OutsideITBlock());
   7075                 // ADDS{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   7076                 adds(Condition::None(),
   7077                      Best,
   7078                      Register(rd),
   7079                      Register(rn),
   7080                      Register(rm));
   7081               }
   7082               break;
   7083             }
   7084             case 0x02000000: {
   7085               // 0x1a000000
   7086               unsigned rd = (instr >> 16) & 0x7;
   7087               unsigned rn = (instr >> 19) & 0x7;
   7088               unsigned rm = (instr >> 22) & 0x7;
   7089               if (InITBlock()) {
   7090                 // SUB<c>{<q>} <Rd>, <Rn>, <Rm> ; T1
   7091                 sub(CurrentCond(),
   7092                     Best,
   7093                     Register(rd),
   7094                     Register(rn),
   7095                     Register(rm));
   7096               } else {
   7097                 VIXL_ASSERT(OutsideITBlock());
   7098                 // SUBS{<q>} {<Rd>}, <Rn>, <Rm> ; T1
   7099                 subs(Condition::None(),
   7100                      Best,
   7101                      Register(rd),
   7102                      Register(rn),
   7103                      Register(rm));
   7104               }
   7105               break;
   7106             }
   7107             case 0x04000000: {
   7108               // 0x1c000000
   7109               unsigned rd = (instr >> 16) & 0x7;
   7110               unsigned rn = (instr >> 19) & 0x7;
   7111               uint32_t imm = (instr >> 22) & 0x7;
   7112               if (InITBlock()) {
   7113                 // ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
   7114                 add(CurrentCond(), Best, Register(rd), Register(rn), imm);
   7115               } else {
   7116                 VIXL_ASSERT(OutsideITBlock());
   7117                 // ADDS{<q>} <Rd>, <Rn>, #<imm3> ; T1
   7118                 adds(Condition::None(), Best, Register(rd), Register(rn), imm);
   7119               }
   7120               break;
   7121             }
   7122             case 0x06000000: {
   7123               // 0x1e000000
   7124               unsigned rd = (instr >> 16) & 0x7;
   7125               unsigned rn = (instr >> 19) & 0x7;
   7126               uint32_t imm = (instr >> 22) & 0x7;
   7127               if (InITBlock()) {
   7128                 // SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
   7129                 sub(CurrentCond(), Best, Register(rd), Register(rn), imm);
   7130               } else {
   7131                 VIXL_ASSERT(OutsideITBlock());
   7132                 // SUBS{<q>} <Rd>, <Rn>, #<imm3> ; T1
   7133                 subs(Condition::None(), Best, Register(rd), Register(rn), imm);
   7134               }
   7135               break;
   7136             }
   7137           }
   7138           break;
   7139         }
   7140         default: {
   7141           if (((instr & 0x18000000) == 0x18000000)) {
   7142             UnallocatedT32(instr);
   7143             return;
   7144           }
   7145           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) &&
   7146               InITBlock()) {
   7147             unsigned rd = (instr >> 16) & 0x7;
   7148             unsigned rm = (instr >> 19) & 0x7;
   7149             uint32_t amount = (instr >> 22) & 0x1f;
   7150             if (amount == 0) amount = 32;
   7151             // ASR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7152             asr(CurrentCond(), Best, Register(rd), Register(rm), amount);
   7153             return;
   7154           }
   7155           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) &&
   7156               !InITBlock()) {
   7157             unsigned rd = (instr >> 16) & 0x7;
   7158             unsigned rm = (instr >> 19) & 0x7;
   7159             uint32_t amount = (instr >> 22) & 0x1f;
   7160             if (amount == 0) amount = 32;
   7161             // ASRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7162             asrs(Condition::None(), Best, Register(rd), Register(rm), amount);
   7163             return;
   7164           }
   7165           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) &&
   7166               ((instr & 0x07c00000) != 0x00000000) && InITBlock()) {
   7167             unsigned rd = (instr >> 16) & 0x7;
   7168             unsigned rm = (instr >> 19) & 0x7;
   7169             uint32_t amount = (instr >> 22) & 0x1f;
   7170             // LSL<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7171             lsl(CurrentCond(), Best, Register(rd), Register(rm), amount);
   7172             return;
   7173           }
   7174           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) &&
   7175               ((instr & 0x07c00000) != 0x00000000) && !InITBlock()) {
   7176             unsigned rd = (instr >> 16) & 0x7;
   7177             unsigned rm = (instr >> 19) & 0x7;
   7178             uint32_t amount = (instr >> 22) & 0x1f;
   7179             // LSLS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7180             lsls(Condition::None(), Best, Register(rd), Register(rm), amount);
   7181             return;
   7182           }
   7183           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) &&
   7184               InITBlock()) {
   7185             unsigned rd = (instr >> 16) & 0x7;
   7186             unsigned rm = (instr >> 19) & 0x7;
   7187             uint32_t amount = (instr >> 22) & 0x1f;
   7188             if (amount == 0) amount = 32;
   7189             // LSR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7190             lsr(CurrentCond(), Best, Register(rd), Register(rm), amount);
   7191             return;
   7192           }
   7193           if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) &&
   7194               !InITBlock()) {
   7195             unsigned rd = (instr >> 16) & 0x7;
   7196             unsigned rm = (instr >> 19) & 0x7;
   7197             uint32_t amount = (instr >> 22) & 0x1f;
   7198             if (amount == 0) amount = 32;
   7199             // LSRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2
   7200             lsrs(Condition::None(), Best, Register(rd), Register(rm), amount);
   7201             return;
   7202           }
   7203           unsigned rd = (instr >> 16) & 0x7;
   7204           unsigned rm = (instr >> 19) & 0x7;
   7205           ImmediateShiftOperand shift_operand((instr >> 27) & 0x3,
   7206                                               (instr >> 22) & 0x1f);
   7207           if (InITBlock()) {
   7208             // MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2
   7209             mov(CurrentCond(),
   7210                 Best,
   7211                 Register(rd),
   7212                 Operand(Register(rm),
   7213                         shift_operand.GetType(),
   7214                         shift_operand.GetAmount()));
   7215           } else {
   7216             VIXL_ASSERT(OutsideITBlock());
   7217             // MOVS{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2
   7218             movs(Condition::None(),
   7219                  Best,
   7220                  Register(rd),
   7221                  Operand(Register(rm),
   7222                          shift_operand.GetType(),
   7223                          shift_operand.GetAmount()));
   7224           }
   7225           break;
   7226         }
   7227       }
   7228       break;
   7229     }
   7230     case 0x20000000: {
   7231       // 0x20000000
   7232       switch (instr & 0x18000000) {
   7233         case 0x00000000: {
   7234           // 0x20000000
   7235           unsigned rd = (instr >> 24) & 0x7;
   7236           uint32_t imm = (instr >> 16) & 0xff;
   7237           if (InITBlock()) {
   7238             // MOV<c>{<q>} <Rd>, #<imm8> ; T1
   7239             mov(CurrentCond(), Best, Register(rd), imm);
   7240           } else {
   7241             VIXL_ASSERT(OutsideITBlock());
   7242             // MOVS{<q>} <Rd>, #<imm8> ; T1
   7243             movs(Condition::None(), Best, Register(rd), imm);
   7244           }
   7245           break;
   7246         }
   7247         case 0x08000000: {
   7248           // 0x28000000
   7249           unsigned rn = (instr >> 24) & 0x7;
   7250           uint32_t imm = (instr >> 16) & 0xff;
   7251           // CMP{<c>}{<q>} <Rn>, #<imm8> ; T1
   7252           cmp(CurrentCond(), Best, Register(rn), imm);
   7253           break;
   7254         }
   7255         case 0x10000000: {
   7256           // 0x30000000
   7257           unsigned rd = (instr >> 24) & 0x7;
   7258           uint32_t imm = (instr >> 16) & 0xff;
   7259           if (InITBlock() && ((imm <= 7))) {
   7260             // ADD<c>{<q>} <Rdn>, #<imm8> ; T2
   7261             add(CurrentCond(), Register(rd), imm);
   7262           } else if (InITBlock() && ((imm > 7))) {
   7263             // ADD<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
   7264             add(CurrentCond(), Best, Register(rd), Register(rd), imm);
   7265           } else if (OutsideITBlock() && ((imm <= 7))) {
   7266             // ADDS{<q>} <Rdn>, #<imm8> ; T2
   7267             adds(Register(rd), imm);
   7268           } else {
   7269             VIXL_ASSERT(OutsideITBlock() && ((imm > 7)));
   7270             // ADDS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
   7271             adds(Condition::None(), Best, Register(rd), Register(rd), imm);
   7272           }
   7273           break;
   7274         }
   7275         case 0x18000000: {
   7276           // 0x38000000
   7277           unsigned rd = (instr >> 24) & 0x7;
   7278           uint32_t imm = (instr >> 16) & 0xff;
   7279           if (InITBlock() && ((imm <= 7))) {
   7280             // SUB<c>{<q>} <Rdn>, #<imm8> ; T2
   7281             sub(CurrentCond(), Register(rd), imm);
   7282           } else if (InITBlock() && ((imm > 7))) {
   7283             // SUB<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
   7284             sub(CurrentCond(), Best, Register(rd), Register(rd), imm);
   7285           } else if (OutsideITBlock() && ((imm <= 7))) {
   7286             // SUBS{<q>} <Rdn>, #<imm8> ; T2
   7287             subs(Register(rd), imm);
   7288           } else {
   7289             VIXL_ASSERT(OutsideITBlock() && ((imm > 7)));
   7290             // SUBS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2
   7291             subs(Condition::None(), Best, Register(rd), Register(rd), imm);
   7292           }
   7293           break;
   7294         }
   7295       }
   7296       break;
   7297     }
   7298     case 0x40000000: {
   7299       // 0x40000000
   7300       switch (instr & 0x18000000) {
   7301         case 0x00000000: {
   7302           // 0x40000000
   7303           switch (instr & 0x07000000) {
   7304             case 0x00000000: {
   7305               // 0x40000000
   7306               switch (instr & 0x00c00000) {
   7307                 case 0x00000000: {
   7308                   // 0x40000000
   7309                   unsigned rd = (instr >> 16) & 0x7;
   7310                   unsigned rm = (instr >> 19) & 0x7;
   7311                   if (InITBlock()) {
   7312                     // AND<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7313                     and_(CurrentCond(),
   7314                          Best,
   7315                          Register(rd),
   7316                          Register(rd),
   7317                          Register(rm));
   7318                   } else {
   7319                     VIXL_ASSERT(OutsideITBlock());
   7320                     // ANDS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7321                     ands(Condition::None(),
   7322                          Best,
   7323                          Register(rd),
   7324                          Register(rd),
   7325                          Register(rm));
   7326                   }
   7327                   break;
   7328                 }
   7329                 case 0x00400000: {
   7330                   // 0x40400000
   7331                   unsigned rd = (instr >> 16) & 0x7;
   7332                   unsigned rm = (instr >> 19) & 0x7;
   7333                   if (InITBlock()) {
   7334                     // EOR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7335                     eor(CurrentCond(),
   7336                         Best,
   7337                         Register(rd),
   7338                         Register(rd),
   7339                         Register(rm));
   7340                   } else {
   7341                     VIXL_ASSERT(OutsideITBlock());
   7342                     // EORS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7343                     eors(Condition::None(),
   7344                          Best,
   7345                          Register(rd),
   7346                          Register(rd),
   7347                          Register(rm));
   7348                   }
   7349                   break;
   7350                 }
   7351                 case 0x00800000: {
   7352                   // 0x40800000
   7353                   if (InITBlock()) {
   7354                     unsigned rd = (instr >> 16) & 0x7;
   7355                     unsigned rs = (instr >> 19) & 0x7;
   7356                     // LSL<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7357                     lsl(CurrentCond(),
   7358                         Best,
   7359                         Register(rd),
   7360                         Register(rd),
   7361                         Register(rs));
   7362                     return;
   7363                   }
   7364                   if (!InITBlock()) {
   7365                     unsigned rd = (instr >> 16) & 0x7;
   7366                     unsigned rs = (instr >> 19) & 0x7;
   7367                     // LSLS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7368                     lsls(Condition::None(),
   7369                          Best,
   7370                          Register(rd),
   7371                          Register(rd),
   7372                          Register(rs));
   7373                     return;
   7374                   }
   7375                   unsigned rd = (instr >> 16) & 0x7;
   7376                   unsigned rm = (instr >> 16) & 0x7;
   7377                   unsigned rs = (instr >> 19) & 0x7;
   7378                   if (InITBlock()) {
   7379                     // MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
   7380                     mov(CurrentCond(),
   7381                         Best,
   7382                         Register(rd),
   7383                         Operand(Register(rm), LSL, Register(rs)));
   7384                   } else {
   7385                     VIXL_ASSERT(OutsideITBlock());
   7386                     // MOVS{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
   7387                     movs(Condition::None(),
   7388                          Best,
   7389                          Register(rd),
   7390                          Operand(Register(rm), LSL, Register(rs)));
   7391                   }
   7392                   break;
   7393                 }
   7394                 case 0x00c00000: {
   7395                   // 0x40c00000
   7396                   if (InITBlock()) {
   7397                     unsigned rd = (instr >> 16) & 0x7;
   7398                     unsigned rs = (instr >> 19) & 0x7;
   7399                     // LSR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7400                     lsr(CurrentCond(),
   7401                         Best,
   7402                         Register(rd),
   7403                         Register(rd),
   7404                         Register(rs));
   7405                     return;
   7406                   }
   7407                   if (!InITBlock()) {
   7408                     unsigned rd = (instr >> 16) & 0x7;
   7409                     unsigned rs = (instr >> 19) & 0x7;
   7410                     // LSRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7411                     lsrs(Condition::None(),
   7412                          Best,
   7413                          Register(rd),
   7414                          Register(rd),
   7415                          Register(rs));
   7416                     return;
   7417                   }
   7418                   unsigned rd = (instr >> 16) & 0x7;
   7419                   unsigned rm = (instr >> 16) & 0x7;
   7420                   unsigned rs = (instr >> 19) & 0x7;
   7421                   if (InITBlock()) {
   7422                     // MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
   7423                     mov(CurrentCond(),
   7424                         Best,
   7425                         Register(rd),
   7426                         Operand(Register(rm), LSR, Register(rs)));
   7427                   } else {
   7428                     VIXL_ASSERT(OutsideITBlock());
   7429                     // MOVS{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
   7430                     movs(Condition::None(),
   7431                          Best,
   7432                          Register(rd),
   7433                          Operand(Register(rm), LSR, Register(rs)));
   7434                   }
   7435                   break;
   7436                 }
   7437               }
   7438               break;
   7439             }
   7440             case 0x01000000: {
   7441               // 0x41000000
   7442               switch (instr & 0x00c00000) {
   7443                 case 0x00000000: {
   7444                   // 0x41000000
   7445                   if (InITBlock()) {
   7446                     unsigned rd = (instr >> 16) & 0x7;
   7447                     unsigned rs = (instr >> 19) & 0x7;
   7448                     // ASR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7449                     asr(CurrentCond(),
   7450                         Best,
   7451                         Register(rd),
   7452                         Register(rd),
   7453                         Register(rs));
   7454                     return;
   7455                   }
   7456                   if (!InITBlock()) {
   7457                     unsigned rd = (instr >> 16) & 0x7;
   7458                     unsigned rs = (instr >> 19) & 0x7;
   7459                     // ASRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7460                     asrs(Condition::None(),
   7461                          Best,
   7462                          Register(rd),
   7463                          Register(rd),
   7464                          Register(rs));
   7465                     return;
   7466                   }
   7467                   unsigned rd = (instr >> 16) & 0x7;
   7468                   unsigned rm = (instr >> 16) & 0x7;
   7469                   unsigned rs = (instr >> 19) & 0x7;
   7470                   if (InITBlock()) {
   7471                     // MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
   7472                     mov(CurrentCond(),
   7473                         Best,
   7474                         Register(rd),
   7475                         Operand(Register(rm), ASR, Register(rs)));
   7476                   } else {
   7477                     VIXL_ASSERT(OutsideITBlock());
   7478                     // MOVS{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
   7479                     movs(Condition::None(),
   7480                          Best,
   7481                          Register(rd),
   7482                          Operand(Register(rm), ASR, Register(rs)));
   7483                   }
   7484                   break;
   7485                 }
   7486                 case 0x00400000: {
   7487                   // 0x41400000
   7488                   unsigned rd = (instr >> 16) & 0x7;
   7489                   unsigned rm = (instr >> 19) & 0x7;
   7490                   if (InITBlock()) {
   7491                     // ADC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7492                     adc(CurrentCond(),
   7493                         Best,
   7494                         Register(rd),
   7495                         Register(rd),
   7496                         Register(rm));
   7497                   } else {
   7498                     VIXL_ASSERT(OutsideITBlock());
   7499                     // ADCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7500                     adcs(Condition::None(),
   7501                          Best,
   7502                          Register(rd),
   7503                          Register(rd),
   7504                          Register(rm));
   7505                   }
   7506                   break;
   7507                 }
   7508                 case 0x00800000: {
   7509                   // 0x41800000
   7510                   unsigned rd = (instr >> 16) & 0x7;
   7511                   unsigned rm = (instr >> 19) & 0x7;
   7512                   if (InITBlock()) {
   7513                     // SBC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7514                     sbc(CurrentCond(),
   7515                         Best,
   7516                         Register(rd),
   7517                         Register(rd),
   7518                         Register(rm));
   7519                   } else {
   7520                     VIXL_ASSERT(OutsideITBlock());
   7521                     // SBCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7522                     sbcs(Condition::None(),
   7523                          Best,
   7524                          Register(rd),
   7525                          Register(rd),
   7526                          Register(rm));
   7527                   }
   7528                   break;
   7529                 }
   7530                 case 0x00c00000: {
   7531                   // 0x41c00000
   7532                   if (InITBlock()) {
   7533                     unsigned rd = (instr >> 16) & 0x7;
   7534                     unsigned rs = (instr >> 19) & 0x7;
   7535                     // ROR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7536                     ror(CurrentCond(),
   7537                         Best,
   7538                         Register(rd),
   7539                         Register(rd),
   7540                         Register(rs));
   7541                     return;
   7542                   }
   7543                   if (!InITBlock()) {
   7544                     unsigned rd = (instr >> 16) & 0x7;
   7545                     unsigned rs = (instr >> 19) & 0x7;
   7546                     // RORS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1
   7547                     rors(Condition::None(),
   7548                          Best,
   7549                          Register(rd),
   7550                          Register(rd),
   7551                          Register(rs));
   7552                     return;
   7553                   }
   7554                   unsigned rd = (instr >> 16) & 0x7;
   7555                   unsigned rm = (instr >> 16) & 0x7;
   7556                   unsigned rs = (instr >> 19) & 0x7;
   7557                   if (InITBlock()) {
   7558                     // MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
   7559                     mov(CurrentCond(),
   7560                         Best,
   7561                         Register(rd),
   7562                         Operand(Register(rm), ROR, Register(rs)));
   7563                   } else {
   7564                     VIXL_ASSERT(OutsideITBlock());
   7565                     // MOVS{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
   7566                     movs(Condition::None(),
   7567                          Best,
   7568                          Register(rd),
   7569                          Operand(Register(rm), ROR, Register(rs)));
   7570                   }
   7571                   break;
   7572                 }
   7573               }
   7574               break;
   7575             }
   7576             case 0x02000000: {
   7577               // 0x42000000
   7578               switch (instr & 0x00c00000) {
   7579                 case 0x00000000: {
   7580                   // 0x42000000
   7581                   unsigned rn = (instr >> 16) & 0x7;
   7582                   unsigned rm = (instr >> 19) & 0x7;
   7583                   // TST{<c>}{<q>} <Rn>, <Rm> ; T1
   7584                   tst(CurrentCond(), Best, Register(rn), Register(rm));
   7585                   break;
   7586                 }
   7587                 case 0x00400000: {
   7588                   // 0x42400000
   7589                   unsigned rd = (instr >> 16) & 0x7;
   7590                   unsigned rn = (instr >> 19) & 0x7;
   7591                   if (InITBlock()) {
   7592                     // RSB<c>{<q>} {<Rd>}, <Rn>, #0 ; T1
   7593                     rsb(CurrentCond(),
   7594                         Best,
   7595                         Register(rd),
   7596                         Register(rn),
   7597                         UINT32_C(0));
   7598                   } else {
   7599                     VIXL_ASSERT(OutsideITBlock());
   7600                     // RSBS{<q>} {<Rd>}, <Rn>, #0 ; T1
   7601                     rsbs(Condition::None(),
   7602                          Best,
   7603                          Register(rd),
   7604                          Register(rn),
   7605                          UINT32_C(0));
   7606                   }
   7607                   break;
   7608                 }
   7609                 case 0x00800000: {
   7610                   // 0x42800000
   7611                   unsigned rn = (instr >> 16) & 0x7;
   7612                   unsigned rm = (instr >> 19) & 0x7;
   7613                   // CMP{<c>}{<q>} <Rn>, <Rm> ; T1
   7614                   cmp(CurrentCond(), Best, Register(rn), Register(rm));
   7615                   break;
   7616                 }
   7617                 case 0x00c00000: {
   7618                   // 0x42c00000
   7619                   unsigned rn = (instr >> 16) & 0x7;
   7620                   unsigned rm = (instr >> 19) & 0x7;
   7621                   // CMN{<c>}{<q>} <Rn>, <Rm> ; T1
   7622                   cmn(CurrentCond(), Best, Register(rn), Register(rm));
   7623                   break;
   7624                 }
   7625               }
   7626               break;
   7627             }
   7628             case 0x03000000: {
   7629               // 0x43000000
   7630               switch (instr & 0x00c00000) {
   7631                 case 0x00000000: {
   7632                   // 0x43000000
   7633                   unsigned rd = (instr >> 16) & 0x7;
   7634                   unsigned rm = (instr >> 19) & 0x7;
   7635                   if (InITBlock()) {
   7636                     // ORR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7637                     orr(CurrentCond(),
   7638                         Best,
   7639                         Register(rd),
   7640                         Register(rd),
   7641                         Register(rm));
   7642                   } else {
   7643                     VIXL_ASSERT(OutsideITBlock());
   7644                     // ORRS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7645                     orrs(Condition::None(),
   7646                          Best,
   7647                          Register(rd),
   7648                          Register(rd),
   7649                          Register(rm));
   7650                   }
   7651                   break;
   7652                 }
   7653                 case 0x00400000: {
   7654                   // 0x43400000
   7655                   unsigned rd = (instr >> 16) & 0x7;
   7656                   unsigned rn = (instr >> 19) & 0x7;
   7657                   if (InITBlock()) {
   7658                     // MUL<c>{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1
   7659                     mul(CurrentCond(),
   7660                         Best,
   7661                         Register(rd),
   7662                         Register(rn),
   7663                         Register(rd));
   7664                   } else {
   7665                     VIXL_ASSERT(OutsideITBlock());
   7666                     // MULS{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1
   7667                     muls(Condition::None(),
   7668                          Register(rd),
   7669                          Register(rn),
   7670                          Register(rd));
   7671                   }
   7672                   break;
   7673                 }
   7674                 case 0x00800000: {
   7675                   // 0x43800000
   7676                   unsigned rd = (instr >> 16) & 0x7;
   7677                   unsigned rm = (instr >> 19) & 0x7;
   7678                   if (InITBlock()) {
   7679                     // BIC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7680                     bic(CurrentCond(),
   7681                         Best,
   7682                         Register(rd),
   7683                         Register(rd),
   7684                         Register(rm));
   7685                   } else {
   7686                     VIXL_ASSERT(OutsideITBlock());
   7687                     // BICS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1
   7688                     bics(Condition::None(),
   7689                          Best,
   7690                          Register(rd),
   7691                          Register(rd),
   7692                          Register(rm));
   7693                   }
   7694                   break;
   7695                 }
   7696                 case 0x00c00000: {
   7697                   // 0x43c00000
   7698                   unsigned rd = (instr >> 16) & 0x7;
   7699                   unsigned rm = (instr >> 19) & 0x7;
   7700                   if (InITBlock()) {
   7701                     // MVN<c>{<q>} <Rd>, <Rm> ; T1
   7702                     mvn(CurrentCond(), Best, Register(rd), Register(rm));
   7703                   } else {
   7704                     VIXL_ASSERT(OutsideITBlock());
   7705                     // MVNS{<q>} <Rd>, <Rm> ; T1
   7706                     mvns(Condition::None(), Best, Register(rd), Register(rm));
   7707                   }
   7708                   break;
   7709                 }
   7710               }
   7711               break;
   7712             }
   7713             case 0x04000000: {
   7714               // 0x44000000
   7715               switch (instr & 0x00780000) {
   7716                 case 0x00680000: {
   7717                   // 0x44680000
   7718                   unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
   7719                   // ADD{<c>}{<q>} {<Rdm>}, SP, <Rdm> ; T1
   7720                   add(CurrentCond(), Best, Register(rd), sp, Register(rd));
   7721                   break;
   7722                 }
   7723                 default: {
   7724                   switch (instr & 0x00870000) {
   7725                     case 0x00850000: {
   7726                       // 0x44850000
   7727                       if (((instr & 0x780000) == 0x680000)) {
   7728                         UnallocatedT32(instr);
   7729                         return;
   7730                       }
   7731                       unsigned rm = (instr >> 19) & 0xf;
   7732                       // ADD{<c>}{<q>} {SP}, SP, <Rm> ; T2
   7733                       add(CurrentCond(), Best, sp, sp, Register(rm));
   7734                       break;
   7735                     }
   7736                     default: {
   7737                       if (((instr & 0x780000) == 0x680000) ||
   7738                           ((instr & 0x870000) == 0x850000)) {
   7739                         UnallocatedT32(instr);
   7740                         return;
   7741                       }
   7742                       unsigned rd =
   7743                           ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
   7744                       unsigned rm = (instr >> 19) & 0xf;
   7745                       if (InITBlock()) {
   7746                         // ADD<c>{<q>} <Rdn>, <Rm> ; T2
   7747                         add(CurrentCond(), Register(rd), Register(rm));
   7748                       } else {
   7749                         // ADD{<c>}{<q>} {<Rdn>}, <Rdn>, <Rm> ; T2
   7750                         add(CurrentCond(),
   7751                             Best,
   7752                             Register(rd),
   7753                             Register(rd),
   7754                             Register(rm));
   7755                       }
   7756                       break;
   7757                     }
   7758                   }
   7759                   break;
   7760                 }
   7761               }
   7762               break;
   7763             }
   7764             case 0x05000000: {
   7765               // 0x45000000
   7766               unsigned rn = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
   7767               unsigned rm = (instr >> 19) & 0xf;
   7768               // CMP{<c>}{<q>} <Rn>, <Rm> ; T2
   7769               cmp(CurrentCond(), Best, Register(rn), Register(rm));
   7770               break;
   7771             }
   7772             case 0x06000000: {
   7773               // 0x46000000
   7774               unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8);
   7775               unsigned rm = (instr >> 19) & 0xf;
   7776               // MOV{<c>}{<q>} <Rd>, <Rm> ; T1
   7777               mov(CurrentCond(), Best, Register(rd), Register(rm));
   7778               break;
   7779             }
   7780             case 0x07000000: {
   7781               // 0x47000000
   7782               switch (instr & 0x00800000) {
   7783                 case 0x00000000: {
   7784                   // 0x47000000
   7785                   unsigned rm = (instr >> 19) & 0xf;
   7786                   // BX{<c>}{<q>} <Rm> ; T1
   7787                   bx(CurrentCond(), Register(rm));
   7788                   if (((instr & 0xff870000) != 0x47000000)) {
   7789                     UnpredictableT32(instr);
   7790                   }
   7791                   break;
   7792                 }
   7793                 case 0x00800000: {
   7794                   // 0x47800000
   7795                   unsigned rm = (instr >> 19) & 0xf;
   7796                   // BLX{<c>}{<q>} <Rm> ; T1
   7797                   blx(CurrentCond(), Register(rm));
   7798                   if (((instr & 0xff870000) != 0x47800000)) {
   7799                     UnpredictableT32(instr);
   7800                   }
   7801                   break;
   7802                 }
   7803               }
   7804               break;
   7805             }
   7806           }
   7807           break;
   7808         }
   7809         case 0x08000000: {
   7810           // 0x48000000
   7811           unsigned rt = (instr >> 24) & 0x7;
   7812           int32_t imm = ((instr >> 16) & 0xff) << 2;
   7813           Label label(imm, kT32PcDelta);
   7814           // LDR{<c>}{<q>} <Rt>, <label> ; T1
   7815           ldr(CurrentCond(), Best, Register(rt), &label);
   7816           break;
   7817         }
   7818         case 0x10000000: {
   7819           // 0x50000000
   7820           switch (instr & 0x06000000) {
   7821             case 0x00000000: {
   7822               // 0x50000000
   7823               unsigned rt = (instr >> 16) & 0x7;
   7824               unsigned rn = (instr >> 19) & 0x7;
   7825               Sign sign(plus);
   7826               unsigned rm = (instr >> 22) & 0x7;
   7827               AddrMode addrmode = Offset;
   7828               // STR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7829               str(CurrentCond(),
   7830                   Best,
   7831                   Register(rt),
   7832                   MemOperand(Register(rn), sign, Register(rm), addrmode));
   7833               break;
   7834             }
   7835             case 0x02000000: {
   7836               // 0x52000000
   7837               unsigned rt = (instr >> 16) & 0x7;
   7838               unsigned rn = (instr >> 19) & 0x7;
   7839               Sign sign(plus);
   7840               unsigned rm = (instr >> 22) & 0x7;
   7841               AddrMode addrmode = Offset;
   7842               // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7843               strh(CurrentCond(),
   7844                    Best,
   7845                    Register(rt),
   7846                    MemOperand(Register(rn), sign, Register(rm), addrmode));
   7847               break;
   7848             }
   7849             case 0x04000000: {
   7850               // 0x54000000
   7851               unsigned rt = (instr >> 16) & 0x7;
   7852               unsigned rn = (instr >> 19) & 0x7;
   7853               Sign sign(plus);
   7854               unsigned rm = (instr >> 22) & 0x7;
   7855               AddrMode addrmode = Offset;
   7856               // STRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7857               strb(CurrentCond(),
   7858                    Best,
   7859                    Register(rt),
   7860                    MemOperand(Register(rn), sign, Register(rm), addrmode));
   7861               break;
   7862             }
   7863             case 0x06000000: {
   7864               // 0x56000000
   7865               unsigned rt = (instr >> 16) & 0x7;
   7866               unsigned rn = (instr >> 19) & 0x7;
   7867               Sign sign(plus);
   7868               unsigned rm = (instr >> 22) & 0x7;
   7869               AddrMode addrmode = Offset;
   7870               // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7871               ldrsb(CurrentCond(),
   7872                     Best,
   7873                     Register(rt),
   7874                     MemOperand(Register(rn), sign, Register(rm), addrmode));
   7875               break;
   7876             }
   7877           }
   7878           break;
   7879         }
   7880         case 0x18000000: {
   7881           // 0x58000000
   7882           switch (instr & 0x06000000) {
   7883             case 0x00000000: {
   7884               // 0x58000000
   7885               unsigned rt = (instr >> 16) & 0x7;
   7886               unsigned rn = (instr >> 19) & 0x7;
   7887               Sign sign(plus);
   7888               unsigned rm = (instr >> 22) & 0x7;
   7889               AddrMode addrmode = Offset;
   7890               // LDR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7891               ldr(CurrentCond(),
   7892                   Best,
   7893                   Register(rt),
   7894                   MemOperand(Register(rn), sign, Register(rm), addrmode));
   7895               break;
   7896             }
   7897             case 0x02000000: {
   7898               // 0x5a000000
   7899               unsigned rt = (instr >> 16) & 0x7;
   7900               unsigned rn = (instr >> 19) & 0x7;
   7901               Sign sign(plus);
   7902               unsigned rm = (instr >> 22) & 0x7;
   7903               AddrMode addrmode = Offset;
   7904               // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7905               ldrh(CurrentCond(),
   7906                    Best,
   7907                    Register(rt),
   7908                    MemOperand(Register(rn), sign, Register(rm), addrmode));
   7909               break;
   7910             }
   7911             case 0x04000000: {
   7912               // 0x5c000000
   7913               unsigned rt = (instr >> 16) & 0x7;
   7914               unsigned rn = (instr >> 19) & 0x7;
   7915               Sign sign(plus);
   7916               unsigned rm = (instr >> 22) & 0x7;
   7917               AddrMode addrmode = Offset;
   7918               // LDRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7919               ldrb(CurrentCond(),
   7920                    Best,
   7921                    Register(rt),
   7922                    MemOperand(Register(rn), sign, Register(rm), addrmode));
   7923               break;
   7924             }
   7925             case 0x06000000: {
   7926               // 0x5e000000
   7927               unsigned rt = (instr >> 16) & 0x7;
   7928               unsigned rn = (instr >> 19) & 0x7;
   7929               Sign sign(plus);
   7930               unsigned rm = (instr >> 22) & 0x7;
   7931               AddrMode addrmode = Offset;
   7932               // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1
   7933               ldrsh(CurrentCond(),
   7934                     Best,
   7935                     Register(rt),
   7936                     MemOperand(Register(rn), sign, Register(rm), addrmode));
   7937               break;
   7938             }
   7939           }
   7940           break;
   7941         }
   7942       }
   7943       break;
   7944     }
   7945     case 0x60000000: {
   7946       // 0x60000000
   7947       switch (instr & 0x18000000) {
   7948         case 0x00000000: {
   7949           // 0x60000000
   7950           unsigned rt = (instr >> 16) & 0x7;
   7951           unsigned rn = (instr >> 19) & 0x7;
   7952           int32_t offset = ((instr >> 22) & 0x1f) << 2;
   7953           // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7954           str(CurrentCond(),
   7955               Best,
   7956               Register(rt),
   7957               MemOperand(Register(rn), plus, offset, Offset));
   7958           break;
   7959         }
   7960         case 0x08000000: {
   7961           // 0x68000000
   7962           unsigned rt = (instr >> 16) & 0x7;
   7963           unsigned rn = (instr >> 19) & 0x7;
   7964           int32_t offset = ((instr >> 22) & 0x1f) << 2;
   7965           // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7966           ldr(CurrentCond(),
   7967               Best,
   7968               Register(rt),
   7969               MemOperand(Register(rn), plus, offset, Offset));
   7970           break;
   7971         }
   7972         case 0x10000000: {
   7973           // 0x70000000
   7974           unsigned rt = (instr >> 16) & 0x7;
   7975           unsigned rn = (instr >> 19) & 0x7;
   7976           int32_t offset = (instr >> 22) & 0x1f;
   7977           // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7978           strb(CurrentCond(),
   7979                Best,
   7980                Register(rt),
   7981                MemOperand(Register(rn), plus, offset, Offset));
   7982           break;
   7983         }
   7984         case 0x18000000: {
   7985           // 0x78000000
   7986           unsigned rt = (instr >> 16) & 0x7;
   7987           unsigned rn = (instr >> 19) & 0x7;
   7988           int32_t offset = (instr >> 22) & 0x1f;
   7989           // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   7990           ldrb(CurrentCond(),
   7991                Best,
   7992                Register(rt),
   7993                MemOperand(Register(rn), plus, offset, Offset));
   7994           break;
   7995         }
   7996       }
   7997       break;
   7998     }
   7999     case 0x80000000: {
   8000       // 0x80000000
   8001       switch (instr & 0x18000000) {
   8002         case 0x00000000: {
   8003           // 0x80000000
   8004           unsigned rt = (instr >> 16) & 0x7;
   8005           unsigned rn = (instr >> 19) & 0x7;
   8006           int32_t offset = ((instr >> 22) & 0x1f) << 1;
   8007           // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   8008           strh(CurrentCond(),
   8009                Best,
   8010                Register(rt),
   8011                MemOperand(Register(rn), plus, offset, Offset));
   8012           break;
   8013         }
   8014         case 0x08000000: {
   8015           // 0x88000000
   8016           unsigned rt = (instr >> 16) & 0x7;
   8017           unsigned rn = (instr >> 19) & 0x7;
   8018           int32_t offset = ((instr >> 22) & 0x1f) << 1;
   8019           // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1
   8020           ldrh(CurrentCond(),
   8021                Best,
   8022                Register(rt),
   8023                MemOperand(Register(rn), plus, offset, Offset));
   8024           break;
   8025         }
   8026         case 0x10000000: {
   8027           // 0x90000000
   8028           unsigned rt = (instr >> 24) & 0x7;
   8029           int32_t offset = ((instr >> 16) & 0xff) << 2;
   8030           // STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
   8031           str(CurrentCond(),
   8032               Best,
   8033               Register(rt),
   8034               MemOperand(sp, plus, offset, Offset));
   8035           break;
   8036         }
   8037         case 0x18000000: {
   8038           // 0x98000000
   8039           unsigned rt = (instr >> 24) & 0x7;
   8040           int32_t offset = ((instr >> 16) & 0xff) << 2;
   8041           // LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
   8042           ldr(CurrentCond(),
   8043               Best,
   8044               Register(rt),
   8045               MemOperand(sp, plus, offset, Offset));
   8046           break;
   8047         }
   8048       }
   8049       break;
   8050     }
   8051     case 0xa0000000: {
   8052       // 0xa0000000
   8053       switch (instr & 0x18000000) {
   8054         case 0x00000000: {
   8055           // 0xa0000000
   8056           unsigned rd = (instr >> 24) & 0x7;
   8057           int32_t imm = ((instr >> 16) & 0xff) << 2;
   8058           Label label(imm, kT32PcDelta);
   8059           // ADR{<c>}{<q>} <Rd>, <label> ; T1
   8060           adr(CurrentCond(), Best, Register(rd), &label);
   8061           break;
   8062         }
   8063         case 0x08000000: {
   8064           // 0xa8000000
   8065           unsigned rd = (instr >> 24) & 0x7;
   8066           uint32_t imm = ((instr >> 16) & 0xff) << 2;
   8067           // ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1
   8068           add(CurrentCond(), Best, Register(rd), sp, imm);
   8069           break;
   8070         }
   8071         case 0x10000000: {
   8072           // 0xb0000000
   8073           switch (instr & 0x04000000) {
   8074             case 0x00000000: {
   8075               // 0xb0000000
   8076               switch (instr & 0x01000000) {
   8077                 case 0x00000000: {
   8078                   // 0xb0000000
   8079                   switch (instr & 0x02800000) {
   8080                     case 0x00000000: {
   8081                       // 0xb0000000
   8082                       uint32_t imm = ((instr >> 16) & 0x7f) << 2;
   8083                       // ADD{<c>}{<q>} {SP}, SP, #<imm7> ; T2
   8084                       add(CurrentCond(), Best, sp, sp, imm);
   8085                       break;
   8086                     }
   8087                     case 0x00800000: {
   8088                       // 0xb0800000
   8089                       uint32_t imm = ((instr >> 16) & 0x7f) << 2;
   8090                       // SUB{<c>}{<q>} {SP}, SP, #<imm7> ; T1
   8091                       sub(CurrentCond(), Best, sp, sp, imm);
   8092                       break;
   8093                     }
   8094                     case 0x02000000: {
   8095                       // 0xb2000000
   8096                       switch (instr & 0x00400000) {
   8097                         case 0x00000000: {
   8098                           // 0xb2000000
   8099                           unsigned rd = (instr >> 16) & 0x7;
   8100                           unsigned rm = (instr >> 19) & 0x7;
   8101                           // SXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1
   8102                           sxth(CurrentCond(), Best, Register(rd), Register(rm));
   8103                           break;
   8104                         }
   8105                         case 0x00400000: {
   8106                           // 0xb2400000
   8107                           unsigned rd = (instr >> 16) & 0x7;
   8108                           unsigned rm = (instr >> 19) & 0x7;
   8109                           // SXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1
   8110                           sxtb(CurrentCond(), Best, Register(rd), Register(rm));
   8111                           break;
   8112                         }
   8113                       }
   8114                       break;
   8115                     }
   8116                     case 0x02800000: {
   8117                       // 0xb2800000
   8118                       switch (instr & 0x00400000) {
   8119                         case 0x00000000: {
   8120                           // 0xb2800000
   8121                           unsigned rd = (instr >> 16) & 0x7;
   8122                           unsigned rm = (instr >> 19) & 0x7;
   8123                           // UXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1
   8124                           uxth(CurrentCond(), Best, Register(rd), Register(rm));
   8125                           break;
   8126                         }
   8127                         case 0x00400000: {
   8128                           // 0xb2c00000
   8129                           unsigned rd = (instr >> 16) & 0x7;
   8130                           unsigned rm = (instr >> 19) & 0x7;
   8131                           // UXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1
   8132                           uxtb(CurrentCond(), Best, Register(rd), Register(rm));
   8133                           break;
   8134                         }
   8135                       }
   8136                       break;
   8137                     }
   8138                   }
   8139                   break;
   8140                 }
   8141                 case 0x01000000: {
   8142                   // 0xb1000000
   8143                   unsigned rn = (instr >> 16) & 0x7;
   8144                   int32_t imm =
   8145                       (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1;
   8146                   Label label(imm, kT32PcDelta);
   8147                   // CBZ{<q>} <Rn>, <label> ; T1
   8148                   cbz(Register(rn), &label);
   8149                   break;
   8150                 }
   8151               }
   8152               break;
   8153             }
   8154             case 0x04000000: {
   8155               // 0xb4000000
   8156               switch (instr & 0x02000000) {
   8157                 case 0x00000000: {
   8158                   // 0xb4000000
   8159                   RegisterList registers((((instr >> 24) & 0x1) << kLRRegNum) |
   8160                                          ((instr >> 16) & 0xff));
   8161                   // PUSH{<c>}{<q>} <registers> ; T1
   8162                   push(CurrentCond(), Best, registers);
   8163                   break;
   8164                 }
   8165                 case 0x02000000: {
   8166                   // 0xb6000000
   8167                   switch (instr & 0x01e00000) {
   8168                     case 0x00400000: {
   8169                       // 0xb6400000
   8170                       UnimplementedT32_16("SETEND", instr);
   8171                       break;
   8172                     }
   8173                     case 0x00600000: {
   8174                       // 0xb6600000
   8175                       switch (instr & 0x00100000) {
   8176                         case 0x00000000: {
   8177                           // 0xb6600000
   8178                           UnimplementedT32_16("CPSIE", instr);
   8179                           break;
   8180                         }
   8181                         case 0x00100000: {
   8182                           // 0xb6700000
   8183                           UnimplementedT32_16("CPSID", instr);
   8184                           break;
   8185                         }
   8186                       }
   8187                       break;
   8188                     }
   8189                     default:
   8190                       UnallocatedT32(instr);
   8191                       break;
   8192                   }
   8193                   break;
   8194                 }
   8195               }
   8196               break;
   8197             }
   8198           }
   8199           break;
   8200         }
   8201         case 0x18000000: {
   8202           // 0xb8000000
   8203           switch (instr & 0x04000000) {
   8204             case 0x00000000: {
   8205               // 0xb8000000
   8206               switch (instr & 0x01000000) {
   8207                 case 0x00000000: {
   8208                   // 0xb8000000
   8209                   switch (instr & 0x02c00000) {
   8210                     case 0x02000000: {
   8211                       // 0xba000000
   8212                       unsigned rd = (instr >> 16) & 0x7;
   8213                       unsigned rm = (instr >> 19) & 0x7;
   8214                       // REV{<c>}{<q>} <Rd>, <Rm> ; T1
   8215                       rev(CurrentCond(), Best, Register(rd), Register(rm));
   8216                       break;
   8217                     }
   8218                     case 0x02400000: {
   8219                       // 0xba400000
   8220                       unsigned rd = (instr >> 16) & 0x7;
   8221                       unsigned rm = (instr >> 19) & 0x7;
   8222                       // REV16{<c>}{<q>} <Rd>, <Rm> ; T1
   8223                       rev16(CurrentCond(), Best, Register(rd), Register(rm));
   8224                       break;
   8225                     }
   8226                     case 0x02800000: {
   8227                       // 0xba800000
   8228                       uint32_t imm = (instr >> 16) & 0x3f;
   8229                       // HLT{<q>} {#}<imm> ; T1
   8230                       hlt(Condition::None(), imm);
   8231                       break;
   8232                     }
   8233                     case 0x02c00000: {
   8234                       // 0xbac00000
   8235                       unsigned rd = (instr >> 16) & 0x7;
   8236                       unsigned rm = (instr >> 19) & 0x7;
   8237                       // REVSH{<c>}{<q>} <Rd>, <Rm> ; T1
   8238                       revsh(CurrentCond(), Best, Register(rd), Register(rm));
   8239                       break;
   8240                     }
   8241                     default:
   8242                       UnallocatedT32(instr);
   8243                       break;
   8244                   }
   8245                   break;
   8246                 }
   8247                 case 0x01000000: {
   8248                   // 0xb9000000
   8249                   unsigned rn = (instr >> 16) & 0x7;
   8250                   int32_t imm =
   8251                       (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1;
   8252                   Label label(imm, kT32PcDelta);
   8253                   // CBNZ{<q>} <Rn>, <label> ; T1
   8254                   cbnz(Register(rn), &label);
   8255                   break;
   8256                 }
   8257               }
   8258               break;
   8259             }
   8260             case 0x04000000: {
   8261               // 0xbc000000
   8262               switch (instr & 0x02000000) {
   8263                 case 0x00000000: {
   8264                   // 0xbc000000
   8265                   RegisterList registers((((instr >> 24) & 0x1) << kPCRegNum) |
   8266                                          ((instr >> 16) & 0xff));
   8267                   // POP{<c>}{<q>} <registers> ; T1
   8268                   pop(CurrentCond(), Best, registers);
   8269                   break;
   8270                 }
   8271                 case 0x02000000: {
   8272                   // 0xbe000000
   8273                   switch (instr & 0x01000000) {
   8274                     case 0x00000000: {
   8275                       // 0xbe000000
   8276                       uint32_t imm = (instr >> 16) & 0xff;
   8277                       // BKPT{<q>} {#}<imm> ; T1
   8278                       bkpt(Condition::None(), imm);
   8279                       break;
   8280                     }
   8281                     case 0x01000000: {
   8282                       // 0xbf000000
   8283                       switch (instr & 0x000f0000) {
   8284                         case 0x00000000: {
   8285                           // 0xbf000000
   8286                           switch (instr & 0x00f00000) {
   8287                             case 0x00000000: {
   8288                               // 0xbf000000
   8289                               // NOP{<c>}{<q>} ; T1
   8290                               nop(CurrentCond(), Best);
   8291                               break;
   8292                             }
   8293                             case 0x00100000: {
   8294                               // 0xbf100000
   8295                               // YIELD{<c>}{<q>} ; T1
   8296                               yield(CurrentCond(), Best);
   8297                               break;
   8298                             }
   8299                             case 0x00200000: {
   8300                               // 0xbf200000
   8301                               UnimplementedT32_16("WFE", instr);
   8302                               break;
   8303                             }
   8304                             case 0x00300000: {
   8305                               // 0xbf300000
   8306                               UnimplementedT32_16("WFI", instr);
   8307                               break;
   8308                             }
   8309                             case 0x00400000: {
   8310                               // 0xbf400000
   8311                               UnimplementedT32_16("SEV", instr);
   8312                               break;
   8313                             }
   8314                             case 0x00500000: {
   8315                               // 0xbf500000
   8316                               UnimplementedT32_16("SEVL", instr);
   8317                               break;
   8318                             }
   8319                             default:
   8320                               UnallocatedT32(instr);
   8321                               break;
   8322                           }
   8323                           break;
   8324                         }
   8325                         default: {
   8326                           if (((instr & 0xf0000) == 0x0)) {
   8327                             UnallocatedT32(instr);
   8328                             return;
   8329                           }
   8330                           unsigned firstcond = (instr >> 20) & 0xf;
   8331                           unsigned mask = (instr >> 16) & 0xf;
   8332                           bool wasInITBlock = InITBlock();
   8333                           SetIT(Condition(firstcond), mask);
   8334                           it(Condition(firstcond), mask);
   8335                           if (wasInITBlock || (firstcond == 15) ||
   8336                               ((firstcond == al) &&
   8337                                (BitCount(Uint32(mask)) != 1))) {
   8338                             UnpredictableT32(instr);
   8339                           }
   8340                           break;
   8341                         }
   8342                       }
   8343                       break;
   8344                     }
   8345                   }
   8346                   break;
   8347                 }
   8348               }
   8349               break;
   8350             }
   8351           }
   8352           break;
   8353         }
   8354       }
   8355       break;
   8356     }
   8357     case 0xc0000000: {
   8358       // 0xc0000000
   8359       switch (instr & 0x10000000) {
   8360         case 0x00000000: {
   8361           // 0xc0000000
   8362           switch (instr & 0x08000000) {
   8363             case 0x00000000: {
   8364               // 0xc0000000
   8365               unsigned rn = (instr >> 24) & 0x7;
   8366               RegisterList registers(((instr >> 16) & 0xff));
   8367               // STM{<c>}{<q>} <Rn>!, <registers> ; T1
   8368               stm(CurrentCond(),
   8369                   Best,
   8370                   Register(rn),
   8371                   WriteBack(WRITE_BACK),
   8372                   registers);
   8373               break;
   8374             }
   8375             case 0x08000000: {
   8376               // 0xc8000000
   8377               unsigned rn = (instr >> 24) & 0x7;
   8378               RegisterList registers(((instr >> 16) & 0xff));
   8379               // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T1
   8380               ldm(CurrentCond(),
   8381                   Best,
   8382                   Register(rn),
   8383                   WriteBack(!registers.Includes(Register(rn))),
   8384                   registers);
   8385               break;
   8386             }
   8387           }
   8388           break;
   8389         }
   8390         case 0x10000000: {
   8391           // 0xd0000000
   8392           switch (instr & 0x0e000000) {
   8393             case 0x0e000000: {
   8394               // 0xde000000
   8395               switch (instr & 0x01000000) {
   8396                 case 0x00000000: {
   8397                   // 0xde000000
   8398                   uint32_t imm = (instr >> 16) & 0xff;
   8399                   // UDF{<c>}{<q>} {#}<imm> ; T1
   8400                   udf(CurrentCond(), Best, imm);
   8401                   break;
   8402                 }
   8403                 case 0x01000000: {
   8404                   // 0xdf000000
   8405                   uint32_t imm = (instr >> 16) & 0xff;
   8406                   // SVC{<c>}{<q>} {#}<imm> ; T1
   8407                   svc(CurrentCond(), imm);
   8408                   break;
   8409                 }
   8410               }
   8411               break;
   8412             }
   8413             default: {
   8414               if (((instr & 0xe000000) == 0xe000000)) {
   8415                 UnallocatedT32(instr);
   8416                 return;
   8417               }
   8418               Condition condition((instr >> 24) & 0xf);
   8419               int32_t imm = SignExtend<int32_t>((instr >> 16) & 0xff, 8) << 1;
   8420               Label label(imm, kT32PcDelta);
   8421               // B<c>{<q>} <label> ; T1
   8422               b(condition, Best, &label);
   8423               break;
   8424             }
   8425           }
   8426           break;
   8427         }
   8428       }
   8429       break;
   8430     }
   8431     case 0xe0000000: {
   8432       // 0xe0000000
   8433       switch (instr & 0x08000000) {
   8434         case 0x00000000: {
   8435           // 0xe0000000
   8436           switch (instr & 0x10000000) {
   8437             case 0x00000000: {
   8438               // 0xe0000000
   8439               int32_t imm = SignExtend<int32_t>((instr >> 16) & 0x7ff, 11) << 1;
   8440               Label label(imm, kT32PcDelta);
   8441               // B{<c>}{<q>} <label> ; T2
   8442               b(CurrentCond(), Best, &label);
   8443               break;
   8444             }
   8445             case 0x10000000: {
   8446               // 0xf0000000
   8447               switch (instr & 0x00008000) {
   8448                 case 0x00000000: {
   8449                   // 0xf0000000
   8450                   switch (instr & 0x03f00000) {
   8451                     case 0x00000000: {
   8452                       // 0xf0000000
   8453                       unsigned rd = (instr >> 8) & 0xf;
   8454                       unsigned rn = (instr >> 16) & 0xf;
   8455                       uint32_t imm = ImmediateT32::Decode(
   8456                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8457                           ((instr >> 15) & 0x800));
   8458                       // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8459                       and_(CurrentCond(),
   8460                            Best,
   8461                            Register(rd),
   8462                            Register(rn),
   8463                            imm);
   8464                       break;
   8465                     }
   8466                     case 0x00100000: {
   8467                       // 0xf0100000
   8468                       switch (instr & 0x00000f00) {
   8469                         case 0x00000f00: {
   8470                           // 0xf0100f00
   8471                           unsigned rn = (instr >> 16) & 0xf;
   8472                           uint32_t imm = ImmediateT32::Decode(
   8473                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8474                               ((instr >> 15) & 0x800));
   8475                           // TST{<c>}{<q>} <Rn>, #<const> ; T1
   8476                           tst(CurrentCond(), Best, Register(rn), imm);
   8477                           break;
   8478                         }
   8479                         default: {
   8480                           if (((instr & 0xf00) == 0xf00)) {
   8481                             UnallocatedT32(instr);
   8482                             return;
   8483                           }
   8484                           unsigned rd = (instr >> 8) & 0xf;
   8485                           unsigned rn = (instr >> 16) & 0xf;
   8486                           uint32_t imm = ImmediateT32::Decode(
   8487                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8488                               ((instr >> 15) & 0x800));
   8489                           // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8490                           ands(CurrentCond(),
   8491                                Best,
   8492                                Register(rd),
   8493                                Register(rn),
   8494                                imm);
   8495                           break;
   8496                         }
   8497                       }
   8498                       break;
   8499                     }
   8500                     case 0x00200000: {
   8501                       // 0xf0200000
   8502                       unsigned rd = (instr >> 8) & 0xf;
   8503                       unsigned rn = (instr >> 16) & 0xf;
   8504                       uint32_t imm = ImmediateT32::Decode(
   8505                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8506                           ((instr >> 15) & 0x800));
   8507                       // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8508                       bic(CurrentCond(), Best, Register(rd), Register(rn), imm);
   8509                       break;
   8510                     }
   8511                     case 0x00300000: {
   8512                       // 0xf0300000
   8513                       unsigned rd = (instr >> 8) & 0xf;
   8514                       unsigned rn = (instr >> 16) & 0xf;
   8515                       uint32_t imm = ImmediateT32::Decode(
   8516                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8517                           ((instr >> 15) & 0x800));
   8518                       // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8519                       bics(CurrentCond(),
   8520                            Best,
   8521                            Register(rd),
   8522                            Register(rn),
   8523                            imm);
   8524                       break;
   8525                     }
   8526                     case 0x00400000: {
   8527                       // 0xf0400000
   8528                       switch (instr & 0x000f0000) {
   8529                         case 0x000f0000: {
   8530                           // 0xf04f0000
   8531                           unsigned rd = (instr >> 8) & 0xf;
   8532                           uint32_t imm = ImmediateT32::Decode(
   8533                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8534                               ((instr >> 15) & 0x800));
   8535                           if (InITBlock() &&
   8536                               (instr & 0x00100000) == 0x00000000 &&
   8537                               ((rd < kNumberOfT32LowRegisters) &&
   8538                                (imm <= 255))) {
   8539                             // MOV<c>.W <Rd>, #<const> ; T2
   8540                             mov(CurrentCond(), Wide, Register(rd), imm);
   8541                           } else {
   8542                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   8543                             // MOV{<c>}{<q>} <Rd>, #<const> ; T2
   8544                             mov(CurrentCond(), Best, Register(rd), imm);
   8545                           }
   8546                           break;
   8547                         }
   8548                         default: {
   8549                           if (((instr & 0xf0000) == 0xf0000)) {
   8550                             UnallocatedT32(instr);
   8551                             return;
   8552                           }
   8553                           unsigned rd = (instr >> 8) & 0xf;
   8554                           unsigned rn = (instr >> 16) & 0xf;
   8555                           uint32_t imm = ImmediateT32::Decode(
   8556                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8557                               ((instr >> 15) & 0x800));
   8558                           // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8559                           orr(CurrentCond(),
   8560                               Best,
   8561                               Register(rd),
   8562                               Register(rn),
   8563                               imm);
   8564                           break;
   8565                         }
   8566                       }
   8567                       break;
   8568                     }
   8569                     case 0x00500000: {
   8570                       // 0xf0500000
   8571                       switch (instr & 0x000f0000) {
   8572                         case 0x000f0000: {
   8573                           // 0xf05f0000
   8574                           unsigned rd = (instr >> 8) & 0xf;
   8575                           uint32_t imm = ImmediateT32::Decode(
   8576                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8577                               ((instr >> 15) & 0x800));
   8578                           if (OutsideITBlock() &&
   8579                               (instr & 0x00100000) == 0x00100000 &&
   8580                               ((rd < kNumberOfT32LowRegisters) &&
   8581                                (imm <= 255))) {
   8582                             // MOVS.W <Rd>, #<const> ; T2
   8583                             movs(Condition::None(), Wide, Register(rd), imm);
   8584                           } else {
   8585                             VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
   8586                             // MOVS{<c>}{<q>} <Rd>, #<const> ; T2
   8587                             movs(CurrentCond(), Best, Register(rd), imm);
   8588                           }
   8589                           break;
   8590                         }
   8591                         default: {
   8592                           if (((instr & 0xf0000) == 0xf0000)) {
   8593                             UnallocatedT32(instr);
   8594                             return;
   8595                           }
   8596                           unsigned rd = (instr >> 8) & 0xf;
   8597                           unsigned rn = (instr >> 16) & 0xf;
   8598                           uint32_t imm = ImmediateT32::Decode(
   8599                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8600                               ((instr >> 15) & 0x800));
   8601                           // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8602                           orrs(CurrentCond(),
   8603                                Best,
   8604                                Register(rd),
   8605                                Register(rn),
   8606                                imm);
   8607                           break;
   8608                         }
   8609                       }
   8610                       break;
   8611                     }
   8612                     case 0x00600000: {
   8613                       // 0xf0600000
   8614                       switch (instr & 0x000f0000) {
   8615                         case 0x000f0000: {
   8616                           // 0xf06f0000
   8617                           unsigned rd = (instr >> 8) & 0xf;
   8618                           uint32_t imm = ImmediateT32::Decode(
   8619                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8620                               ((instr >> 15) & 0x800));
   8621                           // MVN{<c>}{<q>} <Rd>, #<const> ; T1
   8622                           mvn(CurrentCond(), Best, Register(rd), imm);
   8623                           break;
   8624                         }
   8625                         default: {
   8626                           if (((instr & 0xf0000) == 0xf0000)) {
   8627                             UnallocatedT32(instr);
   8628                             return;
   8629                           }
   8630                           unsigned rd = (instr >> 8) & 0xf;
   8631                           unsigned rn = (instr >> 16) & 0xf;
   8632                           uint32_t imm = ImmediateT32::Decode(
   8633                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8634                               ((instr >> 15) & 0x800));
   8635                           // ORN{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8636                           orn(CurrentCond(), Register(rd), Register(rn), imm);
   8637                           break;
   8638                         }
   8639                       }
   8640                       break;
   8641                     }
   8642                     case 0x00700000: {
   8643                       // 0xf0700000
   8644                       switch (instr & 0x000f0000) {
   8645                         case 0x000f0000: {
   8646                           // 0xf07f0000
   8647                           unsigned rd = (instr >> 8) & 0xf;
   8648                           uint32_t imm = ImmediateT32::Decode(
   8649                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8650                               ((instr >> 15) & 0x800));
   8651                           // MVNS{<c>}{<q>} <Rd>, #<const> ; T1
   8652                           mvns(CurrentCond(), Best, Register(rd), imm);
   8653                           break;
   8654                         }
   8655                         default: {
   8656                           if (((instr & 0xf0000) == 0xf0000)) {
   8657                             UnallocatedT32(instr);
   8658                             return;
   8659                           }
   8660                           unsigned rd = (instr >> 8) & 0xf;
   8661                           unsigned rn = (instr >> 16) & 0xf;
   8662                           uint32_t imm = ImmediateT32::Decode(
   8663                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8664                               ((instr >> 15) & 0x800));
   8665                           // ORNS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8666                           orns(CurrentCond(), Register(rd), Register(rn), imm);
   8667                           break;
   8668                         }
   8669                       }
   8670                       break;
   8671                     }
   8672                     case 0x00800000: {
   8673                       // 0xf0800000
   8674                       unsigned rd = (instr >> 8) & 0xf;
   8675                       unsigned rn = (instr >> 16) & 0xf;
   8676                       uint32_t imm = ImmediateT32::Decode(
   8677                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8678                           ((instr >> 15) & 0x800));
   8679                       // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8680                       eor(CurrentCond(), Best, Register(rd), Register(rn), imm);
   8681                       break;
   8682                     }
   8683                     case 0x00900000: {
   8684                       // 0xf0900000
   8685                       switch (instr & 0x00000f00) {
   8686                         case 0x00000f00: {
   8687                           // 0xf0900f00
   8688                           unsigned rn = (instr >> 16) & 0xf;
   8689                           uint32_t imm = ImmediateT32::Decode(
   8690                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8691                               ((instr >> 15) & 0x800));
   8692                           // TEQ{<c>}{<q>} <Rn>, #<const> ; T1
   8693                           teq(CurrentCond(), Register(rn), imm);
   8694                           break;
   8695                         }
   8696                         default: {
   8697                           if (((instr & 0xf00) == 0xf00)) {
   8698                             UnallocatedT32(instr);
   8699                             return;
   8700                           }
   8701                           unsigned rd = (instr >> 8) & 0xf;
   8702                           unsigned rn = (instr >> 16) & 0xf;
   8703                           uint32_t imm = ImmediateT32::Decode(
   8704                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8705                               ((instr >> 15) & 0x800));
   8706                           // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8707                           eors(CurrentCond(),
   8708                                Best,
   8709                                Register(rd),
   8710                                Register(rn),
   8711                                imm);
   8712                           break;
   8713                         }
   8714                       }
   8715                       break;
   8716                     }
   8717                     case 0x01000000: {
   8718                       // 0xf1000000
   8719                       switch (instr & 0x000f0000) {
   8720                         case 0x000d0000: {
   8721                           // 0xf10d0000
   8722                           unsigned rd = (instr >> 8) & 0xf;
   8723                           uint32_t imm = ImmediateT32::Decode(
   8724                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8725                               ((instr >> 15) & 0x800));
   8726                           if ((instr & 0x00100000) == 0x00000000 &&
   8727                               (((rd < kNumberOfT32LowRegisters) &&
   8728                                 ((imm <= 1020) && ((imm & 3) == 0))) ||
   8729                                ((rd == sp.GetCode()) &&
   8730                                 ((imm <= 508) && ((imm & 3) == 0))))) {
   8731                             // ADD{<c>}.W {<Rd>}, SP, #<const> ; T3
   8732                             add(CurrentCond(), Wide, Register(rd), sp, imm);
   8733                           } else {
   8734                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   8735                             // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; T3
   8736                             add(CurrentCond(), Best, Register(rd), sp, imm);
   8737                           }
   8738                           break;
   8739                         }
   8740                         default: {
   8741                           if (((instr & 0xf0000) == 0xd0000)) {
   8742                             UnallocatedT32(instr);
   8743                             return;
   8744                           }
   8745                           unsigned rd = (instr >> 8) & 0xf;
   8746                           unsigned rn = (instr >> 16) & 0xf;
   8747                           uint32_t imm = ImmediateT32::Decode(
   8748                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8749                               ((instr >> 15) & 0x800));
   8750                           if (InITBlock() &&
   8751                               (instr & 0x00100000) == 0x00000000 &&
   8752                               (((rd < kNumberOfT32LowRegisters) &&
   8753                                 (rn < kNumberOfT32LowRegisters) &&
   8754                                 (imm <= 7)) ||
   8755                                ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   8756                                 (imm <= 255)))) {
   8757                             // ADD<c>.W {<Rd>}, <Rn>, #<const> ; T3
   8758                             add(CurrentCond(),
   8759                                 Wide,
   8760                                 Register(rd),
   8761                                 Register(rn),
   8762                                 imm);
   8763                           } else {
   8764                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   8765                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
   8766                             add(CurrentCond(),
   8767                                 Best,
   8768                                 Register(rd),
   8769                                 Register(rn),
   8770                                 imm);
   8771                           }
   8772                           break;
   8773                         }
   8774                       }
   8775                       break;
   8776                     }
   8777                     case 0x01100000: {
   8778                       // 0xf1100000
   8779                       switch (instr & 0x00000f00) {
   8780                         case 0x00000f00: {
   8781                           // 0xf1100f00
   8782                           unsigned rn = (instr >> 16) & 0xf;
   8783                           uint32_t imm = ImmediateT32::Decode(
   8784                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8785                               ((instr >> 15) & 0x800));
   8786                           // CMN{<c>}{<q>} <Rn>, #<const> ; T1
   8787                           cmn(CurrentCond(), Best, Register(rn), imm);
   8788                           break;
   8789                         }
   8790                         default: {
   8791                           switch (instr & 0x000f0000) {
   8792                             case 0x000d0000: {
   8793                               // 0xf11d0000
   8794                               if (((instr & 0xf00) == 0xf00)) {
   8795                                 UnallocatedT32(instr);
   8796                                 return;
   8797                               }
   8798                               unsigned rd = (instr >> 8) & 0xf;
   8799                               uint32_t imm = ImmediateT32::Decode(
   8800                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
   8801                                   ((instr >> 15) & 0x800));
   8802                               // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; T3
   8803                               adds(CurrentCond(), Best, Register(rd), sp, imm);
   8804                               break;
   8805                             }
   8806                             default: {
   8807                               if (((instr & 0xf0000) == 0xd0000) ||
   8808                                   ((instr & 0xf00) == 0xf00)) {
   8809                                 UnallocatedT32(instr);
   8810                                 return;
   8811                               }
   8812                               unsigned rd = (instr >> 8) & 0xf;
   8813                               unsigned rn = (instr >> 16) & 0xf;
   8814                               uint32_t imm = ImmediateT32::Decode(
   8815                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
   8816                                   ((instr >> 15) & 0x800));
   8817                               if (OutsideITBlock() &&
   8818                                   (instr & 0x00100000) == 0x00100000 &&
   8819                                   (((rd < kNumberOfT32LowRegisters) &&
   8820                                     (rn < kNumberOfT32LowRegisters) &&
   8821                                     (imm <= 7)) ||
   8822                                    ((rd == rn) &&
   8823                                     (rd < kNumberOfT32LowRegisters) &&
   8824                                     (imm <= 255)))) {
   8825                                 // ADDS.W {<Rd>}, <Rn>, #<const> ; T3
   8826                                 adds(Condition::None(),
   8827                                      Wide,
   8828                                      Register(rd),
   8829                                      Register(rn),
   8830                                      imm);
   8831                               } else {
   8832                                 VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
   8833                                 // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
   8834                                 adds(CurrentCond(),
   8835                                      Best,
   8836                                      Register(rd),
   8837                                      Register(rn),
   8838                                      imm);
   8839                               }
   8840                               break;
   8841                             }
   8842                           }
   8843                           break;
   8844                         }
   8845                       }
   8846                       break;
   8847                     }
   8848                     case 0x01400000: {
   8849                       // 0xf1400000
   8850                       unsigned rd = (instr >> 8) & 0xf;
   8851                       unsigned rn = (instr >> 16) & 0xf;
   8852                       uint32_t imm = ImmediateT32::Decode(
   8853                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8854                           ((instr >> 15) & 0x800));
   8855                       // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8856                       adc(CurrentCond(), Best, Register(rd), Register(rn), imm);
   8857                       break;
   8858                     }
   8859                     case 0x01500000: {
   8860                       // 0xf1500000
   8861                       unsigned rd = (instr >> 8) & 0xf;
   8862                       unsigned rn = (instr >> 16) & 0xf;
   8863                       uint32_t imm = ImmediateT32::Decode(
   8864                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8865                           ((instr >> 15) & 0x800));
   8866                       // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8867                       adcs(CurrentCond(),
   8868                            Best,
   8869                            Register(rd),
   8870                            Register(rn),
   8871                            imm);
   8872                       break;
   8873                     }
   8874                     case 0x01600000: {
   8875                       // 0xf1600000
   8876                       unsigned rd = (instr >> 8) & 0xf;
   8877                       unsigned rn = (instr >> 16) & 0xf;
   8878                       uint32_t imm = ImmediateT32::Decode(
   8879                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8880                           ((instr >> 15) & 0x800));
   8881                       // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8882                       sbc(CurrentCond(), Best, Register(rd), Register(rn), imm);
   8883                       break;
   8884                     }
   8885                     case 0x01700000: {
   8886                       // 0xf1700000
   8887                       unsigned rd = (instr >> 8) & 0xf;
   8888                       unsigned rn = (instr >> 16) & 0xf;
   8889                       uint32_t imm = ImmediateT32::Decode(
   8890                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   8891                           ((instr >> 15) & 0x800));
   8892                       // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1
   8893                       sbcs(CurrentCond(),
   8894                            Best,
   8895                            Register(rd),
   8896                            Register(rn),
   8897                            imm);
   8898                       break;
   8899                     }
   8900                     case 0x01a00000: {
   8901                       // 0xf1a00000
   8902                       switch (instr & 0x000f0000) {
   8903                         case 0x000d0000: {
   8904                           // 0xf1ad0000
   8905                           unsigned rd = (instr >> 8) & 0xf;
   8906                           uint32_t imm = ImmediateT32::Decode(
   8907                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8908                               ((instr >> 15) & 0x800));
   8909                           if ((instr & 0x00100000) == 0x00000000 &&
   8910                               ((rd == sp.GetCode()) &&
   8911                                ((imm <= 508) && ((imm & 3) == 0)))) {
   8912                             // SUB{<c>}.W {<Rd>}, SP, #<const> ; T2
   8913                             sub(CurrentCond(), Wide, Register(rd), sp, imm);
   8914                           } else {
   8915                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   8916                             // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; T2
   8917                             sub(CurrentCond(), Best, Register(rd), sp, imm);
   8918                           }
   8919                           break;
   8920                         }
   8921                         default: {
   8922                           if (((instr & 0xf0000) == 0xd0000)) {
   8923                             UnallocatedT32(instr);
   8924                             return;
   8925                           }
   8926                           unsigned rd = (instr >> 8) & 0xf;
   8927                           unsigned rn = (instr >> 16) & 0xf;
   8928                           uint32_t imm = ImmediateT32::Decode(
   8929                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8930                               ((instr >> 15) & 0x800));
   8931                           if (InITBlock() &&
   8932                               (instr & 0x00100000) == 0x00000000 &&
   8933                               (((rd < kNumberOfT32LowRegisters) &&
   8934                                 (rn < kNumberOfT32LowRegisters) &&
   8935                                 (imm <= 7)) ||
   8936                                ((rd == rn) && (rd < kNumberOfT32LowRegisters) &&
   8937                                 (imm <= 255)))) {
   8938                             // SUB<c>.W {<Rd>}, <Rn>, #<const> ; T3
   8939                             sub(CurrentCond(),
   8940                                 Wide,
   8941                                 Register(rd),
   8942                                 Register(rn),
   8943                                 imm);
   8944                           } else {
   8945                             VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   8946                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
   8947                             sub(CurrentCond(),
   8948                                 Best,
   8949                                 Register(rd),
   8950                                 Register(rn),
   8951                                 imm);
   8952                           }
   8953                           break;
   8954                         }
   8955                       }
   8956                       break;
   8957                     }
   8958                     case 0x01b00000: {
   8959                       // 0xf1b00000
   8960                       switch (instr & 0x00000f00) {
   8961                         case 0x00000f00: {
   8962                           // 0xf1b00f00
   8963                           unsigned rn = (instr >> 16) & 0xf;
   8964                           uint32_t imm = ImmediateT32::Decode(
   8965                               (instr & 0xff) | ((instr >> 4) & 0x700) |
   8966                               ((instr >> 15) & 0x800));
   8967                           if ((rn < kNumberOfT32LowRegisters) && (imm <= 255)) {
   8968                             // CMP{<c>}.W <Rn>, #<const> ; T2
   8969                             cmp(CurrentCond(), Wide, Register(rn), imm);
   8970                           } else {
   8971                             // CMP{<c>}{<q>} <Rn>, #<const> ; T2
   8972                             cmp(CurrentCond(), Best, Register(rn), imm);
   8973                           }
   8974                           break;
   8975                         }
   8976                         default: {
   8977                           switch (instr & 0x000f0000) {
   8978                             case 0x000d0000: {
   8979                               // 0xf1bd0000
   8980                               if (((instr & 0xf00) == 0xf00)) {
   8981                                 UnallocatedT32(instr);
   8982                                 return;
   8983                               }
   8984                               unsigned rd = (instr >> 8) & 0xf;
   8985                               uint32_t imm = ImmediateT32::Decode(
   8986                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
   8987                                   ((instr >> 15) & 0x800));
   8988                               // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; T2
   8989                               subs(CurrentCond(), Best, Register(rd), sp, imm);
   8990                               break;
   8991                             }
   8992                             default: {
   8993                               if (((instr & 0xf0000) == 0xd0000) ||
   8994                                   ((instr & 0xf00) == 0xf00)) {
   8995                                 UnallocatedT32(instr);
   8996                                 return;
   8997                               }
   8998                               unsigned rd = (instr >> 8) & 0xf;
   8999                               unsigned rn = (instr >> 16) & 0xf;
   9000                               uint32_t imm = ImmediateT32::Decode(
   9001                                   (instr & 0xff) | ((instr >> 4) & 0x700) |
   9002                                   ((instr >> 15) & 0x800));
   9003                               if (OutsideITBlock() &&
   9004                                   (instr & 0x00100000) == 0x00100000 &&
   9005                                   (((rd < kNumberOfT32LowRegisters) &&
   9006                                     (rn < kNumberOfT32LowRegisters) &&
   9007                                     (imm <= 7)) ||
   9008                                    ((rd == rn) &&
   9009                                     (rd < kNumberOfT32LowRegisters) &&
   9010                                     (imm <= 255)))) {
   9011                                 // SUBS.W {<Rd>}, <Rn>, #<const> ; T3
   9012                                 subs(Condition::None(),
   9013                                      Wide,
   9014                                      Register(rd),
   9015                                      Register(rn),
   9016                                      imm);
   9017                               } else {
   9018                                 VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
   9019                                 // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3
   9020                                 subs(CurrentCond(),
   9021                                      Best,
   9022                                      Register(rd),
   9023                                      Register(rn),
   9024                                      imm);
   9025                               }
   9026                               break;
   9027                             }
   9028                           }
   9029                           break;
   9030                         }
   9031                       }
   9032                       break;
   9033                     }
   9034                     case 0x01c00000: {
   9035                       // 0xf1c00000
   9036                       unsigned rd = (instr >> 8) & 0xf;
   9037                       unsigned rn = (instr >> 16) & 0xf;
   9038                       uint32_t imm = ImmediateT32::Decode(
   9039                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   9040                           ((instr >> 15) & 0x800));
   9041                       if (InITBlock() && (instr & 0x00100000) == 0x00000000 &&
   9042                           (imm == 0) &&
   9043                           ((rd < kNumberOfT32LowRegisters) &&
   9044                            (rn < kNumberOfT32LowRegisters) && (imm == 0))) {
   9045                         // RSB<c>.W {<Rd>}, <Rn>, #0 ; T2
   9046                         rsb(CurrentCond(),
   9047                             Wide,
   9048                             Register(rd),
   9049                             Register(rn),
   9050                             UINT32_C(0));
   9051                       } else {
   9052                         VIXL_ASSERT((instr & 0x00100000) == 0x00000000);
   9053                         // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2
   9054                         rsb(CurrentCond(),
   9055                             Best,
   9056                             Register(rd),
   9057                             Register(rn),
   9058                             imm);
   9059                       }
   9060                       break;
   9061                     }
   9062                     case 0x01d00000: {
   9063                       // 0xf1d00000
   9064                       unsigned rd = (instr >> 8) & 0xf;
   9065                       unsigned rn = (instr >> 16) & 0xf;
   9066                       uint32_t imm = ImmediateT32::Decode(
   9067                           (instr & 0xff) | ((instr >> 4) & 0x700) |
   9068                           ((instr >> 15) & 0x800));
   9069                       if (OutsideITBlock() &&
   9070                           (instr & 0x00100000) == 0x00100000 && (imm == 0) &&
   9071                           ((rd < kNumberOfT32LowRegisters) &&
   9072                            (rn < kNumberOfT32LowRegisters) && (imm == 0))) {
   9073                         // RSBS.W {<Rd>}, <Rn>, #0 ; T2
   9074                         rsbs(Condition::None(),
   9075                              Wide,
   9076                              Register(rd),
   9077                              Register(rn),
   9078                              UINT32_C(0));
   9079                       } else {
   9080                         VIXL_ASSERT((instr & 0x00100000) == 0x00100000);
   9081                         // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2
   9082                         rsbs(CurrentCond(),
   9083                              Best,
   9084                              Register(rd),
   9085                              Register(rn),
   9086                              imm);
   9087                       }
   9088                       break;
   9089                     }
   9090                     case 0x02000000: {
   9091                       // 0xf2000000
   9092                       switch (instr & 0x000d0000) {
   9093                         case 0x000d0000: {
   9094                           // 0xf20d0000
   9095                           switch (instr & 0x00020000) {
   9096                             case 0x00000000: {
   9097                               // 0xf20d0000
   9098                               unsigned rd = (instr >> 8) & 0xf;
   9099                               uint32_t imm = (instr & 0xff) |
   9100                                              ((instr >> 4) & 0x700) |
   9101                                              ((instr >> 15) & 0x800);
   9102                               if (((rd >= kNumberOfT32LowRegisters) ||
   9103                                    ((imm > 1020) || ((imm & 3) != 0))) &&
   9104                                   ((rd != sp.GetCode()) ||
   9105                                    ((imm > 508) || ((imm & 3) != 0))) &&
   9106                                   (!ImmediateT32::IsImmediateT32(imm))) {
   9107                                 // ADD{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4
   9108                                 add(CurrentCond(), Best, Register(rd), sp, imm);
   9109                               } else {
   9110                                 // ADDW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4
   9111                                 addw(CurrentCond(), Register(rd), sp, imm);
   9112                               }
   9113                               break;
   9114                             }
   9115                             case 0x00020000: {
   9116                               // 0xf20f0000
   9117                               unsigned rd = (instr >> 8) & 0xf;
   9118                               int32_t imm = (instr & 0xff) |
   9119                                             ((instr >> 4) & 0x700) |
   9120                                             ((instr >> 15) & 0x800);
   9121                               Label label(imm, kT32PcDelta);
   9122                               if ((imm >= 0) && (imm <= 4095) &&
   9123                                   ((rd < kNumberOfT32LowRegisters) &&
   9124                                    (imm >= 0) && (imm <= 1020) &&
   9125                                    ((imm & 3) == 0))) {
   9126                                 // ADR{<c>}.W <Rd>, <label> ; T3
   9127                                 adr(CurrentCond(), Wide, Register(rd), &label);
   9128                               } else {
   9129                                 // ADR{<c>}{<q>} <Rd>, <label> ; T3
   9130                                 adr(CurrentCond(), Best, Register(rd), &label);
   9131                               }
   9132                               break;
   9133                             }
   9134                           }
   9135                           break;
   9136                         }
   9137                         default: {
   9138                           if (((instr & 0xd0000) == 0xd0000)) {
   9139                             UnallocatedT32(instr);
   9140                             return;
   9141                           }
   9142                           unsigned rd = (instr >> 8) & 0xf;
   9143                           unsigned rn = (instr >> 16) & 0xf;
   9144                           uint32_t imm = (instr & 0xff) |
   9145                                          ((instr >> 4) & 0x700) |
   9146                                          ((instr >> 15) & 0x800);
   9147                           if ((InITBlock() ||
   9148                                (rd >= kNumberOfT32LowRegisters) ||
   9149                                (rn >= kNumberOfT32LowRegisters) || (imm > 7)) &&
   9150                               (InITBlock() || (rd != rn) ||
   9151                                (rd >= kNumberOfT32LowRegisters) ||
   9152                                (imm > 255)) &&
   9153                               (!ImmediateT32::IsImmediateT32(imm))) {
   9154                             // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
   9155                             add(CurrentCond(),
   9156                                 Best,
   9157                                 Register(rd),
   9158                                 Register(rn),
   9159                                 imm);
   9160                           } else {
   9161                             // ADDW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
   9162                             addw(CurrentCond(),
   9163                                  Register(rd),
   9164                                  Register(rn),
   9165                                  imm);
   9166                           }
   9167                           break;
   9168                         }
   9169                       }
   9170                       break;
   9171                     }
   9172                     case 0x02400000: {
   9173                       // 0xf2400000
   9174                       unsigned rd = (instr >> 8) & 0xf;
   9175                       uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) |
   9176                                      ((instr >> 15) & 0x800) |
   9177                                      ((instr >> 4) & 0xf000);
   9178                       if ((InITBlock() || (rd >= kNumberOfT32LowRegisters) ||
   9179                            (imm > 255)) &&
   9180                           (!ImmediateT32::IsImmediateT32(imm))) {
   9181                         // MOV{<c>}{<q>} <Rd>, #<imm16> ; T3
   9182                         mov(CurrentCond(), Best, Register(rd), imm);
   9183                       } else {
   9184                         // MOVW{<c>}{<q>} <Rd>, #<imm16> ; T3
   9185                         movw(CurrentCond(), Register(rd), imm);
   9186                       }
   9187                       break;
   9188                     }
   9189                     case 0x02a00000: {
   9190                       // 0xf2a00000
   9191                       switch (instr & 0x000d0000) {
   9192                         case 0x000d0000: {
   9193                           // 0xf2ad0000
   9194                           switch (instr & 0x00020000) {
   9195                             case 0x00000000: {
   9196                               // 0xf2ad0000
   9197                               unsigned rd = (instr >> 8) & 0xf;
   9198                               uint32_t imm = (instr & 0xff) |
   9199                                              ((instr >> 4) & 0x700) |
   9200                                              ((instr >> 15) & 0x800);
   9201                               if (((rd != sp.GetCode()) ||
   9202                                    ((imm > 508) || ((imm & 3) != 0))) &&
   9203                                   (!ImmediateT32::IsImmediateT32(imm))) {
   9204                                 // SUB{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3
   9205                                 sub(CurrentCond(), Best, Register(rd), sp, imm);
   9206                               } else {
   9207                                 // SUBW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3
   9208                                 subw(CurrentCond(), Register(rd), sp, imm);
   9209                               }
   9210                               break;
   9211                             }
   9212                             case 0x00020000: {
   9213                               // 0xf2af0000
   9214                               if (((((Uint32((instr >> 26)) & Uint32(0x1))
   9215                                      << 11) |
   9216                                     ((Uint32((instr >> 12)) & Uint32(0x7))
   9217                                      << 8) |
   9218                                     (Uint32(instr) & Uint32(0xff))) ==
   9219                                    Uint32(0x0))) {
   9220                                 unsigned rd = (instr >> 8) & 0xf;
   9221                                 uint32_t imm = (instr & 0xff) |
   9222                                                ((instr >> 4) & 0x700) |
   9223                                                ((instr >> 15) & 0x800);
   9224                                 // SUB{<c>}{<q>} <Rd>, PC, #<imm12> ; T2
   9225                                 sub(CurrentCond(), Best, Register(rd), pc, imm);
   9226                                 return;
   9227                               }
   9228                               unsigned rd = (instr >> 8) & 0xf;
   9229                               int32_t imm = (instr & 0xff) |
   9230                                             ((instr >> 4) & 0x700) |
   9231                                             ((instr >> 15) & 0x800);
   9232                               Label label(-imm, kT32PcDelta);
   9233                               // ADR{<c>}{<q>} <Rd>, <label> ; T2
   9234                               adr(CurrentCond(), Best, Register(rd), &label);
   9235                               break;
   9236                             }
   9237                           }
   9238                           break;
   9239                         }
   9240                         default: {
   9241                           if (((instr & 0xd0000) == 0xd0000)) {
   9242                             UnallocatedT32(instr);
   9243                             return;
   9244                           }
   9245                           unsigned rd = (instr >> 8) & 0xf;
   9246                           unsigned rn = (instr >> 16) & 0xf;
   9247                           uint32_t imm = (instr & 0xff) |
   9248                                          ((instr >> 4) & 0x700) |
   9249                                          ((instr >> 15) & 0x800);
   9250                           if ((InITBlock() ||
   9251                                (rd >= kNumberOfT32LowRegisters) ||
   9252                                (rn >= kNumberOfT32LowRegisters) || (imm > 7)) &&
   9253                               (InITBlock() || (rd != rn) ||
   9254                                (rd >= kNumberOfT32LowRegisters) ||
   9255                                (imm > 255)) &&
   9256                               (!ImmediateT32::IsImmediateT32(imm))) {
   9257                             // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
   9258                             sub(CurrentCond(),
   9259                                 Best,
   9260                                 Register(rd),
   9261                                 Register(rn),
   9262                                 imm);
   9263                           } else {
   9264                             // SUBW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4
   9265                             subw(CurrentCond(),
   9266                                  Register(rd),
   9267                                  Register(rn),
   9268                                  imm);
   9269                           }
   9270                           break;
   9271                         }
   9272                       }
   9273                       break;
   9274                     }
   9275                     case 0x02c00000: {
   9276                       // 0xf2c00000
   9277                       unsigned rd = (instr >> 8) & 0xf;
   9278                       uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) |
   9279                                      ((instr >> 15) & 0x800) |
   9280                                      ((instr >> 4) & 0xf000);
   9281                       // MOVT{<c>}{<q>} <Rd>, #<imm16> ; T1
   9282                       movt(CurrentCond(), Register(rd), imm);
   9283                       break;
   9284                     }
   9285                     case 0x03000000: {
   9286                       // 0xf3000000
   9287                       unsigned rd = (instr >> 8) & 0xf;
   9288                       uint32_t imm = (instr & 0x1f) + 1;
   9289                       unsigned rn = (instr >> 16) & 0xf;
   9290                       uint32_t amount =
   9291                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9292                       // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length)
   9293                       ssat(CurrentCond(),
   9294                            Register(rd),
   9295                            imm,
   9296                            Operand(Register(rn), LSL, amount));
   9297                       if (((instr & 0xfff08020) != 0xf3000000)) {
   9298                         UnpredictableT32(instr);
   9299                       }
   9300                       break;
   9301                     }
   9302                     case 0x03200000: {
   9303                       // 0xf3200000
   9304                       switch (instr & 0x000070c0) {
   9305                         case 0x00000000: {
   9306                           // 0xf3200000
   9307                           unsigned rd = (instr >> 8) & 0xf;
   9308                           uint32_t imm = (instr & 0xf) + 1;
   9309                           unsigned rn = (instr >> 16) & 0xf;
   9310                           // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1
   9311                           ssat16(CurrentCond(),
   9312                                  Register(rd),
   9313                                  imm,
   9314                                  Register(rn));
   9315                           if (((instr & 0xfff0f0f0) != 0xf3200000)) {
   9316                             UnpredictableT32(instr);
   9317                           }
   9318                           break;
   9319                         }
   9320                         default: {
   9321                           if (((instr & 0x70c0) == 0x0)) {
   9322                             UnallocatedT32(instr);
   9323                             return;
   9324                           }
   9325                           unsigned rd = (instr >> 8) & 0xf;
   9326                           uint32_t imm = (instr & 0x1f) + 1;
   9327                           unsigned rn = (instr >> 16) & 0xf;
   9328                           uint32_t amount =
   9329                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9330                           // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length)
   9331                           ssat(CurrentCond(),
   9332                                Register(rd),
   9333                                imm,
   9334                                Operand(Register(rn), ASR, amount));
   9335                           if (((instr & 0xfff08020) != 0xf3200000)) {
   9336                             UnpredictableT32(instr);
   9337                           }
   9338                           break;
   9339                         }
   9340                       }
   9341                       break;
   9342                     }
   9343                     case 0x03400000: {
   9344                       // 0xf3400000
   9345                       unsigned rd = (instr >> 8) & 0xf;
   9346                       unsigned rn = (instr >> 16) & 0xf;
   9347                       uint32_t lsb =
   9348                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9349                       uint32_t widthm1 = instr & 0x1f;
   9350                       uint32_t width = widthm1 + 1;
   9351                       // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
   9352                       sbfx(CurrentCond(),
   9353                            Register(rd),
   9354                            Register(rn),
   9355                            lsb,
   9356                            width);
   9357                       if (((instr & 0xfff08020) != 0xf3400000)) {
   9358                         UnpredictableT32(instr);
   9359                       }
   9360                       break;
   9361                     }
   9362                     case 0x03600000: {
   9363                       // 0xf3600000
   9364                       switch (instr & 0x000f0000) {
   9365                         case 0x000f0000: {
   9366                           // 0xf36f0000
   9367                           unsigned rd = (instr >> 8) & 0xf;
   9368                           uint32_t lsb =
   9369                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9370                           uint32_t msb = instr & 0x1f;
   9371                           uint32_t width = msb - lsb + 1;
   9372                           // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; T1
   9373                           bfc(CurrentCond(), Register(rd), lsb, width);
   9374                           if (((instr & 0xffff8020) != 0xf36f0000)) {
   9375                             UnpredictableT32(instr);
   9376                           }
   9377                           break;
   9378                         }
   9379                         default: {
   9380                           if (((instr & 0xf0000) == 0xf0000)) {
   9381                             UnallocatedT32(instr);
   9382                             return;
   9383                           }
   9384                           unsigned rd = (instr >> 8) & 0xf;
   9385                           unsigned rn = (instr >> 16) & 0xf;
   9386                           uint32_t lsb =
   9387                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9388                           uint32_t msb = instr & 0x1f;
   9389                           uint32_t width = msb - lsb + 1;
   9390                           // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
   9391                           bfi(CurrentCond(),
   9392                               Register(rd),
   9393                               Register(rn),
   9394                               lsb,
   9395                               width);
   9396                           if (((instr & 0xfff08020) != 0xf3600000)) {
   9397                             UnpredictableT32(instr);
   9398                           }
   9399                           break;
   9400                         }
   9401                       }
   9402                       break;
   9403                     }
   9404                     case 0x03800000: {
   9405                       // 0xf3800000
   9406                       unsigned rd = (instr >> 8) & 0xf;
   9407                       uint32_t imm = instr & 0x1f;
   9408                       unsigned rn = (instr >> 16) & 0xf;
   9409                       uint32_t amount =
   9410                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9411                       // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length)
   9412                       usat(CurrentCond(),
   9413                            Register(rd),
   9414                            imm,
   9415                            Operand(Register(rn), LSL, amount));
   9416                       if (((instr & 0xfff08020) != 0xf3800000)) {
   9417                         UnpredictableT32(instr);
   9418                       }
   9419                       break;
   9420                     }
   9421                     case 0x03a00000: {
   9422                       // 0xf3a00000
   9423                       switch (instr & 0x000070c0) {
   9424                         case 0x00000000: {
   9425                           // 0xf3a00000
   9426                           unsigned rd = (instr >> 8) & 0xf;
   9427                           uint32_t imm = instr & 0xf;
   9428                           unsigned rn = (instr >> 16) & 0xf;
   9429                           // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1
   9430                           usat16(CurrentCond(),
   9431                                  Register(rd),
   9432                                  imm,
   9433                                  Register(rn));
   9434                           if (((instr & 0xfff0f0f0) != 0xf3a00000)) {
   9435                             UnpredictableT32(instr);
   9436                           }
   9437                           break;
   9438                         }
   9439                         default: {
   9440                           if (((instr & 0x70c0) == 0x0)) {
   9441                             UnallocatedT32(instr);
   9442                             return;
   9443                           }
   9444                           unsigned rd = (instr >> 8) & 0xf;
   9445                           uint32_t imm = instr & 0x1f;
   9446                           unsigned rn = (instr >> 16) & 0xf;
   9447                           uint32_t amount =
   9448                               ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9449                           // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length)
   9450                           usat(CurrentCond(),
   9451                                Register(rd),
   9452                                imm,
   9453                                Operand(Register(rn), ASR, amount));
   9454                           if (((instr & 0xfff08020) != 0xf3a00000)) {
   9455                             UnpredictableT32(instr);
   9456                           }
   9457                           break;
   9458                         }
   9459                       }
   9460                       break;
   9461                     }
   9462                     case 0x03c00000: {
   9463                       // 0xf3c00000
   9464                       unsigned rd = (instr >> 8) & 0xf;
   9465                       unsigned rn = (instr >> 16) & 0xf;
   9466                       uint32_t lsb =
   9467                           ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c);
   9468                       uint32_t widthm1 = instr & 0x1f;
   9469                       uint32_t width = widthm1 + 1;
   9470                       // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1
   9471                       ubfx(CurrentCond(),
   9472                            Register(rd),
   9473                            Register(rn),
   9474                            lsb,
   9475                            width);
   9476                       if (((instr & 0xfff08020) != 0xf3c00000)) {
   9477                         UnpredictableT32(instr);
   9478                       }
   9479                       break;
   9480                     }
   9481                     default:
   9482                       UnallocatedT32(instr);
   9483                       break;
   9484                   }
   9485                   break;
   9486                 }
   9487                 case 0x00008000: {
   9488                   // 0xf0008000
   9489                   switch (instr & 0x00005000) {
   9490                     case 0x00000000: {
   9491                       // 0xf0008000
   9492                       switch (instr & 0x03800000) {
   9493                         case 0x03800000: {
   9494                           // 0xf3808000
   9495                           switch (instr & 0x04600000) {
   9496                             case 0x00000000: {
   9497                               // 0xf3808000
   9498                               switch (instr & 0x00000020) {
   9499                                 case 0x00000000: {
   9500                                   // 0xf3808000
   9501                                   unsigned spec_reg = ((instr >> 8) & 0xf) |
   9502                                                       ((instr >> 16) & 0x10);
   9503                                   unsigned rn = (instr >> 16) & 0xf;
   9504                                   // MSR{<c>}{<q>} <spec_reg>, <Rn> ; T1
   9505                                   msr(CurrentCond(),
   9506                                       MaskedSpecialRegister(spec_reg),
   9507                                       Register(rn));
   9508                                   if (((instr & 0xffe0f0ff) != 0xf3808000)) {
   9509                                     UnpredictableT32(instr);
   9510                                   }
   9511                                   break;
   9512                                 }
   9513                                 case 0x00000020: {
   9514                                   // 0xf3808020
   9515                                   UnimplementedT32_32("MSR", instr);
   9516                                   break;
   9517                                 }
   9518                               }
   9519                               break;
   9520                             }
   9521                             case 0x00200000: {
   9522                               // 0xf3a08000
   9523                               switch (instr & 0x00100000) {
   9524                                 case 0x00000000: {
   9525                                   // 0xf3a08000
   9526                                   switch (instr & 0x00000700) {
   9527                                     case 0x00000000: {
   9528                                       // 0xf3a08000
   9529                                       switch (instr & 0x000000f0) {
   9530                                         case 0x00000000: {
   9531                                           // 0xf3a08000
   9532                                           switch (instr & 0x0000000f) {
   9533                                             case 0x00000000: {
   9534                                               // 0xf3a08000
   9535                                               // NOP{<c>}.W ; T2
   9536                                               nop(CurrentCond(), Wide);
   9537                                               if (((instr & 0xffffffff) !=
   9538                                                    0xf3af8000)) {
   9539                                                 UnpredictableT32(instr);
   9540                                               }
   9541                                               break;
   9542                                             }
   9543                                             case 0x00000001: {
   9544                                               // 0xf3a08001
   9545                                               // YIELD{<c>}.W ; T2
   9546                                               yield(CurrentCond(), Wide);
   9547                                               if (((instr & 0xffffffff) !=
   9548                                                    0xf3af8001)) {
   9549                                                 UnpredictableT32(instr);
   9550                                               }
   9551                                               break;
   9552                                             }
   9553                                             case 0x00000002: {
   9554                                               // 0xf3a08002
   9555                                               UnimplementedT32_32("WFE", instr);
   9556                                               break;
   9557                                             }
   9558                                             case 0x00000003: {
   9559                                               // 0xf3a08003
   9560                                               UnimplementedT32_32("WFI", instr);
   9561                                               break;
   9562                                             }
   9563                                             case 0x00000004: {
   9564                                               // 0xf3a08004
   9565                                               UnimplementedT32_32("SEV", instr);
   9566                                               break;
   9567                                             }
   9568                                             case 0x00000005: {
   9569                                               // 0xf3a08005
   9570                                               UnimplementedT32_32("SEVL",
   9571                                                                   instr);
   9572                                               break;
   9573                                             }
   9574                                             default:
   9575                                               UnallocatedT32(instr);
   9576                                               break;
   9577                                           }
   9578                                           break;
   9579                                         }
   9580                                         case 0x000000f0: {
   9581                                           // 0xf3a080f0
   9582                                           UnimplementedT32_32("DBG", instr);
   9583                                           break;
   9584                                         }
   9585                                         default:
   9586                                           UnallocatedT32(instr);
   9587                                           break;
   9588                                       }
   9589                                       break;
   9590                                     }
   9591                                     case 0x00000100: {
   9592                                       // 0xf3a08100
   9593                                       if ((instr & 0x000000e0) == 0x00000000) {
   9594                                         UnimplementedT32_32("CPS", instr);
   9595                                       } else {
   9596                                         UnallocatedT32(instr);
   9597                                       }
   9598                                       break;
   9599                                     }
   9600                                     case 0x00000400: {
   9601                                       // 0xf3a08400
   9602                                       if ((instr & 0x0000001f) == 0x00000000) {
   9603                                         UnimplementedT32_32("CPSIE", instr);
   9604                                       } else {
   9605                                         UnallocatedT32(instr);
   9606                                       }
   9607                                       break;
   9608                                     }
   9609                                     case 0x00000500: {
   9610                                       // 0xf3a08500
   9611                                       UnimplementedT32_32("CPSIE", instr);
   9612                                       break;
   9613                                     }
   9614                                     case 0x00000600: {
   9615                                       // 0xf3a08600
   9616                                       if ((instr & 0x0000001f) == 0x00000000) {
   9617                                         UnimplementedT32_32("CPSID", instr);
   9618                                       } else {
   9619                                         UnallocatedT32(instr);
   9620                                       }
   9621                                       break;
   9622                                     }
   9623                                     case 0x00000700: {
   9624                                       // 0xf3a08700
   9625                                       UnimplementedT32_32("CPSID", instr);
   9626                                       break;
   9627                                     }
   9628                                     default:
   9629                                       UnallocatedT32(instr);
   9630                                       break;
   9631                                   }
   9632                                   break;
   9633                                 }
   9634                                 case 0x00100000: {
   9635                                   // 0xf3b08000
   9636                                   switch (instr & 0x000000f0) {
   9637                                     case 0x00000020: {
   9638                                       // 0xf3b08020
   9639                                       // CLREX{<c>}{<q>} ; T1
   9640                                       clrex(CurrentCond());
   9641                                       if (((instr & 0xffffffff) !=
   9642                                            0xf3bf8f2f)) {
   9643                                         UnpredictableT32(instr);
   9644                                       }
   9645                                       break;
   9646                                     }
   9647                                     case 0x00000040: {
   9648                                       // 0xf3b08040
   9649                                       MemoryBarrier option(instr & 0xf);
   9650                                       // DSB{<c>}{<q>} {<option>} ; T1
   9651                                       dsb(CurrentCond(), option);
   9652                                       if (((instr & 0xfffffff0) !=
   9653                                            0xf3bf8f40)) {
   9654                                         UnpredictableT32(instr);
   9655                                       }
   9656                                       break;
   9657                                     }
   9658                                     case 0x00000050: {
   9659                                       // 0xf3b08050
   9660                                       MemoryBarrier option(instr & 0xf);
   9661                                       // DMB{<c>}{<q>} {<option>} ; T1
   9662                                       dmb(CurrentCond(), option);
   9663                                       if (((instr & 0xfffffff0) !=
   9664                                            0xf3bf8f50)) {
   9665                                         UnpredictableT32(instr);
   9666                                       }
   9667                                       break;
   9668                                     }
   9669                                     case 0x00000060: {
   9670                                       // 0xf3b08060
   9671                                       MemoryBarrier option(instr & 0xf);
   9672                                       // ISB{<c>}{<q>} {<option>} ; T1
   9673                                       isb(CurrentCond(), option);
   9674                                       if (((instr & 0xfffffff0) !=
   9675                                            0xf3bf8f60)) {
   9676                                         UnpredictableT32(instr);
   9677                                       }
   9678                                       break;
   9679                                     }
   9680                                     default:
   9681                                       UnallocatedT32(instr);
   9682                                       break;
   9683                                   }
   9684                                   break;
   9685                                 }
   9686                               }
   9687                               break;
   9688                             }
   9689                             case 0x00400000: {
   9690                               // 0xf3c08000
   9691                               switch (instr & 0x00100000) {
   9692                                 case 0x00000000: {
   9693                                   // 0xf3c08000
   9694                                   unsigned rm = (instr >> 16) & 0xf;
   9695                                   // BXJ{<c>}{<q>} <Rm> ; T1
   9696                                   bxj(CurrentCond(), Register(rm));
   9697                                   if (((instr & 0xfff0ffff) != 0xf3c08f00)) {
   9698                                     UnpredictableT32(instr);
   9699                                   }
   9700                                   break;
   9701                                 }
   9702                                 case 0x00100000: {
   9703                                   // 0xf3d08000
   9704                                   switch (instr & 0x000000ff) {
   9705                                     case 0x00000000: {
   9706                                       // 0xf3d08000
   9707                                       if ((instr & 0x000f0000) == 0x000e0000) {
   9708                                         UnimplementedT32_32("ERET", instr);
   9709                                       } else {
   9710                                         UnallocatedT32(instr);
   9711                                       }
   9712                                       break;
   9713                                     }
   9714                                     default: {
   9715                                       if (((instr & 0xff) == 0x0)) {
   9716                                         UnallocatedT32(instr);
   9717                                         return;
   9718                                       }
   9719                                       uint32_t imm = instr & 0xff;
   9720                                       // SUBS{<c>}{<q>} PC, LR, #<imm8> ; T5
   9721                                       subs(CurrentCond(), Best, pc, lr, imm);
   9722                                       if (((instr & 0xffffff00) !=
   9723                                            0xf3de8f00)) {
   9724                                         UnpredictableT32(instr);
   9725                                       }
   9726                                       break;
   9727                                     }
   9728                                   }
   9729                                   break;
   9730                                 }
   9731                               }
   9732                               break;
   9733                             }
   9734                             case 0x00600000: {
   9735                               // 0xf3e08000
   9736                               switch (instr & 0x00000020) {
   9737                                 case 0x00000000: {
   9738                                   // 0xf3e08000
   9739                                   unsigned rd = (instr >> 8) & 0xf;
   9740                                   unsigned spec_reg = (instr >> 20) & 0x1;
   9741                                   // MRS{<c>}{<q>} <Rd>, <spec_reg> ; T1
   9742                                   mrs(CurrentCond(),
   9743                                       Register(rd),
   9744                                       SpecialRegister(spec_reg));
   9745                                   if (((instr & 0xffeff0ff) != 0xf3ef8000)) {
   9746                                     UnpredictableT32(instr);
   9747                                   }
   9748                                   break;
   9749                                 }
   9750                                 case 0x00000020: {
   9751                                   // 0xf3e08020
   9752                                   UnimplementedT32_32("MRS", instr);
   9753                                   break;
   9754                                 }
   9755                               }
   9756                               break;
   9757                             }
   9758                             case 0x04000000: {
   9759                               // 0xf7808000
   9760                               switch (instr & 0x001f2fff) {
   9761                                 case 0x000f0001: {
   9762                                   // 0xf78f8001
   9763                                   UnimplementedT32_32("DCPS1", instr);
   9764                                   break;
   9765                                 }
   9766                                 case 0x000f0002: {
   9767                                   // 0xf78f8002
   9768                                   UnimplementedT32_32("DCPS2", instr);
   9769                                   break;
   9770                                 }
   9771                                 case 0x000f0003: {
   9772                                   // 0xf78f8003
   9773                                   UnimplementedT32_32("DCPS3", instr);
   9774                                   break;
   9775                                 }
   9776                                 default:
   9777                                   UnallocatedT32(instr);
   9778                                   break;
   9779                               }
   9780                               break;
   9781                             }
   9782                             case 0x04600000: {
   9783                               // 0xf7e08000
   9784                               switch (instr & 0x00102000) {
   9785                                 case 0x00000000: {
   9786                                   // 0xf7e08000
   9787                                   uint32_t imm =
   9788                                       (instr & 0xfff) | ((instr >> 4) & 0xf000);
   9789                                   // HVC{<q>} {#}<imm16> ; T1
   9790                                   hvc(Condition::None(), imm);
   9791                                   break;
   9792                                 }
   9793                                 case 0x00100000: {
   9794                                   // 0xf7f08000
   9795                                   UnimplementedT32_32("SMC", instr);
   9796                                   break;
   9797                                 }
   9798                                 case 0x00102000: {
   9799                                   // 0xf7f0a000
   9800                                   uint32_t imm =
   9801                                       (instr & 0xfff) | ((instr >> 4) & 0xf000);
   9802                                   if ((imm <= 255)) {
   9803                                     // UDF{<c>}.W {#}<imm> ; T2
   9804                                     udf(CurrentCond(), Wide, imm);
   9805                                   } else {
   9806                                     // UDF{<c>}{<q>} {#}<imm> ; T2
   9807                                     udf(CurrentCond(), Best, imm);
   9808                                   }
   9809                                   break;
   9810                                 }
   9811                                 default:
   9812                                   UnallocatedT32(instr);
   9813                                   break;
   9814                               }
   9815                               break;
   9816                             }
   9817                             default:
   9818                               UnallocatedT32(instr);
   9819                               break;
   9820                           }
   9821                           break;
   9822                         }
   9823                         default: {
   9824                           if (((instr & 0x3800000) == 0x3800000)) {
   9825                             UnallocatedT32(instr);
   9826                             return;
   9827                           }
   9828                           Condition condition((instr >> 22) & 0xf);
   9829                           int32_t imm =
   9830                               SignExtend<int32_t>((instr & 0x7ff) |
   9831                                                       ((instr >> 5) & 0x1f800) |
   9832                                                       ((instr << 4) & 0x20000) |
   9833                                                       ((instr << 7) & 0x40000) |
   9834                                                       ((instr >> 7) & 0x80000),
   9835                                                   20)
   9836                               << 1;
   9837                           Label label(imm, kT32PcDelta);
   9838                           if (OutsideITBlock() && (imm >= -1048576) &&
   9839                               (imm <= 1048574) && ((imm & 1) == 0) &&
   9840                               ((imm >= -256) && (imm <= 254) &&
   9841                                ((imm & 1) == 0))) {
   9842                             // B<c>.W <label> ; T3
   9843                             b(condition, Wide, &label);
   9844                           } else {
   9845                             VIXL_ASSERT(OutsideITBlock() && (imm >= -1048576) &&
   9846                                         (imm <= 1048574) && ((imm & 1) == 0));
   9847                             // B<c>{<q>} <label> ; T3
   9848                             b(condition, Best, &label);
   9849                           }
   9850                           break;
   9851                         }
   9852                       }
   9853                       break;
   9854                     }
   9855                     case 0x00001000: {
   9856                       // 0xf0009000
   9857                       uint32_t encoded_imm =
   9858                           (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) |
   9859                           ((instr << 10) & 0x200000) |
   9860                           ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000);
   9861                       uint32_t S = encoded_imm & (1 << 23);
   9862                       encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21);
   9863                       int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25);
   9864                       Label label(imm, kT32PcDelta);
   9865                       if ((imm >= -16777216) && (imm <= 16777214) &&
   9866                           ((imm & 1) == 0) &&
   9867                           (OutsideITBlockOrLast() && (imm >= -2048) &&
   9868                            (imm <= 2046) && ((imm & 1) == 0))) {
   9869                         // B{<c>}.W <label> ; T4
   9870                         b(CurrentCond(), Wide, &label);
   9871                       } else {
   9872                         VIXL_ASSERT(OutsideITBlockOrLast() &&
   9873                                     (imm >= -16777216) && (imm <= 16777214) &&
   9874                                     ((imm & 1) == 0));
   9875                         // B{<c>}{<q>} <label> ; T4
   9876                         b(CurrentCond(), Best, &label);
   9877                       }
   9878                       break;
   9879                     }
   9880                     case 0x00004000: {
   9881                       // 0xf000c000
   9882                       if ((instr & 0x00000001) == 0x00000000) {
   9883                         uint32_t encoded_imm = ((instr >> 1) & 0x3ff) |
   9884                                                ((instr >> 6) & 0xffc00) |
   9885                                                ((instr << 9) & 0x100000) |
   9886                                                ((instr << 8) & 0x200000) |
   9887                                                ((instr >> 4) & 0x400000);
   9888                         uint32_t S = encoded_imm & (1 << 22);
   9889                         encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 20);
   9890                         int32_t imm = SignExtend<int32_t>(encoded_imm << 2, 25);
   9891                         Label label(imm, kT32PcDelta);
   9892                         // BLX{<c>}{<q>} <label> ; T2
   9893                         blx(CurrentCond(), &label);
   9894                       } else {
   9895                         UnallocatedT32(instr);
   9896                       }
   9897                       break;
   9898                     }
   9899                     case 0x00005000: {
   9900                       // 0xf000d000
   9901                       uint32_t encoded_imm =
   9902                           (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) |
   9903                           ((instr << 10) & 0x200000) |
   9904                           ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000);
   9905                       uint32_t S = encoded_imm & (1 << 23);
   9906                       encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21);
   9907                       int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25);
   9908                       Label label(imm, kT32PcDelta);
   9909                       // BL{<c>}{<q>} <label> ; T1
   9910                       bl(CurrentCond(), &label);
   9911                       break;
   9912                     }
   9913                   }
   9914                   break;
   9915                 }
   9916               }
   9917               break;
   9918             }
   9919           }
   9920           break;
   9921         }
   9922         case 0x08000000: {
   9923           // 0xe8000000
   9924           switch (instr & 0x06000000) {
   9925             case 0x00000000: {
   9926               // 0xe8000000
   9927               switch (instr & 0x10100000) {
   9928                 case 0x00000000: {
   9929                   // 0xe8000000
   9930                   switch (instr & 0x01400000) {
   9931                     case 0x00000000: {
   9932                       // 0xe8000000
   9933                       switch (instr & 0x00800000) {
   9934                         case 0x00000000: {
   9935                           // 0xe8000000
   9936                           UnimplementedT32_32("SRSDB", instr);
   9937                           break;
   9938                         }
   9939                         case 0x00800000: {
   9940                           // 0xe8800000
   9941                           unsigned rn = (instr >> 16) & 0xf;
   9942                           WriteBack write_back((instr >> 21) & 0x1);
   9943                           RegisterList registers(
   9944                               (((instr >> 14) & 0x1) << kLRRegNum) |
   9945                               (instr & 0x1fff));
   9946                           if ((rn < kNumberOfT32LowRegisters) &&
   9947                               write_back.DoesWriteBack() &&
   9948                               ((registers.GetList() & ~0xff) == 0)) {
   9949                             // STM{<c>}.W <Rn>{!}, <registers> ; T2
   9950                             stm(CurrentCond(),
   9951                                 Wide,
   9952                                 Register(rn),
   9953                                 write_back,
   9954                                 registers);
   9955                             if (((instr & 0xffd0a000) != 0xe8800000)) {
   9956                               UnpredictableT32(instr);
   9957                             }
   9958                           } else {
   9959                             // STM{<c>}{<q>} <Rn>{!}, <registers> ; T2
   9960                             stm(CurrentCond(),
   9961                                 Best,
   9962                                 Register(rn),
   9963                                 write_back,
   9964                                 registers);
   9965                             if (((instr & 0xffd0a000) != 0xe8800000)) {
   9966                               UnpredictableT32(instr);
   9967                             }
   9968                           }
   9969                           break;
   9970                         }
   9971                       }
   9972                       break;
   9973                     }
   9974                     case 0x00400000: {
   9975                       // 0xe8400000
   9976                       switch (instr & 0x00200000) {
   9977                         case 0x00000000: {
   9978                           // 0xe8400000
   9979                           switch (instr & 0x00800000) {
   9980                             case 0x00000000: {
   9981                               // 0xe8400000
   9982                               unsigned rd = (instr >> 8) & 0xf;
   9983                               unsigned rt = (instr >> 12) & 0xf;
   9984                               unsigned rn = (instr >> 16) & 0xf;
   9985                               int32_t offset = (instr & 0xff) << 2;
   9986                               // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm>}] ; T1 NOLINT(whitespace/line_length)
   9987                               strex(CurrentCond(),
   9988                                     Register(rd),
   9989                                     Register(rt),
   9990                                     MemOperand(Register(rn),
   9991                                                plus,
   9992                                                offset,
   9993                                                Offset));
   9994                               break;
   9995                             }
   9996                             case 0x00800000: {
   9997                               // 0xe8c00000
   9998                               switch (instr & 0x000000f0) {
   9999                                 case 0x00000040: {
   10000                                   // 0xe8c00040
   10001                                   unsigned rd = instr & 0xf;
   10002                                   unsigned rt = (instr >> 12) & 0xf;
   10003                                   unsigned rn = (instr >> 16) & 0xf;
   10004                                   // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
   10005                                   strexb(CurrentCond(),
   10006                                          Register(rd),
   10007                                          Register(rt),
   10008                                          MemOperand(Register(rn), Offset));
   10009                                   if (((instr & 0xfff00ff0) != 0xe8c00f40)) {
   10010                                     UnpredictableT32(instr);
   10011                                   }
   10012                                   break;
   10013                                 }
   10014                                 case 0x00000050: {
   10015                                   // 0xe8c00050
   10016                                   unsigned rd = instr & 0xf;
   10017                                   unsigned rt = (instr >> 12) & 0xf;
   10018                                   unsigned rn = (instr >> 16) & 0xf;
   10019                                   // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
   10020                                   strexh(CurrentCond(),
   10021                                          Register(rd),
   10022                                          Register(rt),
   10023                                          MemOperand(Register(rn), Offset));
   10024                                   if (((instr & 0xfff00ff0) != 0xe8c00f50)) {
   10025                                     UnpredictableT32(instr);
   10026                                   }
   10027                                   break;
   10028                                 }
   10029                                 case 0x00000070: {
   10030                                   // 0xe8c00070
   10031                                   unsigned rd = instr & 0xf;
   10032                                   unsigned rt = (instr >> 12) & 0xf;
   10033                                   unsigned rt2 = (instr >> 8) & 0xf;
   10034                                   unsigned rn = (instr >> 16) & 0xf;
   10035                                   // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
   10036                                   strexd(CurrentCond(),
   10037                                          Register(rd),
   10038                                          Register(rt),
   10039                                          Register(rt2),
   10040                                          MemOperand(Register(rn), Offset));
   10041                                   break;
   10042                                 }
   10043                                 case 0x00000080: {
   10044                                   // 0xe8c00080
   10045                                   unsigned rt = (instr >> 12) & 0xf;
   10046                                   unsigned rn = (instr >> 16) & 0xf;
   10047                                   // STLB{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10048                                   stlb(CurrentCond(),
   10049                                        Register(rt),
   10050                                        MemOperand(Register(rn), Offset));
   10051                                   if (((instr & 0xfff00fff) != 0xe8c00f8f)) {
   10052                                     UnpredictableT32(instr);
   10053                                   }
   10054                                   break;
   10055                                 }
   10056                                 case 0x00000090: {
   10057                                   // 0xe8c00090
   10058                                   unsigned rt = (instr >> 12) & 0xf;
   10059                                   unsigned rn = (instr >> 16) & 0xf;
   10060                                   // STLH{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10061                                   stlh(CurrentCond(),
   10062                                        Register(rt),
   10063                                        MemOperand(Register(rn), Offset));
   10064                                   if (((instr & 0xfff00fff) != 0xe8c00f9f)) {
   10065                                     UnpredictableT32(instr);
   10066                                   }
   10067                                   break;
   10068                                 }
   10069                                 case 0x000000a0: {
   10070                                   // 0xe8c000a0
   10071                                   unsigned rt = (instr >> 12) & 0xf;
   10072                                   unsigned rn = (instr >> 16) & 0xf;
   10073                                   // STL{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10074                                   stl(CurrentCond(),
   10075                                       Register(rt),
   10076                                       MemOperand(Register(rn), Offset));
   10077                                   if (((instr & 0xfff00fff) != 0xe8c00faf)) {
   10078                                     UnpredictableT32(instr);
   10079                                   }
   10080                                   break;
   10081                                 }
   10082                                 case 0x000000c0: {
   10083                                   // 0xe8c000c0
   10084                                   unsigned rd = instr & 0xf;
   10085                                   unsigned rt = (instr >> 12) & 0xf;
   10086                                   unsigned rn = (instr >> 16) & 0xf;
   10087                                   // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
   10088                                   stlexb(CurrentCond(),
   10089                                          Register(rd),
   10090                                          Register(rt),
   10091                                          MemOperand(Register(rn), Offset));
   10092                                   if (((instr & 0xfff00ff0) != 0xe8c00fc0)) {
   10093                                     UnpredictableT32(instr);
   10094                                   }
   10095                                   break;
   10096                                 }
   10097                                 case 0x000000d0: {
   10098                                   // 0xe8c000d0
   10099                                   unsigned rd = instr & 0xf;
   10100                                   unsigned rt = (instr >> 12) & 0xf;
   10101                                   unsigned rn = (instr >> 16) & 0xf;
   10102                                   // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
   10103                                   stlexh(CurrentCond(),
   10104                                          Register(rd),
   10105                                          Register(rt),
   10106                                          MemOperand(Register(rn), Offset));
   10107                                   if (((instr & 0xfff00ff0) != 0xe8c00fd0)) {
   10108                                     UnpredictableT32(instr);
   10109                                   }
   10110                                   break;
   10111                                 }
   10112                                 case 0x000000e0: {
   10113                                   // 0xe8c000e0
   10114                                   unsigned rd = instr & 0xf;
   10115                                   unsigned rt = (instr >> 12) & 0xf;
   10116                                   unsigned rn = (instr >> 16) & 0xf;
   10117                                   // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1
   10118                                   stlex(CurrentCond(),
   10119                                         Register(rd),
   10120                                         Register(rt),
   10121                                         MemOperand(Register(rn), Offset));
   10122                                   if (((instr & 0xfff00ff0) != 0xe8c00fe0)) {
   10123                                     UnpredictableT32(instr);
   10124                                   }
   10125                                   break;
   10126                                 }
   10127                                 case 0x000000f0: {
   10128                                   // 0xe8c000f0
   10129                                   unsigned rd = instr & 0xf;
   10130                                   unsigned rt = (instr >> 12) & 0xf;
   10131                                   unsigned rt2 = (instr >> 8) & 0xf;
   10132                                   unsigned rn = (instr >> 16) & 0xf;
   10133                                   // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length)
   10134                                   stlexd(CurrentCond(),
   10135                                          Register(rd),
   10136                                          Register(rt),
   10137                                          Register(rt2),
   10138                                          MemOperand(Register(rn), Offset));
   10139                                   break;
   10140                                 }
   10141                                 default:
   10142                                   UnallocatedT32(instr);
   10143                                   break;
   10144                               }
   10145                               break;
   10146                             }
   10147                           }
   10148                           break;
   10149                         }
   10150                         case 0x00200000: {
   10151                           // 0xe8600000
   10152                           if (((instr & 0xf0000) == 0xf0000)) {
   10153                             UnallocatedT32(instr);
   10154                             return;
   10155                           }
   10156                           unsigned rt = (instr >> 12) & 0xf;
   10157                           unsigned rt2 = (instr >> 8) & 0xf;
   10158                           unsigned rn = (instr >> 16) & 0xf;
   10159                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   10160                                                                  : plus);
   10161                           int32_t offset = (instr & 0xff) << 2;
   10162                           // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length)
   10163                           strd(CurrentCond(),
   10164                                Register(rt),
   10165                                Register(rt2),
   10166                                MemOperand(Register(rn),
   10167                                           sign,
   10168                                           offset,
   10169                                           PostIndex));
   10170                           break;
   10171                         }
   10172                       }
   10173                       break;
   10174                     }
   10175                     case 0x01000000: {
   10176                       // 0xe9000000
   10177                       switch (instr & 0x00800000) {
   10178                         case 0x00000000: {
   10179                           // 0xe9000000
   10180                           if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
   10181                                Uint32(0x1)) &&
   10182                               ((Uint32((instr >> 16)) & Uint32(0xf)) ==
   10183                                Uint32(0xd)) &&
   10184                               (BitCount(((Uint32((instr >> 14)) & Uint32(0x1))
   10185                                          << 13) |
   10186                                         (Uint32(instr) & Uint32(0x1fff))) >
   10187                                Int64(1))) {
   10188                             RegisterList registers(
   10189                                 (((instr >> 14) & 0x1) << kLRRegNum) |
   10190                                 (instr & 0x1fff));
   10191                             if (registers.IsR0toR7orLR()) {
   10192                               // PUSH{<c>}.W <registers> ; T1
   10193                               push(CurrentCond(), Wide, registers);
   10194                               if (((instr & 0xffffa000) != 0xe92d0000)) {
   10195                                 UnpredictableT32(instr);
   10196                               }
   10197                             } else {
   10198                               // PUSH{<c>}{<q>} <registers> ; T1
   10199                               push(CurrentCond(), Best, registers);
   10200                               if (((instr & 0xffffa000) != 0xe92d0000)) {
   10201                                 UnpredictableT32(instr);
   10202                               }
   10203                             }
   10204                             return;
   10205                           }
   10206                           unsigned rn = (instr >> 16) & 0xf;
   10207                           WriteBack write_back((instr >> 21) & 0x1);
   10208                           RegisterList registers(
   10209                               (((instr >> 14) & 0x1) << kLRRegNum) |
   10210                               (instr & 0x1fff));
   10211                           // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1
   10212                           stmdb(CurrentCond(),
   10213                                 Best,
   10214                                 Register(rn),
   10215                                 write_back,
   10216                                 registers);
   10217                           if (((instr & 0xffd0a000) != 0xe9000000)) {
   10218                             UnpredictableT32(instr);
   10219                           }
   10220                           break;
   10221                         }
   10222                         case 0x00800000: {
   10223                           // 0xe9800000
   10224                           UnimplementedT32_32("SRS{IA}", instr);
   10225                           break;
   10226                         }
   10227                       }
   10228                       break;
   10229                     }
   10230                     case 0x01400000: {
   10231                       // 0xe9400000
   10232                       switch (instr & 0x00200000) {
   10233                         case 0x00000000: {
   10234                           // 0xe9400000
   10235                           if (((instr & 0xf0000) == 0xf0000)) {
   10236                             UnallocatedT32(instr);
   10237                             return;
   10238                           }
   10239                           unsigned rt = (instr >> 12) & 0xf;
   10240                           unsigned rt2 = (instr >> 8) & 0xf;
   10241                           unsigned rn = (instr >> 16) & 0xf;
   10242                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   10243                                                                  : plus);
   10244                           int32_t offset = (instr & 0xff) << 2;
   10245                           // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
   10246                           strd(CurrentCond(),
   10247                                Register(rt),
   10248                                Register(rt2),
   10249                                MemOperand(Register(rn), sign, offset, Offset));
   10250                           break;
   10251                         }
   10252                         case 0x00200000: {
   10253                           // 0xe9600000
   10254                           if (((instr & 0xf0000) == 0xf0000)) {
   10255                             UnallocatedT32(instr);
   10256                             return;
   10257                           }
   10258                           unsigned rt = (instr >> 12) & 0xf;
   10259                           unsigned rt2 = (instr >> 8) & 0xf;
   10260                           unsigned rn = (instr >> 16) & 0xf;
   10261                           Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   10262                                                                  : plus);
   10263                           int32_t offset = (instr & 0xff) << 2;
   10264                           // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length)
   10265                           strd(CurrentCond(),
   10266                                Register(rt),
   10267                                Register(rt2),
   10268                                MemOperand(Register(rn),
   10269                                           sign,
   10270                                           offset,
   10271                                           PreIndex));
   10272                           break;
   10273                         }
   10274                       }
   10275                       break;
   10276                     }
   10277                   }
   10278                   break;
   10279                 }
   10280                 case 0x00100000: {
   10281                   // 0xe8100000
   10282                   switch (instr & 0x00400000) {
   10283                     case 0x00000000: {
   10284                       // 0xe8100000
   10285                       switch (instr & 0x01800000) {
   10286                         case 0x00000000: {
   10287                           // 0xe8100000
   10288                           UnimplementedT32_32("RFEDB", instr);
   10289                           break;
   10290                         }
   10291                         case 0x00800000: {
   10292                           // 0xe8900000
   10293                           if (((Uint32((instr >> 21)) & Uint32(0x1)) ==
   10294                                Uint32(0x1)) &&
   10295                               ((Uint32((instr >> 16)) & Uint32(0xf)) ==
   10296                                Uint32(0xd)) &&
   10297                               (BitCount(((Uint32((instr >> 15)) & Uint32(0x1))
   10298                                          << 14) |
   10299                                         ((Uint32((instr >> 14)) & Uint32(0x1))
   10300                                          << 13) |
   10301                                         (Uint32(instr) & Uint32(0x1fff))) >
   10302                                Int64(1))) {
   10303                             RegisterList registers(
   10304                                 (((instr >> 15) & 0x1) << kPCRegNum) |
   10305                                 (((instr >> 14) & 0x1) << kLRRegNum) |
   10306                                 (instr & 0x1fff));
   10307                             if (registers.IsR0toR7orPC()) {
   10308                               // POP{<c>}.W <registers> ; T2
   10309                               pop(CurrentCond(), Wide, registers);
   10310                               if (((instr & 0xffff2000) != 0xe8bd0000)) {
   10311                                 UnpredictableT32(instr);
   10312                               }
   10313                             } else {
   10314                               // POP{<c>}{<q>} <registers> ; T2
   10315                               pop(CurrentCond(), Best, registers);
   10316                               if (((instr & 0xffff2000) != 0xe8bd0000)) {
   10317                                 UnpredictableT32(instr);
   10318                               }
   10319                             }
   10320                             return;
   10321                           }
   10322                           unsigned rn = (instr >> 16) & 0xf;
   10323                           WriteBack write_back((instr >> 21) & 0x1);
   10324                           RegisterList registers(
   10325                               (((instr >> 15) & 0x1) << kPCRegNum) |
   10326                               (((instr >> 14) & 0x1) << kLRRegNum) |
   10327                               (instr & 0x1fff));
   10328                           if ((rn < kNumberOfT32LowRegisters) &&
   10329                               (((registers.GetList() & (1 << rn)) == 0) ==
   10330                                write_back.DoesWriteBack()) &&
   10331                               ((registers.GetList() & ~0xff) == 0)) {
   10332                             // LDM{<c>}.W <Rn>{!}, <registers> ; T2
   10333                             ldm(CurrentCond(),
   10334                                 Wide,
   10335                                 Register(rn),
   10336                                 write_back,
   10337                                 registers);
   10338                             if (((instr & 0xffd02000) != 0xe8900000)) {
   10339                               UnpredictableT32(instr);
   10340                             }
   10341                           } else {
   10342                             // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T2
   10343                             ldm(CurrentCond(),
   10344                                 Best,
   10345                                 Register(rn),
   10346                                 write_back,
   10347                                 registers);
   10348                             if (((instr & 0xffd02000) != 0xe8900000)) {
   10349                               UnpredictableT32(instr);
   10350                             }
   10351                           }
   10352                           break;
   10353                         }
   10354                         case 0x01000000: {
   10355                           // 0xe9100000
   10356                           unsigned rn = (instr >> 16) & 0xf;
   10357                           WriteBack write_back((instr >> 21) & 0x1);
   10358                           RegisterList registers(
   10359                               (((instr >> 15) & 0x1) << kPCRegNum) |
   10360                               (((instr >> 14) & 0x1) << kLRRegNum) |
   10361                               (instr & 0x1fff));
   10362                           // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1
   10363                           ldmdb(CurrentCond(),
   10364                                 Register(rn),
   10365                                 write_back,
   10366                                 registers);
   10367                           if (((instr & 0xffd02000) != 0xe9100000)) {
   10368                             UnpredictableT32(instr);
   10369                           }
   10370                           break;
   10371                         }
   10372                         case 0x01800000: {
   10373                           // 0xe9900000
   10374                           UnimplementedT32_32("RFE{IA}", instr);
   10375                           break;
   10376                         }
   10377                       }
   10378                       break;
   10379                     }
   10380                     case 0x00400000: {
   10381                       // 0xe8500000
   10382                       switch (instr & 0x01200000) {
   10383                         case 0x00000000: {
   10384                           // 0xe8500000
   10385                           switch (instr & 0x00800000) {
   10386                             case 0x00000000: {
   10387                               // 0xe8500000
   10388                               unsigned rt = (instr >> 12) & 0xf;
   10389                               unsigned rn = (instr >> 16) & 0xf;
   10390                               int32_t offset = (instr & 0xff) << 2;
   10391                               // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm>}] ; T1
   10392                               ldrex(CurrentCond(),
   10393                                     Register(rt),
   10394                                     MemOperand(Register(rn),
   10395                                                plus,
   10396                                                offset,
   10397                                                Offset));
   10398                               if (((instr & 0xfff00f00) != 0xe8500f00)) {
   10399                                 UnpredictableT32(instr);
   10400                               }
   10401                               break;
   10402                             }
   10403                             case 0x00800000: {
   10404                               // 0xe8d00000
   10405                               switch (instr & 0x000000f0) {
   10406                                 case 0x00000000: {
   10407                                   // 0xe8d00000
   10408                                   unsigned rn = (instr >> 16) & 0xf;
   10409                                   unsigned rm = instr & 0xf;
   10410                                   // TBB{<c>}{<q>} [<Rn>, <Rm>] ; T1
   10411                                   tbb(CurrentCond(),
   10412                                       Register(rn),
   10413                                       Register(rm));
   10414                                   if (((instr & 0xfff0fff0) != 0xe8d0f000)) {
   10415                                     UnpredictableT32(instr);
   10416                                   }
   10417                                   break;
   10418                                 }
   10419                                 case 0x00000010: {
   10420                                   // 0xe8d00010
   10421                                   unsigned rn = (instr >> 16) & 0xf;
   10422                                   unsigned rm = instr & 0xf;
   10423                                   // TBH{<c>}{<q>} [<Rn>, <Rm>, LSL #1] ; T1
   10424                                   tbh(CurrentCond(),
   10425                                       Register(rn),
   10426                                       Register(rm));
   10427                                   if (((instr & 0xfff0fff0) != 0xe8d0f010)) {
   10428                                     UnpredictableT32(instr);
   10429                                   }
   10430                                   break;
   10431                                 }
   10432                                 case 0x00000040: {
   10433                                   // 0xe8d00040
   10434                                   unsigned rt = (instr >> 12) & 0xf;
   10435                                   unsigned rn = (instr >> 16) & 0xf;
   10436                                   // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10437                                   ldrexb(CurrentCond(),
   10438                                          Register(rt),
   10439                                          MemOperand(Register(rn), Offset));
   10440                                   if (((instr & 0xfff00fff) != 0xe8d00f4f)) {
   10441                                     UnpredictableT32(instr);
   10442                                   }
   10443                                   break;
   10444                                 }
   10445                                 case 0x00000050: {
   10446                                   // 0xe8d00050
   10447                                   unsigned rt = (instr >> 12) & 0xf;
   10448                                   unsigned rn = (instr >> 16) & 0xf;
   10449                                   // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10450                                   ldrexh(CurrentCond(),
   10451                                          Register(rt),
   10452                                          MemOperand(Register(rn), Offset));
   10453                                   if (((instr & 0xfff00fff) != 0xe8d00f5f)) {
   10454                                     UnpredictableT32(instr);
   10455                                   }
   10456                                   break;
   10457                                 }
   10458                                 case 0x00000070: {
   10459                                   // 0xe8d00070
   10460                                   unsigned rt = (instr >> 12) & 0xf;
   10461                                   unsigned rt2 = (instr >> 8) & 0xf;
   10462                                   unsigned rn = (instr >> 16) & 0xf;
   10463                                   // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1
   10464                                   ldrexd(CurrentCond(),
   10465                                          Register(rt),
   10466                                          Register(rt2),
   10467                                          MemOperand(Register(rn), Offset));
   10468                                   if (((instr & 0xfff000ff) != 0xe8d0007f)) {
   10469                                     UnpredictableT32(instr);
   10470                                   }
   10471                                   break;
   10472                                 }
   10473                                 case 0x00000080: {
   10474                                   // 0xe8d00080
   10475                                   unsigned rt = (instr >> 12) & 0xf;
   10476                                   unsigned rn = (instr >> 16) & 0xf;
   10477                                   // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10478                                   ldab(CurrentCond(),
   10479                                        Register(rt),
   10480                                        MemOperand(Register(rn), Offset));
   10481                                   if (((instr & 0xfff00fff) != 0xe8d00f8f)) {
   10482                                     UnpredictableT32(instr);
   10483                                   }
   10484                                   break;
   10485                                 }
   10486                                 case 0x00000090: {
   10487                                   // 0xe8d00090
   10488                                   unsigned rt = (instr >> 12) & 0xf;
   10489                                   unsigned rn = (instr >> 16) & 0xf;
   10490                                   // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10491                                   ldah(CurrentCond(),
   10492                                        Register(rt),
   10493                                        MemOperand(Register(rn), Offset));
   10494                                   if (((instr & 0xfff00fff) != 0xe8d00f9f)) {
   10495                                     UnpredictableT32(instr);
   10496                                   }
   10497                                   break;
   10498                                 }
   10499                                 case 0x000000a0: {
   10500                                   // 0xe8d000a0
   10501                                   unsigned rt = (instr >> 12) & 0xf;
   10502                                   unsigned rn = (instr >> 16) & 0xf;
   10503                                   // LDA{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10504                                   lda(CurrentCond(),
   10505                                       Register(rt),
   10506                                       MemOperand(Register(rn), Offset));
   10507                                   if (((instr & 0xfff00fff) != 0xe8d00faf)) {
   10508                                     UnpredictableT32(instr);
   10509                                   }
   10510                                   break;
   10511                                 }
   10512                                 case 0x000000c0: {
   10513                                   // 0xe8d000c0
   10514                                   unsigned rt = (instr >> 12) & 0xf;
   10515                                   unsigned rn = (instr >> 16) & 0xf;
   10516                                   // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10517                                   ldaexb(CurrentCond(),
   10518                                          Register(rt),
   10519                                          MemOperand(Register(rn), Offset));
   10520                                   if (((instr & 0xfff00fff) != 0xe8d00fcf)) {
   10521                                     UnpredictableT32(instr);
   10522                                   }
   10523                                   break;
   10524                                 }
   10525                                 case 0x000000d0: {
   10526                                   // 0xe8d000d0
   10527                                   unsigned rt = (instr >> 12) & 0xf;
   10528                                   unsigned rn = (instr >> 16) & 0xf;
   10529                                   // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10530                                   ldaexh(CurrentCond(),
   10531                                          Register(rt),
   10532                                          MemOperand(Register(rn), Offset));
   10533                                   if (((instr & 0xfff00fff) != 0xe8d00fdf)) {
   10534                                     UnpredictableT32(instr);
   10535                                   }
   10536                                   break;
   10537                                 }
   10538                                 case 0x000000e0: {
   10539                                   // 0xe8d000e0
   10540                                   unsigned rt = (instr >> 12) & 0xf;
   10541                                   unsigned rn = (instr >> 16) & 0xf;
   10542                                   // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; T1
   10543                                   ldaex(CurrentCond(),
   10544                                         Register(rt),
   10545                                         MemOperand(Register(rn), Offset));
   10546                                   if (((instr & 0xfff00fff) != 0xe8d00fef)) {
   10547                                     UnpredictableT32(instr);
   10548                                   }
   10549                                   break;
   10550                                 }
   10551                                 case 0x000000f0: {
   10552                                   // 0xe8d000f0
   10553                                   unsigned rt = (instr >> 12) & 0xf;
   10554                                   unsigned rt2 = (instr >> 8) & 0xf;
   10555                                   unsigned rn = (instr >> 16) & 0xf;
   10556                                   // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1
   10557                                   ldaexd(CurrentCond(),
   10558                                          Register(rt),
   10559                                          Register(rt2),
   10560                                          MemOperand(Register(rn), Offset));
   10561                                   if (((instr & 0xfff000ff) != 0xe8d000ff)) {
   10562                                     UnpredictableT32(instr);
   10563                                   }
   10564                                   break;
   10565                                 }
   10566                                 default:
   10567                                   UnallocatedT32(instr);
   10568                                   break;
   10569                               }
   10570                               break;
   10571                             }
   10572                           }
   10573                           break;
   10574                         }
   10575                         case 0x00200000: {
   10576                           // 0xe8700000
   10577                           switch (instr & 0x000f0000) {
   10578                             case 0x000f0000: {
   10579                               // 0xe87f0000
   10580                               if (((instr & 0x1200000) == 0x0)) {
   10581                                 UnallocatedT32(instr);
   10582                                 return;
   10583                               }
   10584                               unsigned rt = (instr >> 12) & 0xf;
   10585                               unsigned rt2 = (instr >> 8) & 0xf;
   10586                               uint32_t U = (instr >> 23) & 0x1;
   10587                               int32_t imm = instr & 0xff;
   10588                               imm <<= 2;
   10589                               if (U == 0) imm = -imm;
   10590                               bool minus_zero = (imm == 0) && (U == 0);
   10591                               Label label(imm, kT32PcDelta, minus_zero);
   10592                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
   10593                               ldrd(CurrentCond(),
   10594                                    Register(rt),
   10595                                    Register(rt2),
   10596                                    &label);
   10597                               if (((instr & 0xff7f0000) != 0xe95f0000)) {
   10598                                 UnpredictableT32(instr);
   10599                               }
   10600                               break;
   10601                             }
   10602                             default: {
   10603                               if (((instr & 0xf0000) == 0xf0000)) {
   10604                                 UnallocatedT32(instr);
   10605                                 return;
   10606                               }
   10607                               unsigned rt = (instr >> 12) & 0xf;
   10608                               unsigned rt2 = (instr >> 8) & 0xf;
   10609                               unsigned rn = (instr >> 16) & 0xf;
   10610                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   10611                                                                      : plus);
   10612                               int32_t offset = (instr & 0xff) << 2;
   10613                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length)
   10614                               ldrd(CurrentCond(),
   10615                                    Register(rt),
   10616                                    Register(rt2),
   10617                                    MemOperand(Register(rn),
   10618                                               sign,
   10619                                               offset,
   10620                                               PostIndex));
   10621                               break;
   10622                             }
   10623                           }
   10624                           break;
   10625                         }
   10626                         case 0x01000000: {
   10627                           // 0xe9500000
   10628                           switch (instr & 0x000f0000) {
   10629                             case 0x000f0000: {
   10630                               // 0xe95f0000
   10631                               if (((instr & 0x1200000) == 0x0)) {
   10632                                 UnallocatedT32(instr);
   10633                                 return;
   10634                               }
   10635                               unsigned rt = (instr >> 12) & 0xf;
   10636                               unsigned rt2 = (instr >> 8) & 0xf;
   10637                               uint32_t U = (instr >> 23) & 0x1;
   10638                               int32_t imm = instr & 0xff;
   10639                               imm <<= 2;
   10640                               if (U == 0) imm = -imm;
   10641                               bool minus_zero = (imm == 0) && (U == 0);
   10642                               Label label(imm, kT32PcDelta, minus_zero);
   10643                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
   10644                               ldrd(CurrentCond(),
   10645                                    Register(rt),
   10646                                    Register(rt2),
   10647                                    &label);
   10648                               if (((instr & 0xff7f0000) != 0xe95f0000)) {
   10649                                 UnpredictableT32(instr);
   10650                               }
   10651                               break;
   10652                             }
   10653                             default: {
   10654                               if (((instr & 0xf0000) == 0xf0000)) {
   10655                                 UnallocatedT32(instr);
   10656                                 return;
   10657                               }
   10658                               unsigned rt = (instr >> 12) & 0xf;
   10659                               unsigned rt2 = (instr >> 8) & 0xf;
   10660                               unsigned rn = (instr >> 16) & 0xf;
   10661                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   10662                                                                      : plus);
   10663                               int32_t offset = (instr & 0xff) << 2;
   10664                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length)
   10665                               ldrd(CurrentCond(),
   10666                                    Register(rt),
   10667                                    Register(rt2),
   10668                                    MemOperand(Register(rn),
   10669                                               sign,
   10670                                               offset,
   10671                                               Offset));
   10672                               break;
   10673                             }
   10674                           }
   10675                           break;
   10676                         }
   10677                         case 0x01200000: {
   10678                           // 0xe9700000
   10679                           switch (instr & 0x000f0000) {
   10680                             case 0x000f0000: {
   10681                               // 0xe97f0000
   10682                               if (((instr & 0x1200000) == 0x0)) {
   10683                                 UnallocatedT32(instr);
   10684                                 return;
   10685                               }
   10686                               unsigned rt = (instr >> 12) & 0xf;
   10687                               unsigned rt2 = (instr >> 8) & 0xf;
   10688                               uint32_t U = (instr >> 23) & 0x1;
   10689                               int32_t imm = instr & 0xff;
   10690                               imm <<= 2;
   10691                               if (U == 0) imm = -imm;
   10692                               bool minus_zero = (imm == 0) && (U == 0);
   10693                               Label label(imm, kT32PcDelta, minus_zero);
   10694                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1
   10695                               ldrd(CurrentCond(),
   10696                                    Register(rt),
   10697                                    Register(rt2),
   10698                                    &label);
   10699                               if (((instr & 0xff7f0000) != 0xe95f0000)) {
   10700                                 UnpredictableT32(instr);
   10701                               }
   10702                               break;
   10703                             }
   10704                             default: {
   10705                               if (((instr & 0xf0000) == 0xf0000)) {
   10706                                 UnallocatedT32(instr);
   10707                                 return;
   10708                               }
   10709                               unsigned rt = (instr >> 12) & 0xf;
   10710                               unsigned rt2 = (instr >> 8) & 0xf;
   10711                               unsigned rn = (instr >> 16) & 0xf;
   10712                               Sign sign((((instr >> 23) & 0x1) == 0) ? minus
   10713                                                                      : plus);
   10714                               int32_t offset = (instr & 0xff) << 2;
   10715                               // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length)
   10716                               ldrd(CurrentCond(),
   10717                                    Register(rt),
   10718                                    Register(rt2),
   10719                                    MemOperand(Register(rn),
   10720                                               sign,
   10721                                               offset,
   10722                                               PreIndex));
   10723                               break;
   10724                             }
   10725                           }
   10726                           break;
   10727                         }
   10728                       }
   10729                       break;
   10730                     }
   10731                   }
   10732                   break;
   10733                 }
   10734                 case 0x10000000: {
   10735                   // 0xf8000000
   10736                   switch (instr & 0x01a00000) {
   10737                     case 0x00000000: {
   10738                       // 0xf8000000
   10739                       switch (instr & 0x00400d00) {
   10740                         case 0x00000000: {
   10741                           // 0xf8000000
   10742                           if ((instr & 0x000002c0) == 0x00000000) {
   10743                             if (((instr & 0xf0000) == 0xf0000)) {
   10744                               UnallocatedT32(instr);
   10745                               return;
   10746                             }
   10747                             unsigned rt = (instr >> 12) & 0xf;
   10748                             unsigned rn = (instr >> 16) & 0xf;
   10749                             Sign sign(plus);
   10750                             unsigned rm = instr & 0xf;
   10751                             Shift shift = LSL;
   10752                             uint32_t amount = (instr >> 4) & 0x3;
   10753                             AddrMode addrmode = Offset;
   10754                             if ((rt < kNumberOfT32LowRegisters) &&
   10755                                 (rn < kNumberOfT32LowRegisters) &&
   10756                                 (rm < kNumberOfT32LowRegisters) &&
   10757                                 shift.IsLSL() && (amount == 0) &&
   10758                                 sign.IsPlus()) {
   10759                               // STRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
   10760                               strb(CurrentCond(),
   10761                                    Wide,
   10762                                    Register(rt),
   10763                                    MemOperand(Register(rn),
   10764                                               sign,
   10765                                               Register(rm),
   10766                                               addrmode));
   10767                             } else {
   10768                               // STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
   10769                               strb(CurrentCond(),
   10770                                    Best,
   10771                                    Register(rt),
   10772                                    MemOperand(Register(rn),
   10773                                               sign,
   10774                                               Register(rm),
   10775                                               shift,
   10776                                               amount,
   10777                                               addrmode));
   10778                             }
   10779                           } else {
   10780                             UnallocatedT32(instr);
   10781                           }
   10782                           break;
   10783                         }
   10784                         case 0x00000900: {
   10785                           // 0xf8000900
   10786                           if (((instr & 0xf0000) == 0xf0000)) {
   10787                             UnallocatedT32(instr);
   10788                             return;
   10789                           }
   10790                           unsigned rt = (instr >> 12) & 0xf;
   10791                           unsigned rn = (instr >> 16) & 0xf;
   10792                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
   10793                           int32_t offset = instr & 0xff;
   10794                           // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3
   10795                           strb(CurrentCond(),
   10796                                Best,
   10797                                Register(rt),
   10798                                MemOperand(Register(rn),
   10799                                           sign,
   10800                                           offset,
   10801                                           PostIndex));
   10802                           break;
   10803                         }
   10804                         case 0x00000c00: {
   10805                           // 0xf8000c00
   10806                           switch (instr & 0x00000200) {
   10807                             case 0x00000000: {
   10808                               // 0xf8000c00
   10809                               if (((instr & 0xf0000) == 0xf0000)) {
   10810                                 UnallocatedT32(instr);
   10811                                 return;
   10812                               }
   10813                               unsigned rt = (instr >> 12) & 0xf;
   10814                               unsigned rn = (instr >> 16) & 0xf;
   10815                               int32_t offset = instr & 0xff;
   10816                               // STRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3
   10817                               strb(CurrentCond(),
   10818                                    Best,
   10819                                    Register(rt),
   10820                                    MemOperand(Register(rn),
   10821                                               minus,
   10822                                               offset,
   10823                                               Offset));
   10824                               break;
   10825                             }
   10826                             case 0x00000200: {
   10827                               // 0xf8000e00
   10828                               if (((instr & 0xf0000) == 0xf0000)) {
   10829                                 UnallocatedT32(instr);
   10830                                 return;
   10831                               }
   10832                               UnimplementedT32_32("STRBT", instr);
   10833                               break;
   10834                             }
   10835                           }
   10836                           break;
   10837                         }
   10838                         case 0x00000d00: {
   10839                           // 0xf8000d00
   10840                           if (((instr & 0xf0000) == 0xf0000)) {
   10841                             UnallocatedT32(instr);
   10842                             return;
   10843                           }
   10844                           unsigned rt = (instr >> 12) & 0xf;
   10845                           unsigned rn = (instr >> 16) & 0xf;
   10846                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
   10847                           int32_t offset = instr & 0xff;
   10848                           // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3
   10849                           strb(CurrentCond(),
   10850                                Best,
   10851                                Register(rt),
   10852                                MemOperand(Register(rn),
   10853                                           sign,
   10854                                           offset,
   10855                                           PreIndex));
   10856                           break;
   10857                         }
   10858                         case 0x00400000: {
   10859                           // 0xf8400000
   10860                           if ((instr & 0x000002c0) == 0x00000000) {
   10861                             if (((instr & 0xf0000) == 0xf0000)) {
   10862                               UnallocatedT32(instr);
   10863                               return;
   10864                             }
   10865                             unsigned rt = (instr >> 12) & 0xf;
   10866                             unsigned rn = (instr >> 16) & 0xf;
   10867                             Sign sign(plus);
   10868                             unsigned rm = instr & 0xf;
   10869                             Shift shift = LSL;
   10870                             uint32_t amount = (instr >> 4) & 0x3;
   10871                             AddrMode addrmode = Offset;
   10872                             if ((rt < kNumberOfT32LowRegisters) &&
   10873                                 (rn < kNumberOfT32LowRegisters) &&
   10874                                 (rm < kNumberOfT32LowRegisters) &&
   10875                                 shift.IsLSL() && (amount == 0) &&
   10876                                 sign.IsPlus()) {
   10877                               // STR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2
   10878                               str(CurrentCond(),
   10879                                   Wide,
   10880                                   Register(rt),
   10881                                   MemOperand(Register(rn),
   10882                                              sign,
   10883                                              Register(rm),
   10884                                              addrmode));
   10885                             } else {
   10886                               // STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length)
   10887                               str(CurrentCond(),
   10888                                   Best,
   10889                                   Register(rt),
   10890                                   MemOperand(Register(rn),
   10891                                              sign,
   10892                                              Register(rm),
   10893                                              shift,
   10894                                              amount,
   10895                                              addrmode));
   10896                             }
   10897                           } else {
   10898                             UnallocatedT32(instr);
   10899                           }
   10900                           break;
   10901                         }
   10902                         case 0x00400900: {
   10903                           // 0xf8400900
   10904                           if (((instr & 0xf0000) == 0xf0000)) {
   10905                             UnallocatedT32(instr);
   10906                             return;
   10907                           }
   10908                           unsigned rt = (instr >> 12) & 0xf;
   10909                           unsigned rn = (instr >> 16) & 0xf;
   10910                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
   10911                           int32_t offset = instr & 0xff;
   10912                           // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4
   10913                           str(CurrentCond(),
   10914                               Best,
   10915                               Register(rt),
   10916                               MemOperand(Register(rn),
   10917                                          sign,
   10918                                          offset,
   10919                                          PostIndex));
   10920                           break;
   10921                         }
   10922                         case 0x00400c00: {
   10923                           // 0xf8400c00
   10924                           switch (instr & 0x00000200) {
   10925                             case 0x00000000: {
   10926                               // 0xf8400c00
   10927                               if (((instr & 0xf0000) == 0xf0000)) {
   10928                                 UnallocatedT32(instr);
   10929                                 return;
   10930                               }
   10931                               unsigned rt = (instr >> 12) & 0xf;
   10932                               unsigned rn = (instr >> 16) & 0xf;
   10933                               int32_t offset = instr & 0xff;
   10934                               // STR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4
   10935                               str(CurrentCond(),
   10936                                   Best,
   10937                                   Register(rt),
   10938                                   MemOperand(Register(rn),
   10939                                              minus,
   10940                                              offset,
   10941                                              Offset));
   10942                               break;
   10943                             }
   10944                             case 0x00000200: {
   10945                               // 0xf8400e00
   10946                               if (((instr & 0xf0000) == 0xf0000)) {
   10947                                 UnallocatedT32(instr);
   10948                                 return;
   10949                               }
   10950                               UnimplementedT32_32("STRT", instr);
   10951                               break;
   10952                             }
   10953                           }
   10954                           break;
   10955                         }
   10956                         case 0x00400d00: {
   10957                           // 0xf8400d00
   10958                           if (((instr & 0xf0000) == 0xf0000)) {
   10959                             UnallocatedT32(instr);
   10960                             return;
   10961                           }
   10962                           if (((Uint32((instr >> 16)) & Uint32(0xf)) ==
   10963                                Uint32(0xd)) &&
   10964                               ((Uint32((instr >> 9)) & Uint32(0x1)) ==
   10965                                Uint32(0x0)) &&
   10966                               ((Uint32(instr) & Uint32(0xff)) == Uint32(0x4))) {
   10967                             unsigned rt = (instr >> 12) & 0xf;
   10968                             if ((rt <= 7) || (rt == kLRRegNum)) {
   10969                               // PUSH{<c>}.W <single_register_list> ; T4
   10970                               push(CurrentCond(), Wide, Register(rt));
   10971                             } else {
   10972                               // PUSH{<c>}{<q>} <single_register_list> ; T4
   10973                               push(CurrentCond(), Best, Register(rt));
   10974                             }
   10975                             return;
   10976                           }
   10977                           unsigned rt = (instr >> 12) & 0xf;
   10978                           unsigned rn = (instr >> 16) & 0xf;
   10979                           Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus);
   10980                           int32_t offset = instr & 0xff;
   10981                           // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4
   10982                           str(CurrentCond(),
   10983                               Best,
   10984                               Register(rt),
   10985                               MemOperand(