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