Home | History | Annotate | Download | only in aarch32
      1 // Copyright 2017, 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 #ifndef VIXL_DISASM_AARCH32_H_
     28 #define VIXL_DISASM_AARCH32_H_
     29 
     30 extern "C" {
     31 #include <stdint.h>
     32 }
     33 
     34 #include <iomanip>
     35 
     36 #include "aarch32/constants-aarch32.h"
     37 #include "aarch32/operands-aarch32.h"
     38 
     39 namespace vixl {
     40 namespace aarch32 {
     41 
     42 class ITBlock {
     43   Condition first_condition_;
     44   Condition condition_;
     45   uint16_t it_mask_;
     46 
     47  public:
     48   ITBlock() : first_condition_(al), condition_(al), it_mask_(0) {}
     49   void Advance() {
     50     condition_ = Condition((condition_.GetCondition() & 0xe) | (it_mask_ >> 3));
     51     it_mask_ = (it_mask_ << 1) & 0xf;
     52   }
     53   bool InITBlock() const { return it_mask_ != 0; }
     54   bool OutsideITBlock() const { return !InITBlock(); }
     55   bool LastInITBlock() const { return it_mask_ == 0x8; }
     56   bool OutsideITBlockOrLast() const {
     57     return OutsideITBlock() || LastInITBlock();
     58   }
     59   void Set(Condition first_condition, uint16_t mask) {
     60     condition_ = first_condition_ = first_condition;
     61     it_mask_ = mask;
     62   }
     63   Condition GetFirstCondition() const { return first_condition_; }
     64   Condition GetCurrentCondition() const { return condition_; }
     65 };
     66 
     67 class Disassembler {
     68  public:
     69   enum LocationType {
     70     kAnyLocation,
     71     kCodeLocation,
     72     kDataLocation,
     73     kCoprocLocation,
     74     kLoadByteLocation,
     75     kLoadHalfWordLocation,
     76     kLoadWordLocation,
     77     kLoadDoubleWordLocation,
     78     kLoadSignedByteLocation,
     79     kLoadSignedHalfWordLocation,
     80     kLoadSinglePrecisionLocation,
     81     kLoadDoublePrecisionLocation,
     82     kStoreByteLocation,
     83     kStoreHalfWordLocation,
     84     kStoreWordLocation,
     85     kStoreDoubleWordLocation,
     86     kStoreSinglePrecisionLocation,
     87     kStoreDoublePrecisionLocation,
     88     kVld1Location,
     89     kVld2Location,
     90     kVld3Location,
     91     kVld4Location,
     92     kVst1Location,
     93     kVst2Location,
     94     kVst3Location,
     95     kVst4Location
     96   };
     97 
     98   class ConditionPrinter {
     99     const ITBlock& it_block_;
    100     Condition cond_;
    101 
    102    public:
    103     ConditionPrinter(const ITBlock& it_block, Condition cond)
    104         : it_block_(it_block), cond_(cond) {}
    105     const ITBlock& GetITBlock() const { return it_block_; }
    106     Condition GetCond() const { return cond_; }
    107     friend std::ostream& operator<<(std::ostream& os, ConditionPrinter cond) {
    108       if (cond.it_block_.InITBlock() && cond.cond_.Is(al) &&
    109           !cond.cond_.IsNone()) {
    110         return os << "al";
    111       }
    112       return os << cond.cond_;
    113     }
    114   };
    115 
    116   class ImmediatePrinter {
    117     uint32_t imm_;
    118 
    119    public:
    120     explicit ImmediatePrinter(uint32_t imm) : imm_(imm) {}
    121     uint32_t GetImm() const { return imm_; }
    122     friend std::ostream& operator<<(std::ostream& os, ImmediatePrinter imm) {
    123       return os << "#" << imm.GetImm();
    124     }
    125   };
    126 
    127   class SignedImmediatePrinter {
    128     int32_t imm_;
    129 
    130    public:
    131     explicit SignedImmediatePrinter(int32_t imm) : imm_(imm) {}
    132     int32_t GetImm() const { return imm_; }
    133     friend std::ostream& operator<<(std::ostream& os,
    134                                     SignedImmediatePrinter imm) {
    135       return os << "#" << imm.GetImm();
    136     }
    137   };
    138 
    139   class RawImmediatePrinter {
    140     uint32_t imm_;
    141 
    142    public:
    143     explicit RawImmediatePrinter(uint32_t imm) : imm_(imm) {}
    144     uint32_t GetImm() const { return imm_; }
    145     friend std::ostream& operator<<(std::ostream& os, RawImmediatePrinter imm) {
    146       return os << imm.GetImm();
    147     }
    148   };
    149 
    150   class DtPrinter {
    151     DataType dt_;
    152     DataType default_dt_;
    153 
    154    public:
    155     DtPrinter(DataType dt, DataType default_dt)
    156         : dt_(dt), default_dt_(default_dt) {}
    157     DataType GetDt() const { return dt_; }
    158     DataType GetDefaultDt() const { return default_dt_; }
    159     friend std::ostream& operator<<(std::ostream& os, DtPrinter dt) {
    160       if (dt.dt_.Is(dt.default_dt_)) return os;
    161       return os << dt.dt_;
    162     }
    163   };
    164 
    165   class IndexedRegisterPrinter {
    166     DRegister reg_;
    167     uint32_t index_;
    168 
    169    public:
    170     IndexedRegisterPrinter(DRegister reg, uint32_t index)
    171         : reg_(reg), index_(index) {}
    172     DRegister GetReg() const { return reg_; }
    173     uint32_t GetIndex() const { return index_; }
    174     friend std::ostream& operator<<(std::ostream& os,
    175                                     IndexedRegisterPrinter reg) {
    176       return os << reg.GetReg() << "[" << reg.GetIndex() << "]";
    177     }
    178   };
    179 
    180   // TODO: Merge this class with PrintLabel below. This Location class
    181   // represents a PC-relative offset, not an address.
    182   class Location {
    183    public:
    184     typedef int32_t Offset;
    185 
    186     Location(Offset immediate, Offset pc_offset)
    187         : immediate_(immediate), pc_offset_(pc_offset) {}
    188     Offset GetImmediate() const { return immediate_; }
    189     Offset GetPCOffset() const { return pc_offset_; }
    190 
    191    private:
    192     Offset immediate_;
    193     Offset pc_offset_;
    194   };
    195 
    196   class PrintLabel {
    197     LocationType location_type_;
    198     Location::Offset immediate_;
    199     Location::Offset location_;
    200 
    201    public:
    202     PrintLabel(LocationType location_type,
    203                Location* offset,
    204                Location::Offset position)
    205         : location_type_(location_type),
    206           immediate_(offset->GetImmediate()),
    207           location_(offset->GetPCOffset() + offset->GetImmediate() + position) {
    208     }
    209 
    210     LocationType GetLocationType() const { return location_type_; }
    211     Location::Offset GetLocation() const { return location_; }
    212     Location::Offset GetImmediate() const { return immediate_; }
    213 
    214     friend inline std::ostream& operator<<(std::ostream& os,
    215                                            const PrintLabel& label) {
    216       os << "0x" << std::hex << std::setw(8) << std::setfill('0')
    217          << label.GetLocation() << std::dec;
    218       return os;
    219     }
    220   };
    221 
    222 
    223   class PrintMemOperand {
    224     LocationType location_type_;
    225     const MemOperand& operand_;
    226 
    227    public:
    228     PrintMemOperand(LocationType location_type, const MemOperand& operand)
    229         : location_type_(location_type), operand_(operand) {}
    230     LocationType GetLocationType() const { return location_type_; }
    231     const MemOperand& GetOperand() const { return operand_; }
    232   };
    233 
    234   class PrintAlignedMemOperand {
    235     LocationType location_type_;
    236     const AlignedMemOperand& operand_;
    237 
    238    public:
    239     PrintAlignedMemOperand(LocationType location_type,
    240                            const AlignedMemOperand& operand)
    241         : location_type_(location_type), operand_(operand) {}
    242     LocationType GetLocationType() const { return location_type_; }
    243     const AlignedMemOperand& GetOperand() const { return operand_; }
    244   };
    245 
    246   class DisassemblerStream {
    247     std::ostream& os_;
    248     InstructionType current_instruction_type_;
    249     InstructionAttribute current_instruction_attributes_;
    250 
    251    public:
    252     explicit DisassemblerStream(std::ostream& os)  // NOLINT(runtime/references)
    253         : os_(os),
    254           current_instruction_type_(kUndefInstructionType),
    255           current_instruction_attributes_(kNoAttribute) {}
    256     virtual ~DisassemblerStream() {}
    257     std::ostream& os() const { return os_; }
    258     void SetCurrentInstruction(
    259         InstructionType current_instruction_type,
    260         InstructionAttribute current_instruction_attributes) {
    261       current_instruction_type_ = current_instruction_type;
    262       current_instruction_attributes_ = current_instruction_attributes;
    263     }
    264     InstructionType GetCurrentInstructionType() const {
    265       return current_instruction_type_;
    266     }
    267     InstructionAttribute GetCurrentInstructionAttributes() const {
    268       return current_instruction_attributes_;
    269     }
    270     bool Has(InstructionAttribute attributes) const {
    271       return (current_instruction_attributes_ & attributes) == attributes;
    272     }
    273     template <typename T>
    274     DisassemblerStream& operator<<(T value) {
    275       os_ << value;
    276       return *this;
    277     }
    278     virtual DisassemblerStream& operator<<(const char* string) {
    279       os_ << string;
    280       return *this;
    281     }
    282     virtual DisassemblerStream& operator<<(const ConditionPrinter& cond) {
    283       os_ << cond;
    284       return *this;
    285     }
    286     virtual DisassemblerStream& operator<<(Condition cond) {
    287       os_ << cond;
    288       return *this;
    289     }
    290     virtual DisassemblerStream& operator<<(const EncodingSize& size) {
    291       os_ << size;
    292       return *this;
    293     }
    294     virtual DisassemblerStream& operator<<(const ImmediatePrinter& imm) {
    295       os_ << imm;
    296       return *this;
    297     }
    298     virtual DisassemblerStream& operator<<(const SignedImmediatePrinter& imm) {
    299       os_ << imm;
    300       return *this;
    301     }
    302     virtual DisassemblerStream& operator<<(const RawImmediatePrinter& imm) {
    303       os_ << imm;
    304       return *this;
    305     }
    306     virtual DisassemblerStream& operator<<(const DtPrinter& dt) {
    307       os_ << dt;
    308       return *this;
    309     }
    310     virtual DisassemblerStream& operator<<(const DataType& type) {
    311       os_ << type;
    312       return *this;
    313     }
    314     virtual DisassemblerStream& operator<<(Shift shift) {
    315       os_ << shift;
    316       return *this;
    317     }
    318     virtual DisassemblerStream& operator<<(Sign sign) {
    319       os_ << sign;
    320       return *this;
    321     }
    322     virtual DisassemblerStream& operator<<(Alignment alignment) {
    323       os_ << alignment;
    324       return *this;
    325     }
    326     virtual DisassemblerStream& operator<<(const PrintLabel& label) {
    327       os_ << label;
    328       return *this;
    329     }
    330     virtual DisassemblerStream& operator<<(const WriteBack& write_back) {
    331       os_ << write_back;
    332       return *this;
    333     }
    334     virtual DisassemblerStream& operator<<(const NeonImmediate& immediate) {
    335       os_ << immediate;
    336       return *this;
    337     }
    338     virtual DisassemblerStream& operator<<(Register reg) {
    339       os_ << reg;
    340       return *this;
    341     }
    342     virtual DisassemblerStream& operator<<(SRegister reg) {
    343       os_ << reg;
    344       return *this;
    345     }
    346     virtual DisassemblerStream& operator<<(DRegister reg) {
    347       os_ << reg;
    348       return *this;
    349     }
    350     virtual DisassemblerStream& operator<<(QRegister reg) {
    351       os_ << reg;
    352       return *this;
    353     }
    354     virtual DisassemblerStream& operator<<(const RegisterOrAPSR_nzcv reg) {
    355       os_ << reg;
    356       return *this;
    357     }
    358     virtual DisassemblerStream& operator<<(SpecialRegister reg) {
    359       os_ << reg;
    360       return *this;
    361     }
    362     virtual DisassemblerStream& operator<<(MaskedSpecialRegister reg) {
    363       os_ << reg;
    364       return *this;
    365     }
    366     virtual DisassemblerStream& operator<<(SpecialFPRegister reg) {
    367       os_ << reg;
    368       return *this;
    369     }
    370     virtual DisassemblerStream& operator<<(BankedRegister reg) {
    371       os_ << reg;
    372       return *this;
    373     }
    374     virtual DisassemblerStream& operator<<(const RegisterList& list) {
    375       os_ << list;
    376       return *this;
    377     }
    378     virtual DisassemblerStream& operator<<(const SRegisterList& list) {
    379       os_ << list;
    380       return *this;
    381     }
    382     virtual DisassemblerStream& operator<<(const DRegisterList& list) {
    383       os_ << list;
    384       return *this;
    385     }
    386     virtual DisassemblerStream& operator<<(const NeonRegisterList& list) {
    387       os_ << list;
    388       return *this;
    389     }
    390     virtual DisassemblerStream& operator<<(const DRegisterLane& reg) {
    391       os_ << reg;
    392       return *this;
    393     }
    394     virtual DisassemblerStream& operator<<(const IndexedRegisterPrinter& reg) {
    395       os_ << reg;
    396       return *this;
    397     }
    398     virtual DisassemblerStream& operator<<(Coprocessor coproc) {
    399       os_ << coproc;
    400       return *this;
    401     }
    402     virtual DisassemblerStream& operator<<(CRegister reg) {
    403       os_ << reg;
    404       return *this;
    405     }
    406     virtual DisassemblerStream& operator<<(Endianness endian_specifier) {
    407       os_ << endian_specifier;
    408       return *this;
    409     }
    410     virtual DisassemblerStream& operator<<(MemoryBarrier option) {
    411       os_ << option;
    412       return *this;
    413     }
    414     virtual DisassemblerStream& operator<<(InterruptFlags iflags) {
    415       os_ << iflags;
    416       return *this;
    417     }
    418     virtual DisassemblerStream& operator<<(const Operand& operand) {
    419       if (operand.IsImmediate()) {
    420         if (Has(kBitwise)) {
    421           return *this << "#0x" << std::hex << operand.GetImmediate()
    422                        << std::dec;
    423         }
    424         return *this << "#" << operand.GetImmediate();
    425       }
    426       if (operand.IsImmediateShiftedRegister()) {
    427         if ((operand.GetShift().IsLSL() || operand.GetShift().IsROR()) &&
    428             (operand.GetShiftAmount() == 0)) {
    429           return *this << operand.GetBaseRegister();
    430         }
    431         if (operand.GetShift().IsRRX()) {
    432           return *this << operand.GetBaseRegister() << ", rrx";
    433         }
    434         return *this << operand.GetBaseRegister() << ", " << operand.GetShift()
    435                      << " #" << operand.GetShiftAmount();
    436       }
    437       if (operand.IsRegisterShiftedRegister()) {
    438         return *this << operand.GetBaseRegister() << ", " << operand.GetShift()
    439                      << " " << operand.GetShiftRegister();
    440       }
    441       VIXL_UNREACHABLE();
    442       return *this;
    443     }
    444     virtual DisassemblerStream& operator<<(const SOperand& operand) {
    445       if (operand.IsImmediate()) {
    446         return *this << operand.GetNeonImmediate();
    447       }
    448       return *this << operand.GetRegister();
    449     }
    450     virtual DisassemblerStream& operator<<(const DOperand& operand) {
    451       if (operand.IsImmediate()) {
    452         return *this << operand.GetNeonImmediate();
    453       }
    454       return *this << operand.GetRegister();
    455     }
    456     virtual DisassemblerStream& operator<<(const QOperand& operand) {
    457       if (operand.IsImmediate()) {
    458         return *this << operand.GetNeonImmediate();
    459       }
    460       return *this << operand.GetRegister();
    461     }
    462     virtual DisassemblerStream& operator<<(const MemOperand& operand) {
    463       *this << "[" << operand.GetBaseRegister();
    464       if (operand.GetAddrMode() == PostIndex) {
    465         *this << "]";
    466         if (operand.IsRegisterOnly()) return *this << "!";
    467       }
    468       if (operand.IsImmediate()) {
    469         if ((operand.GetOffsetImmediate() != 0) ||
    470             operand.GetSign().IsMinus() ||
    471             ((operand.GetAddrMode() != Offset) && !operand.IsRegisterOnly())) {
    472           if (operand.GetOffsetImmediate() == 0) {
    473             *this << ", #" << operand.GetSign() << operand.GetOffsetImmediate();
    474           } else {
    475             *this << ", #" << operand.GetOffsetImmediate();
    476           }
    477         }
    478       } else if (operand.IsPlainRegister()) {
    479         *this << ", " << operand.GetSign() << operand.GetOffsetRegister();
    480       } else if (operand.IsShiftedRegister()) {
    481         *this << ", " << operand.GetSign() << operand.GetOffsetRegister()
    482               << ImmediateShiftOperand(operand.GetShift(),
    483                                        operand.GetShiftAmount());
    484       } else {
    485         VIXL_UNREACHABLE();
    486         return *this;
    487       }
    488       if (operand.GetAddrMode() == Offset) {
    489         *this << "]";
    490       } else if (operand.GetAddrMode() == PreIndex) {
    491         *this << "]!";
    492       }
    493       return *this;
    494     }
    495     virtual DisassemblerStream& operator<<(const PrintMemOperand& operand) {
    496       return *this << operand.GetOperand();
    497     }
    498     virtual DisassemblerStream& operator<<(const AlignedMemOperand& operand) {
    499       *this << "[" << operand.GetBaseRegister() << operand.GetAlignment()
    500             << "]";
    501       if (operand.GetAddrMode() == PostIndex) {
    502         if (operand.IsPlainRegister()) {
    503           *this << ", " << operand.GetOffsetRegister();
    504         } else {
    505           *this << "!";
    506         }
    507       }
    508       return *this;
    509     }
    510     virtual DisassemblerStream& operator<<(
    511         const PrintAlignedMemOperand& operand) {
    512       return *this << operand.GetOperand();
    513     }
    514   };
    515 
    516  private:
    517   class ITBlockScope {
    518     ITBlock* const it_block_;
    519     bool inside_;
    520 
    521    public:
    522     explicit ITBlockScope(ITBlock* it_block)
    523         : it_block_(it_block), inside_(it_block->InITBlock()) {}
    524     ~ITBlockScope() {
    525       if (inside_) it_block_->Advance();
    526     }
    527   };
    528 
    529   ITBlock it_block_;
    530   DisassemblerStream* os_;
    531   bool owns_os_;
    532   uint32_t code_address_;
    533   // True if the disassembler always output instructions with all the
    534   // registers (even if two registers are identical and only one could be
    535   // output).
    536   bool use_short_hand_form_;
    537 
    538  public:
    539   explicit Disassembler(std::ostream& os,  // NOLINT(runtime/references)
    540                         uint32_t code_address = 0)
    541       : os_(new DisassemblerStream(os)),
    542         owns_os_(true),
    543         code_address_(code_address),
    544         use_short_hand_form_(true) {}
    545   explicit Disassembler(DisassemblerStream* os, uint32_t code_address = 0)
    546       : os_(os),
    547         owns_os_(false),
    548         code_address_(code_address),
    549         use_short_hand_form_(true) {}
    550   virtual ~Disassembler() {
    551     if (owns_os_) {
    552       delete os_;
    553     }
    554   }
    555   DisassemblerStream& os() const { return *os_; }
    556   void SetIT(Condition first_condition, uint16_t it_mask) {
    557     it_block_.Set(first_condition, it_mask);
    558   }
    559   const ITBlock& GetITBlock() const { return it_block_; }
    560   bool InITBlock() const { return it_block_.InITBlock(); }
    561   bool OutsideITBlock() const { return it_block_.OutsideITBlock(); }
    562   bool OutsideITBlockOrLast() const { return it_block_.OutsideITBlockOrLast(); }
    563   void CheckNotIT() const { VIXL_ASSERT(it_block_.OutsideITBlock()); }
    564   // Return the current condition depending on the IT state for T32.
    565   Condition CurrentCond() const {
    566     if (it_block_.OutsideITBlock()) return al;
    567     return it_block_.GetCurrentCondition();
    568   }
    569   bool UseShortHandForm() const { return use_short_hand_form_; }
    570   void SetUseShortHandForm(bool use_short_hand_form) {
    571     use_short_hand_form_ = use_short_hand_form;
    572   }
    573 
    574   virtual void UnallocatedT32(uint32_t instruction) {
    575     if (T32Size(instruction) == 2) {
    576       os() << "unallocated " << std::hex << std::setw(4) << std::setfill('0')
    577            << (instruction >> 16) << std::dec;
    578     } else {
    579       os() << "unallocated " << std::hex << std::setw(8) << std::setfill('0')
    580            << instruction << std::dec;
    581     }
    582   }
    583   virtual void UnallocatedA32(uint32_t instruction) {
    584     os() << "unallocated " << std::hex << std::setw(8) << std::setfill('0')
    585          << instruction << std::dec;
    586   }
    587   virtual void UnimplementedT32_16(const char* name, uint32_t instruction) {
    588     os() << "unimplemented " << name << " T32:" << std::hex << std::setw(4)
    589          << std::setfill('0') << (instruction >> 16) << std::dec;
    590   }
    591   virtual void UnimplementedT32_32(const char* name, uint32_t instruction) {
    592     os() << "unimplemented " << name << " T32:" << std::hex << std::setw(8)
    593          << std::setfill('0') << instruction << std::dec;
    594   }
    595   virtual void UnimplementedA32(const char* name, uint32_t instruction) {
    596     os() << "unimplemented " << name << " ARM:" << std::hex << std::setw(8)
    597          << std::setfill('0') << instruction << std::dec;
    598   }
    599   virtual void Unpredictable() { os() << " ; unpredictable"; }
    600   virtual void UnpredictableT32(uint32_t /*instr*/) { return Unpredictable(); }
    601   virtual void UnpredictableA32(uint32_t /*instr*/) { return Unpredictable(); }
    602 
    603   static bool Is16BitEncoding(uint32_t instr) { return instr < 0xe8000000; }
    604   uint32_t GetCodeAddress() const { return code_address_; }
    605   void SetCodeAddress(uint32_t code_address) { code_address_ = code_address; }
    606 
    607   // Start of generated code.
    608 
    609   void adc(Condition cond,
    610            EncodingSize size,
    611            Register rd,
    612            Register rn,
    613            const Operand& operand);
    614 
    615   void adcs(Condition cond,
    616             EncodingSize size,
    617             Register rd,
    618             Register rn,
    619             const Operand& operand);
    620 
    621   void add(Condition cond,
    622            EncodingSize size,
    623            Register rd,
    624            Register rn,
    625            const Operand& operand);
    626 
    627   void add(Condition cond, Register rd, const Operand& operand);
    628 
    629   void adds(Condition cond,
    630             EncodingSize size,
    631             Register rd,
    632             Register rn,
    633             const Operand& operand);
    634 
    635   void adds(Register rd, const Operand& operand);
    636 
    637   void addw(Condition cond, Register rd, Register rn, const Operand& operand);
    638 
    639   void adr(Condition cond, EncodingSize size, Register rd, Location* location);
    640 
    641   void and_(Condition cond,
    642             EncodingSize size,
    643             Register rd,
    644             Register rn,
    645             const Operand& operand);
    646 
    647   void ands(Condition cond,
    648             EncodingSize size,
    649             Register rd,
    650             Register rn,
    651             const Operand& operand);
    652 
    653   void asr(Condition cond,
    654            EncodingSize size,
    655            Register rd,
    656            Register rm,
    657            const Operand& operand);
    658 
    659   void asrs(Condition cond,
    660             EncodingSize size,
    661             Register rd,
    662             Register rm,
    663             const Operand& operand);
    664 
    665   void b(Condition cond, EncodingSize size, Location* location);
    666 
    667   void bfc(Condition cond, Register rd, uint32_t lsb, uint32_t width);
    668 
    669   void bfi(
    670       Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width);
    671 
    672   void bic(Condition cond,
    673            EncodingSize size,
    674            Register rd,
    675            Register rn,
    676            const Operand& operand);
    677 
    678   void bics(Condition cond,
    679             EncodingSize size,
    680             Register rd,
    681             Register rn,
    682             const Operand& operand);
    683 
    684   void bkpt(Condition cond, uint32_t imm);
    685 
    686   void bl(Condition cond, Location* location);
    687 
    688   void blx(Condition cond, Location* location);
    689 
    690   void blx(Condition cond, Register rm);
    691 
    692   void bx(Condition cond, Register rm);
    693 
    694   void bxj(Condition cond, Register rm);
    695 
    696   void cbnz(Register rn, Location* location);
    697 
    698   void cbz(Register rn, Location* location);
    699 
    700   void clrex(Condition cond);
    701 
    702   void clz(Condition cond, Register rd, Register rm);
    703 
    704   void cmn(Condition cond,
    705            EncodingSize size,
    706            Register rn,
    707            const Operand& operand);
    708 
    709   void cmp(Condition cond,
    710            EncodingSize size,
    711            Register rn,
    712            const Operand& operand);
    713 
    714   void crc32b(Condition cond, Register rd, Register rn, Register rm);
    715 
    716   void crc32cb(Condition cond, Register rd, Register rn, Register rm);
    717 
    718   void crc32ch(Condition cond, Register rd, Register rn, Register rm);
    719 
    720   void crc32cw(Condition cond, Register rd, Register rn, Register rm);
    721 
    722   void crc32h(Condition cond, Register rd, Register rn, Register rm);
    723 
    724   void crc32w(Condition cond, Register rd, Register rn, Register rm);
    725 
    726   void dmb(Condition cond, MemoryBarrier option);
    727 
    728   void dsb(Condition cond, MemoryBarrier option);
    729 
    730   void eor(Condition cond,
    731            EncodingSize size,
    732            Register rd,
    733            Register rn,
    734            const Operand& operand);
    735 
    736   void eors(Condition cond,
    737             EncodingSize size,
    738             Register rd,
    739             Register rn,
    740             const Operand& operand);
    741 
    742   void fldmdbx(Condition cond,
    743                Register rn,
    744                WriteBack write_back,
    745                DRegisterList dreglist);
    746 
    747   void fldmiax(Condition cond,
    748                Register rn,
    749                WriteBack write_back,
    750                DRegisterList dreglist);
    751 
    752   void fstmdbx(Condition cond,
    753                Register rn,
    754                WriteBack write_back,
    755                DRegisterList dreglist);
    756 
    757   void fstmiax(Condition cond,
    758                Register rn,
    759                WriteBack write_back,
    760                DRegisterList dreglist);
    761 
    762   void hlt(Condition cond, uint32_t imm);
    763 
    764   void hvc(Condition cond, uint32_t imm);
    765 
    766   void isb(Condition cond, MemoryBarrier option);
    767 
    768   void it(Condition cond, uint16_t mask);
    769 
    770   void lda(Condition cond, Register rt, const MemOperand& operand);
    771 
    772   void ldab(Condition cond, Register rt, const MemOperand& operand);
    773 
    774   void ldaex(Condition cond, Register rt, const MemOperand& operand);
    775 
    776   void ldaexb(Condition cond, Register rt, const MemOperand& operand);
    777 
    778   void ldaexd(Condition cond,
    779               Register rt,
    780               Register rt2,
    781               const MemOperand& operand);
    782 
    783   void ldaexh(Condition cond, Register rt, const MemOperand& operand);
    784 
    785   void ldah(Condition cond, Register rt, const MemOperand& operand);
    786 
    787   void ldm(Condition cond,
    788            EncodingSize size,
    789            Register rn,
    790            WriteBack write_back,
    791            RegisterList registers);
    792 
    793   void ldmda(Condition cond,
    794              Register rn,
    795              WriteBack write_back,
    796              RegisterList registers);
    797 
    798   void ldmdb(Condition cond,
    799              Register rn,
    800              WriteBack write_back,
    801              RegisterList registers);
    802 
    803   void ldmea(Condition cond,
    804              Register rn,
    805              WriteBack write_back,
    806              RegisterList registers);
    807 
    808   void ldmed(Condition cond,
    809              Register rn,
    810              WriteBack write_back,
    811              RegisterList registers);
    812 
    813   void ldmfa(Condition cond,
    814              Register rn,
    815              WriteBack write_back,
    816              RegisterList registers);
    817 
    818   void ldmfd(Condition cond,
    819              EncodingSize size,
    820              Register rn,
    821              WriteBack write_back,
    822              RegisterList registers);
    823 
    824   void ldmib(Condition cond,
    825              Register rn,
    826              WriteBack write_back,
    827              RegisterList registers);
    828 
    829   void ldr(Condition cond,
    830            EncodingSize size,
    831            Register rt,
    832            const MemOperand& operand);
    833 
    834   void ldr(Condition cond, EncodingSize size, Register rt, Location* location);
    835 
    836   void ldrb(Condition cond,
    837             EncodingSize size,
    838             Register rt,
    839             const MemOperand& operand);
    840 
    841   void ldrb(Condition cond, Register rt, Location* location);
    842 
    843   void ldrd(Condition cond,
    844             Register rt,
    845             Register rt2,
    846             const MemOperand& operand);
    847 
    848   void ldrd(Condition cond, Register rt, Register rt2, Location* location);
    849 
    850   void ldrex(Condition cond, Register rt, const MemOperand& operand);
    851 
    852   void ldrexb(Condition cond, Register rt, const MemOperand& operand);
    853 
    854   void ldrexd(Condition cond,
    855               Register rt,
    856               Register rt2,
    857               const MemOperand& operand);
    858 
    859   void ldrexh(Condition cond, Register rt, const MemOperand& operand);
    860 
    861   void ldrh(Condition cond,
    862             EncodingSize size,
    863             Register rt,
    864             const MemOperand& operand);
    865 
    866   void ldrh(Condition cond, Register rt, Location* location);
    867 
    868   void ldrsb(Condition cond,
    869              EncodingSize size,
    870              Register rt,
    871              const MemOperand& operand);
    872 
    873   void ldrsb(Condition cond, Register rt, Location* location);
    874 
    875   void ldrsh(Condition cond,
    876              EncodingSize size,
    877              Register rt,
    878              const MemOperand& operand);
    879 
    880   void ldrsh(Condition cond, Register rt, Location* location);
    881 
    882   void lsl(Condition cond,
    883            EncodingSize size,
    884            Register rd,
    885            Register rm,
    886            const Operand& operand);
    887 
    888   void lsls(Condition cond,
    889             EncodingSize size,
    890             Register rd,
    891             Register rm,
    892             const Operand& operand);
    893 
    894   void lsr(Condition cond,
    895            EncodingSize size,
    896            Register rd,
    897            Register rm,
    898            const Operand& operand);
    899 
    900   void lsrs(Condition cond,
    901             EncodingSize size,
    902             Register rd,
    903             Register rm,
    904             const Operand& operand);
    905 
    906   void mla(Condition cond, Register rd, Register rn, Register rm, Register ra);
    907 
    908   void mlas(Condition cond, Register rd, Register rn, Register rm, Register ra);
    909 
    910   void mls(Condition cond, Register rd, Register rn, Register rm, Register ra);
    911 
    912   void mov(Condition cond,
    913            EncodingSize size,
    914            Register rd,
    915            const Operand& operand);
    916 
    917   void movs(Condition cond,
    918             EncodingSize size,
    919             Register rd,
    920             const Operand& operand);
    921 
    922   void movt(Condition cond, Register rd, const Operand& operand);
    923 
    924   void movw(Condition cond, Register rd, const Operand& operand);
    925 
    926   void mrs(Condition cond, Register rd, SpecialRegister spec_reg);
    927 
    928   void msr(Condition cond,
    929            MaskedSpecialRegister spec_reg,
    930            const Operand& operand);
    931 
    932   void mul(
    933       Condition cond, EncodingSize size, Register rd, Register rn, Register rm);
    934 
    935   void muls(Condition cond, Register rd, Register rn, Register rm);
    936 
    937   void mvn(Condition cond,
    938            EncodingSize size,
    939            Register rd,
    940            const Operand& operand);
    941 
    942   void mvns(Condition cond,
    943             EncodingSize size,
    944             Register rd,
    945             const Operand& operand);
    946 
    947   void nop(Condition cond, EncodingSize size);
    948 
    949   void orn(Condition cond, Register rd, Register rn, const Operand& operand);
    950 
    951   void orns(Condition cond, Register rd, Register rn, const Operand& operand);
    952 
    953   void orr(Condition cond,
    954            EncodingSize size,
    955            Register rd,
    956            Register rn,
    957            const Operand& operand);
    958 
    959   void orrs(Condition cond,
    960             EncodingSize size,
    961             Register rd,
    962             Register rn,
    963             const Operand& operand);
    964 
    965   void pkhbt(Condition cond, Register rd, Register rn, const Operand& operand);
    966 
    967   void pkhtb(Condition cond, Register rd, Register rn, const Operand& operand);
    968 
    969   void pld(Condition cond, Location* location);
    970 
    971   void pld(Condition cond, const MemOperand& operand);
    972 
    973   void pldw(Condition cond, const MemOperand& operand);
    974 
    975   void pli(Condition cond, const MemOperand& operand);
    976 
    977   void pli(Condition cond, Location* location);
    978 
    979   void pop(Condition cond, EncodingSize size, RegisterList registers);
    980 
    981   void pop(Condition cond, EncodingSize size, Register rt);
    982 
    983   void push(Condition cond, EncodingSize size, RegisterList registers);
    984 
    985   void push(Condition cond, EncodingSize size, Register rt);
    986 
    987   void qadd(Condition cond, Register rd, Register rm, Register rn);
    988 
    989   void qadd16(Condition cond, Register rd, Register rn, Register rm);
    990 
    991   void qadd8(Condition cond, Register rd, Register rn, Register rm);
    992 
    993   void qasx(Condition cond, Register rd, Register rn, Register rm);
    994 
    995   void qdadd(Condition cond, Register rd, Register rm, Register rn);
    996 
    997   void qdsub(Condition cond, Register rd, Register rm, Register rn);
    998 
    999   void qsax(Condition cond, Register rd, Register rn, Register rm);
   1000 
   1001   void qsub(Condition cond, Register rd, Register rm, Register rn);
   1002 
   1003   void qsub16(Condition cond, Register rd, Register rn, Register rm);
   1004 
   1005   void qsub8(Condition cond, Register rd, Register rn, Register rm);
   1006 
   1007   void rbit(Condition cond, Register rd, Register rm);
   1008 
   1009   void rev(Condition cond, EncodingSize size, Register rd, Register rm);
   1010 
   1011   void rev16(Condition cond, EncodingSize size, Register rd, Register rm);
   1012 
   1013   void revsh(Condition cond, EncodingSize size, Register rd, Register rm);
   1014 
   1015   void ror(Condition cond,
   1016            EncodingSize size,
   1017            Register rd,
   1018            Register rm,
   1019            const Operand& operand);
   1020 
   1021   void rors(Condition cond,
   1022             EncodingSize size,
   1023             Register rd,
   1024             Register rm,
   1025             const Operand& operand);
   1026 
   1027   void rrx(Condition cond, Register rd, Register rm);
   1028 
   1029   void rrxs(Condition cond, Register rd, Register rm);
   1030 
   1031   void rsb(Condition cond,
   1032            EncodingSize size,
   1033            Register rd,
   1034            Register rn,
   1035            const Operand& operand);
   1036 
   1037   void rsbs(Condition cond,
   1038             EncodingSize size,
   1039             Register rd,
   1040             Register rn,
   1041             const Operand& operand);
   1042 
   1043   void rsc(Condition cond, Register rd, Register rn, const Operand& operand);
   1044 
   1045   void rscs(Condition cond, Register rd, Register rn, const Operand& operand);
   1046 
   1047   void sadd16(Condition cond, Register rd, Register rn, Register rm);
   1048 
   1049   void sadd8(Condition cond, Register rd, Register rn, Register rm);
   1050 
   1051   void sasx(Condition cond, Register rd, Register rn, Register rm);
   1052 
   1053   void sbc(Condition cond,
   1054            EncodingSize size,
   1055            Register rd,
   1056            Register rn,
   1057            const Operand& operand);
   1058 
   1059   void sbcs(Condition cond,
   1060             EncodingSize size,
   1061             Register rd,
   1062             Register rn,
   1063             const Operand& operand);
   1064 
   1065   void sbfx(
   1066       Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width);
   1067 
   1068   void sdiv(Condition cond, Register rd, Register rn, Register rm);
   1069 
   1070   void sel(Condition cond, Register rd, Register rn, Register rm);
   1071 
   1072   void shadd16(Condition cond, Register rd, Register rn, Register rm);
   1073 
   1074   void shadd8(Condition cond, Register rd, Register rn, Register rm);
   1075 
   1076   void shasx(Condition cond, Register rd, Register rn, Register rm);
   1077 
   1078   void shsax(Condition cond, Register rd, Register rn, Register rm);
   1079 
   1080   void shsub16(Condition cond, Register rd, Register rn, Register rm);
   1081 
   1082   void shsub8(Condition cond, Register rd, Register rn, Register rm);
   1083 
   1084   void smlabb(
   1085       Condition cond, Register rd, Register rn, Register rm, Register ra);
   1086 
   1087   void smlabt(
   1088       Condition cond, Register rd, Register rn, Register rm, Register ra);
   1089 
   1090   void smlad(
   1091       Condition cond, Register rd, Register rn, Register rm, Register ra);
   1092 
   1093   void smladx(
   1094       Condition cond, Register rd, Register rn, Register rm, Register ra);
   1095 
   1096   void smlal(
   1097       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm);
   1098 
   1099   void smlalbb(
   1100       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm);
   1101 
   1102   void smlalbt(
   1103       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm);
   1104 
   1105   void smlald(
   1106       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm);
   1107 
   1108   void smlaldx(
   1109       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm);
   1110 
   1111   void smlals(
   1112       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm);
   1113 
   1114   void smlaltb(
   1115       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm);
   1116 
   1117   void smlaltt(
   1118       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm);
   1119 
   1120   void smlatb(
   1121       Condition cond, Register rd, Register rn, Register rm, Register ra);
   1122 
   1123   void smlatt(
   1124       Condition cond, Register rd, Register rn, Register rm, Register ra);
   1125 
   1126   void smlawb(
   1127       Condition cond, Register rd, Register rn, Register rm, Register ra);
   1128 
   1129   void smlawt(
   1130       Condition cond, Register rd, Register rn, Register rm, Register ra);
   1131 
   1132   void smlsd(
   1133       Condition cond, Register rd, Register rn, Register rm, Register ra);
   1134 
   1135   void smlsdx(
   1136       Condition cond, Register rd, Register rn, Register rm, Register ra);
   1137 
   1138   void smlsld(
   1139       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm);
   1140 
   1141   void smlsldx(
   1142       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm);
   1143 
   1144   void smmla(
   1145       Condition cond, Register rd, Register rn, Register rm, Register ra);
   1146 
   1147   void smmlar(
   1148       Condition cond, Register rd, Register rn, Register rm, Register ra);
   1149 
   1150   void smmls(
   1151       Condition cond, Register rd, Register rn, Register rm, Register ra);
   1152 
   1153   void smmlsr(
   1154       Condition cond, Register rd, Register rn, Register rm, Register ra);
   1155 
   1156   void smmul(Condition cond, Register rd, Register rn, Register rm);
   1157 
   1158   void smmulr(Condition cond, Register rd, Register rn, Register rm);
   1159 
   1160   void smuad(Condition cond, Register rd, Register rn, Register rm);
   1161 
   1162   void smuadx(Condition cond, Register rd, Register rn, Register rm);
   1163 
   1164   void smulbb(Condition cond, Register rd, Register rn, Register rm);
   1165 
   1166   void smulbt(Condition cond, Register rd, Register rn, Register rm);
   1167 
   1168   void smull(
   1169       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm);
   1170 
   1171   void smulls(
   1172       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm);
   1173 
   1174   void smultb(Condition cond, Register rd, Register rn, Register rm);
   1175 
   1176   void smultt(Condition cond, Register rd, Register rn, Register rm);
   1177 
   1178   void smulwb(Condition cond, Register rd, Register rn, Register rm);
   1179 
   1180   void smulwt(Condition cond, Register rd, Register rn, Register rm);
   1181 
   1182   void smusd(Condition cond, Register rd, Register rn, Register rm);
   1183 
   1184   void smusdx(Condition cond, Register rd, Register rn, Register rm);
   1185 
   1186   void ssat(Condition cond, Register rd, uint32_t imm, const Operand& operand);
   1187 
   1188   void ssat16(Condition cond, Register rd, uint32_t imm, Register rn);
   1189 
   1190   void ssax(Condition cond, Register rd, Register rn, Register rm);
   1191 
   1192   void ssub16(Condition cond, Register rd, Register rn, Register rm);
   1193 
   1194   void ssub8(Condition cond, Register rd, Register rn, Register rm);
   1195 
   1196   void stl(Condition cond, Register rt, const MemOperand& operand);
   1197 
   1198   void stlb(Condition cond, Register rt, const MemOperand& operand);
   1199 
   1200   void stlex(Condition cond,
   1201              Register rd,
   1202              Register rt,
   1203              const MemOperand& operand);
   1204 
   1205   void stlexb(Condition cond,
   1206               Register rd,
   1207               Register rt,
   1208               const MemOperand& operand);
   1209 
   1210   void stlexd(Condition cond,
   1211               Register rd,
   1212               Register rt,
   1213               Register rt2,
   1214               const MemOperand& operand);
   1215 
   1216   void stlexh(Condition cond,
   1217               Register rd,
   1218               Register rt,
   1219               const MemOperand& operand);
   1220 
   1221   void stlh(Condition cond, Register rt, const MemOperand& operand);
   1222 
   1223   void stm(Condition cond,
   1224            EncodingSize size,
   1225            Register rn,
   1226            WriteBack write_back,
   1227            RegisterList registers);
   1228 
   1229   void stmda(Condition cond,
   1230              Register rn,
   1231              WriteBack write_back,
   1232              RegisterList registers);
   1233 
   1234   void stmdb(Condition cond,
   1235              EncodingSize size,
   1236              Register rn,
   1237              WriteBack write_back,
   1238              RegisterList registers);
   1239 
   1240   void stmea(Condition cond,
   1241              EncodingSize size,
   1242              Register rn,
   1243              WriteBack write_back,
   1244              RegisterList registers);
   1245 
   1246   void stmed(Condition cond,
   1247              Register rn,
   1248              WriteBack write_back,
   1249              RegisterList registers);
   1250 
   1251   void stmfa(Condition cond,
   1252              Register rn,
   1253              WriteBack write_back,
   1254              RegisterList registers);
   1255 
   1256   void stmfd(Condition cond,
   1257              Register rn,
   1258              WriteBack write_back,
   1259              RegisterList registers);
   1260 
   1261   void stmib(Condition cond,
   1262              Register rn,
   1263              WriteBack write_back,
   1264              RegisterList registers);
   1265 
   1266   void str(Condition cond,
   1267            EncodingSize size,
   1268            Register rt,
   1269            const MemOperand& operand);
   1270 
   1271   void strb(Condition cond,
   1272             EncodingSize size,
   1273             Register rt,
   1274             const MemOperand& operand);
   1275 
   1276   void strd(Condition cond,
   1277             Register rt,
   1278             Register rt2,
   1279             const MemOperand& operand);
   1280 
   1281   void strex(Condition cond,
   1282              Register rd,
   1283              Register rt,
   1284              const MemOperand& operand);
   1285 
   1286   void strexb(Condition cond,
   1287               Register rd,
   1288               Register rt,
   1289               const MemOperand& operand);
   1290 
   1291   void strexd(Condition cond,
   1292               Register rd,
   1293               Register rt,
   1294               Register rt2,
   1295               const MemOperand& operand);
   1296 
   1297   void strexh(Condition cond,
   1298               Register rd,
   1299               Register rt,
   1300               const MemOperand& operand);
   1301 
   1302   void strh(Condition cond,
   1303             EncodingSize size,
   1304             Register rt,
   1305             const MemOperand& operand);
   1306 
   1307   void sub(Condition cond,
   1308            EncodingSize size,
   1309            Register rd,
   1310            Register rn,
   1311            const Operand& operand);
   1312 
   1313   void sub(Condition cond, Register rd, const Operand& operand);
   1314 
   1315   void subs(Condition cond,
   1316             EncodingSize size,
   1317             Register rd,
   1318             Register rn,
   1319             const Operand& operand);
   1320 
   1321   void subs(Register rd, const Operand& operand);
   1322 
   1323   void subw(Condition cond, Register rd, Register rn, const Operand& operand);
   1324 
   1325   void svc(Condition cond, uint32_t imm);
   1326 
   1327   void sxtab(Condition cond, Register rd, Register rn, const Operand& operand);
   1328 
   1329   void sxtab16(Condition cond,
   1330                Register rd,
   1331                Register rn,
   1332                const Operand& operand);
   1333 
   1334   void sxtah(Condition cond, Register rd, Register rn, const Operand& operand);
   1335 
   1336   void sxtb(Condition cond,
   1337             EncodingSize size,
   1338             Register rd,
   1339             const Operand& operand);
   1340 
   1341   void sxtb16(Condition cond, Register rd, const Operand& operand);
   1342 
   1343   void sxth(Condition cond,
   1344             EncodingSize size,
   1345             Register rd,
   1346             const Operand& operand);
   1347 
   1348   void tbb(Condition cond, Register rn, Register rm);
   1349 
   1350   void tbh(Condition cond, Register rn, Register rm);
   1351 
   1352   void teq(Condition cond, Register rn, const Operand& operand);
   1353 
   1354   void tst(Condition cond,
   1355            EncodingSize size,
   1356            Register rn,
   1357            const Operand& operand);
   1358 
   1359   void uadd16(Condition cond, Register rd, Register rn, Register rm);
   1360 
   1361   void uadd8(Condition cond, Register rd, Register rn, Register rm);
   1362 
   1363   void uasx(Condition cond, Register rd, Register rn, Register rm);
   1364 
   1365   void ubfx(
   1366       Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width);
   1367 
   1368   void udf(Condition cond, EncodingSize size, uint32_t imm);
   1369 
   1370   void udiv(Condition cond, Register rd, Register rn, Register rm);
   1371 
   1372   void uhadd16(Condition cond, Register rd, Register rn, Register rm);
   1373 
   1374   void uhadd8(Condition cond, Register rd, Register rn, Register rm);
   1375 
   1376   void uhasx(Condition cond, Register rd, Register rn, Register rm);
   1377 
   1378   void uhsax(Condition cond, Register rd, Register rn, Register rm);
   1379 
   1380   void uhsub16(Condition cond, Register rd, Register rn, Register rm);
   1381 
   1382   void uhsub8(Condition cond, Register rd, Register rn, Register rm);
   1383 
   1384   void umaal(
   1385       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm);
   1386 
   1387   void umlal(
   1388       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm);
   1389 
   1390   void umlals(
   1391       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm);
   1392 
   1393   void umull(
   1394       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm);
   1395 
   1396   void umulls(
   1397       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm);
   1398 
   1399   void uqadd16(Condition cond, Register rd, Register rn, Register rm);
   1400 
   1401   void uqadd8(Condition cond, Register rd, Register rn, Register rm);
   1402 
   1403   void uqasx(Condition cond, Register rd, Register rn, Register rm);
   1404 
   1405   void uqsax(Condition cond, Register rd, Register rn, Register rm);
   1406 
   1407   void uqsub16(Condition cond, Register rd, Register rn, Register rm);
   1408 
   1409   void uqsub8(Condition cond, Register rd, Register rn, Register rm);
   1410 
   1411   void usad8(Condition cond, Register rd, Register rn, Register rm);
   1412 
   1413   void usada8(
   1414       Condition cond, Register rd, Register rn, Register rm, Register ra);
   1415 
   1416   void usat(Condition cond, Register rd, uint32_t imm, const Operand& operand);
   1417 
   1418   void usat16(Condition cond, Register rd, uint32_t imm, Register rn);
   1419 
   1420   void usax(Condition cond, Register rd, Register rn, Register rm);
   1421 
   1422   void usub16(Condition cond, Register rd, Register rn, Register rm);
   1423 
   1424   void usub8(Condition cond, Register rd, Register rn, Register rm);
   1425 
   1426   void uxtab(Condition cond, Register rd, Register rn, const Operand& operand);
   1427 
   1428   void uxtab16(Condition cond,
   1429                Register rd,
   1430                Register rn,
   1431                const Operand& operand);
   1432 
   1433   void uxtah(Condition cond, Register rd, Register rn, const Operand& operand);
   1434 
   1435   void uxtb(Condition cond,
   1436             EncodingSize size,
   1437             Register rd,
   1438             const Operand& operand);
   1439 
   1440   void uxtb16(Condition cond, Register rd, const Operand& operand);
   1441 
   1442   void uxth(Condition cond,
   1443             EncodingSize size,
   1444             Register rd,
   1445             const Operand& operand);
   1446 
   1447   void vaba(
   1448       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1449 
   1450   void vaba(
   1451       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1452 
   1453   void vabal(
   1454       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm);
   1455 
   1456   void vabd(
   1457       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1458 
   1459   void vabd(
   1460       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1461 
   1462   void vabdl(
   1463       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm);
   1464 
   1465   void vabs(Condition cond, DataType dt, DRegister rd, DRegister rm);
   1466 
   1467   void vabs(Condition cond, DataType dt, QRegister rd, QRegister rm);
   1468 
   1469   void vabs(Condition cond, DataType dt, SRegister rd, SRegister rm);
   1470 
   1471   void vacge(
   1472       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1473 
   1474   void vacge(
   1475       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1476 
   1477   void vacgt(
   1478       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1479 
   1480   void vacgt(
   1481       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1482 
   1483   void vacle(
   1484       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1485 
   1486   void vacle(
   1487       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1488 
   1489   void vaclt(
   1490       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1491 
   1492   void vaclt(
   1493       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1494 
   1495   void vadd(
   1496       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1497 
   1498   void vadd(
   1499       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1500 
   1501   void vadd(
   1502       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm);
   1503 
   1504   void vaddhn(
   1505       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm);
   1506 
   1507   void vaddl(
   1508       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm);
   1509 
   1510   void vaddw(
   1511       Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm);
   1512 
   1513   void vand(Condition cond,
   1514             DataType dt,
   1515             DRegister rd,
   1516             DRegister rn,
   1517             const DOperand& operand);
   1518 
   1519   void vand(Condition cond,
   1520             DataType dt,
   1521             QRegister rd,
   1522             QRegister rn,
   1523             const QOperand& operand);
   1524 
   1525   void vbic(Condition cond,
   1526             DataType dt,
   1527             DRegister rd,
   1528             DRegister rn,
   1529             const DOperand& operand);
   1530 
   1531   void vbic(Condition cond,
   1532             DataType dt,
   1533             QRegister rd,
   1534             QRegister rn,
   1535             const QOperand& operand);
   1536 
   1537   void vbif(
   1538       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1539 
   1540   void vbif(
   1541       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1542 
   1543   void vbit(
   1544       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1545 
   1546   void vbit(
   1547       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1548 
   1549   void vbsl(
   1550       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1551 
   1552   void vbsl(
   1553       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1554 
   1555   void vceq(Condition cond,
   1556             DataType dt,
   1557             DRegister rd,
   1558             DRegister rm,
   1559             const DOperand& operand);
   1560 
   1561   void vceq(Condition cond,
   1562             DataType dt,
   1563             QRegister rd,
   1564             QRegister rm,
   1565             const QOperand& operand);
   1566 
   1567   void vceq(
   1568       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1569 
   1570   void vceq(
   1571       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1572 
   1573   void vcge(Condition cond,
   1574             DataType dt,
   1575             DRegister rd,
   1576             DRegister rm,
   1577             const DOperand& operand);
   1578 
   1579   void vcge(Condition cond,
   1580             DataType dt,
   1581             QRegister rd,
   1582             QRegister rm,
   1583             const QOperand& operand);
   1584 
   1585   void vcge(
   1586       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1587 
   1588   void vcge(
   1589       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1590 
   1591   void vcgt(Condition cond,
   1592             DataType dt,
   1593             DRegister rd,
   1594             DRegister rm,
   1595             const DOperand& operand);
   1596 
   1597   void vcgt(Condition cond,
   1598             DataType dt,
   1599             QRegister rd,
   1600             QRegister rm,
   1601             const QOperand& operand);
   1602 
   1603   void vcgt(
   1604       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1605 
   1606   void vcgt(
   1607       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1608 
   1609   void vcle(Condition cond,
   1610             DataType dt,
   1611             DRegister rd,
   1612             DRegister rm,
   1613             const DOperand& operand);
   1614 
   1615   void vcle(Condition cond,
   1616             DataType dt,
   1617             QRegister rd,
   1618             QRegister rm,
   1619             const QOperand& operand);
   1620 
   1621   void vcle(
   1622       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1623 
   1624   void vcle(
   1625       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1626 
   1627   void vcls(Condition cond, DataType dt, DRegister rd, DRegister rm);
   1628 
   1629   void vcls(Condition cond, DataType dt, QRegister rd, QRegister rm);
   1630 
   1631   void vclt(Condition cond,
   1632             DataType dt,
   1633             DRegister rd,
   1634             DRegister rm,
   1635             const DOperand& operand);
   1636 
   1637   void vclt(Condition cond,
   1638             DataType dt,
   1639             QRegister rd,
   1640             QRegister rm,
   1641             const QOperand& operand);
   1642 
   1643   void vclt(
   1644       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1645 
   1646   void vclt(
   1647       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1648 
   1649   void vclz(Condition cond, DataType dt, DRegister rd, DRegister rm);
   1650 
   1651   void vclz(Condition cond, DataType dt, QRegister rd, QRegister rm);
   1652 
   1653   void vcmp(Condition cond, DataType dt, SRegister rd, const SOperand& operand);
   1654 
   1655   void vcmp(Condition cond, DataType dt, DRegister rd, const DOperand& operand);
   1656 
   1657   void vcmpe(Condition cond,
   1658              DataType dt,
   1659              SRegister rd,
   1660              const SOperand& operand);
   1661 
   1662   void vcmpe(Condition cond,
   1663              DataType dt,
   1664              DRegister rd,
   1665              const DOperand& operand);
   1666 
   1667   void vcnt(Condition cond, DataType dt, DRegister rd, DRegister rm);
   1668 
   1669   void vcnt(Condition cond, DataType dt, QRegister rd, QRegister rm);
   1670 
   1671   void vcvt(
   1672       Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm);
   1673 
   1674   void vcvt(
   1675       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm);
   1676 
   1677   void vcvt(Condition cond,
   1678             DataType dt1,
   1679             DataType dt2,
   1680             DRegister rd,
   1681             DRegister rm,
   1682             int32_t fbits);
   1683 
   1684   void vcvt(Condition cond,
   1685             DataType dt1,
   1686             DataType dt2,
   1687             QRegister rd,
   1688             QRegister rm,
   1689             int32_t fbits);
   1690 
   1691   void vcvt(Condition cond,
   1692             DataType dt1,
   1693             DataType dt2,
   1694             SRegister rd,
   1695             SRegister rm,
   1696             int32_t fbits);
   1697 
   1698   void vcvt(
   1699       Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm);
   1700 
   1701   void vcvt(
   1702       Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm);
   1703 
   1704   void vcvt(
   1705       Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm);
   1706 
   1707   void vcvt(
   1708       Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm);
   1709 
   1710   void vcvt(
   1711       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm);
   1712 
   1713   void vcvta(DataType dt1, DataType dt2, DRegister rd, DRegister rm);
   1714 
   1715   void vcvta(DataType dt1, DataType dt2, QRegister rd, QRegister rm);
   1716 
   1717   void vcvta(DataType dt1, DataType dt2, SRegister rd, SRegister rm);
   1718 
   1719   void vcvta(DataType dt1, DataType dt2, SRegister rd, DRegister rm);
   1720 
   1721   void vcvtb(
   1722       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm);
   1723 
   1724   void vcvtb(
   1725       Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm);
   1726 
   1727   void vcvtb(
   1728       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm);
   1729 
   1730   void vcvtm(DataType dt1, DataType dt2, DRegister rd, DRegister rm);
   1731 
   1732   void vcvtm(DataType dt1, DataType dt2, QRegister rd, QRegister rm);
   1733 
   1734   void vcvtm(DataType dt1, DataType dt2, SRegister rd, SRegister rm);
   1735 
   1736   void vcvtm(DataType dt1, DataType dt2, SRegister rd, DRegister rm);
   1737 
   1738   void vcvtn(DataType dt1, DataType dt2, DRegister rd, DRegister rm);
   1739 
   1740   void vcvtn(DataType dt1, DataType dt2, QRegister rd, QRegister rm);
   1741 
   1742   void vcvtn(DataType dt1, DataType dt2, SRegister rd, SRegister rm);
   1743 
   1744   void vcvtn(DataType dt1, DataType dt2, SRegister rd, DRegister rm);
   1745 
   1746   void vcvtp(DataType dt1, DataType dt2, DRegister rd, DRegister rm);
   1747 
   1748   void vcvtp(DataType dt1, DataType dt2, QRegister rd, QRegister rm);
   1749 
   1750   void vcvtp(DataType dt1, DataType dt2, SRegister rd, SRegister rm);
   1751 
   1752   void vcvtp(DataType dt1, DataType dt2, SRegister rd, DRegister rm);
   1753 
   1754   void vcvtr(
   1755       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm);
   1756 
   1757   void vcvtr(
   1758       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm);
   1759 
   1760   void vcvtt(
   1761       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm);
   1762 
   1763   void vcvtt(
   1764       Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm);
   1765 
   1766   void vcvtt(
   1767       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm);
   1768 
   1769   void vdiv(
   1770       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm);
   1771 
   1772   void vdiv(
   1773       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1774 
   1775   void vdup(Condition cond, DataType dt, QRegister rd, Register rt);
   1776 
   1777   void vdup(Condition cond, DataType dt, DRegister rd, Register rt);
   1778 
   1779   void vdup(Condition cond, DataType dt, DRegister rd, DRegisterLane rm);
   1780 
   1781   void vdup(Condition cond, DataType dt, QRegister rd, DRegisterLane rm);
   1782 
   1783   void veor(
   1784       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1785 
   1786   void veor(
   1787       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1788 
   1789   void vext(Condition cond,
   1790             DataType dt,
   1791             DRegister rd,
   1792             DRegister rn,
   1793             DRegister rm,
   1794             const DOperand& operand);
   1795 
   1796   void vext(Condition cond,
   1797             DataType dt,
   1798             QRegister rd,
   1799             QRegister rn,
   1800             QRegister rm,
   1801             const QOperand& operand);
   1802 
   1803   void vfma(
   1804       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1805 
   1806   void vfma(
   1807       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1808 
   1809   void vfma(
   1810       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm);
   1811 
   1812   void vfms(
   1813       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1814 
   1815   void vfms(
   1816       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1817 
   1818   void vfms(
   1819       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm);
   1820 
   1821   void vfnma(
   1822       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm);
   1823 
   1824   void vfnma(
   1825       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1826 
   1827   void vfnms(
   1828       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm);
   1829 
   1830   void vfnms(
   1831       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1832 
   1833   void vhadd(
   1834       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1835 
   1836   void vhadd(
   1837       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1838 
   1839   void vhsub(
   1840       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1841 
   1842   void vhsub(
   1843       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1844 
   1845   void vld1(Condition cond,
   1846             DataType dt,
   1847             const NeonRegisterList& nreglist,
   1848             const AlignedMemOperand& operand);
   1849 
   1850   void vld2(Condition cond,
   1851             DataType dt,
   1852             const NeonRegisterList& nreglist,
   1853             const AlignedMemOperand& operand);
   1854 
   1855   void vld3(Condition cond,
   1856             DataType dt,
   1857             const NeonRegisterList& nreglist,
   1858             const AlignedMemOperand& operand);
   1859 
   1860   void vld3(Condition cond,
   1861             DataType dt,
   1862             const NeonRegisterList& nreglist,
   1863             const MemOperand& operand);
   1864 
   1865   void vld4(Condition cond,
   1866             DataType dt,
   1867             const NeonRegisterList& nreglist,
   1868             const AlignedMemOperand& operand);
   1869 
   1870   void vldm(Condition cond,
   1871             DataType dt,
   1872             Register rn,
   1873             WriteBack write_back,
   1874             DRegisterList dreglist);
   1875 
   1876   void vldm(Condition cond,
   1877             DataType dt,
   1878             Register rn,
   1879             WriteBack write_back,
   1880             SRegisterList sreglist);
   1881 
   1882   void vldmdb(Condition cond,
   1883               DataType dt,
   1884               Register rn,
   1885               WriteBack write_back,
   1886               DRegisterList dreglist);
   1887 
   1888   void vldmdb(Condition cond,
   1889               DataType dt,
   1890               Register rn,
   1891               WriteBack write_back,
   1892               SRegisterList sreglist);
   1893 
   1894   void vldmia(Condition cond,
   1895               DataType dt,
   1896               Register rn,
   1897               WriteBack write_back,
   1898               DRegisterList dreglist);
   1899 
   1900   void vldmia(Condition cond,
   1901               DataType dt,
   1902               Register rn,
   1903               WriteBack write_back,
   1904               SRegisterList sreglist);
   1905 
   1906   void vldr(Condition cond, DataType dt, DRegister rd, Location* location);
   1907 
   1908   void vldr(Condition cond,
   1909             DataType dt,
   1910             DRegister rd,
   1911             const MemOperand& operand);
   1912 
   1913   void vldr(Condition cond, DataType dt, SRegister rd, Location* location);
   1914 
   1915   void vldr(Condition cond,
   1916             DataType dt,
   1917             SRegister rd,
   1918             const MemOperand& operand);
   1919 
   1920   void vmax(
   1921       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1922 
   1923   void vmax(
   1924       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1925 
   1926   void vmaxnm(DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1927 
   1928   void vmaxnm(DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1929 
   1930   void vmaxnm(DataType dt, SRegister rd, SRegister rn, SRegister rm);
   1931 
   1932   void vmin(
   1933       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1934 
   1935   void vmin(
   1936       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1937 
   1938   void vminnm(DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1939 
   1940   void vminnm(DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1941 
   1942   void vminnm(DataType dt, SRegister rd, SRegister rn, SRegister rm);
   1943 
   1944   void vmla(Condition cond,
   1945             DataType dt,
   1946             DRegister rd,
   1947             DRegister rn,
   1948             DRegisterLane rm);
   1949 
   1950   void vmla(Condition cond,
   1951             DataType dt,
   1952             QRegister rd,
   1953             QRegister rn,
   1954             DRegisterLane rm);
   1955 
   1956   void vmla(
   1957       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1958 
   1959   void vmla(
   1960       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1961 
   1962   void vmla(
   1963       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm);
   1964 
   1965   void vmlal(Condition cond,
   1966              DataType dt,
   1967              QRegister rd,
   1968              DRegister rn,
   1969              DRegisterLane rm);
   1970 
   1971   void vmlal(
   1972       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm);
   1973 
   1974   void vmls(Condition cond,
   1975             DataType dt,
   1976             DRegister rd,
   1977             DRegister rn,
   1978             DRegisterLane rm);
   1979 
   1980   void vmls(Condition cond,
   1981             DataType dt,
   1982             QRegister rd,
   1983             QRegister rn,
   1984             DRegisterLane rm);
   1985 
   1986   void vmls(
   1987       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   1988 
   1989   void vmls(
   1990       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   1991 
   1992   void vmls(
   1993       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm);
   1994 
   1995   void vmlsl(Condition cond,
   1996              DataType dt,
   1997              QRegister rd,
   1998              DRegister rn,
   1999              DRegisterLane rm);
   2000 
   2001   void vmlsl(
   2002       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm);
   2003 
   2004   void vmov(Condition cond, Register rt, SRegister rn);
   2005 
   2006   void vmov(Condition cond, SRegister rn, Register rt);
   2007 
   2008   void vmov(Condition cond, Register rt, Register rt2, DRegister rm);
   2009 
   2010   void vmov(Condition cond, DRegister rm, Register rt, Register rt2);
   2011 
   2012   void vmov(
   2013       Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1);
   2014 
   2015   void vmov(
   2016       Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2);
   2017 
   2018   void vmov(Condition cond, DataType dt, DRegisterLane rd, Register rt);
   2019 
   2020   void vmov(Condition cond, DataType dt, DRegister rd, const DOperand& operand);
   2021 
   2022   void vmov(Condition cond, DataType dt, QRegister rd, const QOperand& operand);
   2023 
   2024   void vmov(Condition cond, DataType dt, SRegister rd, const SOperand& operand);
   2025 
   2026   void vmov(Condition cond, DataType dt, Register rt, DRegisterLane rn);
   2027 
   2028   void vmovl(Condition cond, DataType dt, QRegister rd, DRegister rm);
   2029 
   2030   void vmovn(Condition cond, DataType dt, DRegister rd, QRegister rm);
   2031 
   2032   void vmrs(Condition cond, RegisterOrAPSR_nzcv rt, SpecialFPRegister spec_reg);
   2033 
   2034   void vmsr(Condition cond, SpecialFPRegister spec_reg, Register rt);
   2035 
   2036   void vmul(Condition cond,
   2037             DataType dt,
   2038             DRegister rd,
   2039             DRegister rn,
   2040             DRegister dm,
   2041             unsigned index);
   2042 
   2043   void vmul(Condition cond,
   2044             DataType dt,
   2045             QRegister rd,
   2046             QRegister rn,
   2047             DRegister dm,
   2048             unsigned index);
   2049 
   2050   void vmul(
   2051       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2052 
   2053   void vmul(
   2054       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   2055 
   2056   void vmul(
   2057       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm);
   2058 
   2059   void vmull(Condition cond,
   2060              DataType dt,
   2061              QRegister rd,
   2062              DRegister rn,
   2063              DRegister dm,
   2064              unsigned index);
   2065 
   2066   void vmull(
   2067       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm);
   2068 
   2069   void vmvn(Condition cond, DataType dt, DRegister rd, const DOperand& operand);
   2070 
   2071   void vmvn(Condition cond, DataType dt, QRegister rd, const QOperand& operand);
   2072 
   2073   void vneg(Condition cond, DataType dt, DRegister rd, DRegister rm);
   2074 
   2075   void vneg(Condition cond, DataType dt, QRegister rd, QRegister rm);
   2076 
   2077   void vneg(Condition cond, DataType dt, SRegister rd, SRegister rm);
   2078 
   2079   void vnmla(
   2080       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm);
   2081 
   2082   void vnmla(
   2083       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2084 
   2085   void vnmls(
   2086       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm);
   2087 
   2088   void vnmls(
   2089       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2090 
   2091   void vnmul(
   2092       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm);
   2093 
   2094   void vnmul(
   2095       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2096 
   2097   void vorn(Condition cond,
   2098             DataType dt,
   2099             DRegister rd,
   2100             DRegister rn,
   2101             const DOperand& operand);
   2102 
   2103   void vorn(Condition cond,
   2104             DataType dt,
   2105             QRegister rd,
   2106             QRegister rn,
   2107             const QOperand& operand);
   2108 
   2109   void vorr(Condition cond,
   2110             DataType dt,
   2111             DRegister rd,
   2112             DRegister rn,
   2113             const DOperand& operand);
   2114 
   2115   void vorr(Condition cond,
   2116             DataType dt,
   2117             QRegister rd,
   2118             QRegister rn,
   2119             const QOperand& operand);
   2120 
   2121   void vpadal(Condition cond, DataType dt, DRegister rd, DRegister rm);
   2122 
   2123   void vpadal(Condition cond, DataType dt, QRegister rd, QRegister rm);
   2124 
   2125   void vpadd(
   2126       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2127 
   2128   void vpaddl(Condition cond, DataType dt, DRegister rd, DRegister rm);
   2129 
   2130   void vpaddl(Condition cond, DataType dt, QRegister rd, QRegister rm);
   2131 
   2132   void vpmax(
   2133       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2134 
   2135   void vpmin(
   2136       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2137 
   2138   void vpop(Condition cond, DataType dt, DRegisterList dreglist);
   2139 
   2140   void vpop(Condition cond, DataType dt, SRegisterList sreglist);
   2141 
   2142   void vpush(Condition cond, DataType dt, DRegisterList dreglist);
   2143 
   2144   void vpush(Condition cond, DataType dt, SRegisterList sreglist);
   2145 
   2146   void vqabs(Condition cond, DataType dt, DRegister rd, DRegister rm);
   2147 
   2148   void vqabs(Condition cond, DataType dt, QRegister rd, QRegister rm);
   2149 
   2150   void vqadd(
   2151       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2152 
   2153   void vqadd(
   2154       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   2155 
   2156   void vqdmlal(
   2157       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm);
   2158 
   2159   void vqdmlal(Condition cond,
   2160                DataType dt,
   2161                QRegister rd,
   2162                DRegister rn,
   2163                DRegister dm,
   2164                unsigned index);
   2165 
   2166   void vqdmlsl(
   2167       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm);
   2168 
   2169   void vqdmlsl(Condition cond,
   2170                DataType dt,
   2171                QRegister rd,
   2172                DRegister rn,
   2173                DRegister dm,
   2174                unsigned index);
   2175 
   2176   void vqdmulh(
   2177       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2178 
   2179   void vqdmulh(
   2180       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   2181 
   2182   void vqdmulh(Condition cond,
   2183                DataType dt,
   2184                DRegister rd,
   2185                DRegister rn,
   2186                DRegisterLane rm);
   2187 
   2188   void vqdmulh(Condition cond,
   2189                DataType dt,
   2190                QRegister rd,
   2191                QRegister rn,
   2192                DRegisterLane rm);
   2193 
   2194   void vqdmull(
   2195       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm);
   2196 
   2197   void vqdmull(Condition cond,
   2198                DataType dt,
   2199                QRegister rd,
   2200                DRegister rn,
   2201                DRegisterLane rm);
   2202 
   2203   void vqmovn(Condition cond, DataType dt, DRegister rd, QRegister rm);
   2204 
   2205   void vqmovun(Condition cond, DataType dt, DRegister rd, QRegister rm);
   2206 
   2207   void vqneg(Condition cond, DataType dt, DRegister rd, DRegister rm);
   2208 
   2209   void vqneg(Condition cond, DataType dt, QRegister rd, QRegister rm);
   2210 
   2211   void vqrdmulh(
   2212       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2213 
   2214   void vqrdmulh(
   2215       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   2216 
   2217   void vqrdmulh(Condition cond,
   2218                 DataType dt,
   2219                 DRegister rd,
   2220                 DRegister rn,
   2221                 DRegisterLane rm);
   2222 
   2223   void vqrdmulh(Condition cond,
   2224                 DataType dt,
   2225                 QRegister rd,
   2226                 QRegister rn,
   2227                 DRegisterLane rm);
   2228 
   2229   void vqrshl(
   2230       Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn);
   2231 
   2232   void vqrshl(
   2233       Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn);
   2234 
   2235   void vqrshrn(Condition cond,
   2236                DataType dt,
   2237                DRegister rd,
   2238                QRegister rm,
   2239                const QOperand& operand);
   2240 
   2241   void vqrshrun(Condition cond,
   2242                 DataType dt,
   2243                 DRegister rd,
   2244                 QRegister rm,
   2245                 const QOperand& operand);
   2246 
   2247   void vqshl(Condition cond,
   2248              DataType dt,
   2249              DRegister rd,
   2250              DRegister rm,
   2251              const DOperand& operand);
   2252 
   2253   void vqshl(Condition cond,
   2254              DataType dt,
   2255              QRegister rd,
   2256              QRegister rm,
   2257              const QOperand& operand);
   2258 
   2259   void vqshlu(Condition cond,
   2260               DataType dt,
   2261               DRegister rd,
   2262               DRegister rm,
   2263               const DOperand& operand);
   2264 
   2265   void vqshlu(Condition cond,
   2266               DataType dt,
   2267               QRegister rd,
   2268               QRegister rm,
   2269               const QOperand& operand);
   2270 
   2271   void vqshrn(Condition cond,
   2272               DataType dt,
   2273               DRegister rd,
   2274               QRegister rm,
   2275               const QOperand& operand);
   2276 
   2277   void vqshrun(Condition cond,
   2278                DataType dt,
   2279                DRegister rd,
   2280                QRegister rm,
   2281                const QOperand& operand);
   2282 
   2283   void vqsub(
   2284       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2285 
   2286   void vqsub(
   2287       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   2288 
   2289   void vraddhn(
   2290       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm);
   2291 
   2292   void vrecpe(Condition cond, DataType dt, DRegister rd, DRegister rm);
   2293 
   2294   void vrecpe(Condition cond, DataType dt, QRegister rd, QRegister rm);
   2295 
   2296   void vrecps(
   2297       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2298 
   2299   void vrecps(
   2300       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   2301 
   2302   void vrev16(Condition cond, DataType dt, DRegister rd, DRegister rm);
   2303 
   2304   void vrev16(Condition cond, DataType dt, QRegister rd, QRegister rm);
   2305 
   2306   void vrev32(Condition cond, DataType dt, DRegister rd, DRegister rm);
   2307 
   2308   void vrev32(Condition cond, DataType dt, QRegister rd, QRegister rm);
   2309 
   2310   void vrev64(Condition cond, DataType dt, DRegister rd, DRegister rm);
   2311 
   2312   void vrev64(Condition cond, DataType dt, QRegister rd, QRegister rm);
   2313 
   2314   void vrhadd(
   2315       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2316 
   2317   void vrhadd(
   2318       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   2319 
   2320   void vrinta(DataType dt1, DataType dt2, DRegister rd, DRegister rm);
   2321 
   2322   void vrinta(DataType dt1, DataType dt2, QRegister rd, QRegister rm);
   2323 
   2324   void vrinta(DataType dt1, DataType dt2, SRegister rd, SRegister rm);
   2325 
   2326   void vrintm(DataType dt1, DataType dt2, DRegister rd, DRegister rm);
   2327 
   2328   void vrintm(DataType dt1, DataType dt2, QRegister rd, QRegister rm);
   2329 
   2330   void vrintm(DataType dt1, DataType dt2, SRegister rd, SRegister rm);
   2331 
   2332   void vrintn(DataType dt1, DataType dt2, DRegister rd, DRegister rm);
   2333 
   2334   void vrintn(DataType dt1, DataType dt2, QRegister rd, QRegister rm);
   2335 
   2336   void vrintn(DataType dt1, DataType dt2, SRegister rd, SRegister rm);
   2337 
   2338   void vrintp(DataType dt1, DataType dt2, DRegister rd, DRegister rm);
   2339 
   2340   void vrintp(DataType dt1, DataType dt2, QRegister rd, QRegister rm);
   2341 
   2342   void vrintp(DataType dt1, DataType dt2, SRegister rd, SRegister rm);
   2343 
   2344   void vrintr(
   2345       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm);
   2346 
   2347   void vrintr(
   2348       Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm);
   2349 
   2350   void vrintx(
   2351       Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm);
   2352 
   2353   void vrintx(DataType dt1, DataType dt2, QRegister rd, QRegister rm);
   2354 
   2355   void vrintx(
   2356       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm);
   2357 
   2358   void vrintz(
   2359       Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm);
   2360 
   2361   void vrintz(DataType dt1, DataType dt2, QRegister rd, QRegister rm);
   2362 
   2363   void vrintz(
   2364       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm);
   2365 
   2366   void vrshl(
   2367       Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn);
   2368 
   2369   void vrshl(
   2370       Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn);
   2371 
   2372   void vrshr(Condition cond,
   2373              DataType dt,
   2374              DRegister rd,
   2375              DRegister rm,
   2376              const DOperand& operand);
   2377 
   2378   void vrshr(Condition cond,
   2379              DataType dt,
   2380              QRegister rd,
   2381              QRegister rm,
   2382              const QOperand& operand);
   2383 
   2384   void vrshrn(Condition cond,
   2385               DataType dt,
   2386               DRegister rd,
   2387               QRegister rm,
   2388               const QOperand& operand);
   2389 
   2390   void vrsqrte(Condition cond, DataType dt, DRegister rd, DRegister rm);
   2391 
   2392   void vrsqrte(Condition cond, DataType dt, QRegister rd, QRegister rm);
   2393 
   2394   void vrsqrts(
   2395       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2396 
   2397   void vrsqrts(
   2398       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   2399 
   2400   void vrsra(Condition cond,
   2401              DataType dt,
   2402              DRegister rd,
   2403              DRegister rm,
   2404              const DOperand& operand);
   2405 
   2406   void vrsra(Condition cond,
   2407              DataType dt,
   2408              QRegister rd,
   2409              QRegister rm,
   2410              const QOperand& operand);
   2411 
   2412   void vrsubhn(
   2413       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm);
   2414 
   2415   void vseleq(DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2416 
   2417   void vseleq(DataType dt, SRegister rd, SRegister rn, SRegister rm);
   2418 
   2419   void vselge(DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2420 
   2421   void vselge(DataType dt, SRegister rd, SRegister rn, SRegister rm);
   2422 
   2423   void vselgt(DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2424 
   2425   void vselgt(DataType dt, SRegister rd, SRegister rn, SRegister rm);
   2426 
   2427   void vselvs(DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2428 
   2429   void vselvs(DataType dt, SRegister rd, SRegister rn, SRegister rm);
   2430 
   2431   void vshl(Condition cond,
   2432             DataType dt,
   2433             DRegister rd,
   2434             DRegister rm,
   2435             const DOperand& operand);
   2436 
   2437   void vshl(Condition cond,
   2438             DataType dt,
   2439             QRegister rd,
   2440             QRegister rm,
   2441             const QOperand& operand);
   2442 
   2443   void vshll(Condition cond,
   2444              DataType dt,
   2445              QRegister rd,
   2446              DRegister rm,
   2447              const DOperand& operand);
   2448 
   2449   void vshr(Condition cond,
   2450             DataType dt,
   2451             DRegister rd,
   2452             DRegister rm,
   2453             const DOperand& operand);
   2454 
   2455   void vshr(Condition cond,
   2456             DataType dt,
   2457             QRegister rd,
   2458             QRegister rm,
   2459             const QOperand& operand);
   2460 
   2461   void vshrn(Condition cond,
   2462              DataType dt,
   2463              DRegister rd,
   2464              QRegister rm,
   2465              const QOperand& operand);
   2466 
   2467   void vsli(Condition cond,
   2468             DataType dt,
   2469             DRegister rd,
   2470             DRegister rm,
   2471             const DOperand& operand);
   2472 
   2473   void vsli(Condition cond,
   2474             DataType dt,
   2475             QRegister rd,
   2476             QRegister rm,
   2477             const QOperand& operand);
   2478 
   2479   void vsqrt(Condition cond, DataType dt, SRegister rd, SRegister rm);
   2480 
   2481   void vsqrt(Condition cond, DataType dt, DRegister rd, DRegister rm);
   2482 
   2483   void vsra(Condition cond,
   2484             DataType dt,
   2485             DRegister rd,
   2486             DRegister rm,
   2487             const DOperand& operand);
   2488 
   2489   void vsra(Condition cond,
   2490             DataType dt,
   2491             QRegister rd,
   2492             QRegister rm,
   2493             const QOperand& operand);
   2494 
   2495   void vsri(Condition cond,
   2496             DataType dt,
   2497             DRegister rd,
   2498             DRegister rm,
   2499             const DOperand& operand);
   2500 
   2501   void vsri(Condition cond,
   2502             DataType dt,
   2503             QRegister rd,
   2504             QRegister rm,
   2505             const QOperand& operand);
   2506 
   2507   void vst1(Condition cond,
   2508             DataType dt,
   2509             const NeonRegisterList& nreglist,
   2510             const AlignedMemOperand& operand);
   2511 
   2512   void vst2(Condition cond,
   2513             DataType dt,
   2514             const NeonRegisterList& nreglist,
   2515             const AlignedMemOperand& operand);
   2516 
   2517   void vst3(Condition cond,
   2518             DataType dt,
   2519             const NeonRegisterList& nreglist,
   2520             const AlignedMemOperand& operand);
   2521 
   2522   void vst3(Condition cond,
   2523             DataType dt,
   2524             const NeonRegisterList& nreglist,
   2525             const MemOperand& operand);
   2526 
   2527   void vst4(Condition cond,
   2528             DataType dt,
   2529             const NeonRegisterList& nreglist,
   2530             const AlignedMemOperand& operand);
   2531 
   2532   void vstm(Condition cond,
   2533             DataType dt,
   2534             Register rn,
   2535             WriteBack write_back,
   2536             DRegisterList dreglist);
   2537 
   2538   void vstm(Condition cond,
   2539             DataType dt,
   2540             Register rn,
   2541             WriteBack write_back,
   2542             SRegisterList sreglist);
   2543 
   2544   void vstmdb(Condition cond,
   2545               DataType dt,
   2546               Register rn,
   2547               WriteBack write_back,
   2548               DRegisterList dreglist);
   2549 
   2550   void vstmdb(Condition cond,
   2551               DataType dt,
   2552               Register rn,
   2553               WriteBack write_back,
   2554               SRegisterList sreglist);
   2555 
   2556   void vstmia(Condition cond,
   2557               DataType dt,
   2558               Register rn,
   2559               WriteBack write_back,
   2560               DRegisterList dreglist);
   2561 
   2562   void vstmia(Condition cond,
   2563               DataType dt,
   2564               Register rn,
   2565               WriteBack write_back,
   2566               SRegisterList sreglist);
   2567 
   2568   void vstr(Condition cond,
   2569             DataType dt,
   2570             DRegister rd,
   2571             const MemOperand& operand);
   2572 
   2573   void vstr(Condition cond,
   2574             DataType dt,
   2575             SRegister rd,
   2576             const MemOperand& operand);
   2577 
   2578   void vsub(
   2579       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2580 
   2581   void vsub(
   2582       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   2583 
   2584   void vsub(
   2585       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm);
   2586 
   2587   void vsubhn(
   2588       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm);
   2589 
   2590   void vsubl(
   2591       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm);
   2592 
   2593   void vsubw(
   2594       Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm);
   2595 
   2596   void vswp(Condition cond, DataType dt, DRegister rd, DRegister rm);
   2597 
   2598   void vswp(Condition cond, DataType dt, QRegister rd, QRegister rm);
   2599 
   2600   void vtbl(Condition cond,
   2601             DataType dt,
   2602             DRegister rd,
   2603             const NeonRegisterList& nreglist,
   2604             DRegister rm);
   2605 
   2606   void vtbx(Condition cond,
   2607             DataType dt,
   2608             DRegister rd,
   2609             const NeonRegisterList& nreglist,
   2610             DRegister rm);
   2611 
   2612   void vtrn(Condition cond, DataType dt, DRegister rd, DRegister rm);
   2613 
   2614   void vtrn(Condition cond, DataType dt, QRegister rd, QRegister rm);
   2615 
   2616   void vtst(
   2617       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm);
   2618 
   2619   void vtst(
   2620       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm);
   2621 
   2622   void vuzp(Condition cond, DataType dt, DRegister rd, DRegister rm);
   2623 
   2624   void vuzp(Condition cond, DataType dt, QRegister rd, QRegister rm);
   2625 
   2626   void vzip(Condition cond, DataType dt, DRegister rd, DRegister rm);
   2627 
   2628   void vzip(Condition cond, DataType dt, QRegister rd, QRegister rm);
   2629 
   2630   void yield(Condition cond, EncodingSize size);
   2631 
   2632   int T32Size(uint32_t instr);
   2633   void DecodeT32(uint32_t instr);
   2634   void DecodeA32(uint32_t instr);
   2635 };
   2636 
   2637 DataTypeValue Dt_L_imm6_1_Decode(uint32_t value, uint32_t type_value);
   2638 DataTypeValue Dt_L_imm6_2_Decode(uint32_t value, uint32_t type_value);
   2639 DataTypeValue Dt_L_imm6_3_Decode(uint32_t value);
   2640 DataTypeValue Dt_L_imm6_4_Decode(uint32_t value);
   2641 DataTypeValue Dt_imm6_1_Decode(uint32_t value, uint32_t type_value);
   2642 DataTypeValue Dt_imm6_2_Decode(uint32_t value, uint32_t type_value);
   2643 DataTypeValue Dt_imm6_3_Decode(uint32_t value);
   2644 DataTypeValue Dt_imm6_4_Decode(uint32_t value, uint32_t type_value);
   2645 DataTypeValue Dt_op_U_size_1_Decode(uint32_t value);
   2646 DataTypeValue Dt_op_size_1_Decode(uint32_t value);
   2647 DataTypeValue Dt_op_size_2_Decode(uint32_t value);
   2648 DataTypeValue Dt_op_size_3_Decode(uint32_t value);
   2649 DataTypeValue Dt_U_imm3H_1_Decode(uint32_t value);
   2650 DataTypeValue Dt_U_opc1_opc2_1_Decode(uint32_t value, unsigned* lane);
   2651 DataTypeValue Dt_opc1_opc2_1_Decode(uint32_t value, unsigned* lane);
   2652 DataTypeValue Dt_imm4_1_Decode(uint32_t value, unsigned* lane);
   2653 DataTypeValue Dt_B_E_1_Decode(uint32_t value);
   2654 DataTypeValue Dt_op_1_Decode1(uint32_t value);
   2655 DataTypeValue Dt_op_1_Decode2(uint32_t value);
   2656 DataTypeValue Dt_op_2_Decode(uint32_t value);
   2657 DataTypeValue Dt_op_3_Decode(uint32_t value);
   2658 DataTypeValue Dt_U_sx_1_Decode(uint32_t value);
   2659 DataTypeValue Dt_op_U_1_Decode1(uint32_t value);
   2660 DataTypeValue Dt_op_U_1_Decode2(uint32_t value);
   2661 DataTypeValue Dt_sz_1_Decode(uint32_t value);
   2662 DataTypeValue Dt_F_size_1_Decode(uint32_t value);
   2663 DataTypeValue Dt_F_size_2_Decode(uint32_t value);
   2664 DataTypeValue Dt_F_size_3_Decode(uint32_t value);
   2665 DataTypeValue Dt_F_size_4_Decode(uint32_t value);
   2666 DataTypeValue Dt_U_size_1_Decode(uint32_t value);
   2667 DataTypeValue Dt_U_size_2_Decode(uint32_t value);
   2668 DataTypeValue Dt_U_size_3_Decode(uint32_t value);
   2669 DataTypeValue Dt_size_1_Decode(uint32_t value);
   2670 DataTypeValue Dt_size_2_Decode(uint32_t value);
   2671 DataTypeValue Dt_size_3_Decode(uint32_t value);
   2672 DataTypeValue Dt_size_4_Decode(uint32_t value);
   2673 DataTypeValue Dt_size_5_Decode(uint32_t value);
   2674 DataTypeValue Dt_size_6_Decode(uint32_t value);
   2675 DataTypeValue Dt_size_7_Decode(uint32_t value);
   2676 DataTypeValue Dt_size_8_Decode(uint32_t value);
   2677 DataTypeValue Dt_size_9_Decode(uint32_t value, uint32_t type_value);
   2678 DataTypeValue Dt_size_10_Decode(uint32_t value);
   2679 DataTypeValue Dt_size_11_Decode(uint32_t value, uint32_t type_value);
   2680 DataTypeValue Dt_size_12_Decode(uint32_t value, uint32_t type_value);
   2681 DataTypeValue Dt_size_13_Decode(uint32_t value);
   2682 DataTypeValue Dt_size_14_Decode(uint32_t value);
   2683 DataTypeValue Dt_size_15_Decode(uint32_t value);
   2684 DataTypeValue Dt_size_16_Decode(uint32_t value);
   2685 // End of generated code.
   2686 
   2687 class PrintDisassembler : public Disassembler {
   2688  public:
   2689   explicit PrintDisassembler(std::ostream& os,  // NOLINT(runtime/references)
   2690                              uint32_t code_address = 0)
   2691       : Disassembler(os, code_address) {}
   2692   explicit PrintDisassembler(DisassemblerStream* os, uint32_t code_address = 0)
   2693       : Disassembler(os, code_address) {}
   2694 
   2695   virtual void PrintCodeAddress(uint32_t code_address) {
   2696     os() << "0x" << std::hex << std::setw(8) << std::setfill('0')
   2697          << code_address << "\t";
   2698   }
   2699 
   2700   virtual void PrintOpcode16(uint32_t opcode) {
   2701     os() << std::hex << std::setw(4) << std::setfill('0') << opcode << "    "
   2702          << std::dec << "\t";
   2703   }
   2704 
   2705   virtual void PrintOpcode32(uint32_t opcode) {
   2706     os() << std::hex << std::setw(8) << std::setfill('0') << opcode << std::dec
   2707          << "\t";
   2708   }
   2709 
   2710   const uint32_t* DecodeA32At(const uint32_t* instruction_address) {
   2711     DecodeA32(*instruction_address);
   2712     return instruction_address + 1;
   2713   }
   2714 
   2715   // Returns the address of the next instruction.
   2716   const uint16_t* DecodeT32At(const uint16_t* instruction_address,
   2717                               const uint16_t* buffer_end);
   2718   void DecodeT32(uint32_t instruction);
   2719   void DecodeA32(uint32_t instruction);
   2720   void DisassembleA32Buffer(const uint32_t* buffer, size_t size_in_bytes);
   2721   void DisassembleT32Buffer(const uint16_t* buffer, size_t size_in_bytes);
   2722 };
   2723 
   2724 }  // namespace aarch32
   2725 }  // namespace vixl
   2726 
   2727 #endif  // VIXL_DISASM_AARCH32_H_
   2728