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