xref: /aosp_15_r20/external/vixl/src/aarch64/macro-assembler-aarch64.h (revision f5c631da2f1efdd72b5fd1e20510e4042af13d77)
1*f5c631daSSadaf Ebrahimi // Copyright 2015, 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_AARCH64_MACRO_ASSEMBLER_AARCH64_H_
28*f5c631daSSadaf Ebrahimi #define VIXL_AARCH64_MACRO_ASSEMBLER_AARCH64_H_
29*f5c631daSSadaf Ebrahimi 
30*f5c631daSSadaf Ebrahimi #include <algorithm>
31*f5c631daSSadaf Ebrahimi #include <limits>
32*f5c631daSSadaf Ebrahimi 
33*f5c631daSSadaf Ebrahimi #include "../code-generation-scopes-vixl.h"
34*f5c631daSSadaf Ebrahimi #include "../globals-vixl.h"
35*f5c631daSSadaf Ebrahimi #include "../macro-assembler-interface.h"
36*f5c631daSSadaf Ebrahimi 
37*f5c631daSSadaf Ebrahimi #include "assembler-aarch64.h"
38*f5c631daSSadaf Ebrahimi // Required for runtime call support.
39*f5c631daSSadaf Ebrahimi // TODO: Break this dependency. We should be able to separate out the necessary
40*f5c631daSSadaf Ebrahimi // parts so that we don't need to include the whole simulator header.
41*f5c631daSSadaf Ebrahimi #include "simulator-aarch64.h"
42*f5c631daSSadaf Ebrahimi // Required in order to generate debugging instructions for the simulator. This
43*f5c631daSSadaf Ebrahimi // is needed regardless of whether the simulator is included or not, since
44*f5c631daSSadaf Ebrahimi // generating simulator specific instructions is controlled at runtime.
45*f5c631daSSadaf Ebrahimi #include "simulator-constants-aarch64.h"
46*f5c631daSSadaf Ebrahimi 
47*f5c631daSSadaf Ebrahimi 
48*f5c631daSSadaf Ebrahimi #define LS_MACRO_LIST(V)                                     \
49*f5c631daSSadaf Ebrahimi   V(Ldrb, Register&, rt, LDRB_w)                             \
50*f5c631daSSadaf Ebrahimi   V(Strb, Register&, rt, STRB_w)                             \
51*f5c631daSSadaf Ebrahimi   V(Ldrsb, Register&, rt, rt.Is64Bits() ? LDRSB_x : LDRSB_w) \
52*f5c631daSSadaf Ebrahimi   V(Ldrh, Register&, rt, LDRH_w)                             \
53*f5c631daSSadaf Ebrahimi   V(Strh, Register&, rt, STRH_w)                             \
54*f5c631daSSadaf Ebrahimi   V(Ldrsh, Register&, rt, rt.Is64Bits() ? LDRSH_x : LDRSH_w) \
55*f5c631daSSadaf Ebrahimi   V(Ldr, CPURegister&, rt, LoadOpFor(rt))                    \
56*f5c631daSSadaf Ebrahimi   V(Str, CPURegister&, rt, StoreOpFor(rt))                   \
57*f5c631daSSadaf Ebrahimi   V(Ldrsw, Register&, rt, LDRSW_x)
58*f5c631daSSadaf Ebrahimi 
59*f5c631daSSadaf Ebrahimi 
60*f5c631daSSadaf Ebrahimi #define LSPAIR_MACRO_LIST(V)                             \
61*f5c631daSSadaf Ebrahimi   V(Ldp, CPURegister&, rt, rt2, LoadPairOpFor(rt, rt2))  \
62*f5c631daSSadaf Ebrahimi   V(Stp, CPURegister&, rt, rt2, StorePairOpFor(rt, rt2)) \
63*f5c631daSSadaf Ebrahimi   V(Ldpsw, Register&, rt, rt2, LDPSW_x)
64*f5c631daSSadaf Ebrahimi 
65*f5c631daSSadaf Ebrahimi namespace vixl {
66*f5c631daSSadaf Ebrahimi namespace aarch64 {
67*f5c631daSSadaf Ebrahimi 
68*f5c631daSSadaf Ebrahimi // Forward declaration
69*f5c631daSSadaf Ebrahimi class MacroAssembler;
70*f5c631daSSadaf Ebrahimi class UseScratchRegisterScope;
71*f5c631daSSadaf Ebrahimi 
72*f5c631daSSadaf Ebrahimi class Pool {
73*f5c631daSSadaf Ebrahimi  public:
Pool(MacroAssembler * masm)74*f5c631daSSadaf Ebrahimi   explicit Pool(MacroAssembler* masm)
75*f5c631daSSadaf Ebrahimi       : checkpoint_(kNoCheckpointRequired), masm_(masm) {
76*f5c631daSSadaf Ebrahimi     Reset();
77*f5c631daSSadaf Ebrahimi   }
78*f5c631daSSadaf Ebrahimi 
Reset()79*f5c631daSSadaf Ebrahimi   void Reset() {
80*f5c631daSSadaf Ebrahimi     checkpoint_ = kNoCheckpointRequired;
81*f5c631daSSadaf Ebrahimi     monitor_ = 0;
82*f5c631daSSadaf Ebrahimi   }
83*f5c631daSSadaf Ebrahimi 
Block()84*f5c631daSSadaf Ebrahimi   void Block() { monitor_++; }
85*f5c631daSSadaf Ebrahimi   void Release();
IsBlocked()86*f5c631daSSadaf Ebrahimi   bool IsBlocked() const { return monitor_ != 0; }
87*f5c631daSSadaf Ebrahimi 
88*f5c631daSSadaf Ebrahimi   static const ptrdiff_t kNoCheckpointRequired = PTRDIFF_MAX;
89*f5c631daSSadaf Ebrahimi 
90*f5c631daSSadaf Ebrahimi   void SetNextCheckpoint(ptrdiff_t checkpoint);
GetCheckpoint()91*f5c631daSSadaf Ebrahimi   ptrdiff_t GetCheckpoint() const { return checkpoint_; }
92*f5c631daSSadaf Ebrahimi   VIXL_DEPRECATED("GetCheckpoint", ptrdiff_t checkpoint() const) {
93*f5c631daSSadaf Ebrahimi     return GetCheckpoint();
94*f5c631daSSadaf Ebrahimi   }
95*f5c631daSSadaf Ebrahimi 
96*f5c631daSSadaf Ebrahimi   enum EmitOption { kBranchRequired, kNoBranchRequired };
97*f5c631daSSadaf Ebrahimi 
98*f5c631daSSadaf Ebrahimi  protected:
99*f5c631daSSadaf Ebrahimi   // Next buffer offset at which a check is required for this pool.
100*f5c631daSSadaf Ebrahimi   ptrdiff_t checkpoint_;
101*f5c631daSSadaf Ebrahimi   // Indicates whether the emission of this pool is blocked.
102*f5c631daSSadaf Ebrahimi   int monitor_;
103*f5c631daSSadaf Ebrahimi   // The MacroAssembler using this pool.
104*f5c631daSSadaf Ebrahimi   MacroAssembler* masm_;
105*f5c631daSSadaf Ebrahimi };
106*f5c631daSSadaf Ebrahimi 
107*f5c631daSSadaf Ebrahimi 
108*f5c631daSSadaf Ebrahimi class LiteralPool : public Pool {
109*f5c631daSSadaf Ebrahimi  public:
110*f5c631daSSadaf Ebrahimi   explicit LiteralPool(MacroAssembler* masm);
111*f5c631daSSadaf Ebrahimi   ~LiteralPool() VIXL_NEGATIVE_TESTING_ALLOW_EXCEPTION;
112*f5c631daSSadaf Ebrahimi   void Reset();
113*f5c631daSSadaf Ebrahimi 
114*f5c631daSSadaf Ebrahimi   void AddEntry(RawLiteral* literal);
IsEmpty()115*f5c631daSSadaf Ebrahimi   bool IsEmpty() const { return entries_.empty(); }
116*f5c631daSSadaf Ebrahimi   size_t GetSize() const;
117*f5c631daSSadaf Ebrahimi   VIXL_DEPRECATED("GetSize", size_t Size() const) { return GetSize(); }
118*f5c631daSSadaf Ebrahimi 
119*f5c631daSSadaf Ebrahimi   size_t GetMaxSize() const;
120*f5c631daSSadaf Ebrahimi   VIXL_DEPRECATED("GetMaxSize", size_t MaxSize() const) { return GetMaxSize(); }
121*f5c631daSSadaf Ebrahimi 
122*f5c631daSSadaf Ebrahimi   size_t GetOtherPoolsMaxSize() const;
123*f5c631daSSadaf Ebrahimi   VIXL_DEPRECATED("GetOtherPoolsMaxSize", size_t OtherPoolsMaxSize() const) {
124*f5c631daSSadaf Ebrahimi     return GetOtherPoolsMaxSize();
125*f5c631daSSadaf Ebrahimi   }
126*f5c631daSSadaf Ebrahimi 
127*f5c631daSSadaf Ebrahimi   void CheckEmitFor(size_t amount, EmitOption option = kBranchRequired);
128*f5c631daSSadaf Ebrahimi   // Check whether we need to emit the literal pool in order to be able to
129*f5c631daSSadaf Ebrahimi   // safely emit a branch with a given range.
130*f5c631daSSadaf Ebrahimi   void CheckEmitForBranch(size_t range);
131*f5c631daSSadaf Ebrahimi   void Emit(EmitOption option = kNoBranchRequired);
132*f5c631daSSadaf Ebrahimi 
133*f5c631daSSadaf Ebrahimi   void SetNextRecommendedCheckpoint(ptrdiff_t offset);
134*f5c631daSSadaf Ebrahimi   ptrdiff_t GetNextRecommendedCheckpoint();
135*f5c631daSSadaf Ebrahimi   VIXL_DEPRECATED("GetNextRecommendedCheckpoint",
136*f5c631daSSadaf Ebrahimi                   ptrdiff_t NextRecommendedCheckpoint()) {
137*f5c631daSSadaf Ebrahimi     return GetNextRecommendedCheckpoint();
138*f5c631daSSadaf Ebrahimi   }
139*f5c631daSSadaf Ebrahimi 
140*f5c631daSSadaf Ebrahimi   void UpdateFirstUse(ptrdiff_t use_position);
141*f5c631daSSadaf Ebrahimi 
DeleteOnDestruction(RawLiteral * literal)142*f5c631daSSadaf Ebrahimi   void DeleteOnDestruction(RawLiteral* literal) {
143*f5c631daSSadaf Ebrahimi     deleted_on_destruction_.push_back(literal);
144*f5c631daSSadaf Ebrahimi   }
145*f5c631daSSadaf Ebrahimi 
146*f5c631daSSadaf Ebrahimi   // Recommended not exact since the pool can be blocked for short periods.
147*f5c631daSSadaf Ebrahimi   static const ptrdiff_t kRecommendedLiteralPoolRange = 128 * KBytes;
148*f5c631daSSadaf Ebrahimi 
149*f5c631daSSadaf Ebrahimi  private:
150*f5c631daSSadaf Ebrahimi   std::vector<RawLiteral*> entries_;
151*f5c631daSSadaf Ebrahimi   size_t size_;
152*f5c631daSSadaf Ebrahimi   ptrdiff_t first_use_;
153*f5c631daSSadaf Ebrahimi   // The parent class `Pool` provides a `checkpoint_`, which is the buffer
154*f5c631daSSadaf Ebrahimi   // offset before which a check *must* occur. This recommended checkpoint
155*f5c631daSSadaf Ebrahimi   // indicates when we would like to start emitting the constant pool. The
156*f5c631daSSadaf Ebrahimi   // MacroAssembler can, but does not have to, check the buffer when the
157*f5c631daSSadaf Ebrahimi   // checkpoint is reached.
158*f5c631daSSadaf Ebrahimi   ptrdiff_t recommended_checkpoint_;
159*f5c631daSSadaf Ebrahimi 
160*f5c631daSSadaf Ebrahimi   std::vector<RawLiteral*> deleted_on_destruction_;
161*f5c631daSSadaf Ebrahimi };
162*f5c631daSSadaf Ebrahimi 
163*f5c631daSSadaf Ebrahimi 
GetSize()164*f5c631daSSadaf Ebrahimi inline size_t LiteralPool::GetSize() const {
165*f5c631daSSadaf Ebrahimi   // Account for the pool header.
166*f5c631daSSadaf Ebrahimi   return size_ + kInstructionSize;
167*f5c631daSSadaf Ebrahimi }
168*f5c631daSSadaf Ebrahimi 
169*f5c631daSSadaf Ebrahimi 
GetMaxSize()170*f5c631daSSadaf Ebrahimi inline size_t LiteralPool::GetMaxSize() const {
171*f5c631daSSadaf Ebrahimi   // Account for the potential branch over the pool.
172*f5c631daSSadaf Ebrahimi   return GetSize() + kInstructionSize;
173*f5c631daSSadaf Ebrahimi }
174*f5c631daSSadaf Ebrahimi 
175*f5c631daSSadaf Ebrahimi 
GetNextRecommendedCheckpoint()176*f5c631daSSadaf Ebrahimi inline ptrdiff_t LiteralPool::GetNextRecommendedCheckpoint() {
177*f5c631daSSadaf Ebrahimi   return first_use_ + kRecommendedLiteralPoolRange;
178*f5c631daSSadaf Ebrahimi }
179*f5c631daSSadaf Ebrahimi 
180*f5c631daSSadaf Ebrahimi 
181*f5c631daSSadaf Ebrahimi class VeneerPool : public Pool {
182*f5c631daSSadaf Ebrahimi  public:
VeneerPool(MacroAssembler * masm)183*f5c631daSSadaf Ebrahimi   explicit VeneerPool(MacroAssembler* masm) : Pool(masm) {}
184*f5c631daSSadaf Ebrahimi 
185*f5c631daSSadaf Ebrahimi   void Reset();
186*f5c631daSSadaf Ebrahimi 
Block()187*f5c631daSSadaf Ebrahimi   void Block() { monitor_++; }
188*f5c631daSSadaf Ebrahimi   void Release();
IsBlocked()189*f5c631daSSadaf Ebrahimi   bool IsBlocked() const { return monitor_ != 0; }
IsEmpty()190*f5c631daSSadaf Ebrahimi   bool IsEmpty() const { return unresolved_branches_.IsEmpty(); }
191*f5c631daSSadaf Ebrahimi 
192*f5c631daSSadaf Ebrahimi   class BranchInfo {
193*f5c631daSSadaf Ebrahimi    public:
BranchInfo()194*f5c631daSSadaf Ebrahimi     BranchInfo()
195*f5c631daSSadaf Ebrahimi         : first_unreacheable_pc_(0),
196*f5c631daSSadaf Ebrahimi           pc_offset_(0),
197*f5c631daSSadaf Ebrahimi           label_(NULL),
198*f5c631daSSadaf Ebrahimi           branch_type_(UnknownBranchType) {}
BranchInfo(ptrdiff_t offset,Label * label,ImmBranchType branch_type)199*f5c631daSSadaf Ebrahimi     BranchInfo(ptrdiff_t offset, Label* label, ImmBranchType branch_type)
200*f5c631daSSadaf Ebrahimi         : pc_offset_(offset), label_(label), branch_type_(branch_type) {
201*f5c631daSSadaf Ebrahimi       first_unreacheable_pc_ =
202*f5c631daSSadaf Ebrahimi           pc_offset_ + Instruction::GetImmBranchForwardRange(branch_type_);
203*f5c631daSSadaf Ebrahimi     }
204*f5c631daSSadaf Ebrahimi 
IsValidComparison(const BranchInfo & branch_1,const BranchInfo & branch_2)205*f5c631daSSadaf Ebrahimi     static bool IsValidComparison(const BranchInfo& branch_1,
206*f5c631daSSadaf Ebrahimi                                   const BranchInfo& branch_2) {
207*f5c631daSSadaf Ebrahimi       // BranchInfo are always compared against against other objects with
208*f5c631daSSadaf Ebrahimi       // the same branch type.
209*f5c631daSSadaf Ebrahimi       if (branch_1.branch_type_ != branch_2.branch_type_) {
210*f5c631daSSadaf Ebrahimi         return false;
211*f5c631daSSadaf Ebrahimi       }
212*f5c631daSSadaf Ebrahimi       // Since we should never have two branch infos with the same offsets, it
213*f5c631daSSadaf Ebrahimi       // first looks like we should check that offsets are different. However
214*f5c631daSSadaf Ebrahimi       // the operators may also be used to *search* for a branch info in the
215*f5c631daSSadaf Ebrahimi       // set.
216*f5c631daSSadaf Ebrahimi       bool same_offsets = (branch_1.pc_offset_ == branch_2.pc_offset_);
217*f5c631daSSadaf Ebrahimi       return (!same_offsets || ((branch_1.label_ == branch_2.label_) &&
218*f5c631daSSadaf Ebrahimi                                 (branch_1.first_unreacheable_pc_ ==
219*f5c631daSSadaf Ebrahimi                                  branch_2.first_unreacheable_pc_)));
220*f5c631daSSadaf Ebrahimi     }
221*f5c631daSSadaf Ebrahimi 
222*f5c631daSSadaf Ebrahimi     // We must provide comparison operators to work with InvalSet.
223*f5c631daSSadaf Ebrahimi     bool operator==(const BranchInfo& other) const {
224*f5c631daSSadaf Ebrahimi       VIXL_ASSERT(IsValidComparison(*this, other));
225*f5c631daSSadaf Ebrahimi       return pc_offset_ == other.pc_offset_;
226*f5c631daSSadaf Ebrahimi     }
227*f5c631daSSadaf Ebrahimi     bool operator<(const BranchInfo& other) const {
228*f5c631daSSadaf Ebrahimi       VIXL_ASSERT(IsValidComparison(*this, other));
229*f5c631daSSadaf Ebrahimi       return pc_offset_ < other.pc_offset_;
230*f5c631daSSadaf Ebrahimi     }
231*f5c631daSSadaf Ebrahimi     bool operator<=(const BranchInfo& other) const {
232*f5c631daSSadaf Ebrahimi       VIXL_ASSERT(IsValidComparison(*this, other));
233*f5c631daSSadaf Ebrahimi       return pc_offset_ <= other.pc_offset_;
234*f5c631daSSadaf Ebrahimi     }
235*f5c631daSSadaf Ebrahimi     bool operator>(const BranchInfo& other) const {
236*f5c631daSSadaf Ebrahimi       VIXL_ASSERT(IsValidComparison(*this, other));
237*f5c631daSSadaf Ebrahimi       return pc_offset_ > other.pc_offset_;
238*f5c631daSSadaf Ebrahimi     }
239*f5c631daSSadaf Ebrahimi 
240*f5c631daSSadaf Ebrahimi     // First instruction position that is not reachable by the branch using a
241*f5c631daSSadaf Ebrahimi     // positive branch offset.
242*f5c631daSSadaf Ebrahimi     ptrdiff_t first_unreacheable_pc_;
243*f5c631daSSadaf Ebrahimi     // Offset of the branch in the code generation buffer.
244*f5c631daSSadaf Ebrahimi     ptrdiff_t pc_offset_;
245*f5c631daSSadaf Ebrahimi     // The label branched to.
246*f5c631daSSadaf Ebrahimi     Label* label_;
247*f5c631daSSadaf Ebrahimi     ImmBranchType branch_type_;
248*f5c631daSSadaf Ebrahimi   };
249*f5c631daSSadaf Ebrahimi 
BranchTypeUsesVeneers(ImmBranchType type)250*f5c631daSSadaf Ebrahimi   bool BranchTypeUsesVeneers(ImmBranchType type) {
251*f5c631daSSadaf Ebrahimi     return (type != UnknownBranchType) && (type != UncondBranchType);
252*f5c631daSSadaf Ebrahimi   }
253*f5c631daSSadaf Ebrahimi 
254*f5c631daSSadaf Ebrahimi   void RegisterUnresolvedBranch(ptrdiff_t branch_pos,
255*f5c631daSSadaf Ebrahimi                                 Label* label,
256*f5c631daSSadaf Ebrahimi                                 ImmBranchType branch_type);
257*f5c631daSSadaf Ebrahimi   void DeleteUnresolvedBranchInfoForLabel(Label* label);
258*f5c631daSSadaf Ebrahimi 
259*f5c631daSSadaf Ebrahimi   bool ShouldEmitVeneer(int64_t first_unreacheable_pc, size_t amount);
ShouldEmitVeneers(size_t amount)260*f5c631daSSadaf Ebrahimi   bool ShouldEmitVeneers(size_t amount) {
261*f5c631daSSadaf Ebrahimi     return ShouldEmitVeneer(unresolved_branches_.GetFirstLimit(), amount);
262*f5c631daSSadaf Ebrahimi   }
263*f5c631daSSadaf Ebrahimi 
264*f5c631daSSadaf Ebrahimi   void CheckEmitFor(size_t amount, EmitOption option = kBranchRequired);
265*f5c631daSSadaf Ebrahimi   void Emit(EmitOption option, size_t margin);
266*f5c631daSSadaf Ebrahimi 
267*f5c631daSSadaf Ebrahimi   // The code size generated for a veneer. Currently one branch instruction.
268*f5c631daSSadaf Ebrahimi   // This is for code size checking purposes, and can be extended in the future
269*f5c631daSSadaf Ebrahimi   // for example if we decide to add nops between the veneers.
270*f5c631daSSadaf Ebrahimi   static const int kVeneerCodeSize = 1 * kInstructionSize;
271*f5c631daSSadaf Ebrahimi   // The maximum size of code other than veneers that can be generated when
272*f5c631daSSadaf Ebrahimi   // emitting a veneer pool. Currently there can be an additional branch to jump
273*f5c631daSSadaf Ebrahimi   // over the pool.
274*f5c631daSSadaf Ebrahimi   static const int kPoolNonVeneerCodeSize = 1 * kInstructionSize;
275*f5c631daSSadaf Ebrahimi 
UpdateNextCheckPoint()276*f5c631daSSadaf Ebrahimi   void UpdateNextCheckPoint() { SetNextCheckpoint(GetNextCheckPoint()); }
277*f5c631daSSadaf Ebrahimi 
GetNumberOfPotentialVeneers()278*f5c631daSSadaf Ebrahimi   int GetNumberOfPotentialVeneers() const {
279*f5c631daSSadaf Ebrahimi     return static_cast<int>(unresolved_branches_.GetSize());
280*f5c631daSSadaf Ebrahimi   }
281*f5c631daSSadaf Ebrahimi   VIXL_DEPRECATED("GetNumberOfPotentialVeneers",
NumberOfPotentialVeneers()282*f5c631daSSadaf Ebrahimi                   int NumberOfPotentialVeneers() const) {
283*f5c631daSSadaf Ebrahimi     return GetNumberOfPotentialVeneers();
284*f5c631daSSadaf Ebrahimi   }
285*f5c631daSSadaf Ebrahimi 
GetMaxSize()286*f5c631daSSadaf Ebrahimi   size_t GetMaxSize() const {
287*f5c631daSSadaf Ebrahimi     return kPoolNonVeneerCodeSize +
288*f5c631daSSadaf Ebrahimi            unresolved_branches_.GetSize() * kVeneerCodeSize;
289*f5c631daSSadaf Ebrahimi   }
290*f5c631daSSadaf Ebrahimi   VIXL_DEPRECATED("GetMaxSize", size_t MaxSize() const) { return GetMaxSize(); }
291*f5c631daSSadaf Ebrahimi 
292*f5c631daSSadaf Ebrahimi   size_t GetOtherPoolsMaxSize() const;
293*f5c631daSSadaf Ebrahimi   VIXL_DEPRECATED("GetOtherPoolsMaxSize", size_t OtherPoolsMaxSize() const) {
294*f5c631daSSadaf Ebrahimi     return GetOtherPoolsMaxSize();
295*f5c631daSSadaf Ebrahimi   }
296*f5c631daSSadaf Ebrahimi 
297*f5c631daSSadaf Ebrahimi   static const int kNPreallocatedInfos = 4;
298*f5c631daSSadaf Ebrahimi   static const ptrdiff_t kInvalidOffset = PTRDIFF_MAX;
299*f5c631daSSadaf Ebrahimi   static const size_t kReclaimFrom = 128;
300*f5c631daSSadaf Ebrahimi   static const size_t kReclaimFactor = 16;
301*f5c631daSSadaf Ebrahimi 
302*f5c631daSSadaf Ebrahimi  private:
303*f5c631daSSadaf Ebrahimi   typedef InvalSet<BranchInfo,
304*f5c631daSSadaf Ebrahimi                    kNPreallocatedInfos,
305*f5c631daSSadaf Ebrahimi                    ptrdiff_t,
306*f5c631daSSadaf Ebrahimi                    kInvalidOffset,
307*f5c631daSSadaf Ebrahimi                    kReclaimFrom,
308*f5c631daSSadaf Ebrahimi                    kReclaimFactor>
309*f5c631daSSadaf Ebrahimi       BranchInfoTypedSetBase;
310*f5c631daSSadaf Ebrahimi   typedef InvalSetIterator<BranchInfoTypedSetBase> BranchInfoTypedSetIterBase;
311*f5c631daSSadaf Ebrahimi 
312*f5c631daSSadaf Ebrahimi   class BranchInfoTypedSet : public BranchInfoTypedSetBase {
313*f5c631daSSadaf Ebrahimi    public:
BranchInfoTypedSet()314*f5c631daSSadaf Ebrahimi     BranchInfoTypedSet() : BranchInfoTypedSetBase() {}
315*f5c631daSSadaf Ebrahimi 
GetFirstLimit()316*f5c631daSSadaf Ebrahimi     ptrdiff_t GetFirstLimit() {
317*f5c631daSSadaf Ebrahimi       if (empty()) {
318*f5c631daSSadaf Ebrahimi         return kInvalidOffset;
319*f5c631daSSadaf Ebrahimi       }
320*f5c631daSSadaf Ebrahimi       return GetMinElementKey();
321*f5c631daSSadaf Ebrahimi     }
322*f5c631daSSadaf Ebrahimi     VIXL_DEPRECATED("GetFirstLimit", ptrdiff_t FirstLimit()) {
323*f5c631daSSadaf Ebrahimi       return GetFirstLimit();
324*f5c631daSSadaf Ebrahimi     }
325*f5c631daSSadaf Ebrahimi   };
326*f5c631daSSadaf Ebrahimi 
327*f5c631daSSadaf Ebrahimi   class BranchInfoTypedSetIterator : public BranchInfoTypedSetIterBase {
328*f5c631daSSadaf Ebrahimi    public:
BranchInfoTypedSetIterator()329*f5c631daSSadaf Ebrahimi     BranchInfoTypedSetIterator() : BranchInfoTypedSetIterBase(NULL) {}
BranchInfoTypedSetIterator(BranchInfoTypedSet * typed_set)330*f5c631daSSadaf Ebrahimi     explicit BranchInfoTypedSetIterator(BranchInfoTypedSet* typed_set)
331*f5c631daSSadaf Ebrahimi         : BranchInfoTypedSetIterBase(typed_set) {}
332*f5c631daSSadaf Ebrahimi 
333*f5c631daSSadaf Ebrahimi     // TODO: Remove these and use the STL-like interface instead.
334*f5c631daSSadaf Ebrahimi     using BranchInfoTypedSetIterBase::Advance;
335*f5c631daSSadaf Ebrahimi     using BranchInfoTypedSetIterBase::Current;
336*f5c631daSSadaf Ebrahimi   };
337*f5c631daSSadaf Ebrahimi 
338*f5c631daSSadaf Ebrahimi   class BranchInfoSet {
339*f5c631daSSadaf Ebrahimi    public:
insert(BranchInfo branch_info)340*f5c631daSSadaf Ebrahimi     void insert(BranchInfo branch_info) {
341*f5c631daSSadaf Ebrahimi       ImmBranchType type = branch_info.branch_type_;
342*f5c631daSSadaf Ebrahimi       VIXL_ASSERT(IsValidBranchType(type));
343*f5c631daSSadaf Ebrahimi       typed_set_[BranchIndexFromType(type)].insert(branch_info);
344*f5c631daSSadaf Ebrahimi     }
345*f5c631daSSadaf Ebrahimi 
erase(BranchInfo branch_info)346*f5c631daSSadaf Ebrahimi     void erase(BranchInfo branch_info) {
347*f5c631daSSadaf Ebrahimi       if (IsValidBranchType(branch_info.branch_type_)) {
348*f5c631daSSadaf Ebrahimi         int index =
349*f5c631daSSadaf Ebrahimi             BranchInfoSet::BranchIndexFromType(branch_info.branch_type_);
350*f5c631daSSadaf Ebrahimi         typed_set_[index].erase(branch_info);
351*f5c631daSSadaf Ebrahimi       }
352*f5c631daSSadaf Ebrahimi     }
353*f5c631daSSadaf Ebrahimi 
GetSize()354*f5c631daSSadaf Ebrahimi     size_t GetSize() const {
355*f5c631daSSadaf Ebrahimi       size_t res = 0;
356*f5c631daSSadaf Ebrahimi       for (int i = 0; i < kNumberOfTrackedBranchTypes; i++) {
357*f5c631daSSadaf Ebrahimi         res += typed_set_[i].size();
358*f5c631daSSadaf Ebrahimi       }
359*f5c631daSSadaf Ebrahimi       return res;
360*f5c631daSSadaf Ebrahimi     }
361*f5c631daSSadaf Ebrahimi     VIXL_DEPRECATED("GetSize", size_t size() const) { return GetSize(); }
362*f5c631daSSadaf Ebrahimi 
IsEmpty()363*f5c631daSSadaf Ebrahimi     bool IsEmpty() const {
364*f5c631daSSadaf Ebrahimi       for (int i = 0; i < kNumberOfTrackedBranchTypes; i++) {
365*f5c631daSSadaf Ebrahimi         if (!typed_set_[i].empty()) {
366*f5c631daSSadaf Ebrahimi           return false;
367*f5c631daSSadaf Ebrahimi         }
368*f5c631daSSadaf Ebrahimi       }
369*f5c631daSSadaf Ebrahimi       return true;
370*f5c631daSSadaf Ebrahimi     }
empty()371*f5c631daSSadaf Ebrahimi     VIXL_DEPRECATED("IsEmpty", bool empty() const) { return IsEmpty(); }
372*f5c631daSSadaf Ebrahimi 
GetFirstLimit()373*f5c631daSSadaf Ebrahimi     ptrdiff_t GetFirstLimit() {
374*f5c631daSSadaf Ebrahimi       ptrdiff_t res = kInvalidOffset;
375*f5c631daSSadaf Ebrahimi       for (int i = 0; i < kNumberOfTrackedBranchTypes; i++) {
376*f5c631daSSadaf Ebrahimi         res = std::min(res, typed_set_[i].GetFirstLimit());
377*f5c631daSSadaf Ebrahimi       }
378*f5c631daSSadaf Ebrahimi       return res;
379*f5c631daSSadaf Ebrahimi     }
380*f5c631daSSadaf Ebrahimi     VIXL_DEPRECATED("GetFirstLimit", ptrdiff_t FirstLimit()) {
381*f5c631daSSadaf Ebrahimi       return GetFirstLimit();
382*f5c631daSSadaf Ebrahimi     }
383*f5c631daSSadaf Ebrahimi 
Reset()384*f5c631daSSadaf Ebrahimi     void Reset() {
385*f5c631daSSadaf Ebrahimi       for (int i = 0; i < kNumberOfTrackedBranchTypes; i++) {
386*f5c631daSSadaf Ebrahimi         typed_set_[i].clear();
387*f5c631daSSadaf Ebrahimi       }
388*f5c631daSSadaf Ebrahimi     }
389*f5c631daSSadaf Ebrahimi 
BranchTypeFromIndex(int index)390*f5c631daSSadaf Ebrahimi     static ImmBranchType BranchTypeFromIndex(int index) {
391*f5c631daSSadaf Ebrahimi       switch (index) {
392*f5c631daSSadaf Ebrahimi         case 0:
393*f5c631daSSadaf Ebrahimi           return CondBranchType;
394*f5c631daSSadaf Ebrahimi         case 1:
395*f5c631daSSadaf Ebrahimi           return CompareBranchType;
396*f5c631daSSadaf Ebrahimi         case 2:
397*f5c631daSSadaf Ebrahimi           return TestBranchType;
398*f5c631daSSadaf Ebrahimi         default:
399*f5c631daSSadaf Ebrahimi           VIXL_UNREACHABLE();
400*f5c631daSSadaf Ebrahimi           return UnknownBranchType;
401*f5c631daSSadaf Ebrahimi       }
402*f5c631daSSadaf Ebrahimi     }
BranchIndexFromType(ImmBranchType branch_type)403*f5c631daSSadaf Ebrahimi     static int BranchIndexFromType(ImmBranchType branch_type) {
404*f5c631daSSadaf Ebrahimi       switch (branch_type) {
405*f5c631daSSadaf Ebrahimi         case CondBranchType:
406*f5c631daSSadaf Ebrahimi           return 0;
407*f5c631daSSadaf Ebrahimi         case CompareBranchType:
408*f5c631daSSadaf Ebrahimi           return 1;
409*f5c631daSSadaf Ebrahimi         case TestBranchType:
410*f5c631daSSadaf Ebrahimi           return 2;
411*f5c631daSSadaf Ebrahimi         default:
412*f5c631daSSadaf Ebrahimi           VIXL_UNREACHABLE();
413*f5c631daSSadaf Ebrahimi           return 0;
414*f5c631daSSadaf Ebrahimi       }
415*f5c631daSSadaf Ebrahimi     }
416*f5c631daSSadaf Ebrahimi 
IsValidBranchType(ImmBranchType branch_type)417*f5c631daSSadaf Ebrahimi     bool IsValidBranchType(ImmBranchType branch_type) {
418*f5c631daSSadaf Ebrahimi       return (branch_type != UnknownBranchType) &&
419*f5c631daSSadaf Ebrahimi              (branch_type != UncondBranchType);
420*f5c631daSSadaf Ebrahimi     }
421*f5c631daSSadaf Ebrahimi 
422*f5c631daSSadaf Ebrahimi    private:
423*f5c631daSSadaf Ebrahimi     static const int kNumberOfTrackedBranchTypes = 3;
424*f5c631daSSadaf Ebrahimi     BranchInfoTypedSet typed_set_[kNumberOfTrackedBranchTypes];
425*f5c631daSSadaf Ebrahimi 
426*f5c631daSSadaf Ebrahimi     friend class VeneerPool;
427*f5c631daSSadaf Ebrahimi     friend class BranchInfoSetIterator;
428*f5c631daSSadaf Ebrahimi   };
429*f5c631daSSadaf Ebrahimi 
430*f5c631daSSadaf Ebrahimi   class BranchInfoSetIterator {
431*f5c631daSSadaf Ebrahimi    public:
BranchInfoSetIterator(BranchInfoSet * set)432*f5c631daSSadaf Ebrahimi     explicit BranchInfoSetIterator(BranchInfoSet* set) : set_(set) {
433*f5c631daSSadaf Ebrahimi       for (int i = 0; i < BranchInfoSet::kNumberOfTrackedBranchTypes; i++) {
434*f5c631daSSadaf Ebrahimi         new (&sub_iterator_[i])
435*f5c631daSSadaf Ebrahimi             BranchInfoTypedSetIterator(&(set_->typed_set_[i]));
436*f5c631daSSadaf Ebrahimi       }
437*f5c631daSSadaf Ebrahimi     }
438*f5c631daSSadaf Ebrahimi 
Current()439*f5c631daSSadaf Ebrahimi     VeneerPool::BranchInfo* Current() {
440*f5c631daSSadaf Ebrahimi       for (int i = 0; i < BranchInfoSet::kNumberOfTrackedBranchTypes; i++) {
441*f5c631daSSadaf Ebrahimi         if (!sub_iterator_[i].Done()) {
442*f5c631daSSadaf Ebrahimi           return sub_iterator_[i].Current();
443*f5c631daSSadaf Ebrahimi         }
444*f5c631daSSadaf Ebrahimi       }
445*f5c631daSSadaf Ebrahimi       VIXL_UNREACHABLE();
446*f5c631daSSadaf Ebrahimi       return NULL;
447*f5c631daSSadaf Ebrahimi     }
448*f5c631daSSadaf Ebrahimi 
Advance()449*f5c631daSSadaf Ebrahimi     void Advance() {
450*f5c631daSSadaf Ebrahimi       VIXL_ASSERT(!Done());
451*f5c631daSSadaf Ebrahimi       for (int i = 0; i < BranchInfoSet::kNumberOfTrackedBranchTypes; i++) {
452*f5c631daSSadaf Ebrahimi         if (!sub_iterator_[i].Done()) {
453*f5c631daSSadaf Ebrahimi           sub_iterator_[i].Advance();
454*f5c631daSSadaf Ebrahimi           return;
455*f5c631daSSadaf Ebrahimi         }
456*f5c631daSSadaf Ebrahimi       }
457*f5c631daSSadaf Ebrahimi       VIXL_UNREACHABLE();
458*f5c631daSSadaf Ebrahimi     }
459*f5c631daSSadaf Ebrahimi 
Done()460*f5c631daSSadaf Ebrahimi     bool Done() const {
461*f5c631daSSadaf Ebrahimi       for (int i = 0; i < BranchInfoSet::kNumberOfTrackedBranchTypes; i++) {
462*f5c631daSSadaf Ebrahimi         if (!sub_iterator_[i].Done()) return false;
463*f5c631daSSadaf Ebrahimi       }
464*f5c631daSSadaf Ebrahimi       return true;
465*f5c631daSSadaf Ebrahimi     }
466*f5c631daSSadaf Ebrahimi 
AdvanceToNextType()467*f5c631daSSadaf Ebrahimi     void AdvanceToNextType() {
468*f5c631daSSadaf Ebrahimi       VIXL_ASSERT(!Done());
469*f5c631daSSadaf Ebrahimi       for (int i = 0; i < BranchInfoSet::kNumberOfTrackedBranchTypes; i++) {
470*f5c631daSSadaf Ebrahimi         if (!sub_iterator_[i].Done()) {
471*f5c631daSSadaf Ebrahimi           sub_iterator_[i].Finish();
472*f5c631daSSadaf Ebrahimi           return;
473*f5c631daSSadaf Ebrahimi         }
474*f5c631daSSadaf Ebrahimi       }
475*f5c631daSSadaf Ebrahimi       VIXL_UNREACHABLE();
476*f5c631daSSadaf Ebrahimi     }
477*f5c631daSSadaf Ebrahimi 
DeleteCurrentAndAdvance()478*f5c631daSSadaf Ebrahimi     void DeleteCurrentAndAdvance() {
479*f5c631daSSadaf Ebrahimi       for (int i = 0; i < BranchInfoSet::kNumberOfTrackedBranchTypes; i++) {
480*f5c631daSSadaf Ebrahimi         if (!sub_iterator_[i].Done()) {
481*f5c631daSSadaf Ebrahimi           sub_iterator_[i].DeleteCurrentAndAdvance();
482*f5c631daSSadaf Ebrahimi           return;
483*f5c631daSSadaf Ebrahimi         }
484*f5c631daSSadaf Ebrahimi       }
485*f5c631daSSadaf Ebrahimi     }
486*f5c631daSSadaf Ebrahimi 
487*f5c631daSSadaf Ebrahimi    private:
488*f5c631daSSadaf Ebrahimi     BranchInfoSet* set_;
489*f5c631daSSadaf Ebrahimi     BranchInfoTypedSetIterator
490*f5c631daSSadaf Ebrahimi         sub_iterator_[BranchInfoSet::kNumberOfTrackedBranchTypes];
491*f5c631daSSadaf Ebrahimi   };
492*f5c631daSSadaf Ebrahimi 
GetNextCheckPoint()493*f5c631daSSadaf Ebrahimi   ptrdiff_t GetNextCheckPoint() {
494*f5c631daSSadaf Ebrahimi     if (unresolved_branches_.IsEmpty()) {
495*f5c631daSSadaf Ebrahimi       return kNoCheckpointRequired;
496*f5c631daSSadaf Ebrahimi     } else {
497*f5c631daSSadaf Ebrahimi       return unresolved_branches_.GetFirstLimit();
498*f5c631daSSadaf Ebrahimi     }
499*f5c631daSSadaf Ebrahimi   }
500*f5c631daSSadaf Ebrahimi   VIXL_DEPRECATED("GetNextCheckPoint", ptrdiff_t NextCheckPoint()) {
501*f5c631daSSadaf Ebrahimi     return GetNextCheckPoint();
502*f5c631daSSadaf Ebrahimi   }
503*f5c631daSSadaf Ebrahimi 
504*f5c631daSSadaf Ebrahimi   // Information about unresolved (forward) branches.
505*f5c631daSSadaf Ebrahimi   BranchInfoSet unresolved_branches_;
506*f5c631daSSadaf Ebrahimi };
507*f5c631daSSadaf Ebrahimi 
508*f5c631daSSadaf Ebrahimi 
509*f5c631daSSadaf Ebrahimi // Helper for common Emission checks.
510*f5c631daSSadaf Ebrahimi // The macro-instruction maps to a single instruction.
511*f5c631daSSadaf Ebrahimi class SingleEmissionCheckScope : public EmissionCheckScope {
512*f5c631daSSadaf Ebrahimi  public:
SingleEmissionCheckScope(MacroAssemblerInterface * masm)513*f5c631daSSadaf Ebrahimi   explicit SingleEmissionCheckScope(MacroAssemblerInterface* masm)
514*f5c631daSSadaf Ebrahimi       : EmissionCheckScope(masm, kInstructionSize) {}
515*f5c631daSSadaf Ebrahimi };
516*f5c631daSSadaf Ebrahimi 
517*f5c631daSSadaf Ebrahimi 
518*f5c631daSSadaf Ebrahimi // The macro instruction is a "typical" macro-instruction. Typical macro-
519*f5c631daSSadaf Ebrahimi // instruction only emit a few instructions, a few being defined as 8 here.
520*f5c631daSSadaf Ebrahimi class MacroEmissionCheckScope : public EmissionCheckScope {
521*f5c631daSSadaf Ebrahimi  public:
MacroEmissionCheckScope(MacroAssemblerInterface * masm)522*f5c631daSSadaf Ebrahimi   explicit MacroEmissionCheckScope(MacroAssemblerInterface* masm)
523*f5c631daSSadaf Ebrahimi       : EmissionCheckScope(masm, kTypicalMacroInstructionMaxSize) {}
524*f5c631daSSadaf Ebrahimi 
525*f5c631daSSadaf Ebrahimi  private:
526*f5c631daSSadaf Ebrahimi   static const size_t kTypicalMacroInstructionMaxSize = 8 * kInstructionSize;
527*f5c631daSSadaf Ebrahimi };
528*f5c631daSSadaf Ebrahimi 
529*f5c631daSSadaf Ebrahimi 
530*f5c631daSSadaf Ebrahimi // This scope simplifies the handling of the SVE `movprfx` instruction.
531*f5c631daSSadaf Ebrahimi //
532*f5c631daSSadaf Ebrahimi // If dst.Aliases(src):
533*f5c631daSSadaf Ebrahimi // - Start an ExactAssemblyScope(masm, kInstructionSize).
534*f5c631daSSadaf Ebrahimi // Otherwise:
535*f5c631daSSadaf Ebrahimi // - Start an ExactAssemblyScope(masm, 2 * kInstructionSize).
536*f5c631daSSadaf Ebrahimi // - Generate a suitable `movprfx` instruction.
537*f5c631daSSadaf Ebrahimi //
538*f5c631daSSadaf Ebrahimi // In both cases, the ExactAssemblyScope is left with enough remaining space for
539*f5c631daSSadaf Ebrahimi // exactly one destructive instruction.
540*f5c631daSSadaf Ebrahimi class MovprfxHelperScope : public ExactAssemblyScope {
541*f5c631daSSadaf Ebrahimi  public:
542*f5c631daSSadaf Ebrahimi   inline MovprfxHelperScope(MacroAssembler* masm,
543*f5c631daSSadaf Ebrahimi                             const ZRegister& dst,
544*f5c631daSSadaf Ebrahimi                             const ZRegister& src);
545*f5c631daSSadaf Ebrahimi 
546*f5c631daSSadaf Ebrahimi   inline MovprfxHelperScope(MacroAssembler* masm,
547*f5c631daSSadaf Ebrahimi                             const ZRegister& dst,
548*f5c631daSSadaf Ebrahimi                             const PRegister& pg,
549*f5c631daSSadaf Ebrahimi                             const ZRegister& src);
550*f5c631daSSadaf Ebrahimi 
551*f5c631daSSadaf Ebrahimi   // TODO: Implement constructors that examine _all_ sources. If `dst` aliases
552*f5c631daSSadaf Ebrahimi   // any other source register, we can't use `movprfx`. This isn't obviously
553*f5c631daSSadaf Ebrahimi   // useful, but the MacroAssembler should not generate invalid code for it.
554*f5c631daSSadaf Ebrahimi   // Valid behaviour can be implemented using `mov`.
555*f5c631daSSadaf Ebrahimi   //
556*f5c631daSSadaf Ebrahimi   // The best way to handle this in an instruction-agnostic way is probably to
557*f5c631daSSadaf Ebrahimi   // use variadic templates.
558*f5c631daSSadaf Ebrahimi 
559*f5c631daSSadaf Ebrahimi  private:
ShouldGenerateMovprfx(const ZRegister & dst,const ZRegister & src)560*f5c631daSSadaf Ebrahimi   inline bool ShouldGenerateMovprfx(const ZRegister& dst,
561*f5c631daSSadaf Ebrahimi                                     const ZRegister& src) {
562*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(AreSameLaneSize(dst, src));
563*f5c631daSSadaf Ebrahimi     return !dst.Aliases(src);
564*f5c631daSSadaf Ebrahimi   }
565*f5c631daSSadaf Ebrahimi 
ShouldGenerateMovprfx(const ZRegister & dst,const PRegister & pg,const ZRegister & src)566*f5c631daSSadaf Ebrahimi   inline bool ShouldGenerateMovprfx(const ZRegister& dst,
567*f5c631daSSadaf Ebrahimi                                     const PRegister& pg,
568*f5c631daSSadaf Ebrahimi                                     const ZRegister& src) {
569*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(pg.IsMerging() || pg.IsZeroing());
570*f5c631daSSadaf Ebrahimi     // We need to emit movprfx in two cases:
571*f5c631daSSadaf Ebrahimi     //  1. To give a predicated merging unary instruction zeroing predication.
572*f5c631daSSadaf Ebrahimi     //  2. To make destructive instructions constructive.
573*f5c631daSSadaf Ebrahimi     //
574*f5c631daSSadaf Ebrahimi     // There are no predicated zeroing instructions that can take movprfx, so we
575*f5c631daSSadaf Ebrahimi     // will never generate an unnecessary movprfx with this logic.
576*f5c631daSSadaf Ebrahimi     return pg.IsZeroing() || ShouldGenerateMovprfx(dst, src);
577*f5c631daSSadaf Ebrahimi   }
578*f5c631daSSadaf Ebrahimi };
579*f5c631daSSadaf Ebrahimi 
580*f5c631daSSadaf Ebrahimi 
581*f5c631daSSadaf Ebrahimi enum BranchType {
582*f5c631daSSadaf Ebrahimi   // Copies of architectural conditions.
583*f5c631daSSadaf Ebrahimi   // The associated conditions can be used in place of those, the code will
584*f5c631daSSadaf Ebrahimi   // take care of reinterpreting them with the correct type.
585*f5c631daSSadaf Ebrahimi   integer_eq = eq,
586*f5c631daSSadaf Ebrahimi   integer_ne = ne,
587*f5c631daSSadaf Ebrahimi   integer_hs = hs,
588*f5c631daSSadaf Ebrahimi   integer_lo = lo,
589*f5c631daSSadaf Ebrahimi   integer_mi = mi,
590*f5c631daSSadaf Ebrahimi   integer_pl = pl,
591*f5c631daSSadaf Ebrahimi   integer_vs = vs,
592*f5c631daSSadaf Ebrahimi   integer_vc = vc,
593*f5c631daSSadaf Ebrahimi   integer_hi = hi,
594*f5c631daSSadaf Ebrahimi   integer_ls = ls,
595*f5c631daSSadaf Ebrahimi   integer_ge = ge,
596*f5c631daSSadaf Ebrahimi   integer_lt = lt,
597*f5c631daSSadaf Ebrahimi   integer_gt = gt,
598*f5c631daSSadaf Ebrahimi   integer_le = le,
599*f5c631daSSadaf Ebrahimi   integer_al = al,
600*f5c631daSSadaf Ebrahimi   integer_nv = nv,
601*f5c631daSSadaf Ebrahimi 
602*f5c631daSSadaf Ebrahimi   // These two are *different* from the architectural codes al and nv.
603*f5c631daSSadaf Ebrahimi   // 'always' is used to generate unconditional branches.
604*f5c631daSSadaf Ebrahimi   // 'never' is used to not generate a branch (generally as the inverse
605*f5c631daSSadaf Ebrahimi   // branch type of 'always).
606*f5c631daSSadaf Ebrahimi   always,
607*f5c631daSSadaf Ebrahimi   never,
608*f5c631daSSadaf Ebrahimi   // cbz and cbnz
609*f5c631daSSadaf Ebrahimi   reg_zero,
610*f5c631daSSadaf Ebrahimi   reg_not_zero,
611*f5c631daSSadaf Ebrahimi   // tbz and tbnz
612*f5c631daSSadaf Ebrahimi   reg_bit_clear,
613*f5c631daSSadaf Ebrahimi   reg_bit_set,
614*f5c631daSSadaf Ebrahimi 
615*f5c631daSSadaf Ebrahimi   // Aliases.
616*f5c631daSSadaf Ebrahimi   kBranchTypeFirstCondition = eq,
617*f5c631daSSadaf Ebrahimi   kBranchTypeLastCondition = nv,
618*f5c631daSSadaf Ebrahimi   kBranchTypeFirstUsingReg = reg_zero,
619*f5c631daSSadaf Ebrahimi   kBranchTypeFirstUsingBit = reg_bit_clear,
620*f5c631daSSadaf Ebrahimi 
621*f5c631daSSadaf Ebrahimi   // SVE branch conditions.
622*f5c631daSSadaf Ebrahimi   integer_none = eq,
623*f5c631daSSadaf Ebrahimi   integer_any = ne,
624*f5c631daSSadaf Ebrahimi   integer_nlast = cs,
625*f5c631daSSadaf Ebrahimi   integer_last = cc,
626*f5c631daSSadaf Ebrahimi   integer_first = mi,
627*f5c631daSSadaf Ebrahimi   integer_nfrst = pl,
628*f5c631daSSadaf Ebrahimi   integer_pmore = hi,
629*f5c631daSSadaf Ebrahimi   integer_plast = ls,
630*f5c631daSSadaf Ebrahimi   integer_tcont = ge,
631*f5c631daSSadaf Ebrahimi   integer_tstop = lt
632*f5c631daSSadaf Ebrahimi };
633*f5c631daSSadaf Ebrahimi 
634*f5c631daSSadaf Ebrahimi 
635*f5c631daSSadaf Ebrahimi enum DiscardMoveMode { kDontDiscardForSameWReg, kDiscardForSameWReg };
636*f5c631daSSadaf Ebrahimi 
637*f5c631daSSadaf Ebrahimi // The macro assembler supports moving automatically pre-shifted immediates for
638*f5c631daSSadaf Ebrahimi // arithmetic and logical instructions, and then applying a post shift in the
639*f5c631daSSadaf Ebrahimi // instruction to undo the modification, in order to reduce the code emitted for
640*f5c631daSSadaf Ebrahimi // an operation. For example:
641*f5c631daSSadaf Ebrahimi //
642*f5c631daSSadaf Ebrahimi //  Add(x0, x0, 0x1f7de) => movz x16, 0xfbef; add x0, x0, x16, lsl #1.
643*f5c631daSSadaf Ebrahimi //
644*f5c631daSSadaf Ebrahimi // This optimisation can be only partially applied when the stack pointer is an
645*f5c631daSSadaf Ebrahimi // operand or destination, so this enumeration is used to control the shift.
646*f5c631daSSadaf Ebrahimi enum PreShiftImmMode {
647*f5c631daSSadaf Ebrahimi   kNoShift,          // Don't pre-shift.
648*f5c631daSSadaf Ebrahimi   kLimitShiftForSP,  // Limit pre-shift for add/sub extend use.
649*f5c631daSSadaf Ebrahimi   kAnyShift          // Allow any pre-shift.
650*f5c631daSSadaf Ebrahimi };
651*f5c631daSSadaf Ebrahimi 
652*f5c631daSSadaf Ebrahimi enum FPMacroNaNPropagationOption {
653*f5c631daSSadaf Ebrahimi   // The default option. This generates a run-time error in macros that respect
654*f5c631daSSadaf Ebrahimi   // this option.
655*f5c631daSSadaf Ebrahimi   NoFPMacroNaNPropagationSelected,
656*f5c631daSSadaf Ebrahimi   // For example, Fmin(result, NaN(a), NaN(b)) always selects NaN(a) if both
657*f5c631daSSadaf Ebrahimi   // NaN(a) and NaN(b) are both quiet, or both are signalling, at the
658*f5c631daSSadaf Ebrahimi   // cost of extra code generation in some cases.
659*f5c631daSSadaf Ebrahimi   StrictNaNPropagation,
660*f5c631daSSadaf Ebrahimi   // For example, Fmin(result, NaN(a), NaN(b)) selects either NaN, but using the
661*f5c631daSSadaf Ebrahimi   // fewest instructions.
662*f5c631daSSadaf Ebrahimi   FastNaNPropagation
663*f5c631daSSadaf Ebrahimi };
664*f5c631daSSadaf Ebrahimi 
665*f5c631daSSadaf Ebrahimi class MacroAssembler : public Assembler, public MacroAssemblerInterface {
666*f5c631daSSadaf Ebrahimi  public:
667*f5c631daSSadaf Ebrahimi   explicit MacroAssembler(
668*f5c631daSSadaf Ebrahimi       PositionIndependentCodeOption pic = PositionIndependentCode);
669*f5c631daSSadaf Ebrahimi   MacroAssembler(size_t capacity,
670*f5c631daSSadaf Ebrahimi                  PositionIndependentCodeOption pic = PositionIndependentCode);
671*f5c631daSSadaf Ebrahimi   MacroAssembler(byte* buffer,
672*f5c631daSSadaf Ebrahimi                  size_t capacity,
673*f5c631daSSadaf Ebrahimi                  PositionIndependentCodeOption pic = PositionIndependentCode);
674*f5c631daSSadaf Ebrahimi   ~MacroAssembler();
675*f5c631daSSadaf Ebrahimi 
676*f5c631daSSadaf Ebrahimi   enum FinalizeOption {
677*f5c631daSSadaf Ebrahimi     kFallThrough,  // There may be more code to execute after calling Finalize.
678*f5c631daSSadaf Ebrahimi     kUnreachable   // Anything generated after calling Finalize is unreachable.
679*f5c631daSSadaf Ebrahimi   };
680*f5c631daSSadaf Ebrahimi 
AsAssemblerBase()681*f5c631daSSadaf Ebrahimi   virtual vixl::internal::AssemblerBase* AsAssemblerBase() VIXL_OVERRIDE {
682*f5c631daSSadaf Ebrahimi     return this;
683*f5c631daSSadaf Ebrahimi   }
684*f5c631daSSadaf Ebrahimi 
685*f5c631daSSadaf Ebrahimi   // TODO(pools): implement these functions.
EmitPoolHeader()686*f5c631daSSadaf Ebrahimi   virtual void EmitPoolHeader() VIXL_OVERRIDE {}
EmitPoolFooter()687*f5c631daSSadaf Ebrahimi   virtual void EmitPoolFooter() VIXL_OVERRIDE {}
EmitPaddingBytes(int n)688*f5c631daSSadaf Ebrahimi   virtual void EmitPaddingBytes(int n) VIXL_OVERRIDE { USE(n); }
EmitNopBytes(int n)689*f5c631daSSadaf Ebrahimi   virtual void EmitNopBytes(int n) VIXL_OVERRIDE { USE(n); }
690*f5c631daSSadaf Ebrahimi 
691*f5c631daSSadaf Ebrahimi   // Start generating code from the beginning of the buffer, discarding any code
692*f5c631daSSadaf Ebrahimi   // and data that has already been emitted into the buffer.
693*f5c631daSSadaf Ebrahimi   //
694*f5c631daSSadaf Ebrahimi   // In order to avoid any accidental transfer of state, Reset ASSERTs that the
695*f5c631daSSadaf Ebrahimi   // constant pool is not blocked.
696*f5c631daSSadaf Ebrahimi   void Reset();
697*f5c631daSSadaf Ebrahimi 
698*f5c631daSSadaf Ebrahimi   // Finalize a code buffer of generated instructions. This function must be
699*f5c631daSSadaf Ebrahimi   // called before executing or copying code from the buffer. By default,
700*f5c631daSSadaf Ebrahimi   // anything generated after this should not be reachable (the last instruction
701*f5c631daSSadaf Ebrahimi   // generated is an unconditional branch). If you need to generate more code,
702*f5c631daSSadaf Ebrahimi   // then set `option` to kFallThrough.
703*f5c631daSSadaf Ebrahimi   void FinalizeCode(FinalizeOption option = kUnreachable);
704*f5c631daSSadaf Ebrahimi 
705*f5c631daSSadaf Ebrahimi 
706*f5c631daSSadaf Ebrahimi   // Constant generation helpers.
707*f5c631daSSadaf Ebrahimi   // These functions return the number of instructions required to move the
708*f5c631daSSadaf Ebrahimi   // immediate into the destination register. Also, if the masm pointer is
709*f5c631daSSadaf Ebrahimi   // non-null, it generates the code to do so.
710*f5c631daSSadaf Ebrahimi   // The two features are implemented using one function to avoid duplication of
711*f5c631daSSadaf Ebrahimi   // the logic.
712*f5c631daSSadaf Ebrahimi   // The function can be used to evaluate the cost of synthesizing an
713*f5c631daSSadaf Ebrahimi   // instruction using 'mov immediate' instructions. A user might prefer loading
714*f5c631daSSadaf Ebrahimi   // a constant using the literal pool instead of using multiple 'mov immediate'
715*f5c631daSSadaf Ebrahimi   // instructions.
716*f5c631daSSadaf Ebrahimi   static int MoveImmediateHelper(MacroAssembler* masm,
717*f5c631daSSadaf Ebrahimi                                  const Register& rd,
718*f5c631daSSadaf Ebrahimi                                  uint64_t imm);
719*f5c631daSSadaf Ebrahimi 
720*f5c631daSSadaf Ebrahimi 
721*f5c631daSSadaf Ebrahimi   // Logical macros.
722*f5c631daSSadaf Ebrahimi   void And(const Register& rd, const Register& rn, const Operand& operand);
723*f5c631daSSadaf Ebrahimi   void Ands(const Register& rd, const Register& rn, const Operand& operand);
724*f5c631daSSadaf Ebrahimi   void Bic(const Register& rd, const Register& rn, const Operand& operand);
725*f5c631daSSadaf Ebrahimi   void Bics(const Register& rd, const Register& rn, const Operand& operand);
726*f5c631daSSadaf Ebrahimi   void Orr(const Register& rd, const Register& rn, const Operand& operand);
727*f5c631daSSadaf Ebrahimi   void Orn(const Register& rd, const Register& rn, const Operand& operand);
728*f5c631daSSadaf Ebrahimi   void Eor(const Register& rd, const Register& rn, const Operand& operand);
729*f5c631daSSadaf Ebrahimi   void Eon(const Register& rd, const Register& rn, const Operand& operand);
730*f5c631daSSadaf Ebrahimi   void Tst(const Register& rn, const Operand& operand);
731*f5c631daSSadaf Ebrahimi   void LogicalMacro(const Register& rd,
732*f5c631daSSadaf Ebrahimi                     const Register& rn,
733*f5c631daSSadaf Ebrahimi                     const Operand& operand,
734*f5c631daSSadaf Ebrahimi                     LogicalOp op);
735*f5c631daSSadaf Ebrahimi 
736*f5c631daSSadaf Ebrahimi   // Add and sub macros.
737*f5c631daSSadaf Ebrahimi   void Add(const Register& rd,
738*f5c631daSSadaf Ebrahimi            const Register& rn,
739*f5c631daSSadaf Ebrahimi            const Operand& operand,
740*f5c631daSSadaf Ebrahimi            FlagsUpdate S = LeaveFlags);
741*f5c631daSSadaf Ebrahimi   void Adds(const Register& rd, const Register& rn, const Operand& operand);
742*f5c631daSSadaf Ebrahimi   void Sub(const Register& rd,
743*f5c631daSSadaf Ebrahimi            const Register& rn,
744*f5c631daSSadaf Ebrahimi            const Operand& operand,
745*f5c631daSSadaf Ebrahimi            FlagsUpdate S = LeaveFlags);
746*f5c631daSSadaf Ebrahimi   void Subs(const Register& rd, const Register& rn, const Operand& operand);
747*f5c631daSSadaf Ebrahimi   void Cmn(const Register& rn, const Operand& operand);
748*f5c631daSSadaf Ebrahimi   void Cmp(const Register& rn, const Operand& operand);
749*f5c631daSSadaf Ebrahimi   void Neg(const Register& rd, const Operand& operand);
750*f5c631daSSadaf Ebrahimi   void Negs(const Register& rd, const Operand& operand);
751*f5c631daSSadaf Ebrahimi 
752*f5c631daSSadaf Ebrahimi   void AddSubMacro(const Register& rd,
753*f5c631daSSadaf Ebrahimi                    const Register& rn,
754*f5c631daSSadaf Ebrahimi                    const Operand& operand,
755*f5c631daSSadaf Ebrahimi                    FlagsUpdate S,
756*f5c631daSSadaf Ebrahimi                    AddSubOp op);
757*f5c631daSSadaf Ebrahimi 
758*f5c631daSSadaf Ebrahimi   // Add/sub with carry macros.
759*f5c631daSSadaf Ebrahimi   void Adc(const Register& rd, const Register& rn, const Operand& operand);
760*f5c631daSSadaf Ebrahimi   void Adcs(const Register& rd, const Register& rn, const Operand& operand);
761*f5c631daSSadaf Ebrahimi   void Sbc(const Register& rd, const Register& rn, const Operand& operand);
762*f5c631daSSadaf Ebrahimi   void Sbcs(const Register& rd, const Register& rn, const Operand& operand);
763*f5c631daSSadaf Ebrahimi   void Ngc(const Register& rd, const Operand& operand);
764*f5c631daSSadaf Ebrahimi   void Ngcs(const Register& rd, const Operand& operand);
765*f5c631daSSadaf Ebrahimi   void AddSubWithCarryMacro(const Register& rd,
766*f5c631daSSadaf Ebrahimi                             const Register& rn,
767*f5c631daSSadaf Ebrahimi                             const Operand& operand,
768*f5c631daSSadaf Ebrahimi                             FlagsUpdate S,
769*f5c631daSSadaf Ebrahimi                             AddSubWithCarryOp op);
770*f5c631daSSadaf Ebrahimi 
771*f5c631daSSadaf Ebrahimi   void Rmif(const Register& xn, unsigned shift, StatusFlags flags);
772*f5c631daSSadaf Ebrahimi   void Setf8(const Register& wn);
773*f5c631daSSadaf Ebrahimi   void Setf16(const Register& wn);
774*f5c631daSSadaf Ebrahimi 
775*f5c631daSSadaf Ebrahimi   // Move macros.
776*f5c631daSSadaf Ebrahimi   void Mov(const Register& rd, uint64_t imm);
777*f5c631daSSadaf Ebrahimi   void Mov(const Register& rd,
778*f5c631daSSadaf Ebrahimi            const Operand& operand,
779*f5c631daSSadaf Ebrahimi            DiscardMoveMode discard_mode = kDontDiscardForSameWReg);
Mvn(const Register & rd,uint64_t imm)780*f5c631daSSadaf Ebrahimi   void Mvn(const Register& rd, uint64_t imm) {
781*f5c631daSSadaf Ebrahimi     Mov(rd, (rd.GetSizeInBits() == kXRegSize) ? ~imm : (~imm & kWRegMask));
782*f5c631daSSadaf Ebrahimi   }
783*f5c631daSSadaf Ebrahimi   void Mvn(const Register& rd, const Operand& operand);
784*f5c631daSSadaf Ebrahimi 
785*f5c631daSSadaf Ebrahimi   // Try to move an immediate into the destination register in a single
786*f5c631daSSadaf Ebrahimi   // instruction. Returns true for success, and updates the contents of dst.
787*f5c631daSSadaf Ebrahimi   // Returns false, otherwise.
788*f5c631daSSadaf Ebrahimi   bool TryOneInstrMoveImmediate(const Register& dst, uint64_t imm);
789*f5c631daSSadaf Ebrahimi 
790*f5c631daSSadaf Ebrahimi   // Move an immediate into register dst, and return an Operand object for
791*f5c631daSSadaf Ebrahimi   // use with a subsequent instruction that accepts a shift. The value moved
792*f5c631daSSadaf Ebrahimi   // into dst is not necessarily equal to imm; it may have had a shifting
793*f5c631daSSadaf Ebrahimi   // operation applied to it that will be subsequently undone by the shift
794*f5c631daSSadaf Ebrahimi   // applied in the Operand.
795*f5c631daSSadaf Ebrahimi   Operand MoveImmediateForShiftedOp(const Register& dst,
796*f5c631daSSadaf Ebrahimi                                     uint64_t imm,
797*f5c631daSSadaf Ebrahimi                                     PreShiftImmMode mode);
798*f5c631daSSadaf Ebrahimi 
799*f5c631daSSadaf Ebrahimi   void Move(const GenericOperand& dst, const GenericOperand& src);
800*f5c631daSSadaf Ebrahimi 
801*f5c631daSSadaf Ebrahimi   // Synthesises the address represented by a MemOperand into a register.
802*f5c631daSSadaf Ebrahimi   void ComputeAddress(const Register& dst, const MemOperand& mem_op);
803*f5c631daSSadaf Ebrahimi 
804*f5c631daSSadaf Ebrahimi   // Conditional macros.
805*f5c631daSSadaf Ebrahimi   void Ccmp(const Register& rn,
806*f5c631daSSadaf Ebrahimi             const Operand& operand,
807*f5c631daSSadaf Ebrahimi             StatusFlags nzcv,
808*f5c631daSSadaf Ebrahimi             Condition cond);
809*f5c631daSSadaf Ebrahimi   void Ccmn(const Register& rn,
810*f5c631daSSadaf Ebrahimi             const Operand& operand,
811*f5c631daSSadaf Ebrahimi             StatusFlags nzcv,
812*f5c631daSSadaf Ebrahimi             Condition cond);
813*f5c631daSSadaf Ebrahimi   void ConditionalCompareMacro(const Register& rn,
814*f5c631daSSadaf Ebrahimi                                const Operand& operand,
815*f5c631daSSadaf Ebrahimi                                StatusFlags nzcv,
816*f5c631daSSadaf Ebrahimi                                Condition cond,
817*f5c631daSSadaf Ebrahimi                                ConditionalCompareOp op);
818*f5c631daSSadaf Ebrahimi 
819*f5c631daSSadaf Ebrahimi   // On return, the boolean values pointed to will indicate whether `left` and
820*f5c631daSSadaf Ebrahimi   // `right` should be synthesised in a temporary register.
GetCselSynthesisInformation(const Register & rd,const Operand & left,const Operand & right,bool * should_synthesise_left,bool * should_synthesise_right)821*f5c631daSSadaf Ebrahimi   static void GetCselSynthesisInformation(const Register& rd,
822*f5c631daSSadaf Ebrahimi                                           const Operand& left,
823*f5c631daSSadaf Ebrahimi                                           const Operand& right,
824*f5c631daSSadaf Ebrahimi                                           bool* should_synthesise_left,
825*f5c631daSSadaf Ebrahimi                                           bool* should_synthesise_right) {
826*f5c631daSSadaf Ebrahimi     // Note that the helper does not need to look at the condition.
827*f5c631daSSadaf Ebrahimi     CselHelper(NULL,
828*f5c631daSSadaf Ebrahimi                rd,
829*f5c631daSSadaf Ebrahimi                left,
830*f5c631daSSadaf Ebrahimi                right,
831*f5c631daSSadaf Ebrahimi                eq,
832*f5c631daSSadaf Ebrahimi                should_synthesise_left,
833*f5c631daSSadaf Ebrahimi                should_synthesise_right);
834*f5c631daSSadaf Ebrahimi   }
835*f5c631daSSadaf Ebrahimi 
Csel(const Register & rd,const Operand & left,const Operand & right,Condition cond)836*f5c631daSSadaf Ebrahimi   void Csel(const Register& rd,
837*f5c631daSSadaf Ebrahimi             const Operand& left,
838*f5c631daSSadaf Ebrahimi             const Operand& right,
839*f5c631daSSadaf Ebrahimi             Condition cond) {
840*f5c631daSSadaf Ebrahimi     CselHelper(this, rd, left, right, cond);
841*f5c631daSSadaf Ebrahimi   }
842*f5c631daSSadaf Ebrahimi 
843*f5c631daSSadaf Ebrahimi // Load/store macros.
844*f5c631daSSadaf Ebrahimi #define DECLARE_FUNCTION(FN, REGTYPE, REG, OP) \
845*f5c631daSSadaf Ebrahimi   void FN(const REGTYPE REG, const MemOperand& addr);
846*f5c631daSSadaf Ebrahimi   LS_MACRO_LIST(DECLARE_FUNCTION)
847*f5c631daSSadaf Ebrahimi #undef DECLARE_FUNCTION
848*f5c631daSSadaf Ebrahimi 
849*f5c631daSSadaf Ebrahimi   void LoadStoreMacro(const CPURegister& rt,
850*f5c631daSSadaf Ebrahimi                       const MemOperand& addr,
851*f5c631daSSadaf Ebrahimi                       LoadStoreOp op);
852*f5c631daSSadaf Ebrahimi 
853*f5c631daSSadaf Ebrahimi #define DECLARE_FUNCTION(FN, REGTYPE, REG, REG2, OP) \
854*f5c631daSSadaf Ebrahimi   void FN(const REGTYPE REG, const REGTYPE REG2, const MemOperand& addr);
855*f5c631daSSadaf Ebrahimi   LSPAIR_MACRO_LIST(DECLARE_FUNCTION)
856*f5c631daSSadaf Ebrahimi #undef DECLARE_FUNCTION
857*f5c631daSSadaf Ebrahimi 
858*f5c631daSSadaf Ebrahimi   void LoadStorePairMacro(const CPURegister& rt,
859*f5c631daSSadaf Ebrahimi                           const CPURegister& rt2,
860*f5c631daSSadaf Ebrahimi                           const MemOperand& addr,
861*f5c631daSSadaf Ebrahimi                           LoadStorePairOp op);
862*f5c631daSSadaf Ebrahimi 
863*f5c631daSSadaf Ebrahimi   void Prfm(PrefetchOperation op, const MemOperand& addr);
864*f5c631daSSadaf Ebrahimi 
865*f5c631daSSadaf Ebrahimi   // Push or pop up to 4 registers of the same width to or from the stack,
866*f5c631daSSadaf Ebrahimi   // using the current stack pointer as set by SetStackPointer.
867*f5c631daSSadaf Ebrahimi   //
868*f5c631daSSadaf Ebrahimi   // If an argument register is 'NoReg', all further arguments are also assumed
869*f5c631daSSadaf Ebrahimi   // to be 'NoReg', and are thus not pushed or popped.
870*f5c631daSSadaf Ebrahimi   //
871*f5c631daSSadaf Ebrahimi   // Arguments are ordered such that "Push(a, b);" is functionally equivalent
872*f5c631daSSadaf Ebrahimi   // to "Push(a); Push(b);".
873*f5c631daSSadaf Ebrahimi   //
874*f5c631daSSadaf Ebrahimi   // It is valid to push the same register more than once, and there is no
875*f5c631daSSadaf Ebrahimi   // restriction on the order in which registers are specified.
876*f5c631daSSadaf Ebrahimi   //
877*f5c631daSSadaf Ebrahimi   // It is not valid to pop into the same register more than once in one
878*f5c631daSSadaf Ebrahimi   // operation, not even into the zero register.
879*f5c631daSSadaf Ebrahimi   //
880*f5c631daSSadaf Ebrahimi   // If the current stack pointer (as set by SetStackPointer) is sp, then it
881*f5c631daSSadaf Ebrahimi   // must be aligned to 16 bytes on entry and the total size of the specified
882*f5c631daSSadaf Ebrahimi   // registers must also be a multiple of 16 bytes.
883*f5c631daSSadaf Ebrahimi   //
884*f5c631daSSadaf Ebrahimi   // Even if the current stack pointer is not the system stack pointer (sp),
885*f5c631daSSadaf Ebrahimi   // Push (and derived methods) will still modify the system stack pointer in
886*f5c631daSSadaf Ebrahimi   // order to comply with ABI rules about accessing memory below the system
887*f5c631daSSadaf Ebrahimi   // stack pointer.
888*f5c631daSSadaf Ebrahimi   //
889*f5c631daSSadaf Ebrahimi   // Other than the registers passed into Pop, the stack pointer and (possibly)
890*f5c631daSSadaf Ebrahimi   // the system stack pointer, these methods do not modify any other registers.
891*f5c631daSSadaf Ebrahimi   void Push(const CPURegister& src0,
892*f5c631daSSadaf Ebrahimi             const CPURegister& src1 = NoReg,
893*f5c631daSSadaf Ebrahimi             const CPURegister& src2 = NoReg,
894*f5c631daSSadaf Ebrahimi             const CPURegister& src3 = NoReg);
895*f5c631daSSadaf Ebrahimi   void Pop(const CPURegister& dst0,
896*f5c631daSSadaf Ebrahimi            const CPURegister& dst1 = NoReg,
897*f5c631daSSadaf Ebrahimi            const CPURegister& dst2 = NoReg,
898*f5c631daSSadaf Ebrahimi            const CPURegister& dst3 = NoReg);
899*f5c631daSSadaf Ebrahimi 
900*f5c631daSSadaf Ebrahimi   // Alternative forms of Push and Pop, taking a RegList or CPURegList that
901*f5c631daSSadaf Ebrahimi   // specifies the registers that are to be pushed or popped. Higher-numbered
902*f5c631daSSadaf Ebrahimi   // registers are associated with higher memory addresses (as in the A32 push
903*f5c631daSSadaf Ebrahimi   // and pop instructions).
904*f5c631daSSadaf Ebrahimi   //
905*f5c631daSSadaf Ebrahimi   // (Push|Pop)SizeRegList allow you to specify the register size as a
906*f5c631daSSadaf Ebrahimi   // parameter. Only kXRegSize, kWRegSize, kDRegSize and kSRegSize are
907*f5c631daSSadaf Ebrahimi   // supported.
908*f5c631daSSadaf Ebrahimi   //
909*f5c631daSSadaf Ebrahimi   // Otherwise, (Push|Pop)(CPU|X|W|D|S)RegList is preferred.
910*f5c631daSSadaf Ebrahimi   void PushCPURegList(CPURegList registers);
911*f5c631daSSadaf Ebrahimi   void PopCPURegList(CPURegList registers);
912*f5c631daSSadaf Ebrahimi 
913*f5c631daSSadaf Ebrahimi   void PushSizeRegList(
914*f5c631daSSadaf Ebrahimi       RegList registers,
915*f5c631daSSadaf Ebrahimi       unsigned reg_size,
916*f5c631daSSadaf Ebrahimi       CPURegister::RegisterType type = CPURegister::kRegister) {
917*f5c631daSSadaf Ebrahimi     PushCPURegList(CPURegList(type, reg_size, registers));
918*f5c631daSSadaf Ebrahimi   }
919*f5c631daSSadaf Ebrahimi   void PopSizeRegList(RegList registers,
920*f5c631daSSadaf Ebrahimi                       unsigned reg_size,
921*f5c631daSSadaf Ebrahimi                       CPURegister::RegisterType type = CPURegister::kRegister) {
922*f5c631daSSadaf Ebrahimi     PopCPURegList(CPURegList(type, reg_size, registers));
923*f5c631daSSadaf Ebrahimi   }
PushXRegList(RegList regs)924*f5c631daSSadaf Ebrahimi   void PushXRegList(RegList regs) { PushSizeRegList(regs, kXRegSize); }
PopXRegList(RegList regs)925*f5c631daSSadaf Ebrahimi   void PopXRegList(RegList regs) { PopSizeRegList(regs, kXRegSize); }
PushWRegList(RegList regs)926*f5c631daSSadaf Ebrahimi   void PushWRegList(RegList regs) { PushSizeRegList(regs, kWRegSize); }
PopWRegList(RegList regs)927*f5c631daSSadaf Ebrahimi   void PopWRegList(RegList regs) { PopSizeRegList(regs, kWRegSize); }
PushDRegList(RegList regs)928*f5c631daSSadaf Ebrahimi   void PushDRegList(RegList regs) {
929*f5c631daSSadaf Ebrahimi     PushSizeRegList(regs, kDRegSize, CPURegister::kVRegister);
930*f5c631daSSadaf Ebrahimi   }
PopDRegList(RegList regs)931*f5c631daSSadaf Ebrahimi   void PopDRegList(RegList regs) {
932*f5c631daSSadaf Ebrahimi     PopSizeRegList(regs, kDRegSize, CPURegister::kVRegister);
933*f5c631daSSadaf Ebrahimi   }
PushSRegList(RegList regs)934*f5c631daSSadaf Ebrahimi   void PushSRegList(RegList regs) {
935*f5c631daSSadaf Ebrahimi     PushSizeRegList(regs, kSRegSize, CPURegister::kVRegister);
936*f5c631daSSadaf Ebrahimi   }
PopSRegList(RegList regs)937*f5c631daSSadaf Ebrahimi   void PopSRegList(RegList regs) {
938*f5c631daSSadaf Ebrahimi     PopSizeRegList(regs, kSRegSize, CPURegister::kVRegister);
939*f5c631daSSadaf Ebrahimi   }
940*f5c631daSSadaf Ebrahimi 
941*f5c631daSSadaf Ebrahimi   // Push the specified register 'count' times.
942*f5c631daSSadaf Ebrahimi   void PushMultipleTimes(int count, Register src);
943*f5c631daSSadaf Ebrahimi 
944*f5c631daSSadaf Ebrahimi   // Poke 'src' onto the stack. The offset is in bytes.
945*f5c631daSSadaf Ebrahimi   //
946*f5c631daSSadaf Ebrahimi   // If the current stack pointer (as set by SetStackPointer) is sp, then sp
947*f5c631daSSadaf Ebrahimi   // must be aligned to 16 bytes.
948*f5c631daSSadaf Ebrahimi   void Poke(const Register& src, const Operand& offset);
949*f5c631daSSadaf Ebrahimi 
950*f5c631daSSadaf Ebrahimi   // Peek at a value on the stack, and put it in 'dst'. The offset is in bytes.
951*f5c631daSSadaf Ebrahimi   //
952*f5c631daSSadaf Ebrahimi   // If the current stack pointer (as set by SetStackPointer) is sp, then sp
953*f5c631daSSadaf Ebrahimi   // must be aligned to 16 bytes.
954*f5c631daSSadaf Ebrahimi   void Peek(const Register& dst, const Operand& offset);
955*f5c631daSSadaf Ebrahimi 
956*f5c631daSSadaf Ebrahimi   // Alternative forms of Peek and Poke, taking a RegList or CPURegList that
957*f5c631daSSadaf Ebrahimi   // specifies the registers that are to be pushed or popped. Higher-numbered
958*f5c631daSSadaf Ebrahimi   // registers are associated with higher memory addresses.
959*f5c631daSSadaf Ebrahimi   //
960*f5c631daSSadaf Ebrahimi   // (Peek|Poke)SizeRegList allow you to specify the register size as a
961*f5c631daSSadaf Ebrahimi   // parameter. Only kXRegSize, kWRegSize, kDRegSize and kSRegSize are
962*f5c631daSSadaf Ebrahimi   // supported.
963*f5c631daSSadaf Ebrahimi   //
964*f5c631daSSadaf Ebrahimi   // Otherwise, (Peek|Poke)(CPU|X|W|D|S)RegList is preferred.
PeekCPURegList(CPURegList registers,int64_t offset)965*f5c631daSSadaf Ebrahimi   void PeekCPURegList(CPURegList registers, int64_t offset) {
966*f5c631daSSadaf Ebrahimi     LoadCPURegList(registers, MemOperand(StackPointer(), offset));
967*f5c631daSSadaf Ebrahimi   }
PokeCPURegList(CPURegList registers,int64_t offset)968*f5c631daSSadaf Ebrahimi   void PokeCPURegList(CPURegList registers, int64_t offset) {
969*f5c631daSSadaf Ebrahimi     StoreCPURegList(registers, MemOperand(StackPointer(), offset));
970*f5c631daSSadaf Ebrahimi   }
971*f5c631daSSadaf Ebrahimi 
972*f5c631daSSadaf Ebrahimi   void PeekSizeRegList(
973*f5c631daSSadaf Ebrahimi       RegList registers,
974*f5c631daSSadaf Ebrahimi       int64_t offset,
975*f5c631daSSadaf Ebrahimi       unsigned reg_size,
976*f5c631daSSadaf Ebrahimi       CPURegister::RegisterType type = CPURegister::kRegister) {
977*f5c631daSSadaf Ebrahimi     PeekCPURegList(CPURegList(type, reg_size, registers), offset);
978*f5c631daSSadaf Ebrahimi   }
979*f5c631daSSadaf Ebrahimi   void PokeSizeRegList(
980*f5c631daSSadaf Ebrahimi       RegList registers,
981*f5c631daSSadaf Ebrahimi       int64_t offset,
982*f5c631daSSadaf Ebrahimi       unsigned reg_size,
983*f5c631daSSadaf Ebrahimi       CPURegister::RegisterType type = CPURegister::kRegister) {
984*f5c631daSSadaf Ebrahimi     PokeCPURegList(CPURegList(type, reg_size, registers), offset);
985*f5c631daSSadaf Ebrahimi   }
PeekXRegList(RegList regs,int64_t offset)986*f5c631daSSadaf Ebrahimi   void PeekXRegList(RegList regs, int64_t offset) {
987*f5c631daSSadaf Ebrahimi     PeekSizeRegList(regs, offset, kXRegSize);
988*f5c631daSSadaf Ebrahimi   }
PokeXRegList(RegList regs,int64_t offset)989*f5c631daSSadaf Ebrahimi   void PokeXRegList(RegList regs, int64_t offset) {
990*f5c631daSSadaf Ebrahimi     PokeSizeRegList(regs, offset, kXRegSize);
991*f5c631daSSadaf Ebrahimi   }
PeekWRegList(RegList regs,int64_t offset)992*f5c631daSSadaf Ebrahimi   void PeekWRegList(RegList regs, int64_t offset) {
993*f5c631daSSadaf Ebrahimi     PeekSizeRegList(regs, offset, kWRegSize);
994*f5c631daSSadaf Ebrahimi   }
PokeWRegList(RegList regs,int64_t offset)995*f5c631daSSadaf Ebrahimi   void PokeWRegList(RegList regs, int64_t offset) {
996*f5c631daSSadaf Ebrahimi     PokeSizeRegList(regs, offset, kWRegSize);
997*f5c631daSSadaf Ebrahimi   }
PeekDRegList(RegList regs,int64_t offset)998*f5c631daSSadaf Ebrahimi   void PeekDRegList(RegList regs, int64_t offset) {
999*f5c631daSSadaf Ebrahimi     PeekSizeRegList(regs, offset, kDRegSize, CPURegister::kVRegister);
1000*f5c631daSSadaf Ebrahimi   }
PokeDRegList(RegList regs,int64_t offset)1001*f5c631daSSadaf Ebrahimi   void PokeDRegList(RegList regs, int64_t offset) {
1002*f5c631daSSadaf Ebrahimi     PokeSizeRegList(regs, offset, kDRegSize, CPURegister::kVRegister);
1003*f5c631daSSadaf Ebrahimi   }
PeekSRegList(RegList regs,int64_t offset)1004*f5c631daSSadaf Ebrahimi   void PeekSRegList(RegList regs, int64_t offset) {
1005*f5c631daSSadaf Ebrahimi     PeekSizeRegList(regs, offset, kSRegSize, CPURegister::kVRegister);
1006*f5c631daSSadaf Ebrahimi   }
PokeSRegList(RegList regs,int64_t offset)1007*f5c631daSSadaf Ebrahimi   void PokeSRegList(RegList regs, int64_t offset) {
1008*f5c631daSSadaf Ebrahimi     PokeSizeRegList(regs, offset, kSRegSize, CPURegister::kVRegister);
1009*f5c631daSSadaf Ebrahimi   }
1010*f5c631daSSadaf Ebrahimi 
1011*f5c631daSSadaf Ebrahimi 
1012*f5c631daSSadaf Ebrahimi   // Claim or drop stack space without actually accessing memory.
1013*f5c631daSSadaf Ebrahimi   //
1014*f5c631daSSadaf Ebrahimi   // If the current stack pointer (as set by SetStackPointer) is sp, then it
1015*f5c631daSSadaf Ebrahimi   // must be aligned to 16 bytes and the size claimed or dropped must be a
1016*f5c631daSSadaf Ebrahimi   // multiple of 16 bytes.
1017*f5c631daSSadaf Ebrahimi   void Claim(const Operand& size);
1018*f5c631daSSadaf Ebrahimi   void Drop(const Operand& size);
1019*f5c631daSSadaf Ebrahimi 
1020*f5c631daSSadaf Ebrahimi   // As above, but for multiples of the SVE vector length.
ClaimVL(int64_t multiplier)1021*f5c631daSSadaf Ebrahimi   void ClaimVL(int64_t multiplier) {
1022*f5c631daSSadaf Ebrahimi     // We never need to worry about sp alignment because the VL is always a
1023*f5c631daSSadaf Ebrahimi     // multiple of 16.
1024*f5c631daSSadaf Ebrahimi     VIXL_STATIC_ASSERT((kZRegMinSizeInBytes % 16) == 0);
1025*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(multiplier >= 0);
1026*f5c631daSSadaf Ebrahimi     Addvl(sp, sp, -multiplier);
1027*f5c631daSSadaf Ebrahimi   }
DropVL(int64_t multiplier)1028*f5c631daSSadaf Ebrahimi   void DropVL(int64_t multiplier) {
1029*f5c631daSSadaf Ebrahimi     VIXL_STATIC_ASSERT((kZRegMinSizeInBytes % 16) == 0);
1030*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(multiplier >= 0);
1031*f5c631daSSadaf Ebrahimi     Addvl(sp, sp, multiplier);
1032*f5c631daSSadaf Ebrahimi   }
1033*f5c631daSSadaf Ebrahimi 
1034*f5c631daSSadaf Ebrahimi   // Preserve the callee-saved registers (as defined by AAPCS64).
1035*f5c631daSSadaf Ebrahimi   //
1036*f5c631daSSadaf Ebrahimi   // Higher-numbered registers are pushed before lower-numbered registers, and
1037*f5c631daSSadaf Ebrahimi   // thus get higher addresses.
1038*f5c631daSSadaf Ebrahimi   // Floating-point registers are pushed before general-purpose registers, and
1039*f5c631daSSadaf Ebrahimi   // thus get higher addresses.
1040*f5c631daSSadaf Ebrahimi   //
1041*f5c631daSSadaf Ebrahimi   // This method must not be called unless StackPointer() is sp, and it is
1042*f5c631daSSadaf Ebrahimi   // aligned to 16 bytes.
1043*f5c631daSSadaf Ebrahimi   void PushCalleeSavedRegisters();
1044*f5c631daSSadaf Ebrahimi 
1045*f5c631daSSadaf Ebrahimi   // Restore the callee-saved registers (as defined by AAPCS64).
1046*f5c631daSSadaf Ebrahimi   //
1047*f5c631daSSadaf Ebrahimi   // Higher-numbered registers are popped after lower-numbered registers, and
1048*f5c631daSSadaf Ebrahimi   // thus come from higher addresses.
1049*f5c631daSSadaf Ebrahimi   // Floating-point registers are popped after general-purpose registers, and
1050*f5c631daSSadaf Ebrahimi   // thus come from higher addresses.
1051*f5c631daSSadaf Ebrahimi   //
1052*f5c631daSSadaf Ebrahimi   // This method must not be called unless StackPointer() is sp, and it is
1053*f5c631daSSadaf Ebrahimi   // aligned to 16 bytes.
1054*f5c631daSSadaf Ebrahimi   void PopCalleeSavedRegisters();
1055*f5c631daSSadaf Ebrahimi 
1056*f5c631daSSadaf Ebrahimi   void LoadCPURegList(CPURegList registers, const MemOperand& src);
1057*f5c631daSSadaf Ebrahimi   void StoreCPURegList(CPURegList registers, const MemOperand& dst);
1058*f5c631daSSadaf Ebrahimi 
1059*f5c631daSSadaf Ebrahimi   // Remaining instructions are simple pass-through calls to the assembler.
Adr(const Register & rd,Label * label)1060*f5c631daSSadaf Ebrahimi   void Adr(const Register& rd, Label* label) {
1061*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1062*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1063*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1064*f5c631daSSadaf Ebrahimi     adr(rd, label);
1065*f5c631daSSadaf Ebrahimi   }
Adrp(const Register & rd,Label * label)1066*f5c631daSSadaf Ebrahimi   void Adrp(const Register& rd, Label* label) {
1067*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1068*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1069*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1070*f5c631daSSadaf Ebrahimi     adrp(rd, label);
1071*f5c631daSSadaf Ebrahimi   }
Asr(const Register & rd,const Register & rn,unsigned shift)1072*f5c631daSSadaf Ebrahimi   void Asr(const Register& rd, const Register& rn, unsigned shift) {
1073*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1074*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1075*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
1076*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1077*f5c631daSSadaf Ebrahimi     asr(rd, rn, shift);
1078*f5c631daSSadaf Ebrahimi   }
Asr(const Register & rd,const Register & rn,const Register & rm)1079*f5c631daSSadaf Ebrahimi   void Asr(const Register& rd, const Register& rn, const Register& rm) {
1080*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1081*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1082*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
1083*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rm.IsZero());
1084*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1085*f5c631daSSadaf Ebrahimi     asrv(rd, rn, rm);
1086*f5c631daSSadaf Ebrahimi   }
1087*f5c631daSSadaf Ebrahimi 
1088*f5c631daSSadaf Ebrahimi   // Branch type inversion relies on these relations.
1089*f5c631daSSadaf Ebrahimi   VIXL_STATIC_ASSERT((reg_zero == (reg_not_zero ^ 1)) &&
1090*f5c631daSSadaf Ebrahimi                      (reg_bit_clear == (reg_bit_set ^ 1)) &&
1091*f5c631daSSadaf Ebrahimi                      (always == (never ^ 1)));
1092*f5c631daSSadaf Ebrahimi 
InvertBranchType(BranchType type)1093*f5c631daSSadaf Ebrahimi   BranchType InvertBranchType(BranchType type) {
1094*f5c631daSSadaf Ebrahimi     if (kBranchTypeFirstCondition <= type && type <= kBranchTypeLastCondition) {
1095*f5c631daSSadaf Ebrahimi       return static_cast<BranchType>(
1096*f5c631daSSadaf Ebrahimi           InvertCondition(static_cast<Condition>(type)));
1097*f5c631daSSadaf Ebrahimi     } else {
1098*f5c631daSSadaf Ebrahimi       return static_cast<BranchType>(type ^ 1);
1099*f5c631daSSadaf Ebrahimi     }
1100*f5c631daSSadaf Ebrahimi   }
1101*f5c631daSSadaf Ebrahimi 
1102*f5c631daSSadaf Ebrahimi   void B(Label* label, BranchType type, Register reg = NoReg, int bit = -1);
1103*f5c631daSSadaf Ebrahimi 
1104*f5c631daSSadaf Ebrahimi   void B(Label* label);
1105*f5c631daSSadaf Ebrahimi   void B(Label* label, Condition cond);
B(Condition cond,Label * label)1106*f5c631daSSadaf Ebrahimi   void B(Condition cond, Label* label) { B(label, cond); }
Bfm(const Register & rd,const Register & rn,unsigned immr,unsigned imms)1107*f5c631daSSadaf Ebrahimi   void Bfm(const Register& rd,
1108*f5c631daSSadaf Ebrahimi            const Register& rn,
1109*f5c631daSSadaf Ebrahimi            unsigned immr,
1110*f5c631daSSadaf Ebrahimi            unsigned imms) {
1111*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1112*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1113*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
1114*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1115*f5c631daSSadaf Ebrahimi     bfm(rd, rn, immr, imms);
1116*f5c631daSSadaf Ebrahimi   }
Bfi(const Register & rd,const Register & rn,unsigned lsb,unsigned width)1117*f5c631daSSadaf Ebrahimi   void Bfi(const Register& rd,
1118*f5c631daSSadaf Ebrahimi            const Register& rn,
1119*f5c631daSSadaf Ebrahimi            unsigned lsb,
1120*f5c631daSSadaf Ebrahimi            unsigned width) {
1121*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1122*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1123*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
1124*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1125*f5c631daSSadaf Ebrahimi     bfi(rd, rn, lsb, width);
1126*f5c631daSSadaf Ebrahimi   }
Bfc(const Register & rd,unsigned lsb,unsigned width)1127*f5c631daSSadaf Ebrahimi   void Bfc(const Register& rd, unsigned lsb, unsigned width) {
1128*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1129*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1130*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1131*f5c631daSSadaf Ebrahimi     bfc(rd, lsb, width);
1132*f5c631daSSadaf Ebrahimi   }
Bfxil(const Register & rd,const Register & rn,unsigned lsb,unsigned width)1133*f5c631daSSadaf Ebrahimi   void Bfxil(const Register& rd,
1134*f5c631daSSadaf Ebrahimi              const Register& rn,
1135*f5c631daSSadaf Ebrahimi              unsigned lsb,
1136*f5c631daSSadaf Ebrahimi              unsigned width) {
1137*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1138*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1139*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
1140*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1141*f5c631daSSadaf Ebrahimi     bfxil(rd, rn, lsb, width);
1142*f5c631daSSadaf Ebrahimi   }
1143*f5c631daSSadaf Ebrahimi   void Bind(Label* label, BranchTargetIdentifier id = EmitBTI_none);
1144*f5c631daSSadaf Ebrahimi   // Bind a label to a specified offset from the start of the buffer.
1145*f5c631daSSadaf Ebrahimi   void BindToOffset(Label* label, ptrdiff_t offset);
Bl(Label * label)1146*f5c631daSSadaf Ebrahimi   void Bl(Label* label) {
1147*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1148*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1149*f5c631daSSadaf Ebrahimi     bl(label);
1150*f5c631daSSadaf Ebrahimi   }
Blr(const Register & xn)1151*f5c631daSSadaf Ebrahimi   void Blr(const Register& xn) {
1152*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1153*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!xn.IsZero());
1154*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1155*f5c631daSSadaf Ebrahimi     blr(xn);
1156*f5c631daSSadaf Ebrahimi   }
Br(const Register & xn)1157*f5c631daSSadaf Ebrahimi   void Br(const Register& xn) {
1158*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1159*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!xn.IsZero());
1160*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1161*f5c631daSSadaf Ebrahimi     br(xn);
1162*f5c631daSSadaf Ebrahimi   }
Braaz(const Register & xn)1163*f5c631daSSadaf Ebrahimi   void Braaz(const Register& xn) {
1164*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1165*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1166*f5c631daSSadaf Ebrahimi     braaz(xn);
1167*f5c631daSSadaf Ebrahimi   }
Brabz(const Register & xn)1168*f5c631daSSadaf Ebrahimi   void Brabz(const Register& xn) {
1169*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1170*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1171*f5c631daSSadaf Ebrahimi     brabz(xn);
1172*f5c631daSSadaf Ebrahimi   }
Blraaz(const Register & xn)1173*f5c631daSSadaf Ebrahimi   void Blraaz(const Register& xn) {
1174*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1175*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1176*f5c631daSSadaf Ebrahimi     blraaz(xn);
1177*f5c631daSSadaf Ebrahimi   }
Blrabz(const Register & xn)1178*f5c631daSSadaf Ebrahimi   void Blrabz(const Register& xn) {
1179*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1180*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1181*f5c631daSSadaf Ebrahimi     blrabz(xn);
1182*f5c631daSSadaf Ebrahimi   }
Retaa()1183*f5c631daSSadaf Ebrahimi   void Retaa() {
1184*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1185*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1186*f5c631daSSadaf Ebrahimi     retaa();
1187*f5c631daSSadaf Ebrahimi   }
Retab()1188*f5c631daSSadaf Ebrahimi   void Retab() {
1189*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1190*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1191*f5c631daSSadaf Ebrahimi     retab();
1192*f5c631daSSadaf Ebrahimi   }
Braa(const Register & xn,const Register & xm)1193*f5c631daSSadaf Ebrahimi   void Braa(const Register& xn, const Register& xm) {
1194*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1195*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1196*f5c631daSSadaf Ebrahimi     braa(xn, xm);
1197*f5c631daSSadaf Ebrahimi   }
Brab(const Register & xn,const Register & xm)1198*f5c631daSSadaf Ebrahimi   void Brab(const Register& xn, const Register& xm) {
1199*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1200*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1201*f5c631daSSadaf Ebrahimi     brab(xn, xm);
1202*f5c631daSSadaf Ebrahimi   }
Blraa(const Register & xn,const Register & xm)1203*f5c631daSSadaf Ebrahimi   void Blraa(const Register& xn, const Register& xm) {
1204*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1205*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1206*f5c631daSSadaf Ebrahimi     blraa(xn, xm);
1207*f5c631daSSadaf Ebrahimi   }
Blrab(const Register & xn,const Register & xm)1208*f5c631daSSadaf Ebrahimi   void Blrab(const Register& xn, const Register& xm) {
1209*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1210*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1211*f5c631daSSadaf Ebrahimi     blrab(xn, xm);
1212*f5c631daSSadaf Ebrahimi   }
1213*f5c631daSSadaf Ebrahimi   void Brk(int code = 0) {
1214*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1215*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1216*f5c631daSSadaf Ebrahimi     brk(code);
1217*f5c631daSSadaf Ebrahimi   }
1218*f5c631daSSadaf Ebrahimi   void Cbnz(const Register& rt, Label* label);
1219*f5c631daSSadaf Ebrahimi   void Cbz(const Register& rt, Label* label);
Cinc(const Register & rd,const Register & rn,Condition cond)1220*f5c631daSSadaf Ebrahimi   void Cinc(const Register& rd, const Register& rn, Condition cond) {
1221*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1222*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1223*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
1224*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1225*f5c631daSSadaf Ebrahimi     cinc(rd, rn, cond);
1226*f5c631daSSadaf Ebrahimi   }
Cinv(const Register & rd,const Register & rn,Condition cond)1227*f5c631daSSadaf Ebrahimi   void Cinv(const Register& rd, const Register& rn, Condition cond) {
1228*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1229*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1230*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
1231*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1232*f5c631daSSadaf Ebrahimi     cinv(rd, rn, cond);
1233*f5c631daSSadaf Ebrahimi   }
1234*f5c631daSSadaf Ebrahimi 
1235*f5c631daSSadaf Ebrahimi #define PAUTH_SYSTEM_MODES(V) \
1236*f5c631daSSadaf Ebrahimi   V(az)                       \
1237*f5c631daSSadaf Ebrahimi   V(bz)                       \
1238*f5c631daSSadaf Ebrahimi   V(asp)                      \
1239*f5c631daSSadaf Ebrahimi   V(bsp)
1240*f5c631daSSadaf Ebrahimi 
1241*f5c631daSSadaf Ebrahimi #define DEFINE_MACRO_ASM_FUNCS(SUFFIX)      \
1242*f5c631daSSadaf Ebrahimi   void Paci##SUFFIX() {                     \
1243*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_); \
1244*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);   \
1245*f5c631daSSadaf Ebrahimi     paci##SUFFIX();                         \
1246*f5c631daSSadaf Ebrahimi   }                                         \
1247*f5c631daSSadaf Ebrahimi   void Auti##SUFFIX() {                     \
1248*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_); \
1249*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);   \
1250*f5c631daSSadaf Ebrahimi     auti##SUFFIX();                         \
1251*f5c631daSSadaf Ebrahimi   }
1252*f5c631daSSadaf Ebrahimi 
PAUTH_SYSTEM_MODES(DEFINE_MACRO_ASM_FUNCS)1253*f5c631daSSadaf Ebrahimi   PAUTH_SYSTEM_MODES(DEFINE_MACRO_ASM_FUNCS)
1254*f5c631daSSadaf Ebrahimi #undef DEFINE_MACRO_ASM_FUNCS
1255*f5c631daSSadaf Ebrahimi 
1256*f5c631daSSadaf Ebrahimi   // The 1716 pac and aut instructions encourage people to use x16 and x17
1257*f5c631daSSadaf Ebrahimi   // directly, perhaps without realising that this is forbidden. For example:
1258*f5c631daSSadaf Ebrahimi   //
1259*f5c631daSSadaf Ebrahimi   //     UseScratchRegisterScope temps(&masm);
1260*f5c631daSSadaf Ebrahimi   //     Register temp = temps.AcquireX();  // temp will be x16
1261*f5c631daSSadaf Ebrahimi   //     __ Mov(x17, ptr);
1262*f5c631daSSadaf Ebrahimi   //     __ Mov(x16, modifier);  // Will override temp!
1263*f5c631daSSadaf Ebrahimi   //     __ Pacia1716();
1264*f5c631daSSadaf Ebrahimi   //
1265*f5c631daSSadaf Ebrahimi   // To work around this issue, you must exclude x16 and x17 from the scratch
1266*f5c631daSSadaf Ebrahimi   // register list. You may need to replace them with other registers:
1267*f5c631daSSadaf Ebrahimi   //
1268*f5c631daSSadaf Ebrahimi   //     UseScratchRegisterScope temps(&masm);
1269*f5c631daSSadaf Ebrahimi   //     temps.Exclude(x16, x17);
1270*f5c631daSSadaf Ebrahimi   //     temps.Include(x10, x11);
1271*f5c631daSSadaf Ebrahimi   //     __ Mov(x17, ptr);
1272*f5c631daSSadaf Ebrahimi   //     __ Mov(x16, modifier);
1273*f5c631daSSadaf Ebrahimi   //     __ Pacia1716();
1274*f5c631daSSadaf Ebrahimi   void Pacia1716() {
1275*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1276*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!GetScratchRegisterList()->IncludesAliasOf(x16));
1277*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!GetScratchRegisterList()->IncludesAliasOf(x17));
1278*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1279*f5c631daSSadaf Ebrahimi     pacia1716();
1280*f5c631daSSadaf Ebrahimi   }
Pacib1716()1281*f5c631daSSadaf Ebrahimi   void Pacib1716() {
1282*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1283*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!GetScratchRegisterList()->IncludesAliasOf(x16));
1284*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!GetScratchRegisterList()->IncludesAliasOf(x17));
1285*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1286*f5c631daSSadaf Ebrahimi     pacib1716();
1287*f5c631daSSadaf Ebrahimi   }
Autia1716()1288*f5c631daSSadaf Ebrahimi   void Autia1716() {
1289*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1290*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!GetScratchRegisterList()->IncludesAliasOf(x16));
1291*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!GetScratchRegisterList()->IncludesAliasOf(x17));
1292*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1293*f5c631daSSadaf Ebrahimi     autia1716();
1294*f5c631daSSadaf Ebrahimi   }
Autib1716()1295*f5c631daSSadaf Ebrahimi   void Autib1716() {
1296*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1297*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!GetScratchRegisterList()->IncludesAliasOf(x16));
1298*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!GetScratchRegisterList()->IncludesAliasOf(x17));
1299*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1300*f5c631daSSadaf Ebrahimi     autib1716();
1301*f5c631daSSadaf Ebrahimi   }
Xpaclri()1302*f5c631daSSadaf Ebrahimi   void Xpaclri() {
1303*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1304*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1305*f5c631daSSadaf Ebrahimi     xpaclri();
1306*f5c631daSSadaf Ebrahimi   }
Clrex()1307*f5c631daSSadaf Ebrahimi   void Clrex() {
1308*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1309*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1310*f5c631daSSadaf Ebrahimi     clrex();
1311*f5c631daSSadaf Ebrahimi   }
Cls(const Register & rd,const Register & rn)1312*f5c631daSSadaf Ebrahimi   void Cls(const Register& rd, const Register& rn) {
1313*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1314*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1315*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
1316*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1317*f5c631daSSadaf Ebrahimi     cls(rd, rn);
1318*f5c631daSSadaf Ebrahimi   }
Clz(const Register & rd,const Register & rn)1319*f5c631daSSadaf Ebrahimi   void Clz(const Register& rd, const Register& rn) {
1320*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1321*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1322*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
1323*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1324*f5c631daSSadaf Ebrahimi     clz(rd, rn);
1325*f5c631daSSadaf Ebrahimi   }
Cneg(const Register & rd,const Register & rn,Condition cond)1326*f5c631daSSadaf Ebrahimi   void Cneg(const Register& rd, const Register& rn, Condition cond) {
1327*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1328*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1329*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
1330*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1331*f5c631daSSadaf Ebrahimi     cneg(rd, rn, cond);
1332*f5c631daSSadaf Ebrahimi   }
Esb()1333*f5c631daSSadaf Ebrahimi   void Esb() {
1334*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1335*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1336*f5c631daSSadaf Ebrahimi     esb();
1337*f5c631daSSadaf Ebrahimi   }
Csdb()1338*f5c631daSSadaf Ebrahimi   void Csdb() {
1339*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1340*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1341*f5c631daSSadaf Ebrahimi     csdb();
1342*f5c631daSSadaf Ebrahimi   }
Cset(const Register & rd,Condition cond)1343*f5c631daSSadaf Ebrahimi   void Cset(const Register& rd, Condition cond) {
1344*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1345*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1346*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1347*f5c631daSSadaf Ebrahimi     cset(rd, cond);
1348*f5c631daSSadaf Ebrahimi   }
Csetm(const Register & rd,Condition cond)1349*f5c631daSSadaf Ebrahimi   void Csetm(const Register& rd, Condition cond) {
1350*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1351*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1352*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1353*f5c631daSSadaf Ebrahimi     csetm(rd, cond);
1354*f5c631daSSadaf Ebrahimi   }
Csinc(const Register & rd,const Register & rn,const Register & rm,Condition cond)1355*f5c631daSSadaf Ebrahimi   void Csinc(const Register& rd,
1356*f5c631daSSadaf Ebrahimi              const Register& rn,
1357*f5c631daSSadaf Ebrahimi              const Register& rm,
1358*f5c631daSSadaf Ebrahimi              Condition cond) {
1359*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1360*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1361*f5c631daSSadaf Ebrahimi     VIXL_ASSERT((cond != al) && (cond != nv));
1362*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1363*f5c631daSSadaf Ebrahimi     csinc(rd, rn, rm, cond);
1364*f5c631daSSadaf Ebrahimi   }
Csinv(const Register & rd,const Register & rn,const Register & rm,Condition cond)1365*f5c631daSSadaf Ebrahimi   void Csinv(const Register& rd,
1366*f5c631daSSadaf Ebrahimi              const Register& rn,
1367*f5c631daSSadaf Ebrahimi              const Register& rm,
1368*f5c631daSSadaf Ebrahimi              Condition cond) {
1369*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1370*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1371*f5c631daSSadaf Ebrahimi     VIXL_ASSERT((cond != al) && (cond != nv));
1372*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1373*f5c631daSSadaf Ebrahimi     csinv(rd, rn, rm, cond);
1374*f5c631daSSadaf Ebrahimi   }
Csneg(const Register & rd,const Register & rn,const Register & rm,Condition cond)1375*f5c631daSSadaf Ebrahimi   void Csneg(const Register& rd,
1376*f5c631daSSadaf Ebrahimi              const Register& rn,
1377*f5c631daSSadaf Ebrahimi              const Register& rm,
1378*f5c631daSSadaf Ebrahimi              Condition cond) {
1379*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1380*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1381*f5c631daSSadaf Ebrahimi     VIXL_ASSERT((cond != al) && (cond != nv));
1382*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1383*f5c631daSSadaf Ebrahimi     csneg(rd, rn, rm, cond);
1384*f5c631daSSadaf Ebrahimi   }
Dmb(BarrierDomain domain,BarrierType type)1385*f5c631daSSadaf Ebrahimi   void Dmb(BarrierDomain domain, BarrierType type) {
1386*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1387*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1388*f5c631daSSadaf Ebrahimi     dmb(domain, type);
1389*f5c631daSSadaf Ebrahimi   }
Dsb(BarrierDomain domain,BarrierType type)1390*f5c631daSSadaf Ebrahimi   void Dsb(BarrierDomain domain, BarrierType type) {
1391*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1392*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1393*f5c631daSSadaf Ebrahimi     dsb(domain, type);
1394*f5c631daSSadaf Ebrahimi   }
Extr(const Register & rd,const Register & rn,const Register & rm,unsigned lsb)1395*f5c631daSSadaf Ebrahimi   void Extr(const Register& rd,
1396*f5c631daSSadaf Ebrahimi             const Register& rn,
1397*f5c631daSSadaf Ebrahimi             const Register& rm,
1398*f5c631daSSadaf Ebrahimi             unsigned lsb) {
1399*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1400*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1401*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
1402*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rm.IsZero());
1403*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1404*f5c631daSSadaf Ebrahimi     extr(rd, rn, rm, lsb);
1405*f5c631daSSadaf Ebrahimi   }
Fadd(const VRegister & vd,const VRegister & vn,const VRegister & vm)1406*f5c631daSSadaf Ebrahimi   void Fadd(const VRegister& vd, const VRegister& vn, const VRegister& vm) {
1407*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1408*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1409*f5c631daSSadaf Ebrahimi     fadd(vd, vn, vm);
1410*f5c631daSSadaf Ebrahimi   }
1411*f5c631daSSadaf Ebrahimi   void Fccmp(const VRegister& vn,
1412*f5c631daSSadaf Ebrahimi              const VRegister& vm,
1413*f5c631daSSadaf Ebrahimi              StatusFlags nzcv,
1414*f5c631daSSadaf Ebrahimi              Condition cond,
1415*f5c631daSSadaf Ebrahimi              FPTrapFlags trap = DisableTrap) {
1416*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1417*f5c631daSSadaf Ebrahimi     VIXL_ASSERT((cond != al) && (cond != nv));
1418*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1419*f5c631daSSadaf Ebrahimi     FPCCompareMacro(vn, vm, nzcv, cond, trap);
1420*f5c631daSSadaf Ebrahimi   }
Fccmpe(const VRegister & vn,const VRegister & vm,StatusFlags nzcv,Condition cond)1421*f5c631daSSadaf Ebrahimi   void Fccmpe(const VRegister& vn,
1422*f5c631daSSadaf Ebrahimi               const VRegister& vm,
1423*f5c631daSSadaf Ebrahimi               StatusFlags nzcv,
1424*f5c631daSSadaf Ebrahimi               Condition cond) {
1425*f5c631daSSadaf Ebrahimi     Fccmp(vn, vm, nzcv, cond, EnableTrap);
1426*f5c631daSSadaf Ebrahimi   }
1427*f5c631daSSadaf Ebrahimi   void Fcmp(const VRegister& vn,
1428*f5c631daSSadaf Ebrahimi             const VRegister& vm,
1429*f5c631daSSadaf Ebrahimi             FPTrapFlags trap = DisableTrap) {
1430*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1431*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1432*f5c631daSSadaf Ebrahimi     FPCompareMacro(vn, vm, trap);
1433*f5c631daSSadaf Ebrahimi   }
1434*f5c631daSSadaf Ebrahimi   void Fcmp(const VRegister& vn, double value, FPTrapFlags trap = DisableTrap);
1435*f5c631daSSadaf Ebrahimi   void Fcmpe(const VRegister& vn, double value);
Fcmpe(const VRegister & vn,const VRegister & vm)1436*f5c631daSSadaf Ebrahimi   void Fcmpe(const VRegister& vn, const VRegister& vm) {
1437*f5c631daSSadaf Ebrahimi     Fcmp(vn, vm, EnableTrap);
1438*f5c631daSSadaf Ebrahimi   }
Fcsel(const VRegister & vd,const VRegister & vn,const VRegister & vm,Condition cond)1439*f5c631daSSadaf Ebrahimi   void Fcsel(const VRegister& vd,
1440*f5c631daSSadaf Ebrahimi              const VRegister& vn,
1441*f5c631daSSadaf Ebrahimi              const VRegister& vm,
1442*f5c631daSSadaf Ebrahimi              Condition cond) {
1443*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1444*f5c631daSSadaf Ebrahimi     VIXL_ASSERT((cond != al) && (cond != nv));
1445*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1446*f5c631daSSadaf Ebrahimi     fcsel(vd, vn, vm, cond);
1447*f5c631daSSadaf Ebrahimi   }
Fcvt(const VRegister & vd,const VRegister & vn)1448*f5c631daSSadaf Ebrahimi   void Fcvt(const VRegister& vd, const VRegister& vn) {
1449*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1450*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1451*f5c631daSSadaf Ebrahimi     fcvt(vd, vn);
1452*f5c631daSSadaf Ebrahimi   }
Fcvtl(const VRegister & vd,const VRegister & vn)1453*f5c631daSSadaf Ebrahimi   void Fcvtl(const VRegister& vd, const VRegister& vn) {
1454*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1455*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1456*f5c631daSSadaf Ebrahimi     fcvtl(vd, vn);
1457*f5c631daSSadaf Ebrahimi   }
Fcvtl2(const VRegister & vd,const VRegister & vn)1458*f5c631daSSadaf Ebrahimi   void Fcvtl2(const VRegister& vd, const VRegister& vn) {
1459*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1460*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1461*f5c631daSSadaf Ebrahimi     fcvtl2(vd, vn);
1462*f5c631daSSadaf Ebrahimi   }
Fcvtn(const VRegister & vd,const VRegister & vn)1463*f5c631daSSadaf Ebrahimi   void Fcvtn(const VRegister& vd, const VRegister& vn) {
1464*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1465*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1466*f5c631daSSadaf Ebrahimi     fcvtn(vd, vn);
1467*f5c631daSSadaf Ebrahimi   }
Fcvtn2(const VRegister & vd,const VRegister & vn)1468*f5c631daSSadaf Ebrahimi   void Fcvtn2(const VRegister& vd, const VRegister& vn) {
1469*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1470*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1471*f5c631daSSadaf Ebrahimi     fcvtn2(vd, vn);
1472*f5c631daSSadaf Ebrahimi   }
Fcvtxn(const VRegister & vd,const VRegister & vn)1473*f5c631daSSadaf Ebrahimi   void Fcvtxn(const VRegister& vd, const VRegister& vn) {
1474*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1475*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1476*f5c631daSSadaf Ebrahimi     fcvtxn(vd, vn);
1477*f5c631daSSadaf Ebrahimi   }
Fcvtxn2(const VRegister & vd,const VRegister & vn)1478*f5c631daSSadaf Ebrahimi   void Fcvtxn2(const VRegister& vd, const VRegister& vn) {
1479*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1480*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1481*f5c631daSSadaf Ebrahimi     fcvtxn2(vd, vn);
1482*f5c631daSSadaf Ebrahimi   }
Fcvtas(const Register & rd,const VRegister & vn)1483*f5c631daSSadaf Ebrahimi   void Fcvtas(const Register& rd, const VRegister& vn) {
1484*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1485*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1486*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1487*f5c631daSSadaf Ebrahimi     fcvtas(rd, vn);
1488*f5c631daSSadaf Ebrahimi   }
Fcvtau(const Register & rd,const VRegister & vn)1489*f5c631daSSadaf Ebrahimi   void Fcvtau(const Register& rd, const VRegister& vn) {
1490*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1491*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1492*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1493*f5c631daSSadaf Ebrahimi     fcvtau(rd, vn);
1494*f5c631daSSadaf Ebrahimi   }
Fcvtms(const Register & rd,const VRegister & vn)1495*f5c631daSSadaf Ebrahimi   void Fcvtms(const Register& rd, const VRegister& vn) {
1496*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1497*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1498*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1499*f5c631daSSadaf Ebrahimi     fcvtms(rd, vn);
1500*f5c631daSSadaf Ebrahimi   }
Fcvtmu(const Register & rd,const VRegister & vn)1501*f5c631daSSadaf Ebrahimi   void Fcvtmu(const Register& rd, const VRegister& vn) {
1502*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1503*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1504*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1505*f5c631daSSadaf Ebrahimi     fcvtmu(rd, vn);
1506*f5c631daSSadaf Ebrahimi   }
Fcvtns(const Register & rd,const VRegister & vn)1507*f5c631daSSadaf Ebrahimi   void Fcvtns(const Register& rd, const VRegister& vn) {
1508*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1509*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1510*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1511*f5c631daSSadaf Ebrahimi     fcvtns(rd, vn);
1512*f5c631daSSadaf Ebrahimi   }
Fcvtnu(const Register & rd,const VRegister & vn)1513*f5c631daSSadaf Ebrahimi   void Fcvtnu(const Register& rd, const VRegister& vn) {
1514*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1515*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1516*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1517*f5c631daSSadaf Ebrahimi     fcvtnu(rd, vn);
1518*f5c631daSSadaf Ebrahimi   }
Fcvtps(const Register & rd,const VRegister & vn)1519*f5c631daSSadaf Ebrahimi   void Fcvtps(const Register& rd, const VRegister& vn) {
1520*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1521*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1522*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1523*f5c631daSSadaf Ebrahimi     fcvtps(rd, vn);
1524*f5c631daSSadaf Ebrahimi   }
Fcvtpu(const Register & rd,const VRegister & vn)1525*f5c631daSSadaf Ebrahimi   void Fcvtpu(const Register& rd, const VRegister& vn) {
1526*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1527*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1528*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1529*f5c631daSSadaf Ebrahimi     fcvtpu(rd, vn);
1530*f5c631daSSadaf Ebrahimi   }
1531*f5c631daSSadaf Ebrahimi   void Fcvtzs(const Register& rd, const VRegister& vn, int fbits = 0) {
1532*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1533*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1534*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1535*f5c631daSSadaf Ebrahimi     fcvtzs(rd, vn, fbits);
1536*f5c631daSSadaf Ebrahimi   }
Fjcvtzs(const Register & rd,const VRegister & vn)1537*f5c631daSSadaf Ebrahimi   void Fjcvtzs(const Register& rd, const VRegister& vn) {
1538*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1539*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1540*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1541*f5c631daSSadaf Ebrahimi     fjcvtzs(rd, vn);
1542*f5c631daSSadaf Ebrahimi   }
1543*f5c631daSSadaf Ebrahimi   void Fcvtzu(const Register& rd, const VRegister& vn, int fbits = 0) {
1544*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1545*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1546*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1547*f5c631daSSadaf Ebrahimi     fcvtzu(rd, vn, fbits);
1548*f5c631daSSadaf Ebrahimi   }
Fdiv(const VRegister & vd,const VRegister & vn,const VRegister & vm)1549*f5c631daSSadaf Ebrahimi   void Fdiv(const VRegister& vd, const VRegister& vn, const VRegister& vm) {
1550*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1551*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1552*f5c631daSSadaf Ebrahimi     fdiv(vd, vn, vm);
1553*f5c631daSSadaf Ebrahimi   }
Fmax(const VRegister & vd,const VRegister & vn,const VRegister & vm)1554*f5c631daSSadaf Ebrahimi   void Fmax(const VRegister& vd, const VRegister& vn, const VRegister& vm) {
1555*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1556*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1557*f5c631daSSadaf Ebrahimi     fmax(vd, vn, vm);
1558*f5c631daSSadaf Ebrahimi   }
Fmaxnm(const VRegister & vd,const VRegister & vn,const VRegister & vm)1559*f5c631daSSadaf Ebrahimi   void Fmaxnm(const VRegister& vd, const VRegister& vn, const VRegister& vm) {
1560*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1561*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1562*f5c631daSSadaf Ebrahimi     fmaxnm(vd, vn, vm);
1563*f5c631daSSadaf Ebrahimi   }
Fmin(const VRegister & vd,const VRegister & vn,const VRegister & vm)1564*f5c631daSSadaf Ebrahimi   void Fmin(const VRegister& vd, const VRegister& vn, const VRegister& vm) {
1565*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1566*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1567*f5c631daSSadaf Ebrahimi     fmin(vd, vn, vm);
1568*f5c631daSSadaf Ebrahimi   }
Fminnm(const VRegister & vd,const VRegister & vn,const VRegister & vm)1569*f5c631daSSadaf Ebrahimi   void Fminnm(const VRegister& vd, const VRegister& vn, const VRegister& vm) {
1570*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1571*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1572*f5c631daSSadaf Ebrahimi     fminnm(vd, vn, vm);
1573*f5c631daSSadaf Ebrahimi   }
Fmov(const VRegister & vd,const VRegister & vn)1574*f5c631daSSadaf Ebrahimi   void Fmov(const VRegister& vd, const VRegister& vn) {
1575*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1576*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1577*f5c631daSSadaf Ebrahimi     // TODO: Use DiscardMoveMode to allow this move to be elided if vd.Is(vn).
1578*f5c631daSSadaf Ebrahimi     fmov(vd, vn);
1579*f5c631daSSadaf Ebrahimi   }
Fmov(const VRegister & vd,const Register & rn)1580*f5c631daSSadaf Ebrahimi   void Fmov(const VRegister& vd, const Register& rn) {
1581*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1582*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
1583*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1584*f5c631daSSadaf Ebrahimi     fmov(vd, rn);
1585*f5c631daSSadaf Ebrahimi   }
Fmov(const VRegister & vd,int index,const Register & rn)1586*f5c631daSSadaf Ebrahimi   void Fmov(const VRegister& vd, int index, const Register& rn) {
1587*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1588*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1589*f5c631daSSadaf Ebrahimi     if (vd.Is1D() && (index == 0)) {
1590*f5c631daSSadaf Ebrahimi       mov(vd, index, rn);
1591*f5c631daSSadaf Ebrahimi     } else {
1592*f5c631daSSadaf Ebrahimi       fmov(vd, index, rn);
1593*f5c631daSSadaf Ebrahimi     }
1594*f5c631daSSadaf Ebrahimi   }
Fmov(const Register & rd,const VRegister & vn,int index)1595*f5c631daSSadaf Ebrahimi   void Fmov(const Register& rd, const VRegister& vn, int index) {
1596*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1597*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1598*f5c631daSSadaf Ebrahimi     if (vn.Is1D() && (index == 0)) {
1599*f5c631daSSadaf Ebrahimi       mov(rd, vn, index);
1600*f5c631daSSadaf Ebrahimi     } else {
1601*f5c631daSSadaf Ebrahimi       fmov(rd, vn, index);
1602*f5c631daSSadaf Ebrahimi     }
1603*f5c631daSSadaf Ebrahimi   }
1604*f5c631daSSadaf Ebrahimi 
1605*f5c631daSSadaf Ebrahimi   // Provide explicit double and float interfaces for FP immediate moves, rather
1606*f5c631daSSadaf Ebrahimi   // than relying on implicit C++ casts. This allows signalling NaNs to be
1607*f5c631daSSadaf Ebrahimi   // preserved when the immediate matches the format of vd. Most systems convert
1608*f5c631daSSadaf Ebrahimi   // signalling NaNs to quiet NaNs when converting between float and double.
1609*f5c631daSSadaf Ebrahimi   void Fmov(VRegister vd, double imm);
1610*f5c631daSSadaf Ebrahimi   void Fmov(VRegister vd, float imm);
1611*f5c631daSSadaf Ebrahimi   void Fmov(VRegister vd, const Float16 imm);
1612*f5c631daSSadaf Ebrahimi   // Provide a template to allow other types to be converted automatically.
1613*f5c631daSSadaf Ebrahimi   template <typename T>
Fmov(VRegister vd,T imm)1614*f5c631daSSadaf Ebrahimi   void Fmov(VRegister vd, T imm) {
1615*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1616*f5c631daSSadaf Ebrahimi     Fmov(vd, static_cast<double>(imm));
1617*f5c631daSSadaf Ebrahimi   }
Fmov(Register rd,VRegister vn)1618*f5c631daSSadaf Ebrahimi   void Fmov(Register rd, VRegister vn) {
1619*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1620*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
1621*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1622*f5c631daSSadaf Ebrahimi     fmov(rd, vn);
1623*f5c631daSSadaf Ebrahimi   }
Fmul(const VRegister & vd,const VRegister & vn,const VRegister & vm)1624*f5c631daSSadaf Ebrahimi   void Fmul(const VRegister& vd, const VRegister& vn, const VRegister& vm) {
1625*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1626*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1627*f5c631daSSadaf Ebrahimi     fmul(vd, vn, vm);
1628*f5c631daSSadaf Ebrahimi   }
Fnmul(const VRegister & vd,const VRegister & vn,const VRegister & vm)1629*f5c631daSSadaf Ebrahimi   void Fnmul(const VRegister& vd, const VRegister& vn, const VRegister& vm) {
1630*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1631*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1632*f5c631daSSadaf Ebrahimi     fnmul(vd, vn, vm);
1633*f5c631daSSadaf Ebrahimi   }
Fmadd(const VRegister & vd,const VRegister & vn,const VRegister & vm,const VRegister & va)1634*f5c631daSSadaf Ebrahimi   void Fmadd(const VRegister& vd,
1635*f5c631daSSadaf Ebrahimi              const VRegister& vn,
1636*f5c631daSSadaf Ebrahimi              const VRegister& vm,
1637*f5c631daSSadaf Ebrahimi              const VRegister& va) {
1638*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1639*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1640*f5c631daSSadaf Ebrahimi     fmadd(vd, vn, vm, va);
1641*f5c631daSSadaf Ebrahimi   }
Fmsub(const VRegister & vd,const VRegister & vn,const VRegister & vm,const VRegister & va)1642*f5c631daSSadaf Ebrahimi   void Fmsub(const VRegister& vd,
1643*f5c631daSSadaf Ebrahimi              const VRegister& vn,
1644*f5c631daSSadaf Ebrahimi              const VRegister& vm,
1645*f5c631daSSadaf Ebrahimi              const VRegister& va) {
1646*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1647*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1648*f5c631daSSadaf Ebrahimi     fmsub(vd, vn, vm, va);
1649*f5c631daSSadaf Ebrahimi   }
Fnmadd(const VRegister & vd,const VRegister & vn,const VRegister & vm,const VRegister & va)1650*f5c631daSSadaf Ebrahimi   void Fnmadd(const VRegister& vd,
1651*f5c631daSSadaf Ebrahimi               const VRegister& vn,
1652*f5c631daSSadaf Ebrahimi               const VRegister& vm,
1653*f5c631daSSadaf Ebrahimi               const VRegister& va) {
1654*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1655*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1656*f5c631daSSadaf Ebrahimi     fnmadd(vd, vn, vm, va);
1657*f5c631daSSadaf Ebrahimi   }
Fnmsub(const VRegister & vd,const VRegister & vn,const VRegister & vm,const VRegister & va)1658*f5c631daSSadaf Ebrahimi   void Fnmsub(const VRegister& vd,
1659*f5c631daSSadaf Ebrahimi               const VRegister& vn,
1660*f5c631daSSadaf Ebrahimi               const VRegister& vm,
1661*f5c631daSSadaf Ebrahimi               const VRegister& va) {
1662*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1663*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1664*f5c631daSSadaf Ebrahimi     fnmsub(vd, vn, vm, va);
1665*f5c631daSSadaf Ebrahimi   }
Fsub(const VRegister & vd,const VRegister & vn,const VRegister & vm)1666*f5c631daSSadaf Ebrahimi   void Fsub(const VRegister& vd, const VRegister& vn, const VRegister& vm) {
1667*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1668*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1669*f5c631daSSadaf Ebrahimi     fsub(vd, vn, vm);
1670*f5c631daSSadaf Ebrahimi   }
Hint(SystemHint code)1671*f5c631daSSadaf Ebrahimi   void Hint(SystemHint code) {
1672*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1673*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1674*f5c631daSSadaf Ebrahimi     hint(code);
1675*f5c631daSSadaf Ebrahimi   }
Hint(int imm7)1676*f5c631daSSadaf Ebrahimi   void Hint(int imm7) {
1677*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1678*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1679*f5c631daSSadaf Ebrahimi     hint(imm7);
1680*f5c631daSSadaf Ebrahimi   }
Hlt(int code)1681*f5c631daSSadaf Ebrahimi   void Hlt(int code) {
1682*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1683*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1684*f5c631daSSadaf Ebrahimi     hlt(code);
1685*f5c631daSSadaf Ebrahimi   }
Isb()1686*f5c631daSSadaf Ebrahimi   void Isb() {
1687*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1688*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1689*f5c631daSSadaf Ebrahimi     isb();
1690*f5c631daSSadaf Ebrahimi   }
Ldar(const Register & rt,const MemOperand & src)1691*f5c631daSSadaf Ebrahimi   void Ldar(const Register& rt, const MemOperand& src) {
1692*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1693*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1694*f5c631daSSadaf Ebrahimi     ldar(rt, src);
1695*f5c631daSSadaf Ebrahimi   }
Ldarb(const Register & rt,const MemOperand & src)1696*f5c631daSSadaf Ebrahimi   void Ldarb(const Register& rt, const MemOperand& src) {
1697*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1698*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1699*f5c631daSSadaf Ebrahimi     ldarb(rt, src);
1700*f5c631daSSadaf Ebrahimi   }
Ldarh(const Register & rt,const MemOperand & src)1701*f5c631daSSadaf Ebrahimi   void Ldarh(const Register& rt, const MemOperand& src) {
1702*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1703*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1704*f5c631daSSadaf Ebrahimi     ldarh(rt, src);
1705*f5c631daSSadaf Ebrahimi   }
Ldlar(const Register & rt,const MemOperand & src)1706*f5c631daSSadaf Ebrahimi   void Ldlar(const Register& rt, const MemOperand& src) {
1707*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1708*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1709*f5c631daSSadaf Ebrahimi     ldlar(rt, src);
1710*f5c631daSSadaf Ebrahimi   }
Ldlarb(const Register & rt,const MemOperand & src)1711*f5c631daSSadaf Ebrahimi   void Ldlarb(const Register& rt, const MemOperand& src) {
1712*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1713*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1714*f5c631daSSadaf Ebrahimi     ldlarb(rt, src);
1715*f5c631daSSadaf Ebrahimi   }
Ldlarh(const Register & rt,const MemOperand & src)1716*f5c631daSSadaf Ebrahimi   void Ldlarh(const Register& rt, const MemOperand& src) {
1717*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1718*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1719*f5c631daSSadaf Ebrahimi     ldlarh(rt, src);
1720*f5c631daSSadaf Ebrahimi   }
Ldaxp(const Register & rt,const Register & rt2,const MemOperand & src)1721*f5c631daSSadaf Ebrahimi   void Ldaxp(const Register& rt, const Register& rt2, const MemOperand& src) {
1722*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1723*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rt.Aliases(rt2));
1724*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1725*f5c631daSSadaf Ebrahimi     ldaxp(rt, rt2, src);
1726*f5c631daSSadaf Ebrahimi   }
Ldaxr(const Register & rt,const MemOperand & src)1727*f5c631daSSadaf Ebrahimi   void Ldaxr(const Register& rt, const MemOperand& src) {
1728*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1729*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1730*f5c631daSSadaf Ebrahimi     ldaxr(rt, src);
1731*f5c631daSSadaf Ebrahimi   }
Ldaxrb(const Register & rt,const MemOperand & src)1732*f5c631daSSadaf Ebrahimi   void Ldaxrb(const Register& rt, const MemOperand& src) {
1733*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1734*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1735*f5c631daSSadaf Ebrahimi     ldaxrb(rt, src);
1736*f5c631daSSadaf Ebrahimi   }
Ldaxrh(const Register & rt,const MemOperand & src)1737*f5c631daSSadaf Ebrahimi   void Ldaxrh(const Register& rt, const MemOperand& src) {
1738*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1739*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1740*f5c631daSSadaf Ebrahimi     ldaxrh(rt, src);
1741*f5c631daSSadaf Ebrahimi   }
1742*f5c631daSSadaf Ebrahimi 
1743*f5c631daSSadaf Ebrahimi // clang-format off
1744*f5c631daSSadaf Ebrahimi #define COMPARE_AND_SWAP_SINGLE_MACRO_LIST(V) \
1745*f5c631daSSadaf Ebrahimi   V(cas,    Cas)                              \
1746*f5c631daSSadaf Ebrahimi   V(casa,   Casa)                             \
1747*f5c631daSSadaf Ebrahimi   V(casl,   Casl)                             \
1748*f5c631daSSadaf Ebrahimi   V(casal,  Casal)                            \
1749*f5c631daSSadaf Ebrahimi   V(casb,   Casb)                             \
1750*f5c631daSSadaf Ebrahimi   V(casab,  Casab)                            \
1751*f5c631daSSadaf Ebrahimi   V(caslb,  Caslb)                            \
1752*f5c631daSSadaf Ebrahimi   V(casalb, Casalb)                           \
1753*f5c631daSSadaf Ebrahimi   V(cash,   Cash)                             \
1754*f5c631daSSadaf Ebrahimi   V(casah,  Casah)                            \
1755*f5c631daSSadaf Ebrahimi   V(caslh,  Caslh)                            \
1756*f5c631daSSadaf Ebrahimi   V(casalh, Casalh)
1757*f5c631daSSadaf Ebrahimi // clang-format on
1758*f5c631daSSadaf Ebrahimi 
1759*f5c631daSSadaf Ebrahimi #define DEFINE_MACRO_ASM_FUNC(ASM, MASM)                                     \
1760*f5c631daSSadaf Ebrahimi   void MASM(const Register& rs, const Register& rt, const MemOperand& src) { \
1761*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);                                  \
1762*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);                                    \
1763*f5c631daSSadaf Ebrahimi     ASM(rs, rt, src);                                                        \
1764*f5c631daSSadaf Ebrahimi   }
1765*f5c631daSSadaf Ebrahimi   COMPARE_AND_SWAP_SINGLE_MACRO_LIST(DEFINE_MACRO_ASM_FUNC)
1766*f5c631daSSadaf Ebrahimi #undef DEFINE_MACRO_ASM_FUNC
1767*f5c631daSSadaf Ebrahimi 
1768*f5c631daSSadaf Ebrahimi 
1769*f5c631daSSadaf Ebrahimi // clang-format off
1770*f5c631daSSadaf Ebrahimi #define COMPARE_AND_SWAP_PAIR_MACRO_LIST(V) \
1771*f5c631daSSadaf Ebrahimi   V(casp,   Casp)                           \
1772*f5c631daSSadaf Ebrahimi   V(caspa,  Caspa)                          \
1773*f5c631daSSadaf Ebrahimi   V(caspl,  Caspl)                          \
1774*f5c631daSSadaf Ebrahimi   V(caspal, Caspal)
1775*f5c631daSSadaf Ebrahimi // clang-format on
1776*f5c631daSSadaf Ebrahimi 
1777*f5c631daSSadaf Ebrahimi #define DEFINE_MACRO_ASM_FUNC(ASM, MASM)    \
1778*f5c631daSSadaf Ebrahimi   void MASM(const Register& rs,             \
1779*f5c631daSSadaf Ebrahimi             const Register& rs2,            \
1780*f5c631daSSadaf Ebrahimi             const Register& rt,             \
1781*f5c631daSSadaf Ebrahimi             const Register& rt2,            \
1782*f5c631daSSadaf Ebrahimi             const MemOperand& src) {        \
1783*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_); \
1784*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);   \
1785*f5c631daSSadaf Ebrahimi     ASM(rs, rs2, rt, rt2, src);             \
1786*f5c631daSSadaf Ebrahimi   }
COMPARE_AND_SWAP_PAIR_MACRO_LIST(DEFINE_MACRO_ASM_FUNC)1787*f5c631daSSadaf Ebrahimi   COMPARE_AND_SWAP_PAIR_MACRO_LIST(DEFINE_MACRO_ASM_FUNC)
1788*f5c631daSSadaf Ebrahimi #undef DEFINE_MACRO_ASM_FUNC
1789*f5c631daSSadaf Ebrahimi 
1790*f5c631daSSadaf Ebrahimi // These macros generate all the variations of the atomic memory operations,
1791*f5c631daSSadaf Ebrahimi // e.g. ldadd, ldadda, ldaddb, staddl, etc.
1792*f5c631daSSadaf Ebrahimi 
1793*f5c631daSSadaf Ebrahimi // clang-format off
1794*f5c631daSSadaf Ebrahimi #define ATOMIC_MEMORY_SIMPLE_MACRO_LIST(V, DEF, MASM_PRE, ASM_PRE) \
1795*f5c631daSSadaf Ebrahimi   V(DEF, MASM_PRE##add,  ASM_PRE##add)                             \
1796*f5c631daSSadaf Ebrahimi   V(DEF, MASM_PRE##clr,  ASM_PRE##clr)                             \
1797*f5c631daSSadaf Ebrahimi   V(DEF, MASM_PRE##eor,  ASM_PRE##eor)                             \
1798*f5c631daSSadaf Ebrahimi   V(DEF, MASM_PRE##set,  ASM_PRE##set)                             \
1799*f5c631daSSadaf Ebrahimi   V(DEF, MASM_PRE##smax, ASM_PRE##smax)                            \
1800*f5c631daSSadaf Ebrahimi   V(DEF, MASM_PRE##smin, ASM_PRE##smin)                            \
1801*f5c631daSSadaf Ebrahimi   V(DEF, MASM_PRE##umax, ASM_PRE##umax)                            \
1802*f5c631daSSadaf Ebrahimi   V(DEF, MASM_PRE##umin, ASM_PRE##umin)
1803*f5c631daSSadaf Ebrahimi 
1804*f5c631daSSadaf Ebrahimi #define ATOMIC_MEMORY_STORE_MACRO_MODES(V, MASM, ASM) \
1805*f5c631daSSadaf Ebrahimi   V(MASM,     ASM)                                    \
1806*f5c631daSSadaf Ebrahimi   V(MASM##l,  ASM##l)                                 \
1807*f5c631daSSadaf Ebrahimi   V(MASM##b,  ASM##b)                                 \
1808*f5c631daSSadaf Ebrahimi   V(MASM##lb, ASM##lb)                                \
1809*f5c631daSSadaf Ebrahimi   V(MASM##h,  ASM##h)                                 \
1810*f5c631daSSadaf Ebrahimi   V(MASM##lh, ASM##lh)
1811*f5c631daSSadaf Ebrahimi 
1812*f5c631daSSadaf Ebrahimi #define ATOMIC_MEMORY_LOAD_MACRO_MODES(V, MASM, ASM) \
1813*f5c631daSSadaf Ebrahimi   ATOMIC_MEMORY_STORE_MACRO_MODES(V, MASM, ASM)      \
1814*f5c631daSSadaf Ebrahimi   V(MASM##a,   ASM##a)                               \
1815*f5c631daSSadaf Ebrahimi   V(MASM##al,  ASM##al)                              \
1816*f5c631daSSadaf Ebrahimi   V(MASM##ab,  ASM##ab)                              \
1817*f5c631daSSadaf Ebrahimi   V(MASM##alb, ASM##alb)                             \
1818*f5c631daSSadaf Ebrahimi   V(MASM##ah,  ASM##ah)                              \
1819*f5c631daSSadaf Ebrahimi   V(MASM##alh, ASM##alh)
1820*f5c631daSSadaf Ebrahimi // clang-format on
1821*f5c631daSSadaf Ebrahimi 
1822*f5c631daSSadaf Ebrahimi #define DEFINE_MACRO_LOAD_ASM_FUNC(MASM, ASM)                                \
1823*f5c631daSSadaf Ebrahimi   void MASM(const Register& rs, const Register& rt, const MemOperand& src) { \
1824*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);                                  \
1825*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);                                    \
1826*f5c631daSSadaf Ebrahimi     ASM(rs, rt, src);                                                        \
1827*f5c631daSSadaf Ebrahimi   }
1828*f5c631daSSadaf Ebrahimi #define DEFINE_MACRO_STORE_ASM_FUNC(MASM, ASM)           \
1829*f5c631daSSadaf Ebrahimi   void MASM(const Register& rs, const MemOperand& src) { \
1830*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);              \
1831*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);                \
1832*f5c631daSSadaf Ebrahimi     ASM(rs, src);                                        \
1833*f5c631daSSadaf Ebrahimi   }
1834*f5c631daSSadaf Ebrahimi 
1835*f5c631daSSadaf Ebrahimi   ATOMIC_MEMORY_SIMPLE_MACRO_LIST(ATOMIC_MEMORY_LOAD_MACRO_MODES,
1836*f5c631daSSadaf Ebrahimi                                   DEFINE_MACRO_LOAD_ASM_FUNC,
1837*f5c631daSSadaf Ebrahimi                                   Ld,
1838*f5c631daSSadaf Ebrahimi                                   ld)
1839*f5c631daSSadaf Ebrahimi   ATOMIC_MEMORY_SIMPLE_MACRO_LIST(ATOMIC_MEMORY_STORE_MACRO_MODES,
1840*f5c631daSSadaf Ebrahimi                                   DEFINE_MACRO_STORE_ASM_FUNC,
1841*f5c631daSSadaf Ebrahimi                                   St,
1842*f5c631daSSadaf Ebrahimi                                   st)
1843*f5c631daSSadaf Ebrahimi 
1844*f5c631daSSadaf Ebrahimi #define DEFINE_MACRO_SWP_ASM_FUNC(MASM, ASM)                                 \
1845*f5c631daSSadaf Ebrahimi   void MASM(const Register& rs, const Register& rt, const MemOperand& src) { \
1846*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);                                  \
1847*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);                                    \
1848*f5c631daSSadaf Ebrahimi     ASM(rs, rt, src);                                                        \
1849*f5c631daSSadaf Ebrahimi   }
1850*f5c631daSSadaf Ebrahimi 
1851*f5c631daSSadaf Ebrahimi   ATOMIC_MEMORY_LOAD_MACRO_MODES(DEFINE_MACRO_SWP_ASM_FUNC, Swp, swp)
1852*f5c631daSSadaf Ebrahimi 
1853*f5c631daSSadaf Ebrahimi #undef DEFINE_MACRO_LOAD_ASM_FUNC
1854*f5c631daSSadaf Ebrahimi #undef DEFINE_MACRO_STORE_ASM_FUNC
1855*f5c631daSSadaf Ebrahimi #undef DEFINE_MACRO_SWP_ASM_FUNC
1856*f5c631daSSadaf Ebrahimi 
1857*f5c631daSSadaf Ebrahimi   void Ldaprb(const Register& rt, const MemOperand& src) {
1858*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1859*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1860*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(src.IsImmediateOffset());
1861*f5c631daSSadaf Ebrahimi     if (src.GetOffset() == 0) {
1862*f5c631daSSadaf Ebrahimi       ldaprb(rt, src);
1863*f5c631daSSadaf Ebrahimi     } else {
1864*f5c631daSSadaf Ebrahimi       ldapurb(rt, src);
1865*f5c631daSSadaf Ebrahimi     }
1866*f5c631daSSadaf Ebrahimi   }
1867*f5c631daSSadaf Ebrahimi 
Ldapursb(const Register & rt,const MemOperand & src)1868*f5c631daSSadaf Ebrahimi   void Ldapursb(const Register& rt, const MemOperand& src) {
1869*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1870*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1871*f5c631daSSadaf Ebrahimi     ldapursb(rt, src);
1872*f5c631daSSadaf Ebrahimi   }
1873*f5c631daSSadaf Ebrahimi 
Ldaprh(const Register & rt,const MemOperand & src)1874*f5c631daSSadaf Ebrahimi   void Ldaprh(const Register& rt, const MemOperand& src) {
1875*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1876*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1877*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(src.IsImmediateOffset());
1878*f5c631daSSadaf Ebrahimi     if (src.GetOffset() == 0) {
1879*f5c631daSSadaf Ebrahimi       ldaprh(rt, src);
1880*f5c631daSSadaf Ebrahimi     } else {
1881*f5c631daSSadaf Ebrahimi       ldapurh(rt, src);
1882*f5c631daSSadaf Ebrahimi     }
1883*f5c631daSSadaf Ebrahimi   }
1884*f5c631daSSadaf Ebrahimi 
Ldapursh(const Register & rt,const MemOperand & src)1885*f5c631daSSadaf Ebrahimi   void Ldapursh(const Register& rt, const MemOperand& src) {
1886*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1887*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1888*f5c631daSSadaf Ebrahimi     ldapursh(rt, src);
1889*f5c631daSSadaf Ebrahimi   }
1890*f5c631daSSadaf Ebrahimi 
Ldapr(const Register & rt,const MemOperand & src)1891*f5c631daSSadaf Ebrahimi   void Ldapr(const Register& rt, const MemOperand& src) {
1892*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1893*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1894*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(src.IsImmediateOffset());
1895*f5c631daSSadaf Ebrahimi     if (src.GetOffset() == 0) {
1896*f5c631daSSadaf Ebrahimi       ldapr(rt, src);
1897*f5c631daSSadaf Ebrahimi     } else {
1898*f5c631daSSadaf Ebrahimi       ldapur(rt, src);
1899*f5c631daSSadaf Ebrahimi     }
1900*f5c631daSSadaf Ebrahimi   }
1901*f5c631daSSadaf Ebrahimi 
Ldapursw(const Register & rt,const MemOperand & src)1902*f5c631daSSadaf Ebrahimi   void Ldapursw(const Register& rt, const MemOperand& src) {
1903*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1904*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1905*f5c631daSSadaf Ebrahimi     ldapursw(rt, src);
1906*f5c631daSSadaf Ebrahimi   }
1907*f5c631daSSadaf Ebrahimi 
Ldnp(const CPURegister & rt,const CPURegister & rt2,const MemOperand & src)1908*f5c631daSSadaf Ebrahimi   void Ldnp(const CPURegister& rt,
1909*f5c631daSSadaf Ebrahimi             const CPURegister& rt2,
1910*f5c631daSSadaf Ebrahimi             const MemOperand& src) {
1911*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1912*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1913*f5c631daSSadaf Ebrahimi     ldnp(rt, rt2, src);
1914*f5c631daSSadaf Ebrahimi   }
1915*f5c631daSSadaf Ebrahimi   // Provide both double and float interfaces for FP immediate loads, rather
1916*f5c631daSSadaf Ebrahimi   // than relying on implicit C++ casts. This allows signalling NaNs to be
1917*f5c631daSSadaf Ebrahimi   // preserved when the immediate matches the format of fd. Most systems convert
1918*f5c631daSSadaf Ebrahimi   // signalling NaNs to quiet NaNs when converting between float and double.
Ldr(const VRegister & vt,double imm)1919*f5c631daSSadaf Ebrahimi   void Ldr(const VRegister& vt, double imm) {
1920*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1921*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1922*f5c631daSSadaf Ebrahimi     RawLiteral* literal;
1923*f5c631daSSadaf Ebrahimi     if (vt.IsD()) {
1924*f5c631daSSadaf Ebrahimi       literal = new Literal<double>(imm,
1925*f5c631daSSadaf Ebrahimi                                     &literal_pool_,
1926*f5c631daSSadaf Ebrahimi                                     RawLiteral::kDeletedOnPlacementByPool);
1927*f5c631daSSadaf Ebrahimi     } else {
1928*f5c631daSSadaf Ebrahimi       literal = new Literal<float>(static_cast<float>(imm),
1929*f5c631daSSadaf Ebrahimi                                    &literal_pool_,
1930*f5c631daSSadaf Ebrahimi                                    RawLiteral::kDeletedOnPlacementByPool);
1931*f5c631daSSadaf Ebrahimi     }
1932*f5c631daSSadaf Ebrahimi     ldr(vt, literal);
1933*f5c631daSSadaf Ebrahimi   }
Ldr(const VRegister & vt,float imm)1934*f5c631daSSadaf Ebrahimi   void Ldr(const VRegister& vt, float imm) {
1935*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1936*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1937*f5c631daSSadaf Ebrahimi     RawLiteral* literal;
1938*f5c631daSSadaf Ebrahimi     if (vt.IsS()) {
1939*f5c631daSSadaf Ebrahimi       literal = new Literal<float>(imm,
1940*f5c631daSSadaf Ebrahimi                                    &literal_pool_,
1941*f5c631daSSadaf Ebrahimi                                    RawLiteral::kDeletedOnPlacementByPool);
1942*f5c631daSSadaf Ebrahimi     } else {
1943*f5c631daSSadaf Ebrahimi       literal = new Literal<double>(static_cast<double>(imm),
1944*f5c631daSSadaf Ebrahimi                                     &literal_pool_,
1945*f5c631daSSadaf Ebrahimi                                     RawLiteral::kDeletedOnPlacementByPool);
1946*f5c631daSSadaf Ebrahimi     }
1947*f5c631daSSadaf Ebrahimi     ldr(vt, literal);
1948*f5c631daSSadaf Ebrahimi   }
Ldr(const VRegister & vt,uint64_t high64,uint64_t low64)1949*f5c631daSSadaf Ebrahimi   void Ldr(const VRegister& vt, uint64_t high64, uint64_t low64) {
1950*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1951*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(vt.IsQ());
1952*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1953*f5c631daSSadaf Ebrahimi     ldr(vt,
1954*f5c631daSSadaf Ebrahimi         new Literal<uint64_t>(high64,
1955*f5c631daSSadaf Ebrahimi                               low64,
1956*f5c631daSSadaf Ebrahimi                               &literal_pool_,
1957*f5c631daSSadaf Ebrahimi                               RawLiteral::kDeletedOnPlacementByPool));
1958*f5c631daSSadaf Ebrahimi   }
Ldr(const Register & rt,uint64_t imm)1959*f5c631daSSadaf Ebrahimi   void Ldr(const Register& rt, uint64_t imm) {
1960*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1961*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rt.IsZero());
1962*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1963*f5c631daSSadaf Ebrahimi     RawLiteral* literal;
1964*f5c631daSSadaf Ebrahimi     if (rt.Is64Bits()) {
1965*f5c631daSSadaf Ebrahimi       literal = new Literal<uint64_t>(imm,
1966*f5c631daSSadaf Ebrahimi                                       &literal_pool_,
1967*f5c631daSSadaf Ebrahimi                                       RawLiteral::kDeletedOnPlacementByPool);
1968*f5c631daSSadaf Ebrahimi     } else {
1969*f5c631daSSadaf Ebrahimi       VIXL_ASSERT(rt.Is32Bits());
1970*f5c631daSSadaf Ebrahimi       VIXL_ASSERT(IsUint32(imm) || IsInt32(imm));
1971*f5c631daSSadaf Ebrahimi       literal = new Literal<uint32_t>(static_cast<uint32_t>(imm),
1972*f5c631daSSadaf Ebrahimi                                       &literal_pool_,
1973*f5c631daSSadaf Ebrahimi                                       RawLiteral::kDeletedOnPlacementByPool);
1974*f5c631daSSadaf Ebrahimi     }
1975*f5c631daSSadaf Ebrahimi     ldr(rt, literal);
1976*f5c631daSSadaf Ebrahimi   }
Ldrsw(const Register & rt,uint32_t imm)1977*f5c631daSSadaf Ebrahimi   void Ldrsw(const Register& rt, uint32_t imm) {
1978*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1979*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rt.IsZero());
1980*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1981*f5c631daSSadaf Ebrahimi     ldrsw(rt,
1982*f5c631daSSadaf Ebrahimi           new Literal<uint32_t>(imm,
1983*f5c631daSSadaf Ebrahimi                                 &literal_pool_,
1984*f5c631daSSadaf Ebrahimi                                 RawLiteral::kDeletedOnPlacementByPool));
1985*f5c631daSSadaf Ebrahimi   }
Ldr(const CPURegister & rt,RawLiteral * literal)1986*f5c631daSSadaf Ebrahimi   void Ldr(const CPURegister& rt, RawLiteral* literal) {
1987*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1988*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1989*f5c631daSSadaf Ebrahimi     ldr(rt, literal);
1990*f5c631daSSadaf Ebrahimi   }
Ldrsw(const Register & rt,RawLiteral * literal)1991*f5c631daSSadaf Ebrahimi   void Ldrsw(const Register& rt, RawLiteral* literal) {
1992*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1993*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
1994*f5c631daSSadaf Ebrahimi     ldrsw(rt, literal);
1995*f5c631daSSadaf Ebrahimi   }
Ldxp(const Register & rt,const Register & rt2,const MemOperand & src)1996*f5c631daSSadaf Ebrahimi   void Ldxp(const Register& rt, const Register& rt2, const MemOperand& src) {
1997*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
1998*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rt.Aliases(rt2));
1999*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2000*f5c631daSSadaf Ebrahimi     ldxp(rt, rt2, src);
2001*f5c631daSSadaf Ebrahimi   }
Ldxr(const Register & rt,const MemOperand & src)2002*f5c631daSSadaf Ebrahimi   void Ldxr(const Register& rt, const MemOperand& src) {
2003*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2004*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2005*f5c631daSSadaf Ebrahimi     ldxr(rt, src);
2006*f5c631daSSadaf Ebrahimi   }
Ldxrb(const Register & rt,const MemOperand & src)2007*f5c631daSSadaf Ebrahimi   void Ldxrb(const Register& rt, const MemOperand& src) {
2008*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2009*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2010*f5c631daSSadaf Ebrahimi     ldxrb(rt, src);
2011*f5c631daSSadaf Ebrahimi   }
Ldxrh(const Register & rt,const MemOperand & src)2012*f5c631daSSadaf Ebrahimi   void Ldxrh(const Register& rt, const MemOperand& src) {
2013*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2014*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2015*f5c631daSSadaf Ebrahimi     ldxrh(rt, src);
2016*f5c631daSSadaf Ebrahimi   }
Lsl(const Register & rd,const Register & rn,unsigned shift)2017*f5c631daSSadaf Ebrahimi   void Lsl(const Register& rd, const Register& rn, unsigned shift) {
2018*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2019*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2020*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2021*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2022*f5c631daSSadaf Ebrahimi     lsl(rd, rn, shift);
2023*f5c631daSSadaf Ebrahimi   }
Lsl(const Register & rd,const Register & rn,const Register & rm)2024*f5c631daSSadaf Ebrahimi   void Lsl(const Register& rd, const Register& rn, const Register& rm) {
2025*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2026*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2027*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2028*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rm.IsZero());
2029*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2030*f5c631daSSadaf Ebrahimi     lslv(rd, rn, rm);
2031*f5c631daSSadaf Ebrahimi   }
Lsr(const Register & rd,const Register & rn,unsigned shift)2032*f5c631daSSadaf Ebrahimi   void Lsr(const Register& rd, const Register& rn, unsigned shift) {
2033*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2034*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2035*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2036*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2037*f5c631daSSadaf Ebrahimi     lsr(rd, rn, shift);
2038*f5c631daSSadaf Ebrahimi   }
Lsr(const Register & rd,const Register & rn,const Register & rm)2039*f5c631daSSadaf Ebrahimi   void Lsr(const Register& rd, const Register& rn, const Register& rm) {
2040*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2041*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2042*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2043*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rm.IsZero());
2044*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2045*f5c631daSSadaf Ebrahimi     lsrv(rd, rn, rm);
2046*f5c631daSSadaf Ebrahimi   }
Ldraa(const Register & xt,const MemOperand & src)2047*f5c631daSSadaf Ebrahimi   void Ldraa(const Register& xt, const MemOperand& src) {
2048*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2049*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2050*f5c631daSSadaf Ebrahimi     ldraa(xt, src);
2051*f5c631daSSadaf Ebrahimi   }
Ldrab(const Register & xt,const MemOperand & src)2052*f5c631daSSadaf Ebrahimi   void Ldrab(const Register& xt, const MemOperand& src) {
2053*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2054*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2055*f5c631daSSadaf Ebrahimi     ldrab(xt, src);
2056*f5c631daSSadaf Ebrahimi   }
Madd(const Register & rd,const Register & rn,const Register & rm,const Register & ra)2057*f5c631daSSadaf Ebrahimi   void Madd(const Register& rd,
2058*f5c631daSSadaf Ebrahimi             const Register& rn,
2059*f5c631daSSadaf Ebrahimi             const Register& rm,
2060*f5c631daSSadaf Ebrahimi             const Register& ra) {
2061*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2062*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2063*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2064*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rm.IsZero());
2065*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!ra.IsZero());
2066*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2067*f5c631daSSadaf Ebrahimi     madd(rd, rn, rm, ra);
2068*f5c631daSSadaf Ebrahimi   }
Mneg(const Register & rd,const Register & rn,const Register & rm)2069*f5c631daSSadaf Ebrahimi   void Mneg(const Register& rd, const Register& rn, const Register& rm) {
2070*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2071*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2072*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2073*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rm.IsZero());
2074*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2075*f5c631daSSadaf Ebrahimi     mneg(rd, rn, rm);
2076*f5c631daSSadaf Ebrahimi   }
2077*f5c631daSSadaf Ebrahimi   void Mov(const Register& rd,
2078*f5c631daSSadaf Ebrahimi            const Register& rn,
2079*f5c631daSSadaf Ebrahimi            DiscardMoveMode discard_mode = kDontDiscardForSameWReg) {
2080*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2081*f5c631daSSadaf Ebrahimi     // Emit a register move only if the registers are distinct, or if they are
2082*f5c631daSSadaf Ebrahimi     // not X registers.
2083*f5c631daSSadaf Ebrahimi     //
2084*f5c631daSSadaf Ebrahimi     // Note that mov(w0, w0) is not a no-op because it clears the top word of
2085*f5c631daSSadaf Ebrahimi     // x0. A flag is provided (kDiscardForSameWReg) if a move between the same W
2086*f5c631daSSadaf Ebrahimi     // registers is not required to clear the top word of the X register. In
2087*f5c631daSSadaf Ebrahimi     // this case, the instruction is discarded.
2088*f5c631daSSadaf Ebrahimi     //
2089*f5c631daSSadaf Ebrahimi     // If the sp is an operand, add #0 is emitted, otherwise, orr #0.
2090*f5c631daSSadaf Ebrahimi     if (!rd.Is(rn) ||
2091*f5c631daSSadaf Ebrahimi         (rd.Is32Bits() && (discard_mode == kDontDiscardForSameWReg))) {
2092*f5c631daSSadaf Ebrahimi       SingleEmissionCheckScope guard(this);
2093*f5c631daSSadaf Ebrahimi       mov(rd, rn);
2094*f5c631daSSadaf Ebrahimi     }
2095*f5c631daSSadaf Ebrahimi   }
2096*f5c631daSSadaf Ebrahimi   void Movk(const Register& rd, uint64_t imm, int shift = -1) {
2097*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2098*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2099*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2100*f5c631daSSadaf Ebrahimi     movk(rd, imm, shift);
2101*f5c631daSSadaf Ebrahimi   }
Mrs(const Register & rt,SystemRegister sysreg)2102*f5c631daSSadaf Ebrahimi   void Mrs(const Register& rt, SystemRegister sysreg) {
2103*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2104*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rt.IsZero());
2105*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2106*f5c631daSSadaf Ebrahimi     mrs(rt, sysreg);
2107*f5c631daSSadaf Ebrahimi   }
Msr(SystemRegister sysreg,const Register & rt)2108*f5c631daSSadaf Ebrahimi   void Msr(SystemRegister sysreg, const Register& rt) {
2109*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2110*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rt.IsZero());
2111*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2112*f5c631daSSadaf Ebrahimi     msr(sysreg, rt);
2113*f5c631daSSadaf Ebrahimi   }
Cfinv()2114*f5c631daSSadaf Ebrahimi   void Cfinv() {
2115*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2116*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2117*f5c631daSSadaf Ebrahimi     cfinv();
2118*f5c631daSSadaf Ebrahimi   }
Axflag()2119*f5c631daSSadaf Ebrahimi   void Axflag() {
2120*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2121*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2122*f5c631daSSadaf Ebrahimi     axflag();
2123*f5c631daSSadaf Ebrahimi   }
Xaflag()2124*f5c631daSSadaf Ebrahimi   void Xaflag() {
2125*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2126*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2127*f5c631daSSadaf Ebrahimi     xaflag();
2128*f5c631daSSadaf Ebrahimi   }
2129*f5c631daSSadaf Ebrahimi   void Sys(int op1, int crn, int crm, int op2, const Register& rt = xzr) {
2130*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2131*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2132*f5c631daSSadaf Ebrahimi     sys(op1, crn, crm, op2, rt);
2133*f5c631daSSadaf Ebrahimi   }
Dc(DataCacheOp op,const Register & rt)2134*f5c631daSSadaf Ebrahimi   void Dc(DataCacheOp op, const Register& rt) {
2135*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2136*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2137*f5c631daSSadaf Ebrahimi     dc(op, rt);
2138*f5c631daSSadaf Ebrahimi   }
Ic(InstructionCacheOp op,const Register & rt)2139*f5c631daSSadaf Ebrahimi   void Ic(InstructionCacheOp op, const Register& rt) {
2140*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2141*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2142*f5c631daSSadaf Ebrahimi     ic(op, rt);
2143*f5c631daSSadaf Ebrahimi   }
Msub(const Register & rd,const Register & rn,const Register & rm,const Register & ra)2144*f5c631daSSadaf Ebrahimi   void Msub(const Register& rd,
2145*f5c631daSSadaf Ebrahimi             const Register& rn,
2146*f5c631daSSadaf Ebrahimi             const Register& rm,
2147*f5c631daSSadaf Ebrahimi             const Register& ra) {
2148*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2149*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2150*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2151*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rm.IsZero());
2152*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!ra.IsZero());
2153*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2154*f5c631daSSadaf Ebrahimi     msub(rd, rn, rm, ra);
2155*f5c631daSSadaf Ebrahimi   }
Mul(const Register & rd,const Register & rn,const Register & rm)2156*f5c631daSSadaf Ebrahimi   void Mul(const Register& rd, const Register& rn, const Register& rm) {
2157*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2158*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2159*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2160*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rm.IsZero());
2161*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2162*f5c631daSSadaf Ebrahimi     mul(rd, rn, rm);
2163*f5c631daSSadaf Ebrahimi   }
Nop()2164*f5c631daSSadaf Ebrahimi   void Nop() {
2165*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2166*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2167*f5c631daSSadaf Ebrahimi     nop();
2168*f5c631daSSadaf Ebrahimi   }
Rbit(const Register & rd,const Register & rn)2169*f5c631daSSadaf Ebrahimi   void Rbit(const Register& rd, const Register& rn) {
2170*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2171*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2172*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2173*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2174*f5c631daSSadaf Ebrahimi     rbit(rd, rn);
2175*f5c631daSSadaf Ebrahimi   }
2176*f5c631daSSadaf Ebrahimi   void Ret(const Register& xn = lr) {
2177*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2178*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!xn.IsZero());
2179*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2180*f5c631daSSadaf Ebrahimi     ret(xn);
2181*f5c631daSSadaf Ebrahimi   }
Rev(const Register & rd,const Register & rn)2182*f5c631daSSadaf Ebrahimi   void Rev(const Register& rd, const Register& rn) {
2183*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2184*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2185*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2186*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2187*f5c631daSSadaf Ebrahimi     rev(rd, rn);
2188*f5c631daSSadaf Ebrahimi   }
Rev16(const Register & rd,const Register & rn)2189*f5c631daSSadaf Ebrahimi   void Rev16(const Register& rd, const Register& rn) {
2190*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2191*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2192*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2193*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2194*f5c631daSSadaf Ebrahimi     rev16(rd, rn);
2195*f5c631daSSadaf Ebrahimi   }
Rev32(const Register & rd,const Register & rn)2196*f5c631daSSadaf Ebrahimi   void Rev32(const Register& rd, const Register& rn) {
2197*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2198*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2199*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2200*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2201*f5c631daSSadaf Ebrahimi     rev32(rd, rn);
2202*f5c631daSSadaf Ebrahimi   }
Rev64(const Register & rd,const Register & rn)2203*f5c631daSSadaf Ebrahimi   void Rev64(const Register& rd, const Register& rn) {
2204*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2205*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2206*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2207*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2208*f5c631daSSadaf Ebrahimi     rev64(rd, rn);
2209*f5c631daSSadaf Ebrahimi   }
2210*f5c631daSSadaf Ebrahimi 
2211*f5c631daSSadaf Ebrahimi #define PAUTH_MASM_VARIATIONS(V) \
2212*f5c631daSSadaf Ebrahimi   V(Paci, paci)                  \
2213*f5c631daSSadaf Ebrahimi   V(Pacd, pacd)                  \
2214*f5c631daSSadaf Ebrahimi   V(Auti, auti)                  \
2215*f5c631daSSadaf Ebrahimi   V(Autd, autd)
2216*f5c631daSSadaf Ebrahimi 
2217*f5c631daSSadaf Ebrahimi #define DEFINE_MACRO_ASM_FUNCS(MASM_PRE, ASM_PRE)            \
2218*f5c631daSSadaf Ebrahimi   void MASM_PRE##a(const Register& xd, const Register& xn) { \
2219*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);                  \
2220*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);                    \
2221*f5c631daSSadaf Ebrahimi     ASM_PRE##a(xd, xn);                                      \
2222*f5c631daSSadaf Ebrahimi   }                                                          \
2223*f5c631daSSadaf Ebrahimi   void MASM_PRE##za(const Register& xd) {                    \
2224*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);                  \
2225*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);                    \
2226*f5c631daSSadaf Ebrahimi     ASM_PRE##za(xd);                                         \
2227*f5c631daSSadaf Ebrahimi   }                                                          \
2228*f5c631daSSadaf Ebrahimi   void MASM_PRE##b(const Register& xd, const Register& xn) { \
2229*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);                  \
2230*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);                    \
2231*f5c631daSSadaf Ebrahimi     ASM_PRE##b(xd, xn);                                      \
2232*f5c631daSSadaf Ebrahimi   }                                                          \
2233*f5c631daSSadaf Ebrahimi   void MASM_PRE##zb(const Register& xd) {                    \
2234*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);                  \
2235*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);                    \
2236*f5c631daSSadaf Ebrahimi     ASM_PRE##zb(xd);                                         \
2237*f5c631daSSadaf Ebrahimi   }
2238*f5c631daSSadaf Ebrahimi 
PAUTH_MASM_VARIATIONS(DEFINE_MACRO_ASM_FUNCS)2239*f5c631daSSadaf Ebrahimi   PAUTH_MASM_VARIATIONS(DEFINE_MACRO_ASM_FUNCS)
2240*f5c631daSSadaf Ebrahimi #undef DEFINE_MACRO_ASM_FUNCS
2241*f5c631daSSadaf Ebrahimi 
2242*f5c631daSSadaf Ebrahimi   void Pacga(const Register& xd, const Register& xn, const Register& xm) {
2243*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2244*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2245*f5c631daSSadaf Ebrahimi     pacga(xd, xn, xm);
2246*f5c631daSSadaf Ebrahimi   }
2247*f5c631daSSadaf Ebrahimi 
Xpaci(const Register & xd)2248*f5c631daSSadaf Ebrahimi   void Xpaci(const Register& xd) {
2249*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2250*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2251*f5c631daSSadaf Ebrahimi     xpaci(xd);
2252*f5c631daSSadaf Ebrahimi   }
2253*f5c631daSSadaf Ebrahimi 
Xpacd(const Register & xd)2254*f5c631daSSadaf Ebrahimi   void Xpacd(const Register& xd) {
2255*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2256*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2257*f5c631daSSadaf Ebrahimi     xpacd(xd);
2258*f5c631daSSadaf Ebrahimi   }
Ror(const Register & rd,const Register & rs,unsigned shift)2259*f5c631daSSadaf Ebrahimi   void Ror(const Register& rd, const Register& rs, unsigned shift) {
2260*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2261*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2262*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.IsZero());
2263*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2264*f5c631daSSadaf Ebrahimi     ror(rd, rs, shift);
2265*f5c631daSSadaf Ebrahimi   }
Ror(const Register & rd,const Register & rn,const Register & rm)2266*f5c631daSSadaf Ebrahimi   void Ror(const Register& rd, const Register& rn, const Register& rm) {
2267*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2268*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2269*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2270*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rm.IsZero());
2271*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2272*f5c631daSSadaf Ebrahimi     rorv(rd, rn, rm);
2273*f5c631daSSadaf Ebrahimi   }
Sbfiz(const Register & rd,const Register & rn,unsigned lsb,unsigned width)2274*f5c631daSSadaf Ebrahimi   void Sbfiz(const Register& rd,
2275*f5c631daSSadaf Ebrahimi              const Register& rn,
2276*f5c631daSSadaf Ebrahimi              unsigned lsb,
2277*f5c631daSSadaf Ebrahimi              unsigned width) {
2278*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2279*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2280*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2281*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2282*f5c631daSSadaf Ebrahimi     sbfiz(rd, rn, lsb, width);
2283*f5c631daSSadaf Ebrahimi   }
Sbfm(const Register & rd,const Register & rn,unsigned immr,unsigned imms)2284*f5c631daSSadaf Ebrahimi   void Sbfm(const Register& rd,
2285*f5c631daSSadaf Ebrahimi             const Register& rn,
2286*f5c631daSSadaf Ebrahimi             unsigned immr,
2287*f5c631daSSadaf Ebrahimi             unsigned imms) {
2288*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2289*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2290*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2291*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2292*f5c631daSSadaf Ebrahimi     sbfm(rd, rn, immr, imms);
2293*f5c631daSSadaf Ebrahimi   }
Sbfx(const Register & rd,const Register & rn,unsigned lsb,unsigned width)2294*f5c631daSSadaf Ebrahimi   void Sbfx(const Register& rd,
2295*f5c631daSSadaf Ebrahimi             const Register& rn,
2296*f5c631daSSadaf Ebrahimi             unsigned lsb,
2297*f5c631daSSadaf Ebrahimi             unsigned width) {
2298*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2299*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2300*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2301*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2302*f5c631daSSadaf Ebrahimi     sbfx(rd, rn, lsb, width);
2303*f5c631daSSadaf Ebrahimi   }
2304*f5c631daSSadaf Ebrahimi   void Scvtf(const VRegister& vd, const Register& rn, int fbits = 0) {
2305*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2306*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2307*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2308*f5c631daSSadaf Ebrahimi     scvtf(vd, rn, fbits);
2309*f5c631daSSadaf Ebrahimi   }
Sdiv(const Register & rd,const Register & rn,const Register & rm)2310*f5c631daSSadaf Ebrahimi   void Sdiv(const Register& rd, const Register& rn, const Register& rm) {
2311*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2312*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2313*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2314*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rm.IsZero());
2315*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2316*f5c631daSSadaf Ebrahimi     sdiv(rd, rn, rm);
2317*f5c631daSSadaf Ebrahimi   }
Smaddl(const Register & rd,const Register & rn,const Register & rm,const Register & ra)2318*f5c631daSSadaf Ebrahimi   void Smaddl(const Register& rd,
2319*f5c631daSSadaf Ebrahimi               const Register& rn,
2320*f5c631daSSadaf Ebrahimi               const Register& rm,
2321*f5c631daSSadaf Ebrahimi               const Register& ra) {
2322*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2323*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2324*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2325*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rm.IsZero());
2326*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!ra.IsZero());
2327*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2328*f5c631daSSadaf Ebrahimi     smaddl(rd, rn, rm, ra);
2329*f5c631daSSadaf Ebrahimi   }
Smsubl(const Register & rd,const Register & rn,const Register & rm,const Register & ra)2330*f5c631daSSadaf Ebrahimi   void Smsubl(const Register& rd,
2331*f5c631daSSadaf Ebrahimi               const Register& rn,
2332*f5c631daSSadaf Ebrahimi               const Register& rm,
2333*f5c631daSSadaf Ebrahimi               const Register& ra) {
2334*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2335*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2336*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2337*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rm.IsZero());
2338*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!ra.IsZero());
2339*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2340*f5c631daSSadaf Ebrahimi     smsubl(rd, rn, rm, ra);
2341*f5c631daSSadaf Ebrahimi   }
Smull(const Register & rd,const Register & rn,const Register & rm)2342*f5c631daSSadaf Ebrahimi   void Smull(const Register& rd, const Register& rn, const Register& rm) {
2343*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2344*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2345*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2346*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rm.IsZero());
2347*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2348*f5c631daSSadaf Ebrahimi     smull(rd, rn, rm);
2349*f5c631daSSadaf Ebrahimi   }
Smulh(const Register & xd,const Register & xn,const Register & xm)2350*f5c631daSSadaf Ebrahimi   void Smulh(const Register& xd, const Register& xn, const Register& xm) {
2351*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2352*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!xd.IsZero());
2353*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!xn.IsZero());
2354*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!xm.IsZero());
2355*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2356*f5c631daSSadaf Ebrahimi     smulh(xd, xn, xm);
2357*f5c631daSSadaf Ebrahimi   }
Stlr(const Register & rt,const MemOperand & dst)2358*f5c631daSSadaf Ebrahimi   void Stlr(const Register& rt, const MemOperand& dst) {
2359*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2360*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2361*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(dst.IsImmediateOffset());
2362*f5c631daSSadaf Ebrahimi     if (dst.GetOffset() == 0) {
2363*f5c631daSSadaf Ebrahimi       stlr(rt, dst);
2364*f5c631daSSadaf Ebrahimi     } else {
2365*f5c631daSSadaf Ebrahimi       stlur(rt, dst);
2366*f5c631daSSadaf Ebrahimi     }
2367*f5c631daSSadaf Ebrahimi   }
Stlrb(const Register & rt,const MemOperand & dst)2368*f5c631daSSadaf Ebrahimi   void Stlrb(const Register& rt, const MemOperand& dst) {
2369*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2370*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2371*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(dst.IsImmediateOffset());
2372*f5c631daSSadaf Ebrahimi     if (dst.GetOffset() == 0) {
2373*f5c631daSSadaf Ebrahimi       stlrb(rt, dst);
2374*f5c631daSSadaf Ebrahimi     } else {
2375*f5c631daSSadaf Ebrahimi       stlurb(rt, dst);
2376*f5c631daSSadaf Ebrahimi     }
2377*f5c631daSSadaf Ebrahimi   }
Stlrh(const Register & rt,const MemOperand & dst)2378*f5c631daSSadaf Ebrahimi   void Stlrh(const Register& rt, const MemOperand& dst) {
2379*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2380*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2381*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(dst.IsImmediateOffset());
2382*f5c631daSSadaf Ebrahimi     if (dst.GetOffset() == 0) {
2383*f5c631daSSadaf Ebrahimi       stlrh(rt, dst);
2384*f5c631daSSadaf Ebrahimi     } else {
2385*f5c631daSSadaf Ebrahimi       stlurh(rt, dst);
2386*f5c631daSSadaf Ebrahimi     }
2387*f5c631daSSadaf Ebrahimi   }
Stllr(const Register & rt,const MemOperand & dst)2388*f5c631daSSadaf Ebrahimi   void Stllr(const Register& rt, const MemOperand& dst) {
2389*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2390*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2391*f5c631daSSadaf Ebrahimi     stllr(rt, dst);
2392*f5c631daSSadaf Ebrahimi   }
Stllrb(const Register & rt,const MemOperand & dst)2393*f5c631daSSadaf Ebrahimi   void Stllrb(const Register& rt, const MemOperand& dst) {
2394*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2395*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2396*f5c631daSSadaf Ebrahimi     stllrb(rt, dst);
2397*f5c631daSSadaf Ebrahimi   }
Stllrh(const Register & rt,const MemOperand & dst)2398*f5c631daSSadaf Ebrahimi   void Stllrh(const Register& rt, const MemOperand& dst) {
2399*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2400*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2401*f5c631daSSadaf Ebrahimi     stllrh(rt, dst);
2402*f5c631daSSadaf Ebrahimi   }
Stlxp(const Register & rs,const Register & rt,const Register & rt2,const MemOperand & dst)2403*f5c631daSSadaf Ebrahimi   void Stlxp(const Register& rs,
2404*f5c631daSSadaf Ebrahimi              const Register& rt,
2405*f5c631daSSadaf Ebrahimi              const Register& rt2,
2406*f5c631daSSadaf Ebrahimi              const MemOperand& dst) {
2407*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2408*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.Aliases(dst.GetBaseRegister()));
2409*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.Aliases(rt));
2410*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.Aliases(rt2));
2411*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2412*f5c631daSSadaf Ebrahimi     stlxp(rs, rt, rt2, dst);
2413*f5c631daSSadaf Ebrahimi   }
Stlxr(const Register & rs,const Register & rt,const MemOperand & dst)2414*f5c631daSSadaf Ebrahimi   void Stlxr(const Register& rs, const Register& rt, const MemOperand& dst) {
2415*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2416*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.Aliases(dst.GetBaseRegister()));
2417*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.Aliases(rt));
2418*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2419*f5c631daSSadaf Ebrahimi     stlxr(rs, rt, dst);
2420*f5c631daSSadaf Ebrahimi   }
Stlxrb(const Register & rs,const Register & rt,const MemOperand & dst)2421*f5c631daSSadaf Ebrahimi   void Stlxrb(const Register& rs, const Register& rt, const MemOperand& dst) {
2422*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2423*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.Aliases(dst.GetBaseRegister()));
2424*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.Aliases(rt));
2425*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2426*f5c631daSSadaf Ebrahimi     stlxrb(rs, rt, dst);
2427*f5c631daSSadaf Ebrahimi   }
Stlxrh(const Register & rs,const Register & rt,const MemOperand & dst)2428*f5c631daSSadaf Ebrahimi   void Stlxrh(const Register& rs, const Register& rt, const MemOperand& dst) {
2429*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2430*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.Aliases(dst.GetBaseRegister()));
2431*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.Aliases(rt));
2432*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2433*f5c631daSSadaf Ebrahimi     stlxrh(rs, rt, dst);
2434*f5c631daSSadaf Ebrahimi   }
Stnp(const CPURegister & rt,const CPURegister & rt2,const MemOperand & dst)2435*f5c631daSSadaf Ebrahimi   void Stnp(const CPURegister& rt,
2436*f5c631daSSadaf Ebrahimi             const CPURegister& rt2,
2437*f5c631daSSadaf Ebrahimi             const MemOperand& dst) {
2438*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2439*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2440*f5c631daSSadaf Ebrahimi     stnp(rt, rt2, dst);
2441*f5c631daSSadaf Ebrahimi   }
Stxp(const Register & rs,const Register & rt,const Register & rt2,const MemOperand & dst)2442*f5c631daSSadaf Ebrahimi   void Stxp(const Register& rs,
2443*f5c631daSSadaf Ebrahimi             const Register& rt,
2444*f5c631daSSadaf Ebrahimi             const Register& rt2,
2445*f5c631daSSadaf Ebrahimi             const MemOperand& dst) {
2446*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2447*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.Aliases(dst.GetBaseRegister()));
2448*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.Aliases(rt));
2449*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.Aliases(rt2));
2450*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2451*f5c631daSSadaf Ebrahimi     stxp(rs, rt, rt2, dst);
2452*f5c631daSSadaf Ebrahimi   }
Stxr(const Register & rs,const Register & rt,const MemOperand & dst)2453*f5c631daSSadaf Ebrahimi   void Stxr(const Register& rs, const Register& rt, const MemOperand& dst) {
2454*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2455*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.Aliases(dst.GetBaseRegister()));
2456*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.Aliases(rt));
2457*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2458*f5c631daSSadaf Ebrahimi     stxr(rs, rt, dst);
2459*f5c631daSSadaf Ebrahimi   }
Stxrb(const Register & rs,const Register & rt,const MemOperand & dst)2460*f5c631daSSadaf Ebrahimi   void Stxrb(const Register& rs, const Register& rt, const MemOperand& dst) {
2461*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2462*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.Aliases(dst.GetBaseRegister()));
2463*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.Aliases(rt));
2464*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2465*f5c631daSSadaf Ebrahimi     stxrb(rs, rt, dst);
2466*f5c631daSSadaf Ebrahimi   }
Stxrh(const Register & rs,const Register & rt,const MemOperand & dst)2467*f5c631daSSadaf Ebrahimi   void Stxrh(const Register& rs, const Register& rt, const MemOperand& dst) {
2468*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2469*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.Aliases(dst.GetBaseRegister()));
2470*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rs.Aliases(rt));
2471*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2472*f5c631daSSadaf Ebrahimi     stxrh(rs, rt, dst);
2473*f5c631daSSadaf Ebrahimi   }
Svc(int code)2474*f5c631daSSadaf Ebrahimi   void Svc(int code) {
2475*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2476*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2477*f5c631daSSadaf Ebrahimi     svc(code);
2478*f5c631daSSadaf Ebrahimi   }
Sxtb(const Register & rd,const Register & rn)2479*f5c631daSSadaf Ebrahimi   void Sxtb(const Register& rd, const Register& rn) {
2480*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2481*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2482*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2483*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2484*f5c631daSSadaf Ebrahimi     sxtb(rd, rn);
2485*f5c631daSSadaf Ebrahimi   }
Sxth(const Register & rd,const Register & rn)2486*f5c631daSSadaf Ebrahimi   void Sxth(const Register& rd, const Register& rn) {
2487*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2488*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2489*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2490*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2491*f5c631daSSadaf Ebrahimi     sxth(rd, rn);
2492*f5c631daSSadaf Ebrahimi   }
Sxtw(const Register & rd,const Register & rn)2493*f5c631daSSadaf Ebrahimi   void Sxtw(const Register& rd, const Register& rn) {
2494*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2495*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2496*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2497*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2498*f5c631daSSadaf Ebrahimi     sxtw(rd, rn);
2499*f5c631daSSadaf Ebrahimi   }
Tbl(const VRegister & vd,const VRegister & vn,const VRegister & vm)2500*f5c631daSSadaf Ebrahimi   void Tbl(const VRegister& vd, const VRegister& vn, const VRegister& vm) {
2501*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2502*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2503*f5c631daSSadaf Ebrahimi     tbl(vd, vn, vm);
2504*f5c631daSSadaf Ebrahimi   }
Tbl(const VRegister & vd,const VRegister & vn,const VRegister & vn2,const VRegister & vm)2505*f5c631daSSadaf Ebrahimi   void Tbl(const VRegister& vd,
2506*f5c631daSSadaf Ebrahimi            const VRegister& vn,
2507*f5c631daSSadaf Ebrahimi            const VRegister& vn2,
2508*f5c631daSSadaf Ebrahimi            const VRegister& vm) {
2509*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2510*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2511*f5c631daSSadaf Ebrahimi     tbl(vd, vn, vn2, vm);
2512*f5c631daSSadaf Ebrahimi   }
Tbl(const VRegister & vd,const VRegister & vn,const VRegister & vn2,const VRegister & vn3,const VRegister & vm)2513*f5c631daSSadaf Ebrahimi   void Tbl(const VRegister& vd,
2514*f5c631daSSadaf Ebrahimi            const VRegister& vn,
2515*f5c631daSSadaf Ebrahimi            const VRegister& vn2,
2516*f5c631daSSadaf Ebrahimi            const VRegister& vn3,
2517*f5c631daSSadaf Ebrahimi            const VRegister& vm) {
2518*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2519*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2520*f5c631daSSadaf Ebrahimi     tbl(vd, vn, vn2, vn3, vm);
2521*f5c631daSSadaf Ebrahimi   }
Tbl(const VRegister & vd,const VRegister & vn,const VRegister & vn2,const VRegister & vn3,const VRegister & vn4,const VRegister & vm)2522*f5c631daSSadaf Ebrahimi   void Tbl(const VRegister& vd,
2523*f5c631daSSadaf Ebrahimi            const VRegister& vn,
2524*f5c631daSSadaf Ebrahimi            const VRegister& vn2,
2525*f5c631daSSadaf Ebrahimi            const VRegister& vn3,
2526*f5c631daSSadaf Ebrahimi            const VRegister& vn4,
2527*f5c631daSSadaf Ebrahimi            const VRegister& vm) {
2528*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2529*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2530*f5c631daSSadaf Ebrahimi     tbl(vd, vn, vn2, vn3, vn4, vm);
2531*f5c631daSSadaf Ebrahimi   }
Tbx(const VRegister & vd,const VRegister & vn,const VRegister & vm)2532*f5c631daSSadaf Ebrahimi   void Tbx(const VRegister& vd, const VRegister& vn, const VRegister& vm) {
2533*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2534*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2535*f5c631daSSadaf Ebrahimi     tbx(vd, vn, vm);
2536*f5c631daSSadaf Ebrahimi   }
Tbx(const VRegister & vd,const VRegister & vn,const VRegister & vn2,const VRegister & vm)2537*f5c631daSSadaf Ebrahimi   void Tbx(const VRegister& vd,
2538*f5c631daSSadaf Ebrahimi            const VRegister& vn,
2539*f5c631daSSadaf Ebrahimi            const VRegister& vn2,
2540*f5c631daSSadaf Ebrahimi            const VRegister& vm) {
2541*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2542*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2543*f5c631daSSadaf Ebrahimi     tbx(vd, vn, vn2, vm);
2544*f5c631daSSadaf Ebrahimi   }
Tbx(const VRegister & vd,const VRegister & vn,const VRegister & vn2,const VRegister & vn3,const VRegister & vm)2545*f5c631daSSadaf Ebrahimi   void Tbx(const VRegister& vd,
2546*f5c631daSSadaf Ebrahimi            const VRegister& vn,
2547*f5c631daSSadaf Ebrahimi            const VRegister& vn2,
2548*f5c631daSSadaf Ebrahimi            const VRegister& vn3,
2549*f5c631daSSadaf Ebrahimi            const VRegister& vm) {
2550*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2551*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2552*f5c631daSSadaf Ebrahimi     tbx(vd, vn, vn2, vn3, vm);
2553*f5c631daSSadaf Ebrahimi   }
Tbx(const VRegister & vd,const VRegister & vn,const VRegister & vn2,const VRegister & vn3,const VRegister & vn4,const VRegister & vm)2554*f5c631daSSadaf Ebrahimi   void Tbx(const VRegister& vd,
2555*f5c631daSSadaf Ebrahimi            const VRegister& vn,
2556*f5c631daSSadaf Ebrahimi            const VRegister& vn2,
2557*f5c631daSSadaf Ebrahimi            const VRegister& vn3,
2558*f5c631daSSadaf Ebrahimi            const VRegister& vn4,
2559*f5c631daSSadaf Ebrahimi            const VRegister& vm) {
2560*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2561*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2562*f5c631daSSadaf Ebrahimi     tbx(vd, vn, vn2, vn3, vn4, vm);
2563*f5c631daSSadaf Ebrahimi   }
2564*f5c631daSSadaf Ebrahimi   void Tbnz(const Register& rt, unsigned bit_pos, Label* label);
2565*f5c631daSSadaf Ebrahimi   void Tbz(const Register& rt, unsigned bit_pos, Label* label);
Ubfiz(const Register & rd,const Register & rn,unsigned lsb,unsigned width)2566*f5c631daSSadaf Ebrahimi   void Ubfiz(const Register& rd,
2567*f5c631daSSadaf Ebrahimi              const Register& rn,
2568*f5c631daSSadaf Ebrahimi              unsigned lsb,
2569*f5c631daSSadaf Ebrahimi              unsigned width) {
2570*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2571*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2572*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2573*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2574*f5c631daSSadaf Ebrahimi     ubfiz(rd, rn, lsb, width);
2575*f5c631daSSadaf Ebrahimi   }
Ubfm(const Register & rd,const Register & rn,unsigned immr,unsigned imms)2576*f5c631daSSadaf Ebrahimi   void Ubfm(const Register& rd,
2577*f5c631daSSadaf Ebrahimi             const Register& rn,
2578*f5c631daSSadaf Ebrahimi             unsigned immr,
2579*f5c631daSSadaf Ebrahimi             unsigned imms) {
2580*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2581*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2582*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2583*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2584*f5c631daSSadaf Ebrahimi     ubfm(rd, rn, immr, imms);
2585*f5c631daSSadaf Ebrahimi   }
Ubfx(const Register & rd,const Register & rn,unsigned lsb,unsigned width)2586*f5c631daSSadaf Ebrahimi   void Ubfx(const Register& rd,
2587*f5c631daSSadaf Ebrahimi             const Register& rn,
2588*f5c631daSSadaf Ebrahimi             unsigned lsb,
2589*f5c631daSSadaf Ebrahimi             unsigned width) {
2590*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2591*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2592*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2593*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2594*f5c631daSSadaf Ebrahimi     ubfx(rd, rn, lsb, width);
2595*f5c631daSSadaf Ebrahimi   }
2596*f5c631daSSadaf Ebrahimi   void Ucvtf(const VRegister& vd, const Register& rn, int fbits = 0) {
2597*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2598*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2599*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2600*f5c631daSSadaf Ebrahimi     ucvtf(vd, rn, fbits);
2601*f5c631daSSadaf Ebrahimi   }
Udiv(const Register & rd,const Register & rn,const Register & rm)2602*f5c631daSSadaf Ebrahimi   void Udiv(const Register& rd, const Register& rn, const Register& rm) {
2603*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2604*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2605*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2606*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rm.IsZero());
2607*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2608*f5c631daSSadaf Ebrahimi     udiv(rd, rn, rm);
2609*f5c631daSSadaf Ebrahimi   }
Umaddl(const Register & rd,const Register & rn,const Register & rm,const Register & ra)2610*f5c631daSSadaf Ebrahimi   void Umaddl(const Register& rd,
2611*f5c631daSSadaf Ebrahimi               const Register& rn,
2612*f5c631daSSadaf Ebrahimi               const Register& rm,
2613*f5c631daSSadaf Ebrahimi               const Register& ra) {
2614*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2615*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2616*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2617*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rm.IsZero());
2618*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!ra.IsZero());
2619*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2620*f5c631daSSadaf Ebrahimi     umaddl(rd, rn, rm, ra);
2621*f5c631daSSadaf Ebrahimi   }
Umull(const Register & rd,const Register & rn,const Register & rm)2622*f5c631daSSadaf Ebrahimi   void Umull(const Register& rd, const Register& rn, const Register& rm) {
2623*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2624*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2625*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2626*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rm.IsZero());
2627*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2628*f5c631daSSadaf Ebrahimi     umull(rd, rn, rm);
2629*f5c631daSSadaf Ebrahimi   }
Umulh(const Register & xd,const Register & xn,const Register & xm)2630*f5c631daSSadaf Ebrahimi   void Umulh(const Register& xd, const Register& xn, const Register& xm) {
2631*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2632*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!xd.IsZero());
2633*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!xn.IsZero());
2634*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!xm.IsZero());
2635*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2636*f5c631daSSadaf Ebrahimi     umulh(xd, xn, xm);
2637*f5c631daSSadaf Ebrahimi   }
Umsubl(const Register & rd,const Register & rn,const Register & rm,const Register & ra)2638*f5c631daSSadaf Ebrahimi   void Umsubl(const Register& rd,
2639*f5c631daSSadaf Ebrahimi               const Register& rn,
2640*f5c631daSSadaf Ebrahimi               const Register& rm,
2641*f5c631daSSadaf Ebrahimi               const Register& ra) {
2642*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2643*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2644*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2645*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rm.IsZero());
2646*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!ra.IsZero());
2647*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2648*f5c631daSSadaf Ebrahimi     umsubl(rd, rn, rm, ra);
2649*f5c631daSSadaf Ebrahimi   }
Unreachable()2650*f5c631daSSadaf Ebrahimi   void Unreachable() {
2651*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2652*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2653*f5c631daSSadaf Ebrahimi     if (generate_simulator_code_) {
2654*f5c631daSSadaf Ebrahimi       hlt(kUnreachableOpcode);
2655*f5c631daSSadaf Ebrahimi     } else {
2656*f5c631daSSadaf Ebrahimi       // Use the architecturally-defined UDF instruction to abort on hardware,
2657*f5c631daSSadaf Ebrahimi       // because using HLT and BRK tends to make the process difficult to debug.
2658*f5c631daSSadaf Ebrahimi       udf(kUnreachableOpcode);
2659*f5c631daSSadaf Ebrahimi     }
2660*f5c631daSSadaf Ebrahimi   }
Uxtb(const Register & rd,const Register & rn)2661*f5c631daSSadaf Ebrahimi   void Uxtb(const Register& rd, const Register& rn) {
2662*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2663*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2664*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2665*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2666*f5c631daSSadaf Ebrahimi     uxtb(rd, rn);
2667*f5c631daSSadaf Ebrahimi   }
Uxth(const Register & rd,const Register & rn)2668*f5c631daSSadaf Ebrahimi   void Uxth(const Register& rd, const Register& rn) {
2669*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2670*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2671*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2672*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2673*f5c631daSSadaf Ebrahimi     uxth(rd, rn);
2674*f5c631daSSadaf Ebrahimi   }
Uxtw(const Register & rd,const Register & rn)2675*f5c631daSSadaf Ebrahimi   void Uxtw(const Register& rd, const Register& rn) {
2676*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
2677*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rd.IsZero());
2678*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!rn.IsZero());
2679*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
2680*f5c631daSSadaf Ebrahimi     uxtw(rd, rn);
2681*f5c631daSSadaf Ebrahimi   }
2682*f5c631daSSadaf Ebrahimi 
2683*f5c631daSSadaf Ebrahimi // NEON 3 vector register instructions.
2684*f5c631daSSadaf Ebrahimi #define NEON_3VREG_MACRO_LIST(V) \
2685*f5c631daSSadaf Ebrahimi   V(add, Add)                    \
2686*f5c631daSSadaf Ebrahimi   V(addhn, Addhn)                \
2687*f5c631daSSadaf Ebrahimi   V(addhn2, Addhn2)              \
2688*f5c631daSSadaf Ebrahimi   V(addp, Addp)                  \
2689*f5c631daSSadaf Ebrahimi   V(and_, And)                   \
2690*f5c631daSSadaf Ebrahimi   V(bic, Bic)                    \
2691*f5c631daSSadaf Ebrahimi   V(bif, Bif)                    \
2692*f5c631daSSadaf Ebrahimi   V(bit, Bit)                    \
2693*f5c631daSSadaf Ebrahimi   V(bsl, Bsl)                    \
2694*f5c631daSSadaf Ebrahimi   V(cmeq, Cmeq)                  \
2695*f5c631daSSadaf Ebrahimi   V(cmge, Cmge)                  \
2696*f5c631daSSadaf Ebrahimi   V(cmgt, Cmgt)                  \
2697*f5c631daSSadaf Ebrahimi   V(cmhi, Cmhi)                  \
2698*f5c631daSSadaf Ebrahimi   V(cmhs, Cmhs)                  \
2699*f5c631daSSadaf Ebrahimi   V(cmtst, Cmtst)                \
2700*f5c631daSSadaf Ebrahimi   V(eor, Eor)                    \
2701*f5c631daSSadaf Ebrahimi   V(fabd, Fabd)                  \
2702*f5c631daSSadaf Ebrahimi   V(facge, Facge)                \
2703*f5c631daSSadaf Ebrahimi   V(facgt, Facgt)                \
2704*f5c631daSSadaf Ebrahimi   V(faddp, Faddp)                \
2705*f5c631daSSadaf Ebrahimi   V(fcmeq, Fcmeq)                \
2706*f5c631daSSadaf Ebrahimi   V(fcmge, Fcmge)                \
2707*f5c631daSSadaf Ebrahimi   V(fcmgt, Fcmgt)                \
2708*f5c631daSSadaf Ebrahimi   V(fmaxnmp, Fmaxnmp)            \
2709*f5c631daSSadaf Ebrahimi   V(fmaxp, Fmaxp)                \
2710*f5c631daSSadaf Ebrahimi   V(fminnmp, Fminnmp)            \
2711*f5c631daSSadaf Ebrahimi   V(fminp, Fminp)                \
2712*f5c631daSSadaf Ebrahimi   V(fmla, Fmla)                  \
2713*f5c631daSSadaf Ebrahimi   V(fmlal, Fmlal)                \
2714*f5c631daSSadaf Ebrahimi   V(fmlal2, Fmlal2)              \
2715*f5c631daSSadaf Ebrahimi   V(fmls, Fmls)                  \
2716*f5c631daSSadaf Ebrahimi   V(fmlsl, Fmlsl)                \
2717*f5c631daSSadaf Ebrahimi   V(fmlsl2, Fmlsl2)              \
2718*f5c631daSSadaf Ebrahimi   V(fmulx, Fmulx)                \
2719*f5c631daSSadaf Ebrahimi   V(frecps, Frecps)              \
2720*f5c631daSSadaf Ebrahimi   V(frsqrts, Frsqrts)            \
2721*f5c631daSSadaf Ebrahimi   V(mla, Mla)                    \
2722*f5c631daSSadaf Ebrahimi   V(mls, Mls)                    \
2723*f5c631daSSadaf Ebrahimi   V(mul, Mul)                    \
2724*f5c631daSSadaf Ebrahimi   V(orn, Orn)                    \
2725*f5c631daSSadaf Ebrahimi   V(orr, Orr)                    \
2726*f5c631daSSadaf Ebrahimi   V(pmul, Pmul)                  \
2727*f5c631daSSadaf Ebrahimi   V(pmull, Pmull)                \
2728*f5c631daSSadaf Ebrahimi   V(pmull2, Pmull2)              \
2729*f5c631daSSadaf Ebrahimi   V(raddhn, Raddhn)              \
2730*f5c631daSSadaf Ebrahimi   V(raddhn2, Raddhn2)            \
2731*f5c631daSSadaf Ebrahimi   V(rsubhn, Rsubhn)              \
2732*f5c631daSSadaf Ebrahimi   V(rsubhn2, Rsubhn2)            \
2733*f5c631daSSadaf Ebrahimi   V(saba, Saba)                  \
2734*f5c631daSSadaf Ebrahimi   V(sabal, Sabal)                \
2735*f5c631daSSadaf Ebrahimi   V(sabal2, Sabal2)              \
2736*f5c631daSSadaf Ebrahimi   V(sabd, Sabd)                  \
2737*f5c631daSSadaf Ebrahimi   V(sabdl, Sabdl)                \
2738*f5c631daSSadaf Ebrahimi   V(sabdl2, Sabdl2)              \
2739*f5c631daSSadaf Ebrahimi   V(saddl, Saddl)                \
2740*f5c631daSSadaf Ebrahimi   V(saddl2, Saddl2)              \
2741*f5c631daSSadaf Ebrahimi   V(saddw, Saddw)                \
2742*f5c631daSSadaf Ebrahimi   V(saddw2, Saddw2)              \
2743*f5c631daSSadaf Ebrahimi   V(shadd, Shadd)                \
2744*f5c631daSSadaf Ebrahimi   V(shsub, Shsub)                \
2745*f5c631daSSadaf Ebrahimi   V(smax, Smax)                  \
2746*f5c631daSSadaf Ebrahimi   V(smaxp, Smaxp)                \
2747*f5c631daSSadaf Ebrahimi   V(smin, Smin)                  \
2748*f5c631daSSadaf Ebrahimi   V(sminp, Sminp)                \
2749*f5c631daSSadaf Ebrahimi   V(smlal, Smlal)                \
2750*f5c631daSSadaf Ebrahimi   V(smlal2, Smlal2)              \
2751*f5c631daSSadaf Ebrahimi   V(smlsl, Smlsl)                \
2752*f5c631daSSadaf Ebrahimi   V(smlsl2, Smlsl2)              \
2753*f5c631daSSadaf Ebrahimi   V(smull, Smull)                \
2754*f5c631daSSadaf Ebrahimi   V(smull2, Smull2)              \
2755*f5c631daSSadaf Ebrahimi   V(sqadd, Sqadd)                \
2756*f5c631daSSadaf Ebrahimi   V(sqdmlal, Sqdmlal)            \
2757*f5c631daSSadaf Ebrahimi   V(sqdmlal2, Sqdmlal2)          \
2758*f5c631daSSadaf Ebrahimi   V(sqdmlsl, Sqdmlsl)            \
2759*f5c631daSSadaf Ebrahimi   V(sqdmlsl2, Sqdmlsl2)          \
2760*f5c631daSSadaf Ebrahimi   V(sqdmulh, Sqdmulh)            \
2761*f5c631daSSadaf Ebrahimi   V(sqdmull, Sqdmull)            \
2762*f5c631daSSadaf Ebrahimi   V(sqdmull2, Sqdmull2)          \
2763*f5c631daSSadaf Ebrahimi   V(sqrdmulh, Sqrdmulh)          \
2764*f5c631daSSadaf Ebrahimi   V(sdot, Sdot)                  \
2765*f5c631daSSadaf Ebrahimi   V(sqrdmlah, Sqrdmlah)          \
2766*f5c631daSSadaf Ebrahimi   V(udot, Udot)                  \
2767*f5c631daSSadaf Ebrahimi   V(sqrdmlsh, Sqrdmlsh)          \
2768*f5c631daSSadaf Ebrahimi   V(sqrshl, Sqrshl)              \
2769*f5c631daSSadaf Ebrahimi   V(sqshl, Sqshl)                \
2770*f5c631daSSadaf Ebrahimi   V(sqsub, Sqsub)                \
2771*f5c631daSSadaf Ebrahimi   V(srhadd, Srhadd)              \
2772*f5c631daSSadaf Ebrahimi   V(srshl, Srshl)                \
2773*f5c631daSSadaf Ebrahimi   V(sshl, Sshl)                  \
2774*f5c631daSSadaf Ebrahimi   V(ssubl, Ssubl)                \
2775*f5c631daSSadaf Ebrahimi   V(ssubl2, Ssubl2)              \
2776*f5c631daSSadaf Ebrahimi   V(ssubw, Ssubw)                \
2777*f5c631daSSadaf Ebrahimi   V(ssubw2, Ssubw2)              \
2778*f5c631daSSadaf Ebrahimi   V(sub, Sub)                    \
2779*f5c631daSSadaf Ebrahimi   V(subhn, Subhn)                \
2780*f5c631daSSadaf Ebrahimi   V(subhn2, Subhn2)              \
2781*f5c631daSSadaf Ebrahimi   V(trn1, Trn1)                  \
2782*f5c631daSSadaf Ebrahimi   V(trn2, Trn2)                  \
2783*f5c631daSSadaf Ebrahimi   V(uaba, Uaba)                  \
2784*f5c631daSSadaf Ebrahimi   V(uabal, Uabal)                \
2785*f5c631daSSadaf Ebrahimi   V(uabal2, Uabal2)              \
2786*f5c631daSSadaf Ebrahimi   V(uabd, Uabd)                  \
2787*f5c631daSSadaf Ebrahimi   V(uabdl, Uabdl)                \
2788*f5c631daSSadaf Ebrahimi   V(uabdl2, Uabdl2)              \
2789*f5c631daSSadaf Ebrahimi   V(uaddl, Uaddl)                \
2790*f5c631daSSadaf Ebrahimi   V(uaddl2, Uaddl2)              \
2791*f5c631daSSadaf Ebrahimi   V(uaddw, Uaddw)                \
2792*f5c631daSSadaf Ebrahimi   V(uaddw2, Uaddw2)              \
2793*f5c631daSSadaf Ebrahimi   V(uhadd, Uhadd)                \
2794*f5c631daSSadaf Ebrahimi   V(uhsub, Uhsub)                \
2795*f5c631daSSadaf Ebrahimi   V(umax, Umax)                  \
2796*f5c631daSSadaf Ebrahimi   V(umaxp, Umaxp)                \
2797*f5c631daSSadaf Ebrahimi   V(umin, Umin)                  \
2798*f5c631daSSadaf Ebrahimi   V(uminp, Uminp)                \
2799*f5c631daSSadaf Ebrahimi   V(umlal, Umlal)                \
2800*f5c631daSSadaf Ebrahimi   V(umlal2, Umlal2)              \
2801*f5c631daSSadaf Ebrahimi   V(umlsl, Umlsl)                \
2802*f5c631daSSadaf Ebrahimi   V(umlsl2, Umlsl2)              \
2803*f5c631daSSadaf Ebrahimi   V(umull, Umull)                \
2804*f5c631daSSadaf Ebrahimi   V(umull2, Umull2)              \
2805*f5c631daSSadaf Ebrahimi   V(uqadd, Uqadd)                \
2806*f5c631daSSadaf Ebrahimi   V(uqrshl, Uqrshl)              \
2807*f5c631daSSadaf Ebrahimi   V(uqshl, Uqshl)                \
2808*f5c631daSSadaf Ebrahimi   V(uqsub, Uqsub)                \
2809*f5c631daSSadaf Ebrahimi   V(urhadd, Urhadd)              \
2810*f5c631daSSadaf Ebrahimi   V(urshl, Urshl)                \
2811*f5c631daSSadaf Ebrahimi   V(ushl, Ushl)                  \
2812*f5c631daSSadaf Ebrahimi   V(usubl, Usubl)                \
2813*f5c631daSSadaf Ebrahimi   V(usubl2, Usubl2)              \
2814*f5c631daSSadaf Ebrahimi   V(usubw, Usubw)                \
2815*f5c631daSSadaf Ebrahimi   V(usubw2, Usubw2)              \
2816*f5c631daSSadaf Ebrahimi   V(uzp1, Uzp1)                  \
2817*f5c631daSSadaf Ebrahimi   V(uzp2, Uzp2)                  \
2818*f5c631daSSadaf Ebrahimi   V(zip1, Zip1)                  \
2819*f5c631daSSadaf Ebrahimi   V(zip2, Zip2)                  \
2820*f5c631daSSadaf Ebrahimi   V(smmla, Smmla)                \
2821*f5c631daSSadaf Ebrahimi   V(ummla, Ummla)                \
2822*f5c631daSSadaf Ebrahimi   V(usmmla, Usmmla)              \
2823*f5c631daSSadaf Ebrahimi   V(usdot, Usdot)
2824*f5c631daSSadaf Ebrahimi 
2825*f5c631daSSadaf Ebrahimi #define DEFINE_MACRO_ASM_FUNC(ASM, MASM)                                     \
2826*f5c631daSSadaf Ebrahimi   void MASM(const VRegister& vd, const VRegister& vn, const VRegister& vm) { \
2827*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);                                  \
2828*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);                                    \
2829*f5c631daSSadaf Ebrahimi     ASM(vd, vn, vm);                                                         \
2830*f5c631daSSadaf Ebrahimi   }
2831*f5c631daSSadaf Ebrahimi   NEON_3VREG_MACRO_LIST(DEFINE_MACRO_ASM_FUNC)
2832*f5c631daSSadaf Ebrahimi #undef DEFINE_MACRO_ASM_FUNC
2833*f5c631daSSadaf Ebrahimi 
2834*f5c631daSSadaf Ebrahimi // NEON 2 vector register instructions.
2835*f5c631daSSadaf Ebrahimi #define NEON_2VREG_MACRO_LIST(V) \
2836*f5c631daSSadaf Ebrahimi   V(abs, Abs)                    \
2837*f5c631daSSadaf Ebrahimi   V(addp, Addp)                  \
2838*f5c631daSSadaf Ebrahimi   V(addv, Addv)                  \
2839*f5c631daSSadaf Ebrahimi   V(cls, Cls)                    \
2840*f5c631daSSadaf Ebrahimi   V(clz, Clz)                    \
2841*f5c631daSSadaf Ebrahimi   V(cnt, Cnt)                    \
2842*f5c631daSSadaf Ebrahimi   V(fabs, Fabs)                  \
2843*f5c631daSSadaf Ebrahimi   V(faddp, Faddp)                \
2844*f5c631daSSadaf Ebrahimi   V(fcvtas, Fcvtas)              \
2845*f5c631daSSadaf Ebrahimi   V(fcvtau, Fcvtau)              \
2846*f5c631daSSadaf Ebrahimi   V(fcvtms, Fcvtms)              \
2847*f5c631daSSadaf Ebrahimi   V(fcvtmu, Fcvtmu)              \
2848*f5c631daSSadaf Ebrahimi   V(fcvtns, Fcvtns)              \
2849*f5c631daSSadaf Ebrahimi   V(fcvtnu, Fcvtnu)              \
2850*f5c631daSSadaf Ebrahimi   V(fcvtps, Fcvtps)              \
2851*f5c631daSSadaf Ebrahimi   V(fcvtpu, Fcvtpu)              \
2852*f5c631daSSadaf Ebrahimi   V(fmaxnmp, Fmaxnmp)            \
2853*f5c631daSSadaf Ebrahimi   V(fmaxnmv, Fmaxnmv)            \
2854*f5c631daSSadaf Ebrahimi   V(fmaxp, Fmaxp)                \
2855*f5c631daSSadaf Ebrahimi   V(fmaxv, Fmaxv)                \
2856*f5c631daSSadaf Ebrahimi   V(fminnmp, Fminnmp)            \
2857*f5c631daSSadaf Ebrahimi   V(fminnmv, Fminnmv)            \
2858*f5c631daSSadaf Ebrahimi   V(fminp, Fminp)                \
2859*f5c631daSSadaf Ebrahimi   V(fminv, Fminv)                \
2860*f5c631daSSadaf Ebrahimi   V(fneg, Fneg)                  \
2861*f5c631daSSadaf Ebrahimi   V(frecpe, Frecpe)              \
2862*f5c631daSSadaf Ebrahimi   V(frecpx, Frecpx)              \
2863*f5c631daSSadaf Ebrahimi   V(frint32x, Frint32x)          \
2864*f5c631daSSadaf Ebrahimi   V(frint32z, Frint32z)          \
2865*f5c631daSSadaf Ebrahimi   V(frint64x, Frint64x)          \
2866*f5c631daSSadaf Ebrahimi   V(frint64z, Frint64z)          \
2867*f5c631daSSadaf Ebrahimi   V(frinta, Frinta)              \
2868*f5c631daSSadaf Ebrahimi   V(frinti, Frinti)              \
2869*f5c631daSSadaf Ebrahimi   V(frintm, Frintm)              \
2870*f5c631daSSadaf Ebrahimi   V(frintn, Frintn)              \
2871*f5c631daSSadaf Ebrahimi   V(frintp, Frintp)              \
2872*f5c631daSSadaf Ebrahimi   V(frintx, Frintx)              \
2873*f5c631daSSadaf Ebrahimi   V(frintz, Frintz)              \
2874*f5c631daSSadaf Ebrahimi   V(frsqrte, Frsqrte)            \
2875*f5c631daSSadaf Ebrahimi   V(fsqrt, Fsqrt)                \
2876*f5c631daSSadaf Ebrahimi   V(mov, Mov)                    \
2877*f5c631daSSadaf Ebrahimi   V(mvn, Mvn)                    \
2878*f5c631daSSadaf Ebrahimi   V(neg, Neg)                    \
2879*f5c631daSSadaf Ebrahimi   V(not_, Not)                   \
2880*f5c631daSSadaf Ebrahimi   V(rbit, Rbit)                  \
2881*f5c631daSSadaf Ebrahimi   V(rev16, Rev16)                \
2882*f5c631daSSadaf Ebrahimi   V(rev32, Rev32)                \
2883*f5c631daSSadaf Ebrahimi   V(rev64, Rev64)                \
2884*f5c631daSSadaf Ebrahimi   V(sadalp, Sadalp)              \
2885*f5c631daSSadaf Ebrahimi   V(saddlp, Saddlp)              \
2886*f5c631daSSadaf Ebrahimi   V(saddlv, Saddlv)              \
2887*f5c631daSSadaf Ebrahimi   V(smaxv, Smaxv)                \
2888*f5c631daSSadaf Ebrahimi   V(sminv, Sminv)                \
2889*f5c631daSSadaf Ebrahimi   V(sqabs, Sqabs)                \
2890*f5c631daSSadaf Ebrahimi   V(sqneg, Sqneg)                \
2891*f5c631daSSadaf Ebrahimi   V(sqxtn, Sqxtn)                \
2892*f5c631daSSadaf Ebrahimi   V(sqxtn2, Sqxtn2)              \
2893*f5c631daSSadaf Ebrahimi   V(sqxtun, Sqxtun)              \
2894*f5c631daSSadaf Ebrahimi   V(sqxtun2, Sqxtun2)            \
2895*f5c631daSSadaf Ebrahimi   V(suqadd, Suqadd)              \
2896*f5c631daSSadaf Ebrahimi   V(sxtl, Sxtl)                  \
2897*f5c631daSSadaf Ebrahimi   V(sxtl2, Sxtl2)                \
2898*f5c631daSSadaf Ebrahimi   V(uadalp, Uadalp)              \
2899*f5c631daSSadaf Ebrahimi   V(uaddlp, Uaddlp)              \
2900*f5c631daSSadaf Ebrahimi   V(uaddlv, Uaddlv)              \
2901*f5c631daSSadaf Ebrahimi   V(umaxv, Umaxv)                \
2902*f5c631daSSadaf Ebrahimi   V(uminv, Uminv)                \
2903*f5c631daSSadaf Ebrahimi   V(uqxtn, Uqxtn)                \
2904*f5c631daSSadaf Ebrahimi   V(uqxtn2, Uqxtn2)              \
2905*f5c631daSSadaf Ebrahimi   V(urecpe, Urecpe)              \
2906*f5c631daSSadaf Ebrahimi   V(ursqrte, Ursqrte)            \
2907*f5c631daSSadaf Ebrahimi   V(usqadd, Usqadd)              \
2908*f5c631daSSadaf Ebrahimi   V(uxtl, Uxtl)                  \
2909*f5c631daSSadaf Ebrahimi   V(uxtl2, Uxtl2)                \
2910*f5c631daSSadaf Ebrahimi   V(xtn, Xtn)                    \
2911*f5c631daSSadaf Ebrahimi   V(xtn2, Xtn2)
2912*f5c631daSSadaf Ebrahimi 
2913*f5c631daSSadaf Ebrahimi #define DEFINE_MACRO_ASM_FUNC(ASM, MASM)                \
2914*f5c631daSSadaf Ebrahimi   void MASM(const VRegister& vd, const VRegister& vn) { \
2915*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);             \
2916*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);               \
2917*f5c631daSSadaf Ebrahimi     ASM(vd, vn);                                        \
2918*f5c631daSSadaf Ebrahimi   }
NEON_2VREG_MACRO_LIST(DEFINE_MACRO_ASM_FUNC)2919*f5c631daSSadaf Ebrahimi   NEON_2VREG_MACRO_LIST(DEFINE_MACRO_ASM_FUNC)
2920*f5c631daSSadaf Ebrahimi #undef DEFINE_MACRO_ASM_FUNC
2921*f5c631daSSadaf Ebrahimi 
2922*f5c631daSSadaf Ebrahimi // NEON 2 vector register with immediate instructions.
2923*f5c631daSSadaf Ebrahimi #define NEON_2VREG_FPIMM_MACRO_LIST(V) \
2924*f5c631daSSadaf Ebrahimi   V(fcmeq, Fcmeq)                      \
2925*f5c631daSSadaf Ebrahimi   V(fcmge, Fcmge)                      \
2926*f5c631daSSadaf Ebrahimi   V(fcmgt, Fcmgt)                      \
2927*f5c631daSSadaf Ebrahimi   V(fcmle, Fcmle)                      \
2928*f5c631daSSadaf Ebrahimi   V(fcmlt, Fcmlt)
2929*f5c631daSSadaf Ebrahimi 
2930*f5c631daSSadaf Ebrahimi #define DEFINE_MACRO_ASM_FUNC(ASM, MASM)                            \
2931*f5c631daSSadaf Ebrahimi   void MASM(const VRegister& vd, const VRegister& vn, double imm) { \
2932*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);                         \
2933*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);                           \
2934*f5c631daSSadaf Ebrahimi     ASM(vd, vn, imm);                                               \
2935*f5c631daSSadaf Ebrahimi   }
2936*f5c631daSSadaf Ebrahimi   NEON_2VREG_FPIMM_MACRO_LIST(DEFINE_MACRO_ASM_FUNC)
2937*f5c631daSSadaf Ebrahimi #undef DEFINE_MACRO_ASM_FUNC
2938*f5c631daSSadaf Ebrahimi 
2939*f5c631daSSadaf Ebrahimi // NEON by element instructions.
2940*f5c631daSSadaf Ebrahimi #define NEON_BYELEMENT_MACRO_LIST(V) \
2941*f5c631daSSadaf Ebrahimi   V(fmul, Fmul)                      \
2942*f5c631daSSadaf Ebrahimi   V(fmla, Fmla)                      \
2943*f5c631daSSadaf Ebrahimi   V(fmlal, Fmlal)                    \
2944*f5c631daSSadaf Ebrahimi   V(fmlal2, Fmlal2)                  \
2945*f5c631daSSadaf Ebrahimi   V(fmls, Fmls)                      \
2946*f5c631daSSadaf Ebrahimi   V(fmlsl, Fmlsl)                    \
2947*f5c631daSSadaf Ebrahimi   V(fmlsl2, Fmlsl2)                  \
2948*f5c631daSSadaf Ebrahimi   V(fmulx, Fmulx)                    \
2949*f5c631daSSadaf Ebrahimi   V(mul, Mul)                        \
2950*f5c631daSSadaf Ebrahimi   V(mla, Mla)                        \
2951*f5c631daSSadaf Ebrahimi   V(mls, Mls)                        \
2952*f5c631daSSadaf Ebrahimi   V(sqdmulh, Sqdmulh)                \
2953*f5c631daSSadaf Ebrahimi   V(sqrdmulh, Sqrdmulh)              \
2954*f5c631daSSadaf Ebrahimi   V(sdot, Sdot)                      \
2955*f5c631daSSadaf Ebrahimi   V(sqrdmlah, Sqrdmlah)              \
2956*f5c631daSSadaf Ebrahimi   V(udot, Udot)                      \
2957*f5c631daSSadaf Ebrahimi   V(sqrdmlsh, Sqrdmlsh)              \
2958*f5c631daSSadaf Ebrahimi   V(sqdmull, Sqdmull)                \
2959*f5c631daSSadaf Ebrahimi   V(sqdmull2, Sqdmull2)              \
2960*f5c631daSSadaf Ebrahimi   V(sqdmlal, Sqdmlal)                \
2961*f5c631daSSadaf Ebrahimi   V(sqdmlal2, Sqdmlal2)              \
2962*f5c631daSSadaf Ebrahimi   V(sqdmlsl, Sqdmlsl)                \
2963*f5c631daSSadaf Ebrahimi   V(sqdmlsl2, Sqdmlsl2)              \
2964*f5c631daSSadaf Ebrahimi   V(smull, Smull)                    \
2965*f5c631daSSadaf Ebrahimi   V(smull2, Smull2)                  \
2966*f5c631daSSadaf Ebrahimi   V(smlal, Smlal)                    \
2967*f5c631daSSadaf Ebrahimi   V(smlal2, Smlal2)                  \
2968*f5c631daSSadaf Ebrahimi   V(smlsl, Smlsl)                    \
2969*f5c631daSSadaf Ebrahimi   V(smlsl2, Smlsl2)                  \
2970*f5c631daSSadaf Ebrahimi   V(umull, Umull)                    \
2971*f5c631daSSadaf Ebrahimi   V(umull2, Umull2)                  \
2972*f5c631daSSadaf Ebrahimi   V(umlal, Umlal)                    \
2973*f5c631daSSadaf Ebrahimi   V(umlal2, Umlal2)                  \
2974*f5c631daSSadaf Ebrahimi   V(umlsl, Umlsl)                    \
2975*f5c631daSSadaf Ebrahimi   V(umlsl2, Umlsl2)                  \
2976*f5c631daSSadaf Ebrahimi   V(sudot, Sudot)                    \
2977*f5c631daSSadaf Ebrahimi   V(usdot, Usdot)
2978*f5c631daSSadaf Ebrahimi 
2979*f5c631daSSadaf Ebrahimi 
2980*f5c631daSSadaf Ebrahimi #define DEFINE_MACRO_ASM_FUNC(ASM, MASM)    \
2981*f5c631daSSadaf Ebrahimi   void MASM(const VRegister& vd,            \
2982*f5c631daSSadaf Ebrahimi             const VRegister& vn,            \
2983*f5c631daSSadaf Ebrahimi             const VRegister& vm,            \
2984*f5c631daSSadaf Ebrahimi             int vm_index) {                 \
2985*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_); \
2986*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);   \
2987*f5c631daSSadaf Ebrahimi     ASM(vd, vn, vm, vm_index);              \
2988*f5c631daSSadaf Ebrahimi   }
2989*f5c631daSSadaf Ebrahimi   NEON_BYELEMENT_MACRO_LIST(DEFINE_MACRO_ASM_FUNC)
2990*f5c631daSSadaf Ebrahimi #undef DEFINE_MACRO_ASM_FUNC
2991*f5c631daSSadaf Ebrahimi 
2992*f5c631daSSadaf Ebrahimi #define NEON_2VREG_SHIFT_MACRO_LIST(V) \
2993*f5c631daSSadaf Ebrahimi   V(rshrn, Rshrn)                      \
2994*f5c631daSSadaf Ebrahimi   V(rshrn2, Rshrn2)                    \
2995*f5c631daSSadaf Ebrahimi   V(shl, Shl)                          \
2996*f5c631daSSadaf Ebrahimi   V(shll, Shll)                        \
2997*f5c631daSSadaf Ebrahimi   V(shll2, Shll2)                      \
2998*f5c631daSSadaf Ebrahimi   V(shrn, Shrn)                        \
2999*f5c631daSSadaf Ebrahimi   V(shrn2, Shrn2)                      \
3000*f5c631daSSadaf Ebrahimi   V(sli, Sli)                          \
3001*f5c631daSSadaf Ebrahimi   V(sqrshrn, Sqrshrn)                  \
3002*f5c631daSSadaf Ebrahimi   V(sqrshrn2, Sqrshrn2)                \
3003*f5c631daSSadaf Ebrahimi   V(sqrshrun, Sqrshrun)                \
3004*f5c631daSSadaf Ebrahimi   V(sqrshrun2, Sqrshrun2)              \
3005*f5c631daSSadaf Ebrahimi   V(sqshl, Sqshl)                      \
3006*f5c631daSSadaf Ebrahimi   V(sqshlu, Sqshlu)                    \
3007*f5c631daSSadaf Ebrahimi   V(sqshrn, Sqshrn)                    \
3008*f5c631daSSadaf Ebrahimi   V(sqshrn2, Sqshrn2)                  \
3009*f5c631daSSadaf Ebrahimi   V(sqshrun, Sqshrun)                  \
3010*f5c631daSSadaf Ebrahimi   V(sqshrun2, Sqshrun2)                \
3011*f5c631daSSadaf Ebrahimi   V(sri, Sri)                          \
3012*f5c631daSSadaf Ebrahimi   V(srshr, Srshr)                      \
3013*f5c631daSSadaf Ebrahimi   V(srsra, Srsra)                      \
3014*f5c631daSSadaf Ebrahimi   V(sshr, Sshr)                        \
3015*f5c631daSSadaf Ebrahimi   V(ssra, Ssra)                        \
3016*f5c631daSSadaf Ebrahimi   V(uqrshrn, Uqrshrn)                  \
3017*f5c631daSSadaf Ebrahimi   V(uqrshrn2, Uqrshrn2)                \
3018*f5c631daSSadaf Ebrahimi   V(uqshl, Uqshl)                      \
3019*f5c631daSSadaf Ebrahimi   V(uqshrn, Uqshrn)                    \
3020*f5c631daSSadaf Ebrahimi   V(uqshrn2, Uqshrn2)                  \
3021*f5c631daSSadaf Ebrahimi   V(urshr, Urshr)                      \
3022*f5c631daSSadaf Ebrahimi   V(ursra, Ursra)                      \
3023*f5c631daSSadaf Ebrahimi   V(ushr, Ushr)                        \
3024*f5c631daSSadaf Ebrahimi   V(usra, Usra)
3025*f5c631daSSadaf Ebrahimi 
3026*f5c631daSSadaf Ebrahimi #define DEFINE_MACRO_ASM_FUNC(ASM, MASM)                           \
3027*f5c631daSSadaf Ebrahimi   void MASM(const VRegister& vd, const VRegister& vn, int shift) { \
3028*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);                        \
3029*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);                          \
3030*f5c631daSSadaf Ebrahimi     ASM(vd, vn, shift);                                            \
3031*f5c631daSSadaf Ebrahimi   }
3032*f5c631daSSadaf Ebrahimi   NEON_2VREG_SHIFT_MACRO_LIST(DEFINE_MACRO_ASM_FUNC)
3033*f5c631daSSadaf Ebrahimi #undef DEFINE_MACRO_ASM_FUNC
3034*f5c631daSSadaf Ebrahimi 
3035*f5c631daSSadaf Ebrahimi #define NEON_2VREG_SHIFT_LONG_MACRO_LIST(V) \
3036*f5c631daSSadaf Ebrahimi   V(shll, sshll, Sshll)                     \
3037*f5c631daSSadaf Ebrahimi   V(shll, ushll, Ushll)                     \
3038*f5c631daSSadaf Ebrahimi   V(shll2, sshll2, Sshll2)                  \
3039*f5c631daSSadaf Ebrahimi   V(shll2, ushll2, Ushll2)
3040*f5c631daSSadaf Ebrahimi 
3041*f5c631daSSadaf Ebrahimi #define DEFINE_MACRO_ASM_FUNC(ASM1, ASM2, MASM)                    \
3042*f5c631daSSadaf Ebrahimi   void MASM(const VRegister& vd, const VRegister& vn, int shift) { \
3043*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);                        \
3044*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);                          \
3045*f5c631daSSadaf Ebrahimi     if (vn.GetLaneSizeInBits() == static_cast<unsigned>(shift)) {  \
3046*f5c631daSSadaf Ebrahimi       ASM1(vd, vn, shift);                                         \
3047*f5c631daSSadaf Ebrahimi     } else {                                                       \
3048*f5c631daSSadaf Ebrahimi       ASM2(vd, vn, shift);                                         \
3049*f5c631daSSadaf Ebrahimi     }                                                              \
3050*f5c631daSSadaf Ebrahimi   }
3051*f5c631daSSadaf Ebrahimi   NEON_2VREG_SHIFT_LONG_MACRO_LIST(DEFINE_MACRO_ASM_FUNC)
3052*f5c631daSSadaf Ebrahimi #undef DEFINE_MACRO_ASM_FUNC
3053*f5c631daSSadaf Ebrahimi 
3054*f5c631daSSadaf Ebrahimi // SVE 3 vector register instructions.
3055*f5c631daSSadaf Ebrahimi #define SVE_3VREG_COMMUTATIVE_MACRO_LIST(V) \
3056*f5c631daSSadaf Ebrahimi   V(add, Add)                               \
3057*f5c631daSSadaf Ebrahimi   V(and_, And)                              \
3058*f5c631daSSadaf Ebrahimi   V(bic, Bic)                               \
3059*f5c631daSSadaf Ebrahimi   V(eor, Eor)                               \
3060*f5c631daSSadaf Ebrahimi   V(mul, Mul)                               \
3061*f5c631daSSadaf Ebrahimi   V(orr, Orr)                               \
3062*f5c631daSSadaf Ebrahimi   V(sabd, Sabd)                             \
3063*f5c631daSSadaf Ebrahimi   V(shadd, Shadd)                           \
3064*f5c631daSSadaf Ebrahimi   V(smax, Smax)                             \
3065*f5c631daSSadaf Ebrahimi   V(smin, Smin)                             \
3066*f5c631daSSadaf Ebrahimi   V(smulh, Smulh)                           \
3067*f5c631daSSadaf Ebrahimi   V(sqadd, Sqadd)                           \
3068*f5c631daSSadaf Ebrahimi   V(srhadd, Srhadd)                         \
3069*f5c631daSSadaf Ebrahimi   V(uabd, Uabd)                             \
3070*f5c631daSSadaf Ebrahimi   V(uhadd, Uhadd)                           \
3071*f5c631daSSadaf Ebrahimi   V(umax, Umax)                             \
3072*f5c631daSSadaf Ebrahimi   V(umin, Umin)                             \
3073*f5c631daSSadaf Ebrahimi   V(umulh, Umulh)                           \
3074*f5c631daSSadaf Ebrahimi   V(uqadd, Uqadd)                           \
3075*f5c631daSSadaf Ebrahimi   V(urhadd, Urhadd)
3076*f5c631daSSadaf Ebrahimi 
3077*f5c631daSSadaf Ebrahimi #define DEFINE_MACRO_ASM_FUNC(ASM, MASM)          \
3078*f5c631daSSadaf Ebrahimi   void MASM(const ZRegister& zd,                  \
3079*f5c631daSSadaf Ebrahimi             const PRegisterM& pg,                 \
3080*f5c631daSSadaf Ebrahimi             const ZRegister& zn,                  \
3081*f5c631daSSadaf Ebrahimi             const ZRegister& zm) {                \
3082*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);       \
3083*f5c631daSSadaf Ebrahimi     if (zd.Aliases(zn)) {                         \
3084*f5c631daSSadaf Ebrahimi       SingleEmissionCheckScope guard(this);       \
3085*f5c631daSSadaf Ebrahimi       ASM(zd, pg, zd, zm);                        \
3086*f5c631daSSadaf Ebrahimi     } else if (zd.Aliases(zm)) {                  \
3087*f5c631daSSadaf Ebrahimi       SingleEmissionCheckScope guard(this);       \
3088*f5c631daSSadaf Ebrahimi       ASM(zd, pg, zd, zn);                        \
3089*f5c631daSSadaf Ebrahimi     } else {                                      \
3090*f5c631daSSadaf Ebrahimi       MovprfxHelperScope guard(this, zd, pg, zn); \
3091*f5c631daSSadaf Ebrahimi       ASM(zd, pg, zd, zm);                        \
3092*f5c631daSSadaf Ebrahimi     }                                             \
3093*f5c631daSSadaf Ebrahimi   }
3094*f5c631daSSadaf Ebrahimi   SVE_3VREG_COMMUTATIVE_MACRO_LIST(DEFINE_MACRO_ASM_FUNC)
3095*f5c631daSSadaf Ebrahimi #undef DEFINE_MACRO_ASM_FUNC
3096*f5c631daSSadaf Ebrahimi 
3097*f5c631daSSadaf Ebrahimi   void Bic(const VRegister& vd, const int imm8, const int left_shift = 0) {
3098*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3099*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3100*f5c631daSSadaf Ebrahimi     bic(vd, imm8, left_shift);
3101*f5c631daSSadaf Ebrahimi   }
Cmeq(const VRegister & vd,const VRegister & vn,int imm)3102*f5c631daSSadaf Ebrahimi   void Cmeq(const VRegister& vd, const VRegister& vn, int imm) {
3103*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3104*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3105*f5c631daSSadaf Ebrahimi     cmeq(vd, vn, imm);
3106*f5c631daSSadaf Ebrahimi   }
Cmge(const VRegister & vd,const VRegister & vn,int imm)3107*f5c631daSSadaf Ebrahimi   void Cmge(const VRegister& vd, const VRegister& vn, int imm) {
3108*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3109*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3110*f5c631daSSadaf Ebrahimi     cmge(vd, vn, imm);
3111*f5c631daSSadaf Ebrahimi   }
Cmgt(const VRegister & vd,const VRegister & vn,int imm)3112*f5c631daSSadaf Ebrahimi   void Cmgt(const VRegister& vd, const VRegister& vn, int imm) {
3113*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3114*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3115*f5c631daSSadaf Ebrahimi     cmgt(vd, vn, imm);
3116*f5c631daSSadaf Ebrahimi   }
Cmle(const VRegister & vd,const VRegister & vn,int imm)3117*f5c631daSSadaf Ebrahimi   void Cmle(const VRegister& vd, const VRegister& vn, int imm) {
3118*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3119*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3120*f5c631daSSadaf Ebrahimi     cmle(vd, vn, imm);
3121*f5c631daSSadaf Ebrahimi   }
Cmlt(const VRegister & vd,const VRegister & vn,int imm)3122*f5c631daSSadaf Ebrahimi   void Cmlt(const VRegister& vd, const VRegister& vn, int imm) {
3123*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3124*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3125*f5c631daSSadaf Ebrahimi     cmlt(vd, vn, imm);
3126*f5c631daSSadaf Ebrahimi   }
Dup(const VRegister & vd,const VRegister & vn,int index)3127*f5c631daSSadaf Ebrahimi   void Dup(const VRegister& vd, const VRegister& vn, int index) {
3128*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3129*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3130*f5c631daSSadaf Ebrahimi     dup(vd, vn, index);
3131*f5c631daSSadaf Ebrahimi   }
Dup(const VRegister & vd,const Register & rn)3132*f5c631daSSadaf Ebrahimi   void Dup(const VRegister& vd, const Register& rn) {
3133*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3134*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3135*f5c631daSSadaf Ebrahimi     dup(vd, rn);
3136*f5c631daSSadaf Ebrahimi   }
Ext(const VRegister & vd,const VRegister & vn,const VRegister & vm,int index)3137*f5c631daSSadaf Ebrahimi   void Ext(const VRegister& vd,
3138*f5c631daSSadaf Ebrahimi            const VRegister& vn,
3139*f5c631daSSadaf Ebrahimi            const VRegister& vm,
3140*f5c631daSSadaf Ebrahimi            int index) {
3141*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3142*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3143*f5c631daSSadaf Ebrahimi     ext(vd, vn, vm, index);
3144*f5c631daSSadaf Ebrahimi   }
Fcadd(const VRegister & vd,const VRegister & vn,const VRegister & vm,int rot)3145*f5c631daSSadaf Ebrahimi   void Fcadd(const VRegister& vd,
3146*f5c631daSSadaf Ebrahimi              const VRegister& vn,
3147*f5c631daSSadaf Ebrahimi              const VRegister& vm,
3148*f5c631daSSadaf Ebrahimi              int rot) {
3149*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3150*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3151*f5c631daSSadaf Ebrahimi     fcadd(vd, vn, vm, rot);
3152*f5c631daSSadaf Ebrahimi   }
Fcmla(const VRegister & vd,const VRegister & vn,const VRegister & vm,int vm_index,int rot)3153*f5c631daSSadaf Ebrahimi   void Fcmla(const VRegister& vd,
3154*f5c631daSSadaf Ebrahimi              const VRegister& vn,
3155*f5c631daSSadaf Ebrahimi              const VRegister& vm,
3156*f5c631daSSadaf Ebrahimi              int vm_index,
3157*f5c631daSSadaf Ebrahimi              int rot) {
3158*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3159*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3160*f5c631daSSadaf Ebrahimi     fcmla(vd, vn, vm, vm_index, rot);
3161*f5c631daSSadaf Ebrahimi   }
Fcmla(const VRegister & vd,const VRegister & vn,const VRegister & vm,int rot)3162*f5c631daSSadaf Ebrahimi   void Fcmla(const VRegister& vd,
3163*f5c631daSSadaf Ebrahimi              const VRegister& vn,
3164*f5c631daSSadaf Ebrahimi              const VRegister& vm,
3165*f5c631daSSadaf Ebrahimi              int rot) {
3166*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3167*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3168*f5c631daSSadaf Ebrahimi     fcmla(vd, vn, vm, rot);
3169*f5c631daSSadaf Ebrahimi   }
Ins(const VRegister & vd,int vd_index,const VRegister & vn,int vn_index)3170*f5c631daSSadaf Ebrahimi   void Ins(const VRegister& vd,
3171*f5c631daSSadaf Ebrahimi            int vd_index,
3172*f5c631daSSadaf Ebrahimi            const VRegister& vn,
3173*f5c631daSSadaf Ebrahimi            int vn_index) {
3174*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3175*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3176*f5c631daSSadaf Ebrahimi     ins(vd, vd_index, vn, vn_index);
3177*f5c631daSSadaf Ebrahimi   }
Ins(const VRegister & vd,int vd_index,const Register & rn)3178*f5c631daSSadaf Ebrahimi   void Ins(const VRegister& vd, int vd_index, const Register& rn) {
3179*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3180*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3181*f5c631daSSadaf Ebrahimi     ins(vd, vd_index, rn);
3182*f5c631daSSadaf Ebrahimi   }
Ld1(const VRegister & vt,const MemOperand & src)3183*f5c631daSSadaf Ebrahimi   void Ld1(const VRegister& vt, const MemOperand& src) {
3184*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3185*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3186*f5c631daSSadaf Ebrahimi     ld1(vt, src);
3187*f5c631daSSadaf Ebrahimi   }
Ld1(const VRegister & vt,const VRegister & vt2,const MemOperand & src)3188*f5c631daSSadaf Ebrahimi   void Ld1(const VRegister& vt, const VRegister& vt2, const MemOperand& src) {
3189*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3190*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3191*f5c631daSSadaf Ebrahimi     ld1(vt, vt2, src);
3192*f5c631daSSadaf Ebrahimi   }
Ld1(const VRegister & vt,const VRegister & vt2,const VRegister & vt3,const MemOperand & src)3193*f5c631daSSadaf Ebrahimi   void Ld1(const VRegister& vt,
3194*f5c631daSSadaf Ebrahimi            const VRegister& vt2,
3195*f5c631daSSadaf Ebrahimi            const VRegister& vt3,
3196*f5c631daSSadaf Ebrahimi            const MemOperand& src) {
3197*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3198*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3199*f5c631daSSadaf Ebrahimi     ld1(vt, vt2, vt3, src);
3200*f5c631daSSadaf Ebrahimi   }
Ld1(const VRegister & vt,const VRegister & vt2,const VRegister & vt3,const VRegister & vt4,const MemOperand & src)3201*f5c631daSSadaf Ebrahimi   void Ld1(const VRegister& vt,
3202*f5c631daSSadaf Ebrahimi            const VRegister& vt2,
3203*f5c631daSSadaf Ebrahimi            const VRegister& vt3,
3204*f5c631daSSadaf Ebrahimi            const VRegister& vt4,
3205*f5c631daSSadaf Ebrahimi            const MemOperand& src) {
3206*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3207*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3208*f5c631daSSadaf Ebrahimi     ld1(vt, vt2, vt3, vt4, src);
3209*f5c631daSSadaf Ebrahimi   }
Ld1(const VRegister & vt,int lane,const MemOperand & src)3210*f5c631daSSadaf Ebrahimi   void Ld1(const VRegister& vt, int lane, const MemOperand& src) {
3211*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3212*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3213*f5c631daSSadaf Ebrahimi     ld1(vt, lane, src);
3214*f5c631daSSadaf Ebrahimi   }
Ld1r(const VRegister & vt,const MemOperand & src)3215*f5c631daSSadaf Ebrahimi   void Ld1r(const VRegister& vt, const MemOperand& src) {
3216*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3217*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3218*f5c631daSSadaf Ebrahimi     ld1r(vt, src);
3219*f5c631daSSadaf Ebrahimi   }
Ld2(const VRegister & vt,const VRegister & vt2,const MemOperand & src)3220*f5c631daSSadaf Ebrahimi   void Ld2(const VRegister& vt, const VRegister& vt2, const MemOperand& src) {
3221*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3222*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3223*f5c631daSSadaf Ebrahimi     ld2(vt, vt2, src);
3224*f5c631daSSadaf Ebrahimi   }
Ld2(const VRegister & vt,const VRegister & vt2,int lane,const MemOperand & src)3225*f5c631daSSadaf Ebrahimi   void Ld2(const VRegister& vt,
3226*f5c631daSSadaf Ebrahimi            const VRegister& vt2,
3227*f5c631daSSadaf Ebrahimi            int lane,
3228*f5c631daSSadaf Ebrahimi            const MemOperand& src) {
3229*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3230*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3231*f5c631daSSadaf Ebrahimi     ld2(vt, vt2, lane, src);
3232*f5c631daSSadaf Ebrahimi   }
Ld2r(const VRegister & vt,const VRegister & vt2,const MemOperand & src)3233*f5c631daSSadaf Ebrahimi   void Ld2r(const VRegister& vt, const VRegister& vt2, const MemOperand& src) {
3234*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3235*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3236*f5c631daSSadaf Ebrahimi     ld2r(vt, vt2, src);
3237*f5c631daSSadaf Ebrahimi   }
Ld3(const VRegister & vt,const VRegister & vt2,const VRegister & vt3,const MemOperand & src)3238*f5c631daSSadaf Ebrahimi   void Ld3(const VRegister& vt,
3239*f5c631daSSadaf Ebrahimi            const VRegister& vt2,
3240*f5c631daSSadaf Ebrahimi            const VRegister& vt3,
3241*f5c631daSSadaf Ebrahimi            const MemOperand& src) {
3242*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3243*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3244*f5c631daSSadaf Ebrahimi     ld3(vt, vt2, vt3, src);
3245*f5c631daSSadaf Ebrahimi   }
Ld3(const VRegister & vt,const VRegister & vt2,const VRegister & vt3,int lane,const MemOperand & src)3246*f5c631daSSadaf Ebrahimi   void Ld3(const VRegister& vt,
3247*f5c631daSSadaf Ebrahimi            const VRegister& vt2,
3248*f5c631daSSadaf Ebrahimi            const VRegister& vt3,
3249*f5c631daSSadaf Ebrahimi            int lane,
3250*f5c631daSSadaf Ebrahimi            const MemOperand& src) {
3251*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3252*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3253*f5c631daSSadaf Ebrahimi     ld3(vt, vt2, vt3, lane, src);
3254*f5c631daSSadaf Ebrahimi   }
Ld3r(const VRegister & vt,const VRegister & vt2,const VRegister & vt3,const MemOperand & src)3255*f5c631daSSadaf Ebrahimi   void Ld3r(const VRegister& vt,
3256*f5c631daSSadaf Ebrahimi             const VRegister& vt2,
3257*f5c631daSSadaf Ebrahimi             const VRegister& vt3,
3258*f5c631daSSadaf Ebrahimi             const MemOperand& src) {
3259*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3260*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3261*f5c631daSSadaf Ebrahimi     ld3r(vt, vt2, vt3, src);
3262*f5c631daSSadaf Ebrahimi   }
Ld4(const VRegister & vt,const VRegister & vt2,const VRegister & vt3,const VRegister & vt4,const MemOperand & src)3263*f5c631daSSadaf Ebrahimi   void Ld4(const VRegister& vt,
3264*f5c631daSSadaf Ebrahimi            const VRegister& vt2,
3265*f5c631daSSadaf Ebrahimi            const VRegister& vt3,
3266*f5c631daSSadaf Ebrahimi            const VRegister& vt4,
3267*f5c631daSSadaf Ebrahimi            const MemOperand& src) {
3268*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3269*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3270*f5c631daSSadaf Ebrahimi     ld4(vt, vt2, vt3, vt4, src);
3271*f5c631daSSadaf Ebrahimi   }
Ld4(const VRegister & vt,const VRegister & vt2,const VRegister & vt3,const VRegister & vt4,int lane,const MemOperand & src)3272*f5c631daSSadaf Ebrahimi   void Ld4(const VRegister& vt,
3273*f5c631daSSadaf Ebrahimi            const VRegister& vt2,
3274*f5c631daSSadaf Ebrahimi            const VRegister& vt3,
3275*f5c631daSSadaf Ebrahimi            const VRegister& vt4,
3276*f5c631daSSadaf Ebrahimi            int lane,
3277*f5c631daSSadaf Ebrahimi            const MemOperand& src) {
3278*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3279*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3280*f5c631daSSadaf Ebrahimi     ld4(vt, vt2, vt3, vt4, lane, src);
3281*f5c631daSSadaf Ebrahimi   }
Ld4r(const VRegister & vt,const VRegister & vt2,const VRegister & vt3,const VRegister & vt4,const MemOperand & src)3282*f5c631daSSadaf Ebrahimi   void Ld4r(const VRegister& vt,
3283*f5c631daSSadaf Ebrahimi             const VRegister& vt2,
3284*f5c631daSSadaf Ebrahimi             const VRegister& vt3,
3285*f5c631daSSadaf Ebrahimi             const VRegister& vt4,
3286*f5c631daSSadaf Ebrahimi             const MemOperand& src) {
3287*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3288*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3289*f5c631daSSadaf Ebrahimi     ld4r(vt, vt2, vt3, vt4, src);
3290*f5c631daSSadaf Ebrahimi   }
Mov(const VRegister & vd,int vd_index,const VRegister & vn,int vn_index)3291*f5c631daSSadaf Ebrahimi   void Mov(const VRegister& vd,
3292*f5c631daSSadaf Ebrahimi            int vd_index,
3293*f5c631daSSadaf Ebrahimi            const VRegister& vn,
3294*f5c631daSSadaf Ebrahimi            int vn_index) {
3295*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3296*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3297*f5c631daSSadaf Ebrahimi     mov(vd, vd_index, vn, vn_index);
3298*f5c631daSSadaf Ebrahimi   }
Mov(const VRegister & vd,const VRegister & vn,int index)3299*f5c631daSSadaf Ebrahimi   void Mov(const VRegister& vd, const VRegister& vn, int index) {
3300*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3301*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3302*f5c631daSSadaf Ebrahimi     mov(vd, vn, index);
3303*f5c631daSSadaf Ebrahimi   }
Mov(const VRegister & vd,int vd_index,const Register & rn)3304*f5c631daSSadaf Ebrahimi   void Mov(const VRegister& vd, int vd_index, const Register& rn) {
3305*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3306*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3307*f5c631daSSadaf Ebrahimi     mov(vd, vd_index, rn);
3308*f5c631daSSadaf Ebrahimi   }
Mov(const Register & rd,const VRegister & vn,int vn_index)3309*f5c631daSSadaf Ebrahimi   void Mov(const Register& rd, const VRegister& vn, int vn_index) {
3310*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3311*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3312*f5c631daSSadaf Ebrahimi     mov(rd, vn, vn_index);
3313*f5c631daSSadaf Ebrahimi   }
3314*f5c631daSSadaf Ebrahimi   void Movi(const VRegister& vd,
3315*f5c631daSSadaf Ebrahimi             uint64_t imm,
3316*f5c631daSSadaf Ebrahimi             Shift shift = LSL,
3317*f5c631daSSadaf Ebrahimi             int shift_amount = 0);
3318*f5c631daSSadaf Ebrahimi   void Movi(const VRegister& vd, uint64_t hi, uint64_t lo);
3319*f5c631daSSadaf Ebrahimi   void Mvni(const VRegister& vd,
3320*f5c631daSSadaf Ebrahimi             const int imm8,
3321*f5c631daSSadaf Ebrahimi             Shift shift = LSL,
3322*f5c631daSSadaf Ebrahimi             const int shift_amount = 0) {
3323*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3324*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3325*f5c631daSSadaf Ebrahimi     mvni(vd, imm8, shift, shift_amount);
3326*f5c631daSSadaf Ebrahimi   }
3327*f5c631daSSadaf Ebrahimi   void Orr(const VRegister& vd, const int imm8, const int left_shift = 0) {
3328*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3329*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3330*f5c631daSSadaf Ebrahimi     orr(vd, imm8, left_shift);
3331*f5c631daSSadaf Ebrahimi   }
3332*f5c631daSSadaf Ebrahimi   void Scvtf(const VRegister& vd, const VRegister& vn, int fbits = 0) {
3333*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3334*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3335*f5c631daSSadaf Ebrahimi     scvtf(vd, vn, fbits);
3336*f5c631daSSadaf Ebrahimi   }
3337*f5c631daSSadaf Ebrahimi   void Ucvtf(const VRegister& vd, const VRegister& vn, int fbits = 0) {
3338*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3339*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3340*f5c631daSSadaf Ebrahimi     ucvtf(vd, vn, fbits);
3341*f5c631daSSadaf Ebrahimi   }
3342*f5c631daSSadaf Ebrahimi   void Fcvtzs(const VRegister& vd, const VRegister& vn, int fbits = 0) {
3343*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3344*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3345*f5c631daSSadaf Ebrahimi     fcvtzs(vd, vn, fbits);
3346*f5c631daSSadaf Ebrahimi   }
3347*f5c631daSSadaf Ebrahimi   void Fcvtzu(const VRegister& vd, const VRegister& vn, int fbits = 0) {
3348*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3349*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3350*f5c631daSSadaf Ebrahimi     fcvtzu(vd, vn, fbits);
3351*f5c631daSSadaf Ebrahimi   }
St1(const VRegister & vt,const MemOperand & dst)3352*f5c631daSSadaf Ebrahimi   void St1(const VRegister& vt, const MemOperand& dst) {
3353*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3354*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3355*f5c631daSSadaf Ebrahimi     st1(vt, dst);
3356*f5c631daSSadaf Ebrahimi   }
St1(const VRegister & vt,const VRegister & vt2,const MemOperand & dst)3357*f5c631daSSadaf Ebrahimi   void St1(const VRegister& vt, const VRegister& vt2, const MemOperand& dst) {
3358*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3359*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3360*f5c631daSSadaf Ebrahimi     st1(vt, vt2, dst);
3361*f5c631daSSadaf Ebrahimi   }
St1(const VRegister & vt,const VRegister & vt2,const VRegister & vt3,const MemOperand & dst)3362*f5c631daSSadaf Ebrahimi   void St1(const VRegister& vt,
3363*f5c631daSSadaf Ebrahimi            const VRegister& vt2,
3364*f5c631daSSadaf Ebrahimi            const VRegister& vt3,
3365*f5c631daSSadaf Ebrahimi            const MemOperand& dst) {
3366*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3367*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3368*f5c631daSSadaf Ebrahimi     st1(vt, vt2, vt3, dst);
3369*f5c631daSSadaf Ebrahimi   }
St1(const VRegister & vt,const VRegister & vt2,const VRegister & vt3,const VRegister & vt4,const MemOperand & dst)3370*f5c631daSSadaf Ebrahimi   void St1(const VRegister& vt,
3371*f5c631daSSadaf Ebrahimi            const VRegister& vt2,
3372*f5c631daSSadaf Ebrahimi            const VRegister& vt3,
3373*f5c631daSSadaf Ebrahimi            const VRegister& vt4,
3374*f5c631daSSadaf Ebrahimi            const MemOperand& dst) {
3375*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3376*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3377*f5c631daSSadaf Ebrahimi     st1(vt, vt2, vt3, vt4, dst);
3378*f5c631daSSadaf Ebrahimi   }
St1(const VRegister & vt,int lane,const MemOperand & dst)3379*f5c631daSSadaf Ebrahimi   void St1(const VRegister& vt, int lane, const MemOperand& dst) {
3380*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3381*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3382*f5c631daSSadaf Ebrahimi     st1(vt, lane, dst);
3383*f5c631daSSadaf Ebrahimi   }
St2(const VRegister & vt,const VRegister & vt2,const MemOperand & dst)3384*f5c631daSSadaf Ebrahimi   void St2(const VRegister& vt, const VRegister& vt2, const MemOperand& dst) {
3385*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3386*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3387*f5c631daSSadaf Ebrahimi     st2(vt, vt2, dst);
3388*f5c631daSSadaf Ebrahimi   }
St3(const VRegister & vt,const VRegister & vt2,const VRegister & vt3,const MemOperand & dst)3389*f5c631daSSadaf Ebrahimi   void St3(const VRegister& vt,
3390*f5c631daSSadaf Ebrahimi            const VRegister& vt2,
3391*f5c631daSSadaf Ebrahimi            const VRegister& vt3,
3392*f5c631daSSadaf Ebrahimi            const MemOperand& dst) {
3393*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3394*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3395*f5c631daSSadaf Ebrahimi     st3(vt, vt2, vt3, dst);
3396*f5c631daSSadaf Ebrahimi   }
St4(const VRegister & vt,const VRegister & vt2,const VRegister & vt3,const VRegister & vt4,const MemOperand & dst)3397*f5c631daSSadaf Ebrahimi   void St4(const VRegister& vt,
3398*f5c631daSSadaf Ebrahimi            const VRegister& vt2,
3399*f5c631daSSadaf Ebrahimi            const VRegister& vt3,
3400*f5c631daSSadaf Ebrahimi            const VRegister& vt4,
3401*f5c631daSSadaf Ebrahimi            const MemOperand& dst) {
3402*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3403*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3404*f5c631daSSadaf Ebrahimi     st4(vt, vt2, vt3, vt4, dst);
3405*f5c631daSSadaf Ebrahimi   }
St2(const VRegister & vt,const VRegister & vt2,int lane,const MemOperand & dst)3406*f5c631daSSadaf Ebrahimi   void St2(const VRegister& vt,
3407*f5c631daSSadaf Ebrahimi            const VRegister& vt2,
3408*f5c631daSSadaf Ebrahimi            int lane,
3409*f5c631daSSadaf Ebrahimi            const MemOperand& dst) {
3410*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3411*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3412*f5c631daSSadaf Ebrahimi     st2(vt, vt2, lane, dst);
3413*f5c631daSSadaf Ebrahimi   }
St3(const VRegister & vt,const VRegister & vt2,const VRegister & vt3,int lane,const MemOperand & dst)3414*f5c631daSSadaf Ebrahimi   void St3(const VRegister& vt,
3415*f5c631daSSadaf Ebrahimi            const VRegister& vt2,
3416*f5c631daSSadaf Ebrahimi            const VRegister& vt3,
3417*f5c631daSSadaf Ebrahimi            int lane,
3418*f5c631daSSadaf Ebrahimi            const MemOperand& dst) {
3419*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3420*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3421*f5c631daSSadaf Ebrahimi     st3(vt, vt2, vt3, lane, dst);
3422*f5c631daSSadaf Ebrahimi   }
St4(const VRegister & vt,const VRegister & vt2,const VRegister & vt3,const VRegister & vt4,int lane,const MemOperand & dst)3423*f5c631daSSadaf Ebrahimi   void St4(const VRegister& vt,
3424*f5c631daSSadaf Ebrahimi            const VRegister& vt2,
3425*f5c631daSSadaf Ebrahimi            const VRegister& vt3,
3426*f5c631daSSadaf Ebrahimi            const VRegister& vt4,
3427*f5c631daSSadaf Ebrahimi            int lane,
3428*f5c631daSSadaf Ebrahimi            const MemOperand& dst) {
3429*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3430*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3431*f5c631daSSadaf Ebrahimi     st4(vt, vt2, vt3, vt4, lane, dst);
3432*f5c631daSSadaf Ebrahimi   }
Smov(const Register & rd,const VRegister & vn,int vn_index)3433*f5c631daSSadaf Ebrahimi   void Smov(const Register& rd, const VRegister& vn, int vn_index) {
3434*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3435*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3436*f5c631daSSadaf Ebrahimi     smov(rd, vn, vn_index);
3437*f5c631daSSadaf Ebrahimi   }
Umov(const Register & rd,const VRegister & vn,int vn_index)3438*f5c631daSSadaf Ebrahimi   void Umov(const Register& rd, const VRegister& vn, int vn_index) {
3439*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3440*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3441*f5c631daSSadaf Ebrahimi     umov(rd, vn, vn_index);
3442*f5c631daSSadaf Ebrahimi   }
Crc32b(const Register & rd,const Register & rn,const Register & rm)3443*f5c631daSSadaf Ebrahimi   void Crc32b(const Register& rd, const Register& rn, const Register& rm) {
3444*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3445*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3446*f5c631daSSadaf Ebrahimi     crc32b(rd, rn, rm);
3447*f5c631daSSadaf Ebrahimi   }
Crc32h(const Register & rd,const Register & rn,const Register & rm)3448*f5c631daSSadaf Ebrahimi   void Crc32h(const Register& rd, const Register& rn, const Register& rm) {
3449*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3450*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3451*f5c631daSSadaf Ebrahimi     crc32h(rd, rn, rm);
3452*f5c631daSSadaf Ebrahimi   }
Crc32w(const Register & rd,const Register & rn,const Register & rm)3453*f5c631daSSadaf Ebrahimi   void Crc32w(const Register& rd, const Register& rn, const Register& rm) {
3454*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3455*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3456*f5c631daSSadaf Ebrahimi     crc32w(rd, rn, rm);
3457*f5c631daSSadaf Ebrahimi   }
Crc32x(const Register & rd,const Register & rn,const Register & rm)3458*f5c631daSSadaf Ebrahimi   void Crc32x(const Register& rd, const Register& rn, const Register& rm) {
3459*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3460*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3461*f5c631daSSadaf Ebrahimi     crc32x(rd, rn, rm);
3462*f5c631daSSadaf Ebrahimi   }
Crc32cb(const Register & rd,const Register & rn,const Register & rm)3463*f5c631daSSadaf Ebrahimi   void Crc32cb(const Register& rd, const Register& rn, const Register& rm) {
3464*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3465*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3466*f5c631daSSadaf Ebrahimi     crc32cb(rd, rn, rm);
3467*f5c631daSSadaf Ebrahimi   }
Crc32ch(const Register & rd,const Register & rn,const Register & rm)3468*f5c631daSSadaf Ebrahimi   void Crc32ch(const Register& rd, const Register& rn, const Register& rm) {
3469*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3470*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3471*f5c631daSSadaf Ebrahimi     crc32ch(rd, rn, rm);
3472*f5c631daSSadaf Ebrahimi   }
Crc32cw(const Register & rd,const Register & rn,const Register & rm)3473*f5c631daSSadaf Ebrahimi   void Crc32cw(const Register& rd, const Register& rn, const Register& rm) {
3474*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3475*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3476*f5c631daSSadaf Ebrahimi     crc32cw(rd, rn, rm);
3477*f5c631daSSadaf Ebrahimi   }
Crc32cx(const Register & rd,const Register & rn,const Register & rm)3478*f5c631daSSadaf Ebrahimi   void Crc32cx(const Register& rd, const Register& rn, const Register& rm) {
3479*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3480*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3481*f5c631daSSadaf Ebrahimi     crc32cx(rd, rn, rm);
3482*f5c631daSSadaf Ebrahimi   }
3483*f5c631daSSadaf Ebrahimi 
3484*f5c631daSSadaf Ebrahimi   // Scalable Vector Extensions.
Abs(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)3485*f5c631daSSadaf Ebrahimi   void Abs(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
3486*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3487*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3488*f5c631daSSadaf Ebrahimi     abs(zd, pg, zn);
3489*f5c631daSSadaf Ebrahimi   }
Add(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)3490*f5c631daSSadaf Ebrahimi   void Add(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
3491*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3492*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3493*f5c631daSSadaf Ebrahimi     add(zd, zn, zm);
3494*f5c631daSSadaf Ebrahimi   }
Add(const ZRegister & zd,const ZRegister & zn,IntegerOperand imm)3495*f5c631daSSadaf Ebrahimi   void Add(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm) {
3496*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3497*f5c631daSSadaf Ebrahimi     AddSubHelper(kAddImmediate, zd, zn, imm);
3498*f5c631daSSadaf Ebrahimi   }
3499*f5c631daSSadaf Ebrahimi   void Addpl(const Register& xd, const Register& xn, int64_t multiplier);
3500*f5c631daSSadaf Ebrahimi   void Addvl(const Register& xd, const Register& xn, int64_t multiplier);
3501*f5c631daSSadaf Ebrahimi   // Note that unlike the core ISA, SVE's `adr` is not PC-relative.
Adr(const ZRegister & zd,const SVEMemOperand & addr)3502*f5c631daSSadaf Ebrahimi   void Adr(const ZRegister& zd, const SVEMemOperand& addr) {
3503*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3504*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3505*f5c631daSSadaf Ebrahimi     adr(zd, addr);
3506*f5c631daSSadaf Ebrahimi   }
And(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)3507*f5c631daSSadaf Ebrahimi   void And(const PRegisterWithLaneSize& pd,
3508*f5c631daSSadaf Ebrahimi            const PRegisterZ& pg,
3509*f5c631daSSadaf Ebrahimi            const PRegisterWithLaneSize& pn,
3510*f5c631daSSadaf Ebrahimi            const PRegisterWithLaneSize& pm) {
3511*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3512*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3513*f5c631daSSadaf Ebrahimi     and_(pd, pg, pn, pm);
3514*f5c631daSSadaf Ebrahimi   }
And(const ZRegister & zd,const ZRegister & zn,uint64_t imm)3515*f5c631daSSadaf Ebrahimi   void And(const ZRegister& zd, const ZRegister& zn, uint64_t imm) {
3516*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3517*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3518*f5c631daSSadaf Ebrahimi     if (IsImmLogical(imm, zd.GetLaneSizeInBits())) {
3519*f5c631daSSadaf Ebrahimi       and_(zd, zn, imm);
3520*f5c631daSSadaf Ebrahimi     } else {
3521*f5c631daSSadaf Ebrahimi       // TODO: Synthesise the immediate once 'Mov' is implemented.
3522*f5c631daSSadaf Ebrahimi       VIXL_UNIMPLEMENTED();
3523*f5c631daSSadaf Ebrahimi     }
3524*f5c631daSSadaf Ebrahimi   }
And(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)3525*f5c631daSSadaf Ebrahimi   void And(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
3526*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3527*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(AreSameLaneSize(zd, zn, zm));
3528*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3529*f5c631daSSadaf Ebrahimi     and_(zd.VnD(), zn.VnD(), zm.VnD());
3530*f5c631daSSadaf Ebrahimi   }
Ands(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)3531*f5c631daSSadaf Ebrahimi   void Ands(const PRegisterWithLaneSize& pd,
3532*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
3533*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn,
3534*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pm) {
3535*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3536*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3537*f5c631daSSadaf Ebrahimi     ands(pd, pg, pn, pm);
3538*f5c631daSSadaf Ebrahimi   }
Andv(const VRegister & vd,const PRegister & pg,const ZRegister & zn)3539*f5c631daSSadaf Ebrahimi   void Andv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) {
3540*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3541*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3542*f5c631daSSadaf Ebrahimi     andv(vd, pg, zn);
3543*f5c631daSSadaf Ebrahimi   }
Asr(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn,int shift)3544*f5c631daSSadaf Ebrahimi   void Asr(const ZRegister& zd,
3545*f5c631daSSadaf Ebrahimi            const PRegisterM& pg,
3546*f5c631daSSadaf Ebrahimi            const ZRegister& zn,
3547*f5c631daSSadaf Ebrahimi            int shift) {
3548*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3549*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
3550*f5c631daSSadaf Ebrahimi     asr(zd, pg, zd, shift);
3551*f5c631daSSadaf Ebrahimi   }
3552*f5c631daSSadaf Ebrahimi   void Asr(const ZRegister& zd,
3553*f5c631daSSadaf Ebrahimi            const PRegisterM& pg,
3554*f5c631daSSadaf Ebrahimi            const ZRegister& zn,
3555*f5c631daSSadaf Ebrahimi            const ZRegister& zm);
Asr(const ZRegister & zd,const ZRegister & zn,int shift)3556*f5c631daSSadaf Ebrahimi   void Asr(const ZRegister& zd, const ZRegister& zn, int shift) {
3557*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3558*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3559*f5c631daSSadaf Ebrahimi     asr(zd, zn, shift);
3560*f5c631daSSadaf Ebrahimi   }
Asr(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)3561*f5c631daSSadaf Ebrahimi   void Asr(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
3562*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3563*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3564*f5c631daSSadaf Ebrahimi     asr(zd, zn, zm);
3565*f5c631daSSadaf Ebrahimi   }
Asrd(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn,int shift)3566*f5c631daSSadaf Ebrahimi   void Asrd(const ZRegister& zd,
3567*f5c631daSSadaf Ebrahimi             const PRegisterM& pg,
3568*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
3569*f5c631daSSadaf Ebrahimi             int shift) {
3570*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3571*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
3572*f5c631daSSadaf Ebrahimi     asrd(zd, pg, zd, shift);
3573*f5c631daSSadaf Ebrahimi   }
Bic(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)3574*f5c631daSSadaf Ebrahimi   void Bic(const PRegisterWithLaneSize& pd,
3575*f5c631daSSadaf Ebrahimi            const PRegisterZ& pg,
3576*f5c631daSSadaf Ebrahimi            const PRegisterWithLaneSize& pn,
3577*f5c631daSSadaf Ebrahimi            const PRegisterWithLaneSize& pm) {
3578*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3579*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3580*f5c631daSSadaf Ebrahimi     bic(pd, pg, pn, pm);
3581*f5c631daSSadaf Ebrahimi   }
Bic(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)3582*f5c631daSSadaf Ebrahimi   void Bic(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
3583*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3584*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(AreSameLaneSize(zd, zn, zm));
3585*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3586*f5c631daSSadaf Ebrahimi     bic(zd.VnD(), zn.VnD(), zm.VnD());
3587*f5c631daSSadaf Ebrahimi   }
Bic(const ZRegister & zd,const ZRegister & zn,uint64_t imm)3588*f5c631daSSadaf Ebrahimi   void Bic(const ZRegister& zd, const ZRegister& zn, uint64_t imm) {
3589*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3590*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3591*f5c631daSSadaf Ebrahimi     if (IsImmLogical(imm, zd.GetLaneSizeInBits())) {
3592*f5c631daSSadaf Ebrahimi       bic(zd, zn, imm);
3593*f5c631daSSadaf Ebrahimi     } else {
3594*f5c631daSSadaf Ebrahimi       // TODO: Synthesise the immediate once 'Mov' is implemented.
3595*f5c631daSSadaf Ebrahimi       VIXL_UNIMPLEMENTED();
3596*f5c631daSSadaf Ebrahimi     }
3597*f5c631daSSadaf Ebrahimi   }
Bics(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)3598*f5c631daSSadaf Ebrahimi   void Bics(const PRegisterWithLaneSize& pd,
3599*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
3600*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn,
3601*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pm) {
3602*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3603*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3604*f5c631daSSadaf Ebrahimi     bics(pd, pg, pn, pm);
3605*f5c631daSSadaf Ebrahimi   }
Brka(const PRegisterWithLaneSize & pd,const PRegister & pg,const PRegisterWithLaneSize & pn)3606*f5c631daSSadaf Ebrahimi   void Brka(const PRegisterWithLaneSize& pd,
3607*f5c631daSSadaf Ebrahimi             const PRegister& pg,
3608*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn) {
3609*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3610*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3611*f5c631daSSadaf Ebrahimi     brka(pd, pg, pn);
3612*f5c631daSSadaf Ebrahimi   }
Brkas(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn)3613*f5c631daSSadaf Ebrahimi   void Brkas(const PRegisterWithLaneSize& pd,
3614*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3615*f5c631daSSadaf Ebrahimi              const PRegisterWithLaneSize& pn) {
3616*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3617*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3618*f5c631daSSadaf Ebrahimi     brkas(pd, pg, pn);
3619*f5c631daSSadaf Ebrahimi   }
Brkb(const PRegisterWithLaneSize & pd,const PRegister & pg,const PRegisterWithLaneSize & pn)3620*f5c631daSSadaf Ebrahimi   void Brkb(const PRegisterWithLaneSize& pd,
3621*f5c631daSSadaf Ebrahimi             const PRegister& pg,
3622*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn) {
3623*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3624*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3625*f5c631daSSadaf Ebrahimi     brkb(pd, pg, pn);
3626*f5c631daSSadaf Ebrahimi   }
Brkbs(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn)3627*f5c631daSSadaf Ebrahimi   void Brkbs(const PRegisterWithLaneSize& pd,
3628*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3629*f5c631daSSadaf Ebrahimi              const PRegisterWithLaneSize& pn) {
3630*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3631*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3632*f5c631daSSadaf Ebrahimi     brkbs(pd, pg, pn);
3633*f5c631daSSadaf Ebrahimi   }
Brkn(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)3634*f5c631daSSadaf Ebrahimi   void Brkn(const PRegisterWithLaneSize& pd,
3635*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
3636*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn,
3637*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pm) {
3638*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3639*f5c631daSSadaf Ebrahimi     if (!pd.Aliases(pm)) {
3640*f5c631daSSadaf Ebrahimi       Mov(pd, pm);
3641*f5c631daSSadaf Ebrahimi     }
3642*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3643*f5c631daSSadaf Ebrahimi     brkn(pd, pg, pn, pd);
3644*f5c631daSSadaf Ebrahimi   }
Brkns(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)3645*f5c631daSSadaf Ebrahimi   void Brkns(const PRegisterWithLaneSize& pd,
3646*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3647*f5c631daSSadaf Ebrahimi              const PRegisterWithLaneSize& pn,
3648*f5c631daSSadaf Ebrahimi              const PRegisterWithLaneSize& pm) {
3649*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3650*f5c631daSSadaf Ebrahimi     if (!pd.Aliases(pm)) {
3651*f5c631daSSadaf Ebrahimi       Mov(pd, pm);
3652*f5c631daSSadaf Ebrahimi     }
3653*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3654*f5c631daSSadaf Ebrahimi     brkns(pd, pg, pn, pd);
3655*f5c631daSSadaf Ebrahimi   }
Brkpa(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)3656*f5c631daSSadaf Ebrahimi   void Brkpa(const PRegisterWithLaneSize& pd,
3657*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3658*f5c631daSSadaf Ebrahimi              const PRegisterWithLaneSize& pn,
3659*f5c631daSSadaf Ebrahimi              const PRegisterWithLaneSize& pm) {
3660*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3661*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3662*f5c631daSSadaf Ebrahimi     brkpa(pd, pg, pn, pm);
3663*f5c631daSSadaf Ebrahimi   }
Brkpas(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)3664*f5c631daSSadaf Ebrahimi   void Brkpas(const PRegisterWithLaneSize& pd,
3665*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
3666*f5c631daSSadaf Ebrahimi               const PRegisterWithLaneSize& pn,
3667*f5c631daSSadaf Ebrahimi               const PRegisterWithLaneSize& pm) {
3668*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3669*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3670*f5c631daSSadaf Ebrahimi     brkpas(pd, pg, pn, pm);
3671*f5c631daSSadaf Ebrahimi   }
Brkpb(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)3672*f5c631daSSadaf Ebrahimi   void Brkpb(const PRegisterWithLaneSize& pd,
3673*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3674*f5c631daSSadaf Ebrahimi              const PRegisterWithLaneSize& pn,
3675*f5c631daSSadaf Ebrahimi              const PRegisterWithLaneSize& pm) {
3676*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3677*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3678*f5c631daSSadaf Ebrahimi     brkpb(pd, pg, pn, pm);
3679*f5c631daSSadaf Ebrahimi   }
Brkpbs(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)3680*f5c631daSSadaf Ebrahimi   void Brkpbs(const PRegisterWithLaneSize& pd,
3681*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
3682*f5c631daSSadaf Ebrahimi               const PRegisterWithLaneSize& pn,
3683*f5c631daSSadaf Ebrahimi               const PRegisterWithLaneSize& pm) {
3684*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3685*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3686*f5c631daSSadaf Ebrahimi     brkpbs(pd, pg, pn, pm);
3687*f5c631daSSadaf Ebrahimi   }
Clasta(const Register & rd,const PRegister & pg,const Register & rn,const ZRegister & zm)3688*f5c631daSSadaf Ebrahimi   void Clasta(const Register& rd,
3689*f5c631daSSadaf Ebrahimi               const PRegister& pg,
3690*f5c631daSSadaf Ebrahimi               const Register& rn,
3691*f5c631daSSadaf Ebrahimi               const ZRegister& zm) {
3692*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3693*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3694*f5c631daSSadaf Ebrahimi     clasta(rd, pg, rn, zm);
3695*f5c631daSSadaf Ebrahimi   }
Clasta(const VRegister & vd,const PRegister & pg,const VRegister & vn,const ZRegister & zm)3696*f5c631daSSadaf Ebrahimi   void Clasta(const VRegister& vd,
3697*f5c631daSSadaf Ebrahimi               const PRegister& pg,
3698*f5c631daSSadaf Ebrahimi               const VRegister& vn,
3699*f5c631daSSadaf Ebrahimi               const ZRegister& zm) {
3700*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3701*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3702*f5c631daSSadaf Ebrahimi     clasta(vd, pg, vn, zm);
3703*f5c631daSSadaf Ebrahimi   }
3704*f5c631daSSadaf Ebrahimi   void Clasta(const ZRegister& zd,
3705*f5c631daSSadaf Ebrahimi               const PRegister& pg,
3706*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
3707*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
Clastb(const Register & rd,const PRegister & pg,const Register & rn,const ZRegister & zm)3708*f5c631daSSadaf Ebrahimi   void Clastb(const Register& rd,
3709*f5c631daSSadaf Ebrahimi               const PRegister& pg,
3710*f5c631daSSadaf Ebrahimi               const Register& rn,
3711*f5c631daSSadaf Ebrahimi               const ZRegister& zm) {
3712*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3713*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3714*f5c631daSSadaf Ebrahimi     clastb(rd, pg, rn, zm);
3715*f5c631daSSadaf Ebrahimi   }
Clastb(const VRegister & vd,const PRegister & pg,const VRegister & vn,const ZRegister & zm)3716*f5c631daSSadaf Ebrahimi   void Clastb(const VRegister& vd,
3717*f5c631daSSadaf Ebrahimi               const PRegister& pg,
3718*f5c631daSSadaf Ebrahimi               const VRegister& vn,
3719*f5c631daSSadaf Ebrahimi               const ZRegister& zm) {
3720*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3721*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3722*f5c631daSSadaf Ebrahimi     clastb(vd, pg, vn, zm);
3723*f5c631daSSadaf Ebrahimi   }
3724*f5c631daSSadaf Ebrahimi   void Clastb(const ZRegister& zd,
3725*f5c631daSSadaf Ebrahimi               const PRegister& pg,
3726*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
3727*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
Cls(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)3728*f5c631daSSadaf Ebrahimi   void Cls(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
3729*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3730*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3731*f5c631daSSadaf Ebrahimi     cls(zd, pg, zn);
3732*f5c631daSSadaf Ebrahimi   }
Clz(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)3733*f5c631daSSadaf Ebrahimi   void Clz(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
3734*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3735*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3736*f5c631daSSadaf Ebrahimi     clz(zd, pg, zn);
3737*f5c631daSSadaf Ebrahimi   }
Cmpeq(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)3738*f5c631daSSadaf Ebrahimi   void Cmpeq(const PRegisterWithLaneSize& pd,
3739*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3740*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3741*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
3742*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3743*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3744*f5c631daSSadaf Ebrahimi     cmpeq(pd, pg, zn, zm);
3745*f5c631daSSadaf Ebrahimi   }
Cmpeq(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,IntegerOperand imm)3746*f5c631daSSadaf Ebrahimi   void Cmpeq(const PRegisterWithLaneSize& pd,
3747*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3748*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3749*f5c631daSSadaf Ebrahimi              IntegerOperand imm) {
3750*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3751*f5c631daSSadaf Ebrahimi     int imm5;
3752*f5c631daSSadaf Ebrahimi     if (imm.TryEncodeAsIntNForLane<5>(zn, &imm5)) {
3753*f5c631daSSadaf Ebrahimi       SingleEmissionCheckScope guard(this);
3754*f5c631daSSadaf Ebrahimi       cmpeq(pd, pg, zn, imm5);
3755*f5c631daSSadaf Ebrahimi     } else {
3756*f5c631daSSadaf Ebrahimi       CompareHelper(eq, pd, pg, zn, imm);
3757*f5c631daSSadaf Ebrahimi     }
3758*f5c631daSSadaf Ebrahimi   }
Cmpge(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)3759*f5c631daSSadaf Ebrahimi   void Cmpge(const PRegisterWithLaneSize& pd,
3760*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3761*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3762*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
3763*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3764*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3765*f5c631daSSadaf Ebrahimi     cmpge(pd, pg, zn, zm);
3766*f5c631daSSadaf Ebrahimi   }
Cmpge(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,IntegerOperand imm)3767*f5c631daSSadaf Ebrahimi   void Cmpge(const PRegisterWithLaneSize& pd,
3768*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3769*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3770*f5c631daSSadaf Ebrahimi              IntegerOperand imm) {
3771*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3772*f5c631daSSadaf Ebrahimi     int imm5;
3773*f5c631daSSadaf Ebrahimi     if (imm.TryEncodeAsIntNForLane<5>(zn, &imm5)) {
3774*f5c631daSSadaf Ebrahimi       SingleEmissionCheckScope guard(this);
3775*f5c631daSSadaf Ebrahimi       cmpge(pd, pg, zn, imm5);
3776*f5c631daSSadaf Ebrahimi     } else {
3777*f5c631daSSadaf Ebrahimi       CompareHelper(ge, pd, pg, zn, imm);
3778*f5c631daSSadaf Ebrahimi     }
3779*f5c631daSSadaf Ebrahimi   }
Cmpgt(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)3780*f5c631daSSadaf Ebrahimi   void Cmpgt(const PRegisterWithLaneSize& pd,
3781*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3782*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3783*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
3784*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3785*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3786*f5c631daSSadaf Ebrahimi     cmpgt(pd, pg, zn, zm);
3787*f5c631daSSadaf Ebrahimi   }
Cmpgt(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,IntegerOperand imm)3788*f5c631daSSadaf Ebrahimi   void Cmpgt(const PRegisterWithLaneSize& pd,
3789*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3790*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3791*f5c631daSSadaf Ebrahimi              IntegerOperand imm) {
3792*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3793*f5c631daSSadaf Ebrahimi     int imm5;
3794*f5c631daSSadaf Ebrahimi     if (imm.TryEncodeAsIntNForLane<5>(zn, &imm5)) {
3795*f5c631daSSadaf Ebrahimi       SingleEmissionCheckScope guard(this);
3796*f5c631daSSadaf Ebrahimi       cmpgt(pd, pg, zn, imm5);
3797*f5c631daSSadaf Ebrahimi     } else {
3798*f5c631daSSadaf Ebrahimi       CompareHelper(gt, pd, pg, zn, imm);
3799*f5c631daSSadaf Ebrahimi     }
3800*f5c631daSSadaf Ebrahimi   }
Cmphi(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)3801*f5c631daSSadaf Ebrahimi   void Cmphi(const PRegisterWithLaneSize& pd,
3802*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3803*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3804*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
3805*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3806*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3807*f5c631daSSadaf Ebrahimi     cmphi(pd, pg, zn, zm);
3808*f5c631daSSadaf Ebrahimi   }
Cmphi(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,IntegerOperand imm)3809*f5c631daSSadaf Ebrahimi   void Cmphi(const PRegisterWithLaneSize& pd,
3810*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3811*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3812*f5c631daSSadaf Ebrahimi              IntegerOperand imm) {
3813*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3814*f5c631daSSadaf Ebrahimi     if (imm.IsUintN(7)) {
3815*f5c631daSSadaf Ebrahimi       SingleEmissionCheckScope guard(this);
3816*f5c631daSSadaf Ebrahimi       cmphi(pd, pg, zn, static_cast<unsigned>(imm.AsUintN(7)));
3817*f5c631daSSadaf Ebrahimi     } else {
3818*f5c631daSSadaf Ebrahimi       CompareHelper(hi, pd, pg, zn, imm);
3819*f5c631daSSadaf Ebrahimi     }
3820*f5c631daSSadaf Ebrahimi   }
Cmphs(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)3821*f5c631daSSadaf Ebrahimi   void Cmphs(const PRegisterWithLaneSize& pd,
3822*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3823*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3824*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
3825*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3826*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3827*f5c631daSSadaf Ebrahimi     cmphs(pd, pg, zn, zm);
3828*f5c631daSSadaf Ebrahimi   }
Cmphs(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,IntegerOperand imm)3829*f5c631daSSadaf Ebrahimi   void Cmphs(const PRegisterWithLaneSize& pd,
3830*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3831*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3832*f5c631daSSadaf Ebrahimi              IntegerOperand imm) {
3833*f5c631daSSadaf Ebrahimi     if (imm.IsUintN(7)) {
3834*f5c631daSSadaf Ebrahimi       SingleEmissionCheckScope guard(this);
3835*f5c631daSSadaf Ebrahimi       cmphs(pd, pg, zn, static_cast<unsigned>(imm.AsUintN(7)));
3836*f5c631daSSadaf Ebrahimi     } else {
3837*f5c631daSSadaf Ebrahimi       CompareHelper(hs, pd, pg, zn, imm);
3838*f5c631daSSadaf Ebrahimi     }
3839*f5c631daSSadaf Ebrahimi   }
Cmple(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)3840*f5c631daSSadaf Ebrahimi   void Cmple(const PRegisterWithLaneSize& pd,
3841*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3842*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3843*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
3844*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3845*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3846*f5c631daSSadaf Ebrahimi     cmple(pd, pg, zn, zm);
3847*f5c631daSSadaf Ebrahimi   }
Cmple(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,IntegerOperand imm)3848*f5c631daSSadaf Ebrahimi   void Cmple(const PRegisterWithLaneSize& pd,
3849*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3850*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3851*f5c631daSSadaf Ebrahimi              IntegerOperand imm) {
3852*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3853*f5c631daSSadaf Ebrahimi     int imm5;
3854*f5c631daSSadaf Ebrahimi     if (imm.TryEncodeAsIntNForLane<5>(zn, &imm5)) {
3855*f5c631daSSadaf Ebrahimi       SingleEmissionCheckScope guard(this);
3856*f5c631daSSadaf Ebrahimi       cmple(pd, pg, zn, imm5);
3857*f5c631daSSadaf Ebrahimi     } else {
3858*f5c631daSSadaf Ebrahimi       CompareHelper(le, pd, pg, zn, imm);
3859*f5c631daSSadaf Ebrahimi     }
3860*f5c631daSSadaf Ebrahimi   }
Cmplo(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)3861*f5c631daSSadaf Ebrahimi   void Cmplo(const PRegisterWithLaneSize& pd,
3862*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3863*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3864*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
3865*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3866*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3867*f5c631daSSadaf Ebrahimi     cmplo(pd, pg, zn, zm);
3868*f5c631daSSadaf Ebrahimi   }
Cmplo(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,IntegerOperand imm)3869*f5c631daSSadaf Ebrahimi   void Cmplo(const PRegisterWithLaneSize& pd,
3870*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3871*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3872*f5c631daSSadaf Ebrahimi              IntegerOperand imm) {
3873*f5c631daSSadaf Ebrahimi     if (imm.IsUintN(7)) {
3874*f5c631daSSadaf Ebrahimi       SingleEmissionCheckScope guard(this);
3875*f5c631daSSadaf Ebrahimi       cmplo(pd, pg, zn, static_cast<unsigned>(imm.AsUintN(7)));
3876*f5c631daSSadaf Ebrahimi     } else {
3877*f5c631daSSadaf Ebrahimi       CompareHelper(lo, pd, pg, zn, imm);
3878*f5c631daSSadaf Ebrahimi     }
3879*f5c631daSSadaf Ebrahimi   }
Cmpls(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)3880*f5c631daSSadaf Ebrahimi   void Cmpls(const PRegisterWithLaneSize& pd,
3881*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3882*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3883*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
3884*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3885*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3886*f5c631daSSadaf Ebrahimi     cmpls(pd, pg, zn, zm);
3887*f5c631daSSadaf Ebrahimi   }
Cmpls(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,IntegerOperand imm)3888*f5c631daSSadaf Ebrahimi   void Cmpls(const PRegisterWithLaneSize& pd,
3889*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3890*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3891*f5c631daSSadaf Ebrahimi              IntegerOperand imm) {
3892*f5c631daSSadaf Ebrahimi     if (imm.IsUintN(7)) {
3893*f5c631daSSadaf Ebrahimi       SingleEmissionCheckScope guard(this);
3894*f5c631daSSadaf Ebrahimi       cmpls(pd, pg, zn, static_cast<unsigned>(imm.AsUintN(7)));
3895*f5c631daSSadaf Ebrahimi     } else {
3896*f5c631daSSadaf Ebrahimi       CompareHelper(ls, pd, pg, zn, imm);
3897*f5c631daSSadaf Ebrahimi     }
3898*f5c631daSSadaf Ebrahimi   }
Cmplt(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)3899*f5c631daSSadaf Ebrahimi   void Cmplt(const PRegisterWithLaneSize& pd,
3900*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3901*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3902*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
3903*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3904*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3905*f5c631daSSadaf Ebrahimi     cmplt(pd, pg, zn, zm);
3906*f5c631daSSadaf Ebrahimi   }
Cmplt(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,IntegerOperand imm)3907*f5c631daSSadaf Ebrahimi   void Cmplt(const PRegisterWithLaneSize& pd,
3908*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3909*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3910*f5c631daSSadaf Ebrahimi              IntegerOperand imm) {
3911*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3912*f5c631daSSadaf Ebrahimi     int imm5;
3913*f5c631daSSadaf Ebrahimi     if (imm.TryEncodeAsIntNForLane<5>(zn, &imm5)) {
3914*f5c631daSSadaf Ebrahimi       SingleEmissionCheckScope guard(this);
3915*f5c631daSSadaf Ebrahimi       cmplt(pd, pg, zn, imm5);
3916*f5c631daSSadaf Ebrahimi     } else {
3917*f5c631daSSadaf Ebrahimi       CompareHelper(lt, pd, pg, zn, imm);
3918*f5c631daSSadaf Ebrahimi     }
3919*f5c631daSSadaf Ebrahimi   }
Cmpne(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)3920*f5c631daSSadaf Ebrahimi   void Cmpne(const PRegisterWithLaneSize& pd,
3921*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3922*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3923*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
3924*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3925*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3926*f5c631daSSadaf Ebrahimi     cmpne(pd, pg, zn, zm);
3927*f5c631daSSadaf Ebrahimi   }
Cmpne(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,IntegerOperand imm)3928*f5c631daSSadaf Ebrahimi   void Cmpne(const PRegisterWithLaneSize& pd,
3929*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
3930*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
3931*f5c631daSSadaf Ebrahimi              IntegerOperand imm) {
3932*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3933*f5c631daSSadaf Ebrahimi     int imm5;
3934*f5c631daSSadaf Ebrahimi     if (imm.TryEncodeAsIntNForLane<5>(zn, &imm5)) {
3935*f5c631daSSadaf Ebrahimi       SingleEmissionCheckScope guard(this);
3936*f5c631daSSadaf Ebrahimi       cmpne(pd, pg, zn, imm5);
3937*f5c631daSSadaf Ebrahimi     } else {
3938*f5c631daSSadaf Ebrahimi       CompareHelper(ne, pd, pg, zn, imm);
3939*f5c631daSSadaf Ebrahimi     }
3940*f5c631daSSadaf Ebrahimi   }
Cnot(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)3941*f5c631daSSadaf Ebrahimi   void Cnot(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
3942*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3943*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3944*f5c631daSSadaf Ebrahimi     cnot(zd, pg, zn);
3945*f5c631daSSadaf Ebrahimi   }
Cnt(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)3946*f5c631daSSadaf Ebrahimi   void Cnt(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
3947*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3948*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3949*f5c631daSSadaf Ebrahimi     cnt(zd, pg, zn);
3950*f5c631daSSadaf Ebrahimi   }
3951*f5c631daSSadaf Ebrahimi   void Cntb(const Register& rd, int pattern = SVE_ALL, int multiplier = 1) {
3952*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3953*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3954*f5c631daSSadaf Ebrahimi     cntb(rd, pattern, multiplier);
3955*f5c631daSSadaf Ebrahimi   }
3956*f5c631daSSadaf Ebrahimi   void Cntd(const Register& rd, int pattern = SVE_ALL, int multiplier = 1) {
3957*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3958*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3959*f5c631daSSadaf Ebrahimi     cntd(rd, pattern, multiplier);
3960*f5c631daSSadaf Ebrahimi   }
3961*f5c631daSSadaf Ebrahimi   void Cnth(const Register& rd, int pattern = SVE_ALL, int multiplier = 1) {
3962*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3963*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3964*f5c631daSSadaf Ebrahimi     cnth(rd, pattern, multiplier);
3965*f5c631daSSadaf Ebrahimi   }
Cntp(const Register & rd,const PRegister & pg,const PRegisterWithLaneSize & pn)3966*f5c631daSSadaf Ebrahimi   void Cntp(const Register& rd,
3967*f5c631daSSadaf Ebrahimi             const PRegister& pg,
3968*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn) {
3969*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3970*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3971*f5c631daSSadaf Ebrahimi     // The `cntp` instruction architecturally takes an X register, but the
3972*f5c631daSSadaf Ebrahimi     // result will always be in the range [0, kPRegMaxSize] (and therefore
3973*f5c631daSSadaf Ebrahimi     // always fits in a W register), so we can accept a W-sized rd here.
3974*f5c631daSSadaf Ebrahimi     cntp(rd.X(), pg, pn);
3975*f5c631daSSadaf Ebrahimi   }
3976*f5c631daSSadaf Ebrahimi   void Cntw(const Register& rd, int pattern = SVE_ALL, int multiplier = 1) {
3977*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3978*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3979*f5c631daSSadaf Ebrahimi     cntw(rd, pattern, multiplier);
3980*f5c631daSSadaf Ebrahimi   }
Compact(const ZRegister & zd,const PRegister & pg,const ZRegister & zn)3981*f5c631daSSadaf Ebrahimi   void Compact(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) {
3982*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3983*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3984*f5c631daSSadaf Ebrahimi     compact(zd, pg, zn);
3985*f5c631daSSadaf Ebrahimi   }
3986*f5c631daSSadaf Ebrahimi   void Cpy(const ZRegister& zd, const PRegister& pg, IntegerOperand imm);
Cpy(const ZRegister & zd,const PRegisterM & pg,const Register & rn)3987*f5c631daSSadaf Ebrahimi   void Cpy(const ZRegister& zd, const PRegisterM& pg, const Register& rn) {
3988*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3989*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3990*f5c631daSSadaf Ebrahimi     cpy(zd, pg, rn);
3991*f5c631daSSadaf Ebrahimi   }
Cpy(const ZRegister & zd,const PRegisterM & pg,const VRegister & vn)3992*f5c631daSSadaf Ebrahimi   void Cpy(const ZRegister& zd, const PRegisterM& pg, const VRegister& vn) {
3993*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3994*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
3995*f5c631daSSadaf Ebrahimi     cpy(zd, pg, vn);
3996*f5c631daSSadaf Ebrahimi   }
Ctermeq(const Register & rn,const Register & rm)3997*f5c631daSSadaf Ebrahimi   void Ctermeq(const Register& rn, const Register& rm) {
3998*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
3999*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4000*f5c631daSSadaf Ebrahimi     ctermeq(rn, rm);
4001*f5c631daSSadaf Ebrahimi   }
Ctermne(const Register & rn,const Register & rm)4002*f5c631daSSadaf Ebrahimi   void Ctermne(const Register& rn, const Register& rm) {
4003*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4004*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4005*f5c631daSSadaf Ebrahimi     ctermne(rn, rm);
4006*f5c631daSSadaf Ebrahimi   }
4007*f5c631daSSadaf Ebrahimi   void Decb(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
4008*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4009*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4010*f5c631daSSadaf Ebrahimi     decb(rdn, pattern, multiplier);
4011*f5c631daSSadaf Ebrahimi   }
4012*f5c631daSSadaf Ebrahimi   void Decd(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
4013*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4014*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4015*f5c631daSSadaf Ebrahimi     decd(rdn, pattern, multiplier);
4016*f5c631daSSadaf Ebrahimi   }
4017*f5c631daSSadaf Ebrahimi   void Decd(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) {
4018*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4019*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4020*f5c631daSSadaf Ebrahimi     decd(zdn, pattern, multiplier);
4021*f5c631daSSadaf Ebrahimi   }
4022*f5c631daSSadaf Ebrahimi   void Dech(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
4023*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4024*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4025*f5c631daSSadaf Ebrahimi     dech(rdn, pattern, multiplier);
4026*f5c631daSSadaf Ebrahimi   }
4027*f5c631daSSadaf Ebrahimi   void Dech(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) {
4028*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4029*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4030*f5c631daSSadaf Ebrahimi     dech(zdn, pattern, multiplier);
4031*f5c631daSSadaf Ebrahimi   }
Decp(const Register & rdn,const PRegisterWithLaneSize & pg)4032*f5c631daSSadaf Ebrahimi   void Decp(const Register& rdn, const PRegisterWithLaneSize& pg) {
4033*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4034*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4035*f5c631daSSadaf Ebrahimi     decp(rdn, pg);
4036*f5c631daSSadaf Ebrahimi   }
Decp(const ZRegister & zd,const PRegister & pg,const ZRegister & zn)4037*f5c631daSSadaf Ebrahimi   void Decp(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) {
4038*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4039*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(AreSameFormat(zd, zn));
4040*f5c631daSSadaf Ebrahimi     // `decp` writes every lane, so use an unpredicated movprfx.
4041*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, zn);
4042*f5c631daSSadaf Ebrahimi     decp(zd, pg);
4043*f5c631daSSadaf Ebrahimi   }
Decp(const ZRegister & zdn,const PRegister & pg)4044*f5c631daSSadaf Ebrahimi   void Decp(const ZRegister& zdn, const PRegister& pg) { Decp(zdn, pg, zdn); }
4045*f5c631daSSadaf Ebrahimi   void Decw(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
4046*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4047*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4048*f5c631daSSadaf Ebrahimi     decw(rdn, pattern, multiplier);
4049*f5c631daSSadaf Ebrahimi   }
4050*f5c631daSSadaf Ebrahimi   void Decw(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) {
4051*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4052*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4053*f5c631daSSadaf Ebrahimi     decw(zdn, pattern, multiplier);
4054*f5c631daSSadaf Ebrahimi   }
Dup(const ZRegister & zd,const Register & xn)4055*f5c631daSSadaf Ebrahimi   void Dup(const ZRegister& zd, const Register& xn) {
4056*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4057*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4058*f5c631daSSadaf Ebrahimi     dup(zd, xn);
4059*f5c631daSSadaf Ebrahimi   }
Dup(const ZRegister & zd,const ZRegister & zn,int index)4060*f5c631daSSadaf Ebrahimi   void Dup(const ZRegister& zd, const ZRegister& zn, int index) {
4061*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4062*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4063*f5c631daSSadaf Ebrahimi     dup(zd, zn, index);
4064*f5c631daSSadaf Ebrahimi   }
4065*f5c631daSSadaf Ebrahimi   void Dup(const ZRegister& zd, IntegerOperand imm);
Eon(const ZRegister & zd,const ZRegister & zn,uint64_t imm)4066*f5c631daSSadaf Ebrahimi   void Eon(const ZRegister& zd, const ZRegister& zn, uint64_t imm) {
4067*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4068*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4069*f5c631daSSadaf Ebrahimi     if (IsImmLogical(imm, zd.GetLaneSizeInBits())) {
4070*f5c631daSSadaf Ebrahimi       eon(zd, zn, imm);
4071*f5c631daSSadaf Ebrahimi     } else {
4072*f5c631daSSadaf Ebrahimi       // TODO: Synthesise the immediate once 'Mov' is implemented.
4073*f5c631daSSadaf Ebrahimi       VIXL_UNIMPLEMENTED();
4074*f5c631daSSadaf Ebrahimi     }
4075*f5c631daSSadaf Ebrahimi   }
Eor(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)4076*f5c631daSSadaf Ebrahimi   void Eor(const PRegisterWithLaneSize& pd,
4077*f5c631daSSadaf Ebrahimi            const PRegisterZ& pg,
4078*f5c631daSSadaf Ebrahimi            const PRegisterWithLaneSize& pn,
4079*f5c631daSSadaf Ebrahimi            const PRegisterWithLaneSize& pm) {
4080*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4081*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4082*f5c631daSSadaf Ebrahimi     eor(pd, pg, pn, pm);
4083*f5c631daSSadaf Ebrahimi   }
Eor(const ZRegister & zd,const ZRegister & zn,uint64_t imm)4084*f5c631daSSadaf Ebrahimi   void Eor(const ZRegister& zd, const ZRegister& zn, uint64_t imm) {
4085*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4086*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4087*f5c631daSSadaf Ebrahimi     if (IsImmLogical(imm, zd.GetLaneSizeInBits())) {
4088*f5c631daSSadaf Ebrahimi       eor(zd, zn, imm);
4089*f5c631daSSadaf Ebrahimi     } else {
4090*f5c631daSSadaf Ebrahimi       // TODO: Synthesise the immediate once 'Mov' is implemented.
4091*f5c631daSSadaf Ebrahimi       VIXL_UNIMPLEMENTED();
4092*f5c631daSSadaf Ebrahimi     }
4093*f5c631daSSadaf Ebrahimi   }
Eor(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)4094*f5c631daSSadaf Ebrahimi   void Eor(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
4095*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4096*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(AreSameLaneSize(zd, zn, zm));
4097*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4098*f5c631daSSadaf Ebrahimi     eor(zd.VnD(), zn.VnD(), zm.VnD());
4099*f5c631daSSadaf Ebrahimi   }
Eors(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)4100*f5c631daSSadaf Ebrahimi   void Eors(const PRegisterWithLaneSize& pd,
4101*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
4102*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn,
4103*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pm) {
4104*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4105*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4106*f5c631daSSadaf Ebrahimi     eors(pd, pg, pn, pm);
4107*f5c631daSSadaf Ebrahimi   }
Eorv(const VRegister & vd,const PRegister & pg,const ZRegister & zn)4108*f5c631daSSadaf Ebrahimi   void Eorv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) {
4109*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4110*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4111*f5c631daSSadaf Ebrahimi     eorv(vd, pg, zn);
4112*f5c631daSSadaf Ebrahimi   }
Ext(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm,unsigned offset)4113*f5c631daSSadaf Ebrahimi   void Ext(const ZRegister& zd,
4114*f5c631daSSadaf Ebrahimi            const ZRegister& zn,
4115*f5c631daSSadaf Ebrahimi            const ZRegister& zm,
4116*f5c631daSSadaf Ebrahimi            unsigned offset) {
4117*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4118*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4119*f5c631daSSadaf Ebrahimi     ext(zd, zn, zm, offset);
4120*f5c631daSSadaf Ebrahimi   }
4121*f5c631daSSadaf Ebrahimi   void Fabd(const ZRegister& zd,
4122*f5c631daSSadaf Ebrahimi             const PRegisterM& pg,
4123*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
4124*f5c631daSSadaf Ebrahimi             const ZRegister& zm,
4125*f5c631daSSadaf Ebrahimi             FPMacroNaNPropagationOption nan_option);
Fabs(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)4126*f5c631daSSadaf Ebrahimi   void Fabs(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
4127*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4128*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4129*f5c631daSSadaf Ebrahimi     fabs(zd, pg, zn);
4130*f5c631daSSadaf Ebrahimi   }
Facge(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)4131*f5c631daSSadaf Ebrahimi   void Facge(const PRegisterWithLaneSize& pd,
4132*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4133*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4134*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
4135*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4136*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4137*f5c631daSSadaf Ebrahimi     facge(pd, pg, zn, zm);
4138*f5c631daSSadaf Ebrahimi   }
Facgt(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)4139*f5c631daSSadaf Ebrahimi   void Facgt(const PRegisterWithLaneSize& pd,
4140*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4141*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4142*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
4143*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4144*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4145*f5c631daSSadaf Ebrahimi     facgt(pd, pg, zn, zm);
4146*f5c631daSSadaf Ebrahimi   }
Facle(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)4147*f5c631daSSadaf Ebrahimi   void Facle(const PRegisterWithLaneSize& pd,
4148*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4149*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4150*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
4151*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4152*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4153*f5c631daSSadaf Ebrahimi     facge(pd, pg, zm, zn);
4154*f5c631daSSadaf Ebrahimi   }
Faclt(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)4155*f5c631daSSadaf Ebrahimi   void Faclt(const PRegisterWithLaneSize& pd,
4156*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4157*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4158*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
4159*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4160*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4161*f5c631daSSadaf Ebrahimi     facgt(pd, pg, zm, zn);
4162*f5c631daSSadaf Ebrahimi   }
Fadd(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn,double imm)4163*f5c631daSSadaf Ebrahimi   void Fadd(const ZRegister& zd,
4164*f5c631daSSadaf Ebrahimi             const PRegisterM& pg,
4165*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
4166*f5c631daSSadaf Ebrahimi             double imm) {
4167*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4168*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
4169*f5c631daSSadaf Ebrahimi     fadd(zd, pg, zd, imm);
4170*f5c631daSSadaf Ebrahimi   }
4171*f5c631daSSadaf Ebrahimi   void Fadd(const ZRegister& zd,
4172*f5c631daSSadaf Ebrahimi             const PRegisterM& pg,
4173*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
4174*f5c631daSSadaf Ebrahimi             const ZRegister& zm,
4175*f5c631daSSadaf Ebrahimi             FPMacroNaNPropagationOption nan_option);
Fadd(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)4176*f5c631daSSadaf Ebrahimi   void Fadd(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
4177*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4178*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4179*f5c631daSSadaf Ebrahimi     fadd(zd, zn, zm);
4180*f5c631daSSadaf Ebrahimi   }
Fadda(const VRegister & vd,const PRegister & pg,const VRegister & vn,const ZRegister & zm)4181*f5c631daSSadaf Ebrahimi   void Fadda(const VRegister& vd,
4182*f5c631daSSadaf Ebrahimi              const PRegister& pg,
4183*f5c631daSSadaf Ebrahimi              const VRegister& vn,
4184*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
4185*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4186*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4187*f5c631daSSadaf Ebrahimi     fadda(vd, pg, vn, zm);
4188*f5c631daSSadaf Ebrahimi   }
Faddv(const VRegister & vd,const PRegister & pg,const ZRegister & zn)4189*f5c631daSSadaf Ebrahimi   void Faddv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) {
4190*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4191*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4192*f5c631daSSadaf Ebrahimi     faddv(vd, pg, zn);
4193*f5c631daSSadaf Ebrahimi   }
4194*f5c631daSSadaf Ebrahimi   void Fcadd(const ZRegister& zd,
4195*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
4196*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4197*f5c631daSSadaf Ebrahimi              const ZRegister& zm,
4198*f5c631daSSadaf Ebrahimi              int rot);
Fcmeq(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,double zero)4199*f5c631daSSadaf Ebrahimi   void Fcmeq(const PRegisterWithLaneSize& pd,
4200*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4201*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4202*f5c631daSSadaf Ebrahimi              double zero) {
4203*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4204*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4205*f5c631daSSadaf Ebrahimi     if (zero == 0.0) {
4206*f5c631daSSadaf Ebrahimi       fcmeq(pd, pg, zn, zero);
4207*f5c631daSSadaf Ebrahimi     } else {
4208*f5c631daSSadaf Ebrahimi       // TODO: Synthesise other immediates.
4209*f5c631daSSadaf Ebrahimi       VIXL_UNIMPLEMENTED();
4210*f5c631daSSadaf Ebrahimi     }
4211*f5c631daSSadaf Ebrahimi   }
Fcmeq(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)4212*f5c631daSSadaf Ebrahimi   void Fcmeq(const PRegisterWithLaneSize& pd,
4213*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4214*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4215*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
4216*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4217*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4218*f5c631daSSadaf Ebrahimi     fcmeq(pd, pg, zn, zm);
4219*f5c631daSSadaf Ebrahimi   }
Fcmge(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,double zero)4220*f5c631daSSadaf Ebrahimi   void Fcmge(const PRegisterWithLaneSize& pd,
4221*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4222*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4223*f5c631daSSadaf Ebrahimi              double zero) {
4224*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4225*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4226*f5c631daSSadaf Ebrahimi     if (zero == 0.0) {
4227*f5c631daSSadaf Ebrahimi       fcmge(pd, pg, zn, zero);
4228*f5c631daSSadaf Ebrahimi     } else {
4229*f5c631daSSadaf Ebrahimi       // TODO: Synthesise other immediates.
4230*f5c631daSSadaf Ebrahimi       VIXL_UNIMPLEMENTED();
4231*f5c631daSSadaf Ebrahimi     }
4232*f5c631daSSadaf Ebrahimi   }
Fcmge(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)4233*f5c631daSSadaf Ebrahimi   void Fcmge(const PRegisterWithLaneSize& pd,
4234*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4235*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4236*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
4237*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4238*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4239*f5c631daSSadaf Ebrahimi     fcmge(pd, pg, zn, zm);
4240*f5c631daSSadaf Ebrahimi   }
Fcmgt(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,double zero)4241*f5c631daSSadaf Ebrahimi   void Fcmgt(const PRegisterWithLaneSize& pd,
4242*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4243*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4244*f5c631daSSadaf Ebrahimi              double zero) {
4245*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4246*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4247*f5c631daSSadaf Ebrahimi     if (zero == 0.0) {
4248*f5c631daSSadaf Ebrahimi       fcmgt(pd, pg, zn, zero);
4249*f5c631daSSadaf Ebrahimi     } else {
4250*f5c631daSSadaf Ebrahimi       // TODO: Synthesise other immediates.
4251*f5c631daSSadaf Ebrahimi       VIXL_UNIMPLEMENTED();
4252*f5c631daSSadaf Ebrahimi     }
4253*f5c631daSSadaf Ebrahimi   }
Fcmgt(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)4254*f5c631daSSadaf Ebrahimi   void Fcmgt(const PRegisterWithLaneSize& pd,
4255*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4256*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4257*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
4258*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4259*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4260*f5c631daSSadaf Ebrahimi     fcmgt(pd, pg, zn, zm);
4261*f5c631daSSadaf Ebrahimi   }
4262*f5c631daSSadaf Ebrahimi   void Fcmla(const ZRegister& zd,
4263*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
4264*f5c631daSSadaf Ebrahimi              const ZRegister& za,
4265*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4266*f5c631daSSadaf Ebrahimi              const ZRegister& zm,
4267*f5c631daSSadaf Ebrahimi              int rot);
Fcmla(const ZRegister & zda,const ZRegister & zn,const ZRegister & zm,int index,int rot)4268*f5c631daSSadaf Ebrahimi   void Fcmla(const ZRegister& zda,
4269*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4270*f5c631daSSadaf Ebrahimi              const ZRegister& zm,
4271*f5c631daSSadaf Ebrahimi              int index,
4272*f5c631daSSadaf Ebrahimi              int rot) {
4273*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4274*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4275*f5c631daSSadaf Ebrahimi     fcmla(zda, zn, zm, index, rot);
4276*f5c631daSSadaf Ebrahimi   }
Fcmle(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,double zero)4277*f5c631daSSadaf Ebrahimi   void Fcmle(const PRegisterWithLaneSize& pd,
4278*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4279*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4280*f5c631daSSadaf Ebrahimi              double zero) {
4281*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4282*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4283*f5c631daSSadaf Ebrahimi     if (zero == 0.0) {
4284*f5c631daSSadaf Ebrahimi       fcmle(pd, pg, zn, zero);
4285*f5c631daSSadaf Ebrahimi     } else {
4286*f5c631daSSadaf Ebrahimi       // TODO: Synthesise other immediates.
4287*f5c631daSSadaf Ebrahimi       VIXL_UNIMPLEMENTED();
4288*f5c631daSSadaf Ebrahimi     }
4289*f5c631daSSadaf Ebrahimi   }
Fcmle(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)4290*f5c631daSSadaf Ebrahimi   void Fcmle(const PRegisterWithLaneSize& pd,
4291*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4292*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4293*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
4294*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4295*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4296*f5c631daSSadaf Ebrahimi     fcmge(pd, pg, zm, zn);
4297*f5c631daSSadaf Ebrahimi   }
Fcmlt(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,double zero)4298*f5c631daSSadaf Ebrahimi   void Fcmlt(const PRegisterWithLaneSize& pd,
4299*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4300*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4301*f5c631daSSadaf Ebrahimi              double zero) {
4302*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4303*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4304*f5c631daSSadaf Ebrahimi     if (zero == 0.0) {
4305*f5c631daSSadaf Ebrahimi       fcmlt(pd, pg, zn, zero);
4306*f5c631daSSadaf Ebrahimi     } else {
4307*f5c631daSSadaf Ebrahimi       // TODO: Synthesise other immediates.
4308*f5c631daSSadaf Ebrahimi       VIXL_UNIMPLEMENTED();
4309*f5c631daSSadaf Ebrahimi     }
4310*f5c631daSSadaf Ebrahimi   }
Fcmlt(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)4311*f5c631daSSadaf Ebrahimi   void Fcmlt(const PRegisterWithLaneSize& pd,
4312*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4313*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4314*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
4315*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4316*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4317*f5c631daSSadaf Ebrahimi     fcmgt(pd, pg, zm, zn);
4318*f5c631daSSadaf Ebrahimi   }
Fcmne(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,double zero)4319*f5c631daSSadaf Ebrahimi   void Fcmne(const PRegisterWithLaneSize& pd,
4320*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4321*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4322*f5c631daSSadaf Ebrahimi              double zero) {
4323*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4324*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4325*f5c631daSSadaf Ebrahimi     if (zero == 0.0) {
4326*f5c631daSSadaf Ebrahimi       fcmne(pd, pg, zn, zero);
4327*f5c631daSSadaf Ebrahimi     } else {
4328*f5c631daSSadaf Ebrahimi       // TODO: Synthesise other immediates.
4329*f5c631daSSadaf Ebrahimi       VIXL_UNIMPLEMENTED();
4330*f5c631daSSadaf Ebrahimi     }
4331*f5c631daSSadaf Ebrahimi   }
Fcmne(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)4332*f5c631daSSadaf Ebrahimi   void Fcmne(const PRegisterWithLaneSize& pd,
4333*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4334*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4335*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
4336*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4337*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4338*f5c631daSSadaf Ebrahimi     fcmne(pd, pg, zn, zm);
4339*f5c631daSSadaf Ebrahimi   }
Fcmuo(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)4340*f5c631daSSadaf Ebrahimi   void Fcmuo(const PRegisterWithLaneSize& pd,
4341*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4342*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4343*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
4344*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4345*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4346*f5c631daSSadaf Ebrahimi     fcmuo(pd, pg, zn, zm);
4347*f5c631daSSadaf Ebrahimi   }
4348*f5c631daSSadaf Ebrahimi   void Fcpy(const ZRegister& zd, const PRegisterM& pg, double imm);
4349*f5c631daSSadaf Ebrahimi   void Fcpy(const ZRegister& zd, const PRegisterM& pg, float imm);
4350*f5c631daSSadaf Ebrahimi   void Fcpy(const ZRegister& zd, const PRegisterM& pg, Float16 imm);
Fcvt(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)4351*f5c631daSSadaf Ebrahimi   void Fcvt(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
4352*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4353*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4354*f5c631daSSadaf Ebrahimi     fcvt(zd, pg, zn);
4355*f5c631daSSadaf Ebrahimi   }
Fcvt(const ZRegister & zd,const PRegisterZ & pg,const ZRegister & zn)4356*f5c631daSSadaf Ebrahimi   void Fcvt(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) {
4357*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4358*f5c631daSSadaf Ebrahimi     // The element type in this predicated movprfx is determined by the larger
4359*f5c631daSSadaf Ebrahimi     // type between the source and destination.
4360*f5c631daSSadaf Ebrahimi     int lane_size = std::max(zd.GetLaneSizeInBits(), zn.GetLaneSizeInBits());
4361*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this,
4362*f5c631daSSadaf Ebrahimi                              zd.WithLaneSize(lane_size),
4363*f5c631daSSadaf Ebrahimi                              pg,
4364*f5c631daSSadaf Ebrahimi                              zn.WithLaneSize(lane_size));
4365*f5c631daSSadaf Ebrahimi     fcvt(zd, pg.Merging(), zn);
4366*f5c631daSSadaf Ebrahimi   }
Fcvtzs(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)4367*f5c631daSSadaf Ebrahimi   void Fcvtzs(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
4368*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4369*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4370*f5c631daSSadaf Ebrahimi     fcvtzs(zd, pg, zn);
4371*f5c631daSSadaf Ebrahimi   }
Fcvtzu(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)4372*f5c631daSSadaf Ebrahimi   void Fcvtzu(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
4373*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4374*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4375*f5c631daSSadaf Ebrahimi     fcvtzu(zd, pg, zn);
4376*f5c631daSSadaf Ebrahimi   }
4377*f5c631daSSadaf Ebrahimi   void Fdiv(const ZRegister& zd,
4378*f5c631daSSadaf Ebrahimi             const PRegisterM& pg,
4379*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
4380*f5c631daSSadaf Ebrahimi             const ZRegister& zm);
4381*f5c631daSSadaf Ebrahimi   void Fdup(const ZRegister& zd, double imm);
4382*f5c631daSSadaf Ebrahimi   void Fdup(const ZRegister& zd, float imm);
4383*f5c631daSSadaf Ebrahimi   void Fdup(const ZRegister& zd, Float16 imm);
Fexpa(const ZRegister & zd,const ZRegister & zn)4384*f5c631daSSadaf Ebrahimi   void Fexpa(const ZRegister& zd, const ZRegister& zn) {
4385*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4386*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4387*f5c631daSSadaf Ebrahimi     fexpa(zd, zn);
4388*f5c631daSSadaf Ebrahimi   }
Fmad(const ZRegister & zdn,const PRegisterM & pg,const ZRegister & zm,const ZRegister & za)4389*f5c631daSSadaf Ebrahimi   void Fmad(const ZRegister& zdn,
4390*f5c631daSSadaf Ebrahimi             const PRegisterM& pg,
4391*f5c631daSSadaf Ebrahimi             const ZRegister& zm,
4392*f5c631daSSadaf Ebrahimi             const ZRegister& za) {
4393*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4394*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4395*f5c631daSSadaf Ebrahimi     fmad(zdn, pg, zm, za);
4396*f5c631daSSadaf Ebrahimi   }
Fmax(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn,double imm)4397*f5c631daSSadaf Ebrahimi   void Fmax(const ZRegister& zd,
4398*f5c631daSSadaf Ebrahimi             const PRegisterM& pg,
4399*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
4400*f5c631daSSadaf Ebrahimi             double imm) {
4401*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4402*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
4403*f5c631daSSadaf Ebrahimi     fmax(zd, pg, zd, imm);
4404*f5c631daSSadaf Ebrahimi   }
4405*f5c631daSSadaf Ebrahimi   void Fmax(
4406*f5c631daSSadaf Ebrahimi       const ZRegister& zd,
4407*f5c631daSSadaf Ebrahimi       const PRegisterM& pg,
4408*f5c631daSSadaf Ebrahimi       const ZRegister& zn,
4409*f5c631daSSadaf Ebrahimi       const ZRegister& zm,
4410*f5c631daSSadaf Ebrahimi       FPMacroNaNPropagationOption nan_option = NoFPMacroNaNPropagationSelected);
Fmaxnm(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn,double imm)4411*f5c631daSSadaf Ebrahimi   void Fmaxnm(const ZRegister& zd,
4412*f5c631daSSadaf Ebrahimi               const PRegisterM& pg,
4413*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
4414*f5c631daSSadaf Ebrahimi               double imm) {
4415*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4416*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
4417*f5c631daSSadaf Ebrahimi     fmaxnm(zd, pg, zd, imm);
4418*f5c631daSSadaf Ebrahimi   }
4419*f5c631daSSadaf Ebrahimi   void Fmaxnm(const ZRegister& zd,
4420*f5c631daSSadaf Ebrahimi               const PRegisterM& pg,
4421*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
4422*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
4423*f5c631daSSadaf Ebrahimi               FPMacroNaNPropagationOption nan_option);
Fmaxnmv(const VRegister & vd,const PRegister & pg,const ZRegister & zn)4424*f5c631daSSadaf Ebrahimi   void Fmaxnmv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) {
4425*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4426*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4427*f5c631daSSadaf Ebrahimi     fmaxnmv(vd, pg, zn);
4428*f5c631daSSadaf Ebrahimi   }
Fmaxv(const VRegister & vd,const PRegister & pg,const ZRegister & zn)4429*f5c631daSSadaf Ebrahimi   void Fmaxv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) {
4430*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4431*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4432*f5c631daSSadaf Ebrahimi     fmaxv(vd, pg, zn);
4433*f5c631daSSadaf Ebrahimi   }
Fmin(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn,double imm)4434*f5c631daSSadaf Ebrahimi   void Fmin(const ZRegister& zd,
4435*f5c631daSSadaf Ebrahimi             const PRegisterM& pg,
4436*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
4437*f5c631daSSadaf Ebrahimi             double imm) {
4438*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4439*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
4440*f5c631daSSadaf Ebrahimi     fmin(zd, pg, zd, imm);
4441*f5c631daSSadaf Ebrahimi   }
4442*f5c631daSSadaf Ebrahimi   void Fmin(
4443*f5c631daSSadaf Ebrahimi       const ZRegister& zd,
4444*f5c631daSSadaf Ebrahimi       const PRegisterM& pg,
4445*f5c631daSSadaf Ebrahimi       const ZRegister& zn,
4446*f5c631daSSadaf Ebrahimi       const ZRegister& zm,
4447*f5c631daSSadaf Ebrahimi       FPMacroNaNPropagationOption nan_option = NoFPMacroNaNPropagationSelected);
Fminnm(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn,double imm)4448*f5c631daSSadaf Ebrahimi   void Fminnm(const ZRegister& zd,
4449*f5c631daSSadaf Ebrahimi               const PRegisterM& pg,
4450*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
4451*f5c631daSSadaf Ebrahimi               double imm) {
4452*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4453*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
4454*f5c631daSSadaf Ebrahimi     fminnm(zd, pg, zd, imm);
4455*f5c631daSSadaf Ebrahimi   }
4456*f5c631daSSadaf Ebrahimi   void Fminnm(const ZRegister& zd,
4457*f5c631daSSadaf Ebrahimi               const PRegisterM& pg,
4458*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
4459*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
4460*f5c631daSSadaf Ebrahimi               FPMacroNaNPropagationOption nan_option);
Fminnmv(const VRegister & vd,const PRegister & pg,const ZRegister & zn)4461*f5c631daSSadaf Ebrahimi   void Fminnmv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) {
4462*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4463*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4464*f5c631daSSadaf Ebrahimi     fminnmv(vd, pg, zn);
4465*f5c631daSSadaf Ebrahimi   }
Fminv(const VRegister & vd,const PRegister & pg,const ZRegister & zn)4466*f5c631daSSadaf Ebrahimi   void Fminv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) {
4467*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4468*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4469*f5c631daSSadaf Ebrahimi     fminv(vd, pg, zn);
4470*f5c631daSSadaf Ebrahimi   }
4471*f5c631daSSadaf Ebrahimi   // zd = za + (zn * zm)
4472*f5c631daSSadaf Ebrahimi   void Fmla(
4473*f5c631daSSadaf Ebrahimi       const ZRegister& zd,
4474*f5c631daSSadaf Ebrahimi       const PRegisterM& pg,
4475*f5c631daSSadaf Ebrahimi       const ZRegister& za,
4476*f5c631daSSadaf Ebrahimi       const ZRegister& zn,
4477*f5c631daSSadaf Ebrahimi       const ZRegister& zm,
4478*f5c631daSSadaf Ebrahimi       FPMacroNaNPropagationOption nan_option = NoFPMacroNaNPropagationSelected);
4479*f5c631daSSadaf Ebrahimi   void Fmla(const ZRegister& zd,
4480*f5c631daSSadaf Ebrahimi             const ZRegister& za,
4481*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
4482*f5c631daSSadaf Ebrahimi             const ZRegister& zm,
4483*f5c631daSSadaf Ebrahimi             int index);
4484*f5c631daSSadaf Ebrahimi   // zd = za - (zn * zm)
4485*f5c631daSSadaf Ebrahimi   void Fmls(
4486*f5c631daSSadaf Ebrahimi       const ZRegister& zd,
4487*f5c631daSSadaf Ebrahimi       const PRegisterM& pg,
4488*f5c631daSSadaf Ebrahimi       const ZRegister& za,
4489*f5c631daSSadaf Ebrahimi       const ZRegister& zn,
4490*f5c631daSSadaf Ebrahimi       const ZRegister& zm,
4491*f5c631daSSadaf Ebrahimi       FPMacroNaNPropagationOption nan_option = NoFPMacroNaNPropagationSelected);
4492*f5c631daSSadaf Ebrahimi   void Fmls(const ZRegister& zd,
4493*f5c631daSSadaf Ebrahimi             const ZRegister& za,
4494*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
4495*f5c631daSSadaf Ebrahimi             const ZRegister& zm,
4496*f5c631daSSadaf Ebrahimi             int index);
Fmov(const ZRegister & zd,double imm)4497*f5c631daSSadaf Ebrahimi   void Fmov(const ZRegister& zd, double imm) {
4498*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4499*f5c631daSSadaf Ebrahimi     Fdup(zd, imm);
4500*f5c631daSSadaf Ebrahimi   }
Fmov(const ZRegister & zd,float imm)4501*f5c631daSSadaf Ebrahimi   void Fmov(const ZRegister& zd, float imm) {
4502*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4503*f5c631daSSadaf Ebrahimi     Fdup(zd, imm);
4504*f5c631daSSadaf Ebrahimi   }
Fmov(const ZRegister & zd,Float16 imm)4505*f5c631daSSadaf Ebrahimi   void Fmov(const ZRegister& zd, Float16 imm) {
4506*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4507*f5c631daSSadaf Ebrahimi     Fdup(zd, imm);
4508*f5c631daSSadaf Ebrahimi   }
Fmov(const ZRegister & zd,const PRegisterM & pg,double imm)4509*f5c631daSSadaf Ebrahimi   void Fmov(const ZRegister& zd, const PRegisterM& pg, double imm) {
4510*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4511*f5c631daSSadaf Ebrahimi     Fcpy(zd, pg, imm);
4512*f5c631daSSadaf Ebrahimi   }
Fmov(const ZRegister & zd,const PRegisterM & pg,float imm)4513*f5c631daSSadaf Ebrahimi   void Fmov(const ZRegister& zd, const PRegisterM& pg, float imm) {
4514*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4515*f5c631daSSadaf Ebrahimi     Fcpy(zd, pg, imm);
4516*f5c631daSSadaf Ebrahimi   }
Fmov(const ZRegister & zd,const PRegisterM & pg,Float16 imm)4517*f5c631daSSadaf Ebrahimi   void Fmov(const ZRegister& zd, const PRegisterM& pg, Float16 imm) {
4518*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4519*f5c631daSSadaf Ebrahimi     Fcpy(zd, pg, imm);
4520*f5c631daSSadaf Ebrahimi   }
Fmsb(const ZRegister & zdn,const PRegisterM & pg,const ZRegister & zm,const ZRegister & za)4521*f5c631daSSadaf Ebrahimi   void Fmsb(const ZRegister& zdn,
4522*f5c631daSSadaf Ebrahimi             const PRegisterM& pg,
4523*f5c631daSSadaf Ebrahimi             const ZRegister& zm,
4524*f5c631daSSadaf Ebrahimi             const ZRegister& za) {
4525*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4526*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4527*f5c631daSSadaf Ebrahimi     fmsb(zdn, pg, zm, za);
4528*f5c631daSSadaf Ebrahimi   }
Fmul(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn,double imm)4529*f5c631daSSadaf Ebrahimi   void Fmul(const ZRegister& zd,
4530*f5c631daSSadaf Ebrahimi             const PRegisterM& pg,
4531*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
4532*f5c631daSSadaf Ebrahimi             double imm) {
4533*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4534*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
4535*f5c631daSSadaf Ebrahimi     fmul(zd, pg, zd, imm);
4536*f5c631daSSadaf Ebrahimi   }
4537*f5c631daSSadaf Ebrahimi   void Fmul(const ZRegister& zd,
4538*f5c631daSSadaf Ebrahimi             const PRegisterM& pg,
4539*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
4540*f5c631daSSadaf Ebrahimi             const ZRegister& zm,
4541*f5c631daSSadaf Ebrahimi             FPMacroNaNPropagationOption nan_option);
Fmul(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm,unsigned index)4542*f5c631daSSadaf Ebrahimi   void Fmul(const ZRegister& zd,
4543*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
4544*f5c631daSSadaf Ebrahimi             const ZRegister& zm,
4545*f5c631daSSadaf Ebrahimi             unsigned index) {
4546*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4547*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4548*f5c631daSSadaf Ebrahimi     fmul(zd, zn, zm, index);
4549*f5c631daSSadaf Ebrahimi   }
Fmul(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)4550*f5c631daSSadaf Ebrahimi   void Fmul(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
4551*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4552*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4553*f5c631daSSadaf Ebrahimi     fmul(zd, zn, zm);
4554*f5c631daSSadaf Ebrahimi   }
4555*f5c631daSSadaf Ebrahimi   void Fmulx(const ZRegister& zd,
4556*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
4557*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4558*f5c631daSSadaf Ebrahimi              const ZRegister& zm,
4559*f5c631daSSadaf Ebrahimi              FPMacroNaNPropagationOption nan_option);
Fneg(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)4560*f5c631daSSadaf Ebrahimi   void Fneg(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
4561*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4562*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4563*f5c631daSSadaf Ebrahimi     fneg(zd, pg, zn);
4564*f5c631daSSadaf Ebrahimi   }
4565*f5c631daSSadaf Ebrahimi   void Fnmla(
4566*f5c631daSSadaf Ebrahimi       const ZRegister& zda,
4567*f5c631daSSadaf Ebrahimi       const PRegisterM& pg,
4568*f5c631daSSadaf Ebrahimi       const ZRegister& za,
4569*f5c631daSSadaf Ebrahimi       const ZRegister& zn,
4570*f5c631daSSadaf Ebrahimi       const ZRegister& zm,
4571*f5c631daSSadaf Ebrahimi       FPMacroNaNPropagationOption nan_option = NoFPMacroNaNPropagationSelected);
4572*f5c631daSSadaf Ebrahimi   void Fnmls(
4573*f5c631daSSadaf Ebrahimi       const ZRegister& zd,
4574*f5c631daSSadaf Ebrahimi       const PRegisterM& pg,
4575*f5c631daSSadaf Ebrahimi       const ZRegister& za,
4576*f5c631daSSadaf Ebrahimi       const ZRegister& zn,
4577*f5c631daSSadaf Ebrahimi       const ZRegister& zm,
4578*f5c631daSSadaf Ebrahimi       FPMacroNaNPropagationOption nan_option = NoFPMacroNaNPropagationSelected);
Frecpe(const ZRegister & zd,const ZRegister & zn)4579*f5c631daSSadaf Ebrahimi   void Frecpe(const ZRegister& zd, const ZRegister& zn) {
4580*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4581*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4582*f5c631daSSadaf Ebrahimi     frecpe(zd, zn);
4583*f5c631daSSadaf Ebrahimi   }
Frecps(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)4584*f5c631daSSadaf Ebrahimi   void Frecps(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
4585*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4586*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4587*f5c631daSSadaf Ebrahimi     frecps(zd, zn, zm);
4588*f5c631daSSadaf Ebrahimi   }
Frecpx(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)4589*f5c631daSSadaf Ebrahimi   void Frecpx(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
4590*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4591*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4592*f5c631daSSadaf Ebrahimi     frecpx(zd, pg, zn);
4593*f5c631daSSadaf Ebrahimi   }
Frecpx(const ZRegister & zd,const PRegisterZ & pg,const ZRegister & zn)4594*f5c631daSSadaf Ebrahimi   void Frecpx(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) {
4595*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4596*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
4597*f5c631daSSadaf Ebrahimi     frecpx(zd, pg.Merging(), zn);
4598*f5c631daSSadaf Ebrahimi   }
Frinta(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)4599*f5c631daSSadaf Ebrahimi   void Frinta(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
4600*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4601*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4602*f5c631daSSadaf Ebrahimi     frinta(zd, pg, zn);
4603*f5c631daSSadaf Ebrahimi   }
Frinta(const ZRegister & zd,const PRegisterZ & pg,const ZRegister & zn)4604*f5c631daSSadaf Ebrahimi   void Frinta(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) {
4605*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4606*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
4607*f5c631daSSadaf Ebrahimi     frinta(zd, pg.Merging(), zn);
4608*f5c631daSSadaf Ebrahimi   }
Frinti(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)4609*f5c631daSSadaf Ebrahimi   void Frinti(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
4610*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4611*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4612*f5c631daSSadaf Ebrahimi     frinti(zd, pg, zn);
4613*f5c631daSSadaf Ebrahimi   }
Frinti(const ZRegister & zd,const PRegisterZ & pg,const ZRegister & zn)4614*f5c631daSSadaf Ebrahimi   void Frinti(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) {
4615*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4616*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
4617*f5c631daSSadaf Ebrahimi     frinti(zd, pg.Merging(), zn);
4618*f5c631daSSadaf Ebrahimi   }
Frintm(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)4619*f5c631daSSadaf Ebrahimi   void Frintm(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
4620*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4621*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4622*f5c631daSSadaf Ebrahimi     frintm(zd, pg, zn);
4623*f5c631daSSadaf Ebrahimi   }
Frintm(const ZRegister & zd,const PRegisterZ & pg,const ZRegister & zn)4624*f5c631daSSadaf Ebrahimi   void Frintm(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) {
4625*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4626*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
4627*f5c631daSSadaf Ebrahimi     frintm(zd, pg.Merging(), zn);
4628*f5c631daSSadaf Ebrahimi   }
Frintn(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)4629*f5c631daSSadaf Ebrahimi   void Frintn(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
4630*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4631*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4632*f5c631daSSadaf Ebrahimi     frintn(zd, pg, zn);
4633*f5c631daSSadaf Ebrahimi   }
Frintn(const ZRegister & zd,const PRegisterZ & pg,const ZRegister & zn)4634*f5c631daSSadaf Ebrahimi   void Frintn(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) {
4635*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4636*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
4637*f5c631daSSadaf Ebrahimi     frintn(zd, pg.Merging(), zn);
4638*f5c631daSSadaf Ebrahimi   }
Frintp(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)4639*f5c631daSSadaf Ebrahimi   void Frintp(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
4640*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4641*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4642*f5c631daSSadaf Ebrahimi     frintp(zd, pg, zn);
4643*f5c631daSSadaf Ebrahimi   }
Frintp(const ZRegister & zd,const PRegisterZ & pg,const ZRegister & zn)4644*f5c631daSSadaf Ebrahimi   void Frintp(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) {
4645*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4646*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
4647*f5c631daSSadaf Ebrahimi     frintp(zd, pg.Merging(), zn);
4648*f5c631daSSadaf Ebrahimi   }
Frintx(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)4649*f5c631daSSadaf Ebrahimi   void Frintx(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
4650*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4651*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4652*f5c631daSSadaf Ebrahimi     frintx(zd, pg, zn);
4653*f5c631daSSadaf Ebrahimi   }
Frintx(const ZRegister & zd,const PRegisterZ & pg,const ZRegister & zn)4654*f5c631daSSadaf Ebrahimi   void Frintx(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) {
4655*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4656*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
4657*f5c631daSSadaf Ebrahimi     frintx(zd, pg.Merging(), zn);
4658*f5c631daSSadaf Ebrahimi   }
Frintz(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)4659*f5c631daSSadaf Ebrahimi   void Frintz(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
4660*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4661*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4662*f5c631daSSadaf Ebrahimi     frintz(zd, pg, zn);
4663*f5c631daSSadaf Ebrahimi   }
Frintz(const ZRegister & zd,const PRegisterZ & pg,const ZRegister & zn)4664*f5c631daSSadaf Ebrahimi   void Frintz(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) {
4665*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4666*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
4667*f5c631daSSadaf Ebrahimi     frintz(zd, pg.Merging(), zn);
4668*f5c631daSSadaf Ebrahimi   }
Frsqrte(const ZRegister & zd,const ZRegister & zn)4669*f5c631daSSadaf Ebrahimi   void Frsqrte(const ZRegister& zd, const ZRegister& zn) {
4670*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4671*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4672*f5c631daSSadaf Ebrahimi     frsqrte(zd, zn);
4673*f5c631daSSadaf Ebrahimi   }
Frsqrts(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)4674*f5c631daSSadaf Ebrahimi   void Frsqrts(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
4675*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4676*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4677*f5c631daSSadaf Ebrahimi     frsqrts(zd, zn, zm);
4678*f5c631daSSadaf Ebrahimi   }
4679*f5c631daSSadaf Ebrahimi   void Fscale(const ZRegister& zd,
4680*f5c631daSSadaf Ebrahimi               const PRegisterM& pg,
4681*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
4682*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
Fsqrt(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)4683*f5c631daSSadaf Ebrahimi   void Fsqrt(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
4684*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4685*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4686*f5c631daSSadaf Ebrahimi     fsqrt(zd, pg, zn);
4687*f5c631daSSadaf Ebrahimi   }
Fsqrt(const ZRegister & zd,const PRegisterZ & pg,const ZRegister & zn)4688*f5c631daSSadaf Ebrahimi   void Fsqrt(const ZRegister& zd, const PRegisterZ& pg, const ZRegister& zn) {
4689*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4690*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
4691*f5c631daSSadaf Ebrahimi     fsqrt(zd, pg.Merging(), zn);
4692*f5c631daSSadaf Ebrahimi   }
Fsub(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn,double imm)4693*f5c631daSSadaf Ebrahimi   void Fsub(const ZRegister& zd,
4694*f5c631daSSadaf Ebrahimi             const PRegisterM& pg,
4695*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
4696*f5c631daSSadaf Ebrahimi             double imm) {
4697*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4698*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
4699*f5c631daSSadaf Ebrahimi     fsub(zd, pg, zd, imm);
4700*f5c631daSSadaf Ebrahimi   }
Fsub(const ZRegister & zd,const PRegisterM & pg,double imm,const ZRegister & zn)4701*f5c631daSSadaf Ebrahimi   void Fsub(const ZRegister& zd,
4702*f5c631daSSadaf Ebrahimi             const PRegisterM& pg,
4703*f5c631daSSadaf Ebrahimi             double imm,
4704*f5c631daSSadaf Ebrahimi             const ZRegister& zn) {
4705*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4706*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
4707*f5c631daSSadaf Ebrahimi     fsubr(zd, pg, zd, imm);
4708*f5c631daSSadaf Ebrahimi   }
4709*f5c631daSSadaf Ebrahimi   void Fsub(const ZRegister& zd,
4710*f5c631daSSadaf Ebrahimi             const PRegisterM& pg,
4711*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
4712*f5c631daSSadaf Ebrahimi             const ZRegister& zm);
Fsub(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)4713*f5c631daSSadaf Ebrahimi   void Fsub(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
4714*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4715*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4716*f5c631daSSadaf Ebrahimi     fsub(zd, zn, zm);
4717*f5c631daSSadaf Ebrahimi   }
4718*f5c631daSSadaf Ebrahimi   void Ftmad(const ZRegister& zd,
4719*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
4720*f5c631daSSadaf Ebrahimi              const ZRegister& zm,
4721*f5c631daSSadaf Ebrahimi              int imm3);
Ftsmul(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)4722*f5c631daSSadaf Ebrahimi   void Ftsmul(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
4723*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4724*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4725*f5c631daSSadaf Ebrahimi     ftsmul(zd, zn, zm);
4726*f5c631daSSadaf Ebrahimi   }
Ftssel(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)4727*f5c631daSSadaf Ebrahimi   void Ftssel(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
4728*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4729*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4730*f5c631daSSadaf Ebrahimi     ftssel(zd, zn, zm);
4731*f5c631daSSadaf Ebrahimi   }
4732*f5c631daSSadaf Ebrahimi   void Incb(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
4733*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4734*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4735*f5c631daSSadaf Ebrahimi     incb(rdn, pattern, multiplier);
4736*f5c631daSSadaf Ebrahimi   }
4737*f5c631daSSadaf Ebrahimi   void Incd(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
4738*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4739*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4740*f5c631daSSadaf Ebrahimi     incd(rdn, pattern, multiplier);
4741*f5c631daSSadaf Ebrahimi   }
4742*f5c631daSSadaf Ebrahimi   void Incd(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) {
4743*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4744*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4745*f5c631daSSadaf Ebrahimi     incd(zdn, pattern, multiplier);
4746*f5c631daSSadaf Ebrahimi   }
4747*f5c631daSSadaf Ebrahimi   void Inch(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
4748*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4749*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4750*f5c631daSSadaf Ebrahimi     inch(rdn, pattern, multiplier);
4751*f5c631daSSadaf Ebrahimi   }
4752*f5c631daSSadaf Ebrahimi   void Inch(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) {
4753*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4754*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4755*f5c631daSSadaf Ebrahimi     inch(zdn, pattern, multiplier);
4756*f5c631daSSadaf Ebrahimi   }
Incp(const Register & rdn,const PRegisterWithLaneSize & pg)4757*f5c631daSSadaf Ebrahimi   void Incp(const Register& rdn, const PRegisterWithLaneSize& pg) {
4758*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4759*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4760*f5c631daSSadaf Ebrahimi     incp(rdn, pg);
4761*f5c631daSSadaf Ebrahimi   }
Incp(const ZRegister & zd,const PRegister & pg,const ZRegister & zn)4762*f5c631daSSadaf Ebrahimi   void Incp(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) {
4763*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4764*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(AreSameFormat(zd, zn));
4765*f5c631daSSadaf Ebrahimi     // `incp` writes every lane, so use an unpredicated movprfx.
4766*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, zn);
4767*f5c631daSSadaf Ebrahimi     incp(zd, pg);
4768*f5c631daSSadaf Ebrahimi   }
Incp(const ZRegister & zdn,const PRegister & pg)4769*f5c631daSSadaf Ebrahimi   void Incp(const ZRegister& zdn, const PRegister& pg) { Incp(zdn, pg, zdn); }
4770*f5c631daSSadaf Ebrahimi   void Incw(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
4771*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4772*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4773*f5c631daSSadaf Ebrahimi     incw(rdn, pattern, multiplier);
4774*f5c631daSSadaf Ebrahimi   }
4775*f5c631daSSadaf Ebrahimi   void Incw(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) {
4776*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4777*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4778*f5c631daSSadaf Ebrahimi     incw(zdn, pattern, multiplier);
4779*f5c631daSSadaf Ebrahimi   }
4780*f5c631daSSadaf Ebrahimi   void Index(const ZRegister& zd, const Operand& start, const Operand& step);
Insr(const ZRegister & zdn,const Register & rm)4781*f5c631daSSadaf Ebrahimi   void Insr(const ZRegister& zdn, const Register& rm) {
4782*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4783*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4784*f5c631daSSadaf Ebrahimi     insr(zdn, rm);
4785*f5c631daSSadaf Ebrahimi   }
Insr(const ZRegister & zdn,const VRegister & vm)4786*f5c631daSSadaf Ebrahimi   void Insr(const ZRegister& zdn, const VRegister& vm) {
4787*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4788*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4789*f5c631daSSadaf Ebrahimi     insr(zdn, vm);
4790*f5c631daSSadaf Ebrahimi   }
4791*f5c631daSSadaf Ebrahimi   void Insr(const ZRegister& zdn, IntegerOperand imm);
Lasta(const Register & rd,const PRegister & pg,const ZRegister & zn)4792*f5c631daSSadaf Ebrahimi   void Lasta(const Register& rd, const PRegister& pg, const ZRegister& zn) {
4793*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4794*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4795*f5c631daSSadaf Ebrahimi     lasta(rd, pg, zn);
4796*f5c631daSSadaf Ebrahimi   }
Lasta(const VRegister & vd,const PRegister & pg,const ZRegister & zn)4797*f5c631daSSadaf Ebrahimi   void Lasta(const VRegister& vd, const PRegister& pg, const ZRegister& zn) {
4798*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4799*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4800*f5c631daSSadaf Ebrahimi     lasta(vd, pg, zn);
4801*f5c631daSSadaf Ebrahimi   }
Lastb(const Register & rd,const PRegister & pg,const ZRegister & zn)4802*f5c631daSSadaf Ebrahimi   void Lastb(const Register& rd, const PRegister& pg, const ZRegister& zn) {
4803*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4804*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4805*f5c631daSSadaf Ebrahimi     lastb(rd, pg, zn);
4806*f5c631daSSadaf Ebrahimi   }
Lastb(const VRegister & vd,const PRegister & pg,const ZRegister & zn)4807*f5c631daSSadaf Ebrahimi   void Lastb(const VRegister& vd, const PRegister& pg, const ZRegister& zn) {
4808*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4809*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4810*f5c631daSSadaf Ebrahimi     lastb(vd, pg, zn);
4811*f5c631daSSadaf Ebrahimi   }
4812*f5c631daSSadaf Ebrahimi   void Ld1b(const ZRegister& zt,
4813*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
4814*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr);
4815*f5c631daSSadaf Ebrahimi   void Ld1h(const ZRegister& zt,
4816*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
4817*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr);
4818*f5c631daSSadaf Ebrahimi   void Ld1w(const ZRegister& zt,
4819*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
4820*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr);
4821*f5c631daSSadaf Ebrahimi   void Ld1d(const ZRegister& zt,
4822*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
4823*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr);
Ld1rb(const ZRegister & zt,const PRegisterZ & pg,const SVEMemOperand & addr)4824*f5c631daSSadaf Ebrahimi   void Ld1rb(const ZRegister& zt,
4825*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4826*f5c631daSSadaf Ebrahimi              const SVEMemOperand& addr) {
4827*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4828*f5c631daSSadaf Ebrahimi     SVELoadBroadcastImmHelper(zt,
4829*f5c631daSSadaf Ebrahimi                               pg,
4830*f5c631daSSadaf Ebrahimi                               addr,
4831*f5c631daSSadaf Ebrahimi                               &MacroAssembler::ld1rb,
4832*f5c631daSSadaf Ebrahimi                               kBRegSizeInBytes);
4833*f5c631daSSadaf Ebrahimi   }
Ld1rh(const ZRegister & zt,const PRegisterZ & pg,const SVEMemOperand & addr)4834*f5c631daSSadaf Ebrahimi   void Ld1rh(const ZRegister& zt,
4835*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4836*f5c631daSSadaf Ebrahimi              const SVEMemOperand& addr) {
4837*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4838*f5c631daSSadaf Ebrahimi     SVELoadBroadcastImmHelper(zt,
4839*f5c631daSSadaf Ebrahimi                               pg,
4840*f5c631daSSadaf Ebrahimi                               addr,
4841*f5c631daSSadaf Ebrahimi                               &MacroAssembler::ld1rh,
4842*f5c631daSSadaf Ebrahimi                               kHRegSizeInBytes);
4843*f5c631daSSadaf Ebrahimi   }
Ld1rw(const ZRegister & zt,const PRegisterZ & pg,const SVEMemOperand & addr)4844*f5c631daSSadaf Ebrahimi   void Ld1rw(const ZRegister& zt,
4845*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4846*f5c631daSSadaf Ebrahimi              const SVEMemOperand& addr) {
4847*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4848*f5c631daSSadaf Ebrahimi     SVELoadBroadcastImmHelper(zt,
4849*f5c631daSSadaf Ebrahimi                               pg,
4850*f5c631daSSadaf Ebrahimi                               addr,
4851*f5c631daSSadaf Ebrahimi                               &MacroAssembler::ld1rw,
4852*f5c631daSSadaf Ebrahimi                               kSRegSizeInBytes);
4853*f5c631daSSadaf Ebrahimi   }
Ld1rd(const ZRegister & zt,const PRegisterZ & pg,const SVEMemOperand & addr)4854*f5c631daSSadaf Ebrahimi   void Ld1rd(const ZRegister& zt,
4855*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4856*f5c631daSSadaf Ebrahimi              const SVEMemOperand& addr) {
4857*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4858*f5c631daSSadaf Ebrahimi     SVELoadBroadcastImmHelper(zt,
4859*f5c631daSSadaf Ebrahimi                               pg,
4860*f5c631daSSadaf Ebrahimi                               addr,
4861*f5c631daSSadaf Ebrahimi                               &MacroAssembler::ld1rd,
4862*f5c631daSSadaf Ebrahimi                               kDRegSizeInBytes);
4863*f5c631daSSadaf Ebrahimi   }
4864*f5c631daSSadaf Ebrahimi   void Ld1rqb(const ZRegister& zt,
4865*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
4866*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
4867*f5c631daSSadaf Ebrahimi   void Ld1rqd(const ZRegister& zt,
4868*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
4869*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
4870*f5c631daSSadaf Ebrahimi   void Ld1rqh(const ZRegister& zt,
4871*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
4872*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
4873*f5c631daSSadaf Ebrahimi   void Ld1rqw(const ZRegister& zt,
4874*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
4875*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
4876*f5c631daSSadaf Ebrahimi   void Ld1rob(const ZRegister& zt,
4877*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
4878*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
4879*f5c631daSSadaf Ebrahimi   void Ld1rod(const ZRegister& zt,
4880*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
4881*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
4882*f5c631daSSadaf Ebrahimi   void Ld1roh(const ZRegister& zt,
4883*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
4884*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
4885*f5c631daSSadaf Ebrahimi   void Ld1row(const ZRegister& zt,
4886*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
4887*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
Ld1rsb(const ZRegister & zt,const PRegisterZ & pg,const SVEMemOperand & addr)4888*f5c631daSSadaf Ebrahimi   void Ld1rsb(const ZRegister& zt,
4889*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
4890*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr) {
4891*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4892*f5c631daSSadaf Ebrahimi     SVELoadBroadcastImmHelper(zt,
4893*f5c631daSSadaf Ebrahimi                               pg,
4894*f5c631daSSadaf Ebrahimi                               addr,
4895*f5c631daSSadaf Ebrahimi                               &MacroAssembler::ld1rsb,
4896*f5c631daSSadaf Ebrahimi                               kBRegSizeInBytes);
4897*f5c631daSSadaf Ebrahimi   }
Ld1rsh(const ZRegister & zt,const PRegisterZ & pg,const SVEMemOperand & addr)4898*f5c631daSSadaf Ebrahimi   void Ld1rsh(const ZRegister& zt,
4899*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
4900*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr) {
4901*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4902*f5c631daSSadaf Ebrahimi     SVELoadBroadcastImmHelper(zt,
4903*f5c631daSSadaf Ebrahimi                               pg,
4904*f5c631daSSadaf Ebrahimi                               addr,
4905*f5c631daSSadaf Ebrahimi                               &MacroAssembler::ld1rsh,
4906*f5c631daSSadaf Ebrahimi                               kHRegSizeInBytes);
4907*f5c631daSSadaf Ebrahimi   }
Ld1rsw(const ZRegister & zt,const PRegisterZ & pg,const SVEMemOperand & addr)4908*f5c631daSSadaf Ebrahimi   void Ld1rsw(const ZRegister& zt,
4909*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
4910*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr) {
4911*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4912*f5c631daSSadaf Ebrahimi     SVELoadBroadcastImmHelper(zt,
4913*f5c631daSSadaf Ebrahimi                               pg,
4914*f5c631daSSadaf Ebrahimi                               addr,
4915*f5c631daSSadaf Ebrahimi                               &MacroAssembler::ld1rsw,
4916*f5c631daSSadaf Ebrahimi                               kSRegSizeInBytes);
4917*f5c631daSSadaf Ebrahimi   }
4918*f5c631daSSadaf Ebrahimi   void Ld1sb(const ZRegister& zt,
4919*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4920*f5c631daSSadaf Ebrahimi              const SVEMemOperand& addr);
4921*f5c631daSSadaf Ebrahimi   void Ld1sh(const ZRegister& zt,
4922*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4923*f5c631daSSadaf Ebrahimi              const SVEMemOperand& addr);
4924*f5c631daSSadaf Ebrahimi   void Ld1sw(const ZRegister& zt,
4925*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
4926*f5c631daSSadaf Ebrahimi              const SVEMemOperand& addr);
Ld2b(const ZRegister & zt1,const ZRegister & zt2,const PRegisterZ & pg,const SVEMemOperand & addr)4927*f5c631daSSadaf Ebrahimi   void Ld2b(const ZRegister& zt1,
4928*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
4929*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
4930*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
4931*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4932*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4933*f5c631daSSadaf Ebrahimi     ld2b(zt1, zt2, pg, addr);
4934*f5c631daSSadaf Ebrahimi   }
Ld2h(const ZRegister & zt1,const ZRegister & zt2,const PRegisterZ & pg,const SVEMemOperand & addr)4935*f5c631daSSadaf Ebrahimi   void Ld2h(const ZRegister& zt1,
4936*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
4937*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
4938*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
4939*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4940*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4941*f5c631daSSadaf Ebrahimi     ld2h(zt1, zt2, pg, addr);
4942*f5c631daSSadaf Ebrahimi   }
Ld2w(const ZRegister & zt1,const ZRegister & zt2,const PRegisterZ & pg,const SVEMemOperand & addr)4943*f5c631daSSadaf Ebrahimi   void Ld2w(const ZRegister& zt1,
4944*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
4945*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
4946*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
4947*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4948*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4949*f5c631daSSadaf Ebrahimi     ld2w(zt1, zt2, pg, addr);
4950*f5c631daSSadaf Ebrahimi   }
Ld2d(const ZRegister & zt1,const ZRegister & zt2,const PRegisterZ & pg,const SVEMemOperand & addr)4951*f5c631daSSadaf Ebrahimi   void Ld2d(const ZRegister& zt1,
4952*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
4953*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
4954*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
4955*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4956*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4957*f5c631daSSadaf Ebrahimi     ld2d(zt1, zt2, pg, addr);
4958*f5c631daSSadaf Ebrahimi   }
Ld3b(const ZRegister & zt1,const ZRegister & zt2,const ZRegister & zt3,const PRegisterZ & pg,const SVEMemOperand & addr)4959*f5c631daSSadaf Ebrahimi   void Ld3b(const ZRegister& zt1,
4960*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
4961*f5c631daSSadaf Ebrahimi             const ZRegister& zt3,
4962*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
4963*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
4964*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4965*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4966*f5c631daSSadaf Ebrahimi     ld3b(zt1, zt2, zt3, pg, addr);
4967*f5c631daSSadaf Ebrahimi   }
Ld3h(const ZRegister & zt1,const ZRegister & zt2,const ZRegister & zt3,const PRegisterZ & pg,const SVEMemOperand & addr)4968*f5c631daSSadaf Ebrahimi   void Ld3h(const ZRegister& zt1,
4969*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
4970*f5c631daSSadaf Ebrahimi             const ZRegister& zt3,
4971*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
4972*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
4973*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4974*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4975*f5c631daSSadaf Ebrahimi     ld3h(zt1, zt2, zt3, pg, addr);
4976*f5c631daSSadaf Ebrahimi   }
Ld3w(const ZRegister & zt1,const ZRegister & zt2,const ZRegister & zt3,const PRegisterZ & pg,const SVEMemOperand & addr)4977*f5c631daSSadaf Ebrahimi   void Ld3w(const ZRegister& zt1,
4978*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
4979*f5c631daSSadaf Ebrahimi             const ZRegister& zt3,
4980*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
4981*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
4982*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4983*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4984*f5c631daSSadaf Ebrahimi     ld3w(zt1, zt2, zt3, pg, addr);
4985*f5c631daSSadaf Ebrahimi   }
Ld3d(const ZRegister & zt1,const ZRegister & zt2,const ZRegister & zt3,const PRegisterZ & pg,const SVEMemOperand & addr)4986*f5c631daSSadaf Ebrahimi   void Ld3d(const ZRegister& zt1,
4987*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
4988*f5c631daSSadaf Ebrahimi             const ZRegister& zt3,
4989*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
4990*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
4991*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
4992*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
4993*f5c631daSSadaf Ebrahimi     ld3d(zt1, zt2, zt3, pg, addr);
4994*f5c631daSSadaf Ebrahimi   }
Ld4b(const ZRegister & zt1,const ZRegister & zt2,const ZRegister & zt3,const ZRegister & zt4,const PRegisterZ & pg,const SVEMemOperand & addr)4995*f5c631daSSadaf Ebrahimi   void Ld4b(const ZRegister& zt1,
4996*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
4997*f5c631daSSadaf Ebrahimi             const ZRegister& zt3,
4998*f5c631daSSadaf Ebrahimi             const ZRegister& zt4,
4999*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
5000*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
5001*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5002*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5003*f5c631daSSadaf Ebrahimi     ld4b(zt1, zt2, zt3, zt4, pg, addr);
5004*f5c631daSSadaf Ebrahimi   }
Ld4h(const ZRegister & zt1,const ZRegister & zt2,const ZRegister & zt3,const ZRegister & zt4,const PRegisterZ & pg,const SVEMemOperand & addr)5005*f5c631daSSadaf Ebrahimi   void Ld4h(const ZRegister& zt1,
5006*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
5007*f5c631daSSadaf Ebrahimi             const ZRegister& zt3,
5008*f5c631daSSadaf Ebrahimi             const ZRegister& zt4,
5009*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
5010*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
5011*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5012*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5013*f5c631daSSadaf Ebrahimi     ld4h(zt1, zt2, zt3, zt4, pg, addr);
5014*f5c631daSSadaf Ebrahimi   }
Ld4w(const ZRegister & zt1,const ZRegister & zt2,const ZRegister & zt3,const ZRegister & zt4,const PRegisterZ & pg,const SVEMemOperand & addr)5015*f5c631daSSadaf Ebrahimi   void Ld4w(const ZRegister& zt1,
5016*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
5017*f5c631daSSadaf Ebrahimi             const ZRegister& zt3,
5018*f5c631daSSadaf Ebrahimi             const ZRegister& zt4,
5019*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
5020*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
5021*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5022*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5023*f5c631daSSadaf Ebrahimi     ld4w(zt1, zt2, zt3, zt4, pg, addr);
5024*f5c631daSSadaf Ebrahimi   }
Ld4d(const ZRegister & zt1,const ZRegister & zt2,const ZRegister & zt3,const ZRegister & zt4,const PRegisterZ & pg,const SVEMemOperand & addr)5025*f5c631daSSadaf Ebrahimi   void Ld4d(const ZRegister& zt1,
5026*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
5027*f5c631daSSadaf Ebrahimi             const ZRegister& zt3,
5028*f5c631daSSadaf Ebrahimi             const ZRegister& zt4,
5029*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
5030*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
5031*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5032*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5033*f5c631daSSadaf Ebrahimi     ld4d(zt1, zt2, zt3, zt4, pg, addr);
5034*f5c631daSSadaf Ebrahimi   }
5035*f5c631daSSadaf Ebrahimi   void Ldff1b(const ZRegister& zt,
5036*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5037*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
5038*f5c631daSSadaf Ebrahimi   void Ldff1h(const ZRegister& zt,
5039*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5040*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
5041*f5c631daSSadaf Ebrahimi   void Ldff1w(const ZRegister& zt,
5042*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5043*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
5044*f5c631daSSadaf Ebrahimi   void Ldff1d(const ZRegister& zt,
5045*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5046*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
5047*f5c631daSSadaf Ebrahimi   void Ldff1sb(const ZRegister& zt,
5048*f5c631daSSadaf Ebrahimi                const PRegisterZ& pg,
5049*f5c631daSSadaf Ebrahimi                const SVEMemOperand& addr);
5050*f5c631daSSadaf Ebrahimi   void Ldff1sh(const ZRegister& zt,
5051*f5c631daSSadaf Ebrahimi                const PRegisterZ& pg,
5052*f5c631daSSadaf Ebrahimi                const SVEMemOperand& addr);
5053*f5c631daSSadaf Ebrahimi   void Ldff1sw(const ZRegister& zt,
5054*f5c631daSSadaf Ebrahimi                const PRegisterZ& pg,
5055*f5c631daSSadaf Ebrahimi                const SVEMemOperand& addr);
Ldff1b(const ZRegister & zt,const PRegisterZ & pg,const Register & xn,const ZRegister & zm)5056*f5c631daSSadaf Ebrahimi   void Ldff1b(const ZRegister& zt,
5057*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5058*f5c631daSSadaf Ebrahimi               const Register& xn,
5059*f5c631daSSadaf Ebrahimi               const ZRegister& zm) {
5060*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5061*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5062*f5c631daSSadaf Ebrahimi     ldff1b(zt, pg, xn, zm);
5063*f5c631daSSadaf Ebrahimi   }
Ldff1b(const ZRegister & zt,const PRegisterZ & pg,const ZRegister & zn,int imm5)5064*f5c631daSSadaf Ebrahimi   void Ldff1b(const ZRegister& zt,
5065*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5066*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
5067*f5c631daSSadaf Ebrahimi               int imm5) {
5068*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5069*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5070*f5c631daSSadaf Ebrahimi     ldff1b(zt, pg, zn, imm5);
5071*f5c631daSSadaf Ebrahimi   }
Ldff1d(const ZRegister & zt,const PRegisterZ & pg,const Register & xn,const ZRegister & zm)5072*f5c631daSSadaf Ebrahimi   void Ldff1d(const ZRegister& zt,
5073*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5074*f5c631daSSadaf Ebrahimi               const Register& xn,
5075*f5c631daSSadaf Ebrahimi               const ZRegister& zm) {
5076*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5077*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5078*f5c631daSSadaf Ebrahimi     ldff1d(zt, pg, xn, zm);
5079*f5c631daSSadaf Ebrahimi   }
Ldff1d(const ZRegister & zt,const PRegisterZ & pg,const ZRegister & zn,int imm5)5080*f5c631daSSadaf Ebrahimi   void Ldff1d(const ZRegister& zt,
5081*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5082*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
5083*f5c631daSSadaf Ebrahimi               int imm5) {
5084*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5085*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5086*f5c631daSSadaf Ebrahimi     ldff1d(zt, pg, zn, imm5);
5087*f5c631daSSadaf Ebrahimi   }
Ldff1h(const ZRegister & zt,const PRegisterZ & pg,const Register & xn,const ZRegister & zm)5088*f5c631daSSadaf Ebrahimi   void Ldff1h(const ZRegister& zt,
5089*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5090*f5c631daSSadaf Ebrahimi               const Register& xn,
5091*f5c631daSSadaf Ebrahimi               const ZRegister& zm) {
5092*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5093*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5094*f5c631daSSadaf Ebrahimi     ldff1h(zt, pg, xn, zm);
5095*f5c631daSSadaf Ebrahimi   }
Ldff1h(const ZRegister & zt,const PRegisterZ & pg,const ZRegister & zn,int imm5)5096*f5c631daSSadaf Ebrahimi   void Ldff1h(const ZRegister& zt,
5097*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5098*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
5099*f5c631daSSadaf Ebrahimi               int imm5) {
5100*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5101*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5102*f5c631daSSadaf Ebrahimi     ldff1h(zt, pg, zn, imm5);
5103*f5c631daSSadaf Ebrahimi   }
Ldff1sb(const ZRegister & zt,const PRegisterZ & pg,const Register & xn,const ZRegister & zm)5104*f5c631daSSadaf Ebrahimi   void Ldff1sb(const ZRegister& zt,
5105*f5c631daSSadaf Ebrahimi                const PRegisterZ& pg,
5106*f5c631daSSadaf Ebrahimi                const Register& xn,
5107*f5c631daSSadaf Ebrahimi                const ZRegister& zm) {
5108*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5109*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5110*f5c631daSSadaf Ebrahimi     ldff1sb(zt, pg, xn, zm);
5111*f5c631daSSadaf Ebrahimi   }
Ldff1sb(const ZRegister & zt,const PRegisterZ & pg,const ZRegister & zn,int imm5)5112*f5c631daSSadaf Ebrahimi   void Ldff1sb(const ZRegister& zt,
5113*f5c631daSSadaf Ebrahimi                const PRegisterZ& pg,
5114*f5c631daSSadaf Ebrahimi                const ZRegister& zn,
5115*f5c631daSSadaf Ebrahimi                int imm5) {
5116*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5117*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5118*f5c631daSSadaf Ebrahimi     ldff1sb(zt, pg, zn, imm5);
5119*f5c631daSSadaf Ebrahimi   }
Ldff1sh(const ZRegister & zt,const PRegisterZ & pg,const Register & xn,const ZRegister & zm)5120*f5c631daSSadaf Ebrahimi   void Ldff1sh(const ZRegister& zt,
5121*f5c631daSSadaf Ebrahimi                const PRegisterZ& pg,
5122*f5c631daSSadaf Ebrahimi                const Register& xn,
5123*f5c631daSSadaf Ebrahimi                const ZRegister& zm) {
5124*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5125*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5126*f5c631daSSadaf Ebrahimi     ldff1sh(zt, pg, xn, zm);
5127*f5c631daSSadaf Ebrahimi   }
Ldff1sh(const ZRegister & zt,const PRegisterZ & pg,const ZRegister & zn,int imm5)5128*f5c631daSSadaf Ebrahimi   void Ldff1sh(const ZRegister& zt,
5129*f5c631daSSadaf Ebrahimi                const PRegisterZ& pg,
5130*f5c631daSSadaf Ebrahimi                const ZRegister& zn,
5131*f5c631daSSadaf Ebrahimi                int imm5) {
5132*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5133*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5134*f5c631daSSadaf Ebrahimi     ldff1sh(zt, pg, zn, imm5);
5135*f5c631daSSadaf Ebrahimi   }
Ldff1sw(const ZRegister & zt,const PRegisterZ & pg,const Register & xn,const ZRegister & zm)5136*f5c631daSSadaf Ebrahimi   void Ldff1sw(const ZRegister& zt,
5137*f5c631daSSadaf Ebrahimi                const PRegisterZ& pg,
5138*f5c631daSSadaf Ebrahimi                const Register& xn,
5139*f5c631daSSadaf Ebrahimi                const ZRegister& zm) {
5140*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5141*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5142*f5c631daSSadaf Ebrahimi     ldff1sw(zt, pg, xn, zm);
5143*f5c631daSSadaf Ebrahimi   }
Ldff1sw(const ZRegister & zt,const PRegisterZ & pg,const ZRegister & zn,int imm5)5144*f5c631daSSadaf Ebrahimi   void Ldff1sw(const ZRegister& zt,
5145*f5c631daSSadaf Ebrahimi                const PRegisterZ& pg,
5146*f5c631daSSadaf Ebrahimi                const ZRegister& zn,
5147*f5c631daSSadaf Ebrahimi                int imm5) {
5148*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5149*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5150*f5c631daSSadaf Ebrahimi     ldff1sw(zt, pg, zn, imm5);
5151*f5c631daSSadaf Ebrahimi   }
Ldff1w(const ZRegister & zt,const PRegisterZ & pg,const Register & xn,const ZRegister & zm)5152*f5c631daSSadaf Ebrahimi   void Ldff1w(const ZRegister& zt,
5153*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5154*f5c631daSSadaf Ebrahimi               const Register& xn,
5155*f5c631daSSadaf Ebrahimi               const ZRegister& zm) {
5156*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5157*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5158*f5c631daSSadaf Ebrahimi     ldff1w(zt, pg, xn, zm);
5159*f5c631daSSadaf Ebrahimi   }
Ldff1w(const ZRegister & zt,const PRegisterZ & pg,const ZRegister & zn,int imm5)5160*f5c631daSSadaf Ebrahimi   void Ldff1w(const ZRegister& zt,
5161*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5162*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
5163*f5c631daSSadaf Ebrahimi               int imm5) {
5164*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5165*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5166*f5c631daSSadaf Ebrahimi     ldff1w(zt, pg, zn, imm5);
5167*f5c631daSSadaf Ebrahimi   }
Ldnf1b(const ZRegister & zt,const PRegisterZ & pg,const SVEMemOperand & addr)5168*f5c631daSSadaf Ebrahimi   void Ldnf1b(const ZRegister& zt,
5169*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5170*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr) {
5171*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5172*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5173*f5c631daSSadaf Ebrahimi     ldnf1b(zt, pg, addr);
5174*f5c631daSSadaf Ebrahimi   }
Ldnf1d(const ZRegister & zt,const PRegisterZ & pg,const SVEMemOperand & addr)5175*f5c631daSSadaf Ebrahimi   void Ldnf1d(const ZRegister& zt,
5176*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5177*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr) {
5178*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5179*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5180*f5c631daSSadaf Ebrahimi     ldnf1d(zt, pg, addr);
5181*f5c631daSSadaf Ebrahimi   }
Ldnf1h(const ZRegister & zt,const PRegisterZ & pg,const SVEMemOperand & addr)5182*f5c631daSSadaf Ebrahimi   void Ldnf1h(const ZRegister& zt,
5183*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5184*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr) {
5185*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5186*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5187*f5c631daSSadaf Ebrahimi     ldnf1h(zt, pg, addr);
5188*f5c631daSSadaf Ebrahimi   }
Ldnf1sb(const ZRegister & zt,const PRegisterZ & pg,const SVEMemOperand & addr)5189*f5c631daSSadaf Ebrahimi   void Ldnf1sb(const ZRegister& zt,
5190*f5c631daSSadaf Ebrahimi                const PRegisterZ& pg,
5191*f5c631daSSadaf Ebrahimi                const SVEMemOperand& addr) {
5192*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5193*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5194*f5c631daSSadaf Ebrahimi     ldnf1sb(zt, pg, addr);
5195*f5c631daSSadaf Ebrahimi   }
Ldnf1sh(const ZRegister & zt,const PRegisterZ & pg,const SVEMemOperand & addr)5196*f5c631daSSadaf Ebrahimi   void Ldnf1sh(const ZRegister& zt,
5197*f5c631daSSadaf Ebrahimi                const PRegisterZ& pg,
5198*f5c631daSSadaf Ebrahimi                const SVEMemOperand& addr) {
5199*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5200*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5201*f5c631daSSadaf Ebrahimi     ldnf1sh(zt, pg, addr);
5202*f5c631daSSadaf Ebrahimi   }
Ldnf1sw(const ZRegister & zt,const PRegisterZ & pg,const SVEMemOperand & addr)5203*f5c631daSSadaf Ebrahimi   void Ldnf1sw(const ZRegister& zt,
5204*f5c631daSSadaf Ebrahimi                const PRegisterZ& pg,
5205*f5c631daSSadaf Ebrahimi                const SVEMemOperand& addr) {
5206*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5207*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5208*f5c631daSSadaf Ebrahimi     ldnf1sw(zt, pg, addr);
5209*f5c631daSSadaf Ebrahimi   }
Ldnf1w(const ZRegister & zt,const PRegisterZ & pg,const SVEMemOperand & addr)5210*f5c631daSSadaf Ebrahimi   void Ldnf1w(const ZRegister& zt,
5211*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5212*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr) {
5213*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5214*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5215*f5c631daSSadaf Ebrahimi     ldnf1w(zt, pg, addr);
5216*f5c631daSSadaf Ebrahimi   }
5217*f5c631daSSadaf Ebrahimi   void Ldnt1b(const ZRegister& zt,
5218*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5219*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
5220*f5c631daSSadaf Ebrahimi   void Ldnt1d(const ZRegister& zt,
5221*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5222*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
5223*f5c631daSSadaf Ebrahimi   void Ldnt1h(const ZRegister& zt,
5224*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5225*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
5226*f5c631daSSadaf Ebrahimi   void Ldnt1w(const ZRegister& zt,
5227*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
5228*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
Ldr(const CPURegister & rt,const SVEMemOperand & addr)5229*f5c631daSSadaf Ebrahimi   void Ldr(const CPURegister& rt, const SVEMemOperand& addr) {
5230*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5231*f5c631daSSadaf Ebrahimi     SVELoadStoreScalarImmHelper(rt, addr, &MacroAssembler::ldr);
5232*f5c631daSSadaf Ebrahimi   }
Lsl(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn,int shift)5233*f5c631daSSadaf Ebrahimi   void Lsl(const ZRegister& zd,
5234*f5c631daSSadaf Ebrahimi            const PRegisterM& pg,
5235*f5c631daSSadaf Ebrahimi            const ZRegister& zn,
5236*f5c631daSSadaf Ebrahimi            int shift) {
5237*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5238*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
5239*f5c631daSSadaf Ebrahimi     lsl(zd, pg, zd, shift);
5240*f5c631daSSadaf Ebrahimi   }
5241*f5c631daSSadaf Ebrahimi   void Lsl(const ZRegister& zd,
5242*f5c631daSSadaf Ebrahimi            const PRegisterM& pg,
5243*f5c631daSSadaf Ebrahimi            const ZRegister& zn,
5244*f5c631daSSadaf Ebrahimi            const ZRegister& zm);
Lsl(const ZRegister & zd,const ZRegister & zn,int shift)5245*f5c631daSSadaf Ebrahimi   void Lsl(const ZRegister& zd, const ZRegister& zn, int shift) {
5246*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5247*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5248*f5c631daSSadaf Ebrahimi     lsl(zd, zn, shift);
5249*f5c631daSSadaf Ebrahimi   }
Lsl(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)5250*f5c631daSSadaf Ebrahimi   void Lsl(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
5251*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5252*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5253*f5c631daSSadaf Ebrahimi     lsl(zd, zn, zm);
5254*f5c631daSSadaf Ebrahimi   }
Lsr(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn,int shift)5255*f5c631daSSadaf Ebrahimi   void Lsr(const ZRegister& zd,
5256*f5c631daSSadaf Ebrahimi            const PRegisterM& pg,
5257*f5c631daSSadaf Ebrahimi            const ZRegister& zn,
5258*f5c631daSSadaf Ebrahimi            int shift) {
5259*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5260*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
5261*f5c631daSSadaf Ebrahimi     lsr(zd, pg, zd, shift);
5262*f5c631daSSadaf Ebrahimi   }
5263*f5c631daSSadaf Ebrahimi   void Lsr(const ZRegister& zd,
5264*f5c631daSSadaf Ebrahimi            const PRegisterM& pg,
5265*f5c631daSSadaf Ebrahimi            const ZRegister& zn,
5266*f5c631daSSadaf Ebrahimi            const ZRegister& zm);
Lsr(const ZRegister & zd,const ZRegister & zn,int shift)5267*f5c631daSSadaf Ebrahimi   void Lsr(const ZRegister& zd, const ZRegister& zn, int shift) {
5268*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5269*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5270*f5c631daSSadaf Ebrahimi     lsr(zd, zn, shift);
5271*f5c631daSSadaf Ebrahimi   }
Lsr(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)5272*f5c631daSSadaf Ebrahimi   void Lsr(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
5273*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5274*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5275*f5c631daSSadaf Ebrahimi     lsr(zd, zn, zm);
5276*f5c631daSSadaf Ebrahimi   }
Mov(const PRegister & pd,const PRegister & pn)5277*f5c631daSSadaf Ebrahimi   void Mov(const PRegister& pd, const PRegister& pn) {
5278*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5279*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5280*f5c631daSSadaf Ebrahimi     mov(pd.VnB(), pn.VnB());
5281*f5c631daSSadaf Ebrahimi   }
Mov(const PRegisterWithLaneSize & pd,const PRegisterM & pg,const PRegisterWithLaneSize & pn)5282*f5c631daSSadaf Ebrahimi   void Mov(const PRegisterWithLaneSize& pd,
5283*f5c631daSSadaf Ebrahimi            const PRegisterM& pg,
5284*f5c631daSSadaf Ebrahimi            const PRegisterWithLaneSize& pn) {
5285*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5286*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5287*f5c631daSSadaf Ebrahimi     mov(pd, pg, pn);
5288*f5c631daSSadaf Ebrahimi   }
Mov(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn)5289*f5c631daSSadaf Ebrahimi   void Mov(const PRegisterWithLaneSize& pd,
5290*f5c631daSSadaf Ebrahimi            const PRegisterZ& pg,
5291*f5c631daSSadaf Ebrahimi            const PRegisterWithLaneSize& pn) {
5292*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5293*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5294*f5c631daSSadaf Ebrahimi     mov(pd, pg, pn);
5295*f5c631daSSadaf Ebrahimi   }
Mov(const ZRegister & zd,const Register & xn)5296*f5c631daSSadaf Ebrahimi   void Mov(const ZRegister& zd, const Register& xn) {
5297*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5298*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5299*f5c631daSSadaf Ebrahimi     mov(zd, xn);
5300*f5c631daSSadaf Ebrahimi   }
5301*f5c631daSSadaf Ebrahimi 
Mov(const ZRegister & zd,const VRegister & vn)5302*f5c631daSSadaf Ebrahimi   void Mov(const ZRegister& zd, const VRegister& vn) {
5303*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5304*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5305*f5c631daSSadaf Ebrahimi     mov(zd, vn);
5306*f5c631daSSadaf Ebrahimi   }
5307*f5c631daSSadaf Ebrahimi 
Mov(const ZRegister & zd,const ZRegister & zn)5308*f5c631daSSadaf Ebrahimi   void Mov(const ZRegister& zd, const ZRegister& zn) {
5309*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5310*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5311*f5c631daSSadaf Ebrahimi     mov(zd, zn);
5312*f5c631daSSadaf Ebrahimi   }
Mov(const ZRegister & zd,const ZRegister & zn,unsigned index)5313*f5c631daSSadaf Ebrahimi   void Mov(const ZRegister& zd, const ZRegister& zn, unsigned index) {
5314*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5315*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5316*f5c631daSSadaf Ebrahimi     mov(zd, zn, index);
5317*f5c631daSSadaf Ebrahimi   }
Mov(const ZRegister & zd,const PRegister & pg,IntegerOperand imm)5318*f5c631daSSadaf Ebrahimi   void Mov(const ZRegister& zd, const PRegister& pg, IntegerOperand imm) {
5319*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5320*f5c631daSSadaf Ebrahimi     Cpy(zd, pg, imm);
5321*f5c631daSSadaf Ebrahimi   }
5322*f5c631daSSadaf Ebrahimi   // TODO: support zeroing predicated moves using movprfx.
Mov(const ZRegister & zd,const PRegisterM & pg,const Register & rn)5323*f5c631daSSadaf Ebrahimi   void Mov(const ZRegister& zd, const PRegisterM& pg, const Register& rn) {
5324*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5325*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5326*f5c631daSSadaf Ebrahimi     mov(zd, pg, rn);
5327*f5c631daSSadaf Ebrahimi   }
Mov(const ZRegister & zd,const PRegisterM & pg,const VRegister & vn)5328*f5c631daSSadaf Ebrahimi   void Mov(const ZRegister& zd, const PRegisterM& pg, const VRegister& vn) {
5329*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5330*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5331*f5c631daSSadaf Ebrahimi     mov(zd, pg, vn);
5332*f5c631daSSadaf Ebrahimi   }
Mov(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)5333*f5c631daSSadaf Ebrahimi   void Mov(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
5334*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5335*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5336*f5c631daSSadaf Ebrahimi     mov(zd, pg, zn);
5337*f5c631daSSadaf Ebrahimi   }
Mov(const ZRegister & zd,IntegerOperand imm)5338*f5c631daSSadaf Ebrahimi   void Mov(const ZRegister& zd, IntegerOperand imm) {
5339*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5340*f5c631daSSadaf Ebrahimi     Dup(zd, imm);
5341*f5c631daSSadaf Ebrahimi   }
Movs(const PRegister & pd,const PRegister & pn)5342*f5c631daSSadaf Ebrahimi   void Movs(const PRegister& pd, const PRegister& pn) {
5343*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5344*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5345*f5c631daSSadaf Ebrahimi     movs(pd, pn);
5346*f5c631daSSadaf Ebrahimi   }
Movs(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn)5347*f5c631daSSadaf Ebrahimi   void Movs(const PRegisterWithLaneSize& pd,
5348*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
5349*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn) {
5350*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5351*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5352*f5c631daSSadaf Ebrahimi     movs(pd, pg, pn);
5353*f5c631daSSadaf Ebrahimi   }
5354*f5c631daSSadaf Ebrahimi   // zd = za + (zn * zm)
5355*f5c631daSSadaf Ebrahimi   void Mla(const ZRegister& zd,
5356*f5c631daSSadaf Ebrahimi            const PRegisterM& pg,
5357*f5c631daSSadaf Ebrahimi            const ZRegister& za,
5358*f5c631daSSadaf Ebrahimi            const ZRegister& zn,
5359*f5c631daSSadaf Ebrahimi            const ZRegister& zm);
5360*f5c631daSSadaf Ebrahimi   // zd = za - (zn * zm)
5361*f5c631daSSadaf Ebrahimi   void Mls(const ZRegister& zd,
5362*f5c631daSSadaf Ebrahimi            const PRegisterM& pg,
5363*f5c631daSSadaf Ebrahimi            const ZRegister& za,
5364*f5c631daSSadaf Ebrahimi            const ZRegister& zn,
5365*f5c631daSSadaf Ebrahimi            const ZRegister& zm);
5366*f5c631daSSadaf Ebrahimi   void Mul(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm);
Nand(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)5367*f5c631daSSadaf Ebrahimi   void Nand(const PRegisterWithLaneSize& pd,
5368*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
5369*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn,
5370*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pm) {
5371*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5372*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5373*f5c631daSSadaf Ebrahimi     nand(pd, pg, pn, pm);
5374*f5c631daSSadaf Ebrahimi   }
Nands(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)5375*f5c631daSSadaf Ebrahimi   void Nands(const PRegisterWithLaneSize& pd,
5376*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
5377*f5c631daSSadaf Ebrahimi              const PRegisterWithLaneSize& pn,
5378*f5c631daSSadaf Ebrahimi              const PRegisterWithLaneSize& pm) {
5379*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5380*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5381*f5c631daSSadaf Ebrahimi     nands(pd, pg, pn, pm);
5382*f5c631daSSadaf Ebrahimi   }
5383*f5c631daSSadaf Ebrahimi   // There is no instruction with this form, but we can implement it using
5384*f5c631daSSadaf Ebrahimi   // `subr`.
Neg(const ZRegister & zd,const ZRegister & zn)5385*f5c631daSSadaf Ebrahimi   void Neg(const ZRegister& zd, const ZRegister& zn) {
5386*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5387*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, zn);
5388*f5c631daSSadaf Ebrahimi     subr(zd, zd, 0);
5389*f5c631daSSadaf Ebrahimi   }
Neg(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)5390*f5c631daSSadaf Ebrahimi   void Neg(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
5391*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5392*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5393*f5c631daSSadaf Ebrahimi     neg(zd, pg, zn);
5394*f5c631daSSadaf Ebrahimi   }
Nor(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)5395*f5c631daSSadaf Ebrahimi   void Nor(const PRegisterWithLaneSize& pd,
5396*f5c631daSSadaf Ebrahimi            const PRegisterZ& pg,
5397*f5c631daSSadaf Ebrahimi            const PRegisterWithLaneSize& pn,
5398*f5c631daSSadaf Ebrahimi            const PRegisterWithLaneSize& pm) {
5399*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5400*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5401*f5c631daSSadaf Ebrahimi     nor(pd, pg, pn, pm);
5402*f5c631daSSadaf Ebrahimi   }
Nors(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)5403*f5c631daSSadaf Ebrahimi   void Nors(const PRegisterWithLaneSize& pd,
5404*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
5405*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn,
5406*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pm) {
5407*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5408*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5409*f5c631daSSadaf Ebrahimi     nors(pd, pg, pn, pm);
5410*f5c631daSSadaf Ebrahimi   }
Not(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn)5411*f5c631daSSadaf Ebrahimi   void Not(const PRegisterWithLaneSize& pd,
5412*f5c631daSSadaf Ebrahimi            const PRegisterZ& pg,
5413*f5c631daSSadaf Ebrahimi            const PRegisterWithLaneSize& pn) {
5414*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5415*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5416*f5c631daSSadaf Ebrahimi     not_(pd, pg, pn);
5417*f5c631daSSadaf Ebrahimi   }
Not(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)5418*f5c631daSSadaf Ebrahimi   void Not(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
5419*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5420*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5421*f5c631daSSadaf Ebrahimi     not_(zd, pg, zn);
5422*f5c631daSSadaf Ebrahimi   }
Nots(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn)5423*f5c631daSSadaf Ebrahimi   void Nots(const PRegisterWithLaneSize& pd,
5424*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
5425*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn) {
5426*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5427*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5428*f5c631daSSadaf Ebrahimi     nots(pd, pg, pn);
5429*f5c631daSSadaf Ebrahimi   }
Orn(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)5430*f5c631daSSadaf Ebrahimi   void Orn(const PRegisterWithLaneSize& pd,
5431*f5c631daSSadaf Ebrahimi            const PRegisterZ& pg,
5432*f5c631daSSadaf Ebrahimi            const PRegisterWithLaneSize& pn,
5433*f5c631daSSadaf Ebrahimi            const PRegisterWithLaneSize& pm) {
5434*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5435*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5436*f5c631daSSadaf Ebrahimi     orn(pd, pg, pn, pm);
5437*f5c631daSSadaf Ebrahimi   }
Orn(const ZRegister & zd,const ZRegister & zn,uint64_t imm)5438*f5c631daSSadaf Ebrahimi   void Orn(const ZRegister& zd, const ZRegister& zn, uint64_t imm) {
5439*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5440*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5441*f5c631daSSadaf Ebrahimi     if (IsImmLogical(imm, zd.GetLaneSizeInBits())) {
5442*f5c631daSSadaf Ebrahimi       orn(zd, zn, imm);
5443*f5c631daSSadaf Ebrahimi     } else {
5444*f5c631daSSadaf Ebrahimi       // TODO: Synthesise the immediate once 'Mov' is implemented.
5445*f5c631daSSadaf Ebrahimi       VIXL_UNIMPLEMENTED();
5446*f5c631daSSadaf Ebrahimi     }
5447*f5c631daSSadaf Ebrahimi   }
Orns(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)5448*f5c631daSSadaf Ebrahimi   void Orns(const PRegisterWithLaneSize& pd,
5449*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
5450*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn,
5451*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pm) {
5452*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5453*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5454*f5c631daSSadaf Ebrahimi     orns(pd, pg, pn, pm);
5455*f5c631daSSadaf Ebrahimi   }
Orr(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)5456*f5c631daSSadaf Ebrahimi   void Orr(const PRegisterWithLaneSize& pd,
5457*f5c631daSSadaf Ebrahimi            const PRegisterZ& pg,
5458*f5c631daSSadaf Ebrahimi            const PRegisterWithLaneSize& pn,
5459*f5c631daSSadaf Ebrahimi            const PRegisterWithLaneSize& pm) {
5460*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5461*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5462*f5c631daSSadaf Ebrahimi     orr(pd, pg, pn, pm);
5463*f5c631daSSadaf Ebrahimi   }
Orr(const ZRegister & zd,const ZRegister & zn,uint64_t imm)5464*f5c631daSSadaf Ebrahimi   void Orr(const ZRegister& zd, const ZRegister& zn, uint64_t imm) {
5465*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5466*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5467*f5c631daSSadaf Ebrahimi     if (IsImmLogical(imm, zd.GetLaneSizeInBits())) {
5468*f5c631daSSadaf Ebrahimi       orr(zd, zn, imm);
5469*f5c631daSSadaf Ebrahimi     } else {
5470*f5c631daSSadaf Ebrahimi       // TODO: Synthesise the immediate once 'Mov' is implemented.
5471*f5c631daSSadaf Ebrahimi       VIXL_UNIMPLEMENTED();
5472*f5c631daSSadaf Ebrahimi     }
5473*f5c631daSSadaf Ebrahimi   }
Orr(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)5474*f5c631daSSadaf Ebrahimi   void Orr(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
5475*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5476*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(AreSameLaneSize(zd, zn, zm));
5477*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5478*f5c631daSSadaf Ebrahimi     orr(zd.VnD(), zn.VnD(), zm.VnD());
5479*f5c631daSSadaf Ebrahimi   }
Orrs(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)5480*f5c631daSSadaf Ebrahimi   void Orrs(const PRegisterWithLaneSize& pd,
5481*f5c631daSSadaf Ebrahimi             const PRegisterZ& pg,
5482*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn,
5483*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pm) {
5484*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5485*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5486*f5c631daSSadaf Ebrahimi     orrs(pd, pg, pn, pm);
5487*f5c631daSSadaf Ebrahimi   }
Orv(const VRegister & vd,const PRegister & pg,const ZRegister & zn)5488*f5c631daSSadaf Ebrahimi   void Orv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) {
5489*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5490*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5491*f5c631daSSadaf Ebrahimi     orv(vd, pg, zn);
5492*f5c631daSSadaf Ebrahimi   }
Pfalse(const PRegister & pd)5493*f5c631daSSadaf Ebrahimi   void Pfalse(const PRegister& pd) {
5494*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5495*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(pd.IsUnqualified());
5496*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5497*f5c631daSSadaf Ebrahimi     // No matter what the lane size is, overall this operation just writes zeros
5498*f5c631daSSadaf Ebrahimi     // throughout the register.
5499*f5c631daSSadaf Ebrahimi     pfalse(pd.VnB());
5500*f5c631daSSadaf Ebrahimi   }
5501*f5c631daSSadaf Ebrahimi   void Pfirst(const PRegisterWithLaneSize& pd,
5502*f5c631daSSadaf Ebrahimi               const PRegister& pg,
5503*f5c631daSSadaf Ebrahimi               const PRegisterWithLaneSize& pn);
5504*f5c631daSSadaf Ebrahimi   void Pnext(const PRegisterWithLaneSize& pd,
5505*f5c631daSSadaf Ebrahimi              const PRegister& pg,
5506*f5c631daSSadaf Ebrahimi              const PRegisterWithLaneSize& pn);
Prfb(PrefetchOperation prfop,const PRegister & pg,const SVEMemOperand addr)5507*f5c631daSSadaf Ebrahimi   void Prfb(PrefetchOperation prfop,
5508*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5509*f5c631daSSadaf Ebrahimi             const SVEMemOperand addr) {
5510*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5511*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5512*f5c631daSSadaf Ebrahimi     prfb(prfop, pg, addr);
5513*f5c631daSSadaf Ebrahimi   }
Prfh(PrefetchOperation prfop,const PRegister & pg,const SVEMemOperand addr)5514*f5c631daSSadaf Ebrahimi   void Prfh(PrefetchOperation prfop,
5515*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5516*f5c631daSSadaf Ebrahimi             const SVEMemOperand addr) {
5517*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5518*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5519*f5c631daSSadaf Ebrahimi     prfh(prfop, pg, addr);
5520*f5c631daSSadaf Ebrahimi   }
Prfw(PrefetchOperation prfop,const PRegister & pg,const SVEMemOperand addr)5521*f5c631daSSadaf Ebrahimi   void Prfw(PrefetchOperation prfop,
5522*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5523*f5c631daSSadaf Ebrahimi             const SVEMemOperand addr) {
5524*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5525*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5526*f5c631daSSadaf Ebrahimi     prfw(prfop, pg, addr);
5527*f5c631daSSadaf Ebrahimi   }
Prfd(PrefetchOperation prfop,const PRegister & pg,const SVEMemOperand addr)5528*f5c631daSSadaf Ebrahimi   void Prfd(PrefetchOperation prfop,
5529*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5530*f5c631daSSadaf Ebrahimi             const SVEMemOperand addr) {
5531*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5532*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5533*f5c631daSSadaf Ebrahimi     prfd(prfop, pg, addr);
5534*f5c631daSSadaf Ebrahimi   }
Ptest(const PRegister & pg,const PRegisterWithLaneSize & pn)5535*f5c631daSSadaf Ebrahimi   void Ptest(const PRegister& pg, const PRegisterWithLaneSize& pn) {
5536*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5537*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5538*f5c631daSSadaf Ebrahimi     ptest(pg, pn);
5539*f5c631daSSadaf Ebrahimi   }
5540*f5c631daSSadaf Ebrahimi   void Ptrue(const PRegisterWithLaneSize& pd,
5541*f5c631daSSadaf Ebrahimi              SVEPredicateConstraint pattern,
5542*f5c631daSSadaf Ebrahimi              FlagsUpdate s);
5543*f5c631daSSadaf Ebrahimi   void Ptrue(const PRegisterWithLaneSize& pd,
5544*f5c631daSSadaf Ebrahimi              SVEPredicateConstraint pattern = SVE_ALL) {
5545*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5546*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5547*f5c631daSSadaf Ebrahimi     ptrue(pd, pattern);
5548*f5c631daSSadaf Ebrahimi   }
5549*f5c631daSSadaf Ebrahimi   void Ptrues(const PRegisterWithLaneSize& pd,
5550*f5c631daSSadaf Ebrahimi               SVEPredicateConstraint pattern = SVE_ALL) {
5551*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5552*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5553*f5c631daSSadaf Ebrahimi     ptrues(pd, pattern);
5554*f5c631daSSadaf Ebrahimi   }
Punpkhi(const PRegisterWithLaneSize & pd,const PRegisterWithLaneSize & pn)5555*f5c631daSSadaf Ebrahimi   void Punpkhi(const PRegisterWithLaneSize& pd,
5556*f5c631daSSadaf Ebrahimi                const PRegisterWithLaneSize& pn) {
5557*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5558*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5559*f5c631daSSadaf Ebrahimi     punpkhi(pd, pn);
5560*f5c631daSSadaf Ebrahimi   }
Punpklo(const PRegisterWithLaneSize & pd,const PRegisterWithLaneSize & pn)5561*f5c631daSSadaf Ebrahimi   void Punpklo(const PRegisterWithLaneSize& pd,
5562*f5c631daSSadaf Ebrahimi                const PRegisterWithLaneSize& pn) {
5563*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5564*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5565*f5c631daSSadaf Ebrahimi     punpklo(pd, pn);
5566*f5c631daSSadaf Ebrahimi   }
Rbit(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)5567*f5c631daSSadaf Ebrahimi   void Rbit(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
5568*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5569*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5570*f5c631daSSadaf Ebrahimi     rbit(zd, pg, zn);
5571*f5c631daSSadaf Ebrahimi   }
Rdffr(const PRegister & pd)5572*f5c631daSSadaf Ebrahimi   void Rdffr(const PRegister& pd) {
5573*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5574*f5c631daSSadaf Ebrahimi     // Although this is essentially just a move, it writes every bit and so can
5575*f5c631daSSadaf Ebrahimi     // only support b-sized lane because other lane sizes would simplicity clear
5576*f5c631daSSadaf Ebrahimi     // bits in `pd`.
5577*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!pd.HasLaneSize() || pd.IsLaneSizeB());
5578*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(pd.IsUnqualified());
5579*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5580*f5c631daSSadaf Ebrahimi     rdffr(pd.VnB());
5581*f5c631daSSadaf Ebrahimi   }
Rdffr(const PRegisterWithLaneSize & pd,const PRegisterZ & pg)5582*f5c631daSSadaf Ebrahimi   void Rdffr(const PRegisterWithLaneSize& pd, const PRegisterZ& pg) {
5583*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5584*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5585*f5c631daSSadaf Ebrahimi     rdffr(pd, pg);
5586*f5c631daSSadaf Ebrahimi   }
Rdffrs(const PRegisterWithLaneSize & pd,const PRegisterZ & pg)5587*f5c631daSSadaf Ebrahimi   void Rdffrs(const PRegisterWithLaneSize& pd, const PRegisterZ& pg) {
5588*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5589*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5590*f5c631daSSadaf Ebrahimi     rdffrs(pd, pg);
5591*f5c631daSSadaf Ebrahimi   }
5592*f5c631daSSadaf Ebrahimi   // Note that there is no `rdpl` instruction, but this macro emulates it (for
5593*f5c631daSSadaf Ebrahimi   // symmetry with `Rdvl`).
Rdpl(const Register & xd,int64_t multiplier)5594*f5c631daSSadaf Ebrahimi   void Rdpl(const Register& xd, int64_t multiplier) {
5595*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5596*f5c631daSSadaf Ebrahimi     Addpl(xd, xzr, multiplier);
5597*f5c631daSSadaf Ebrahimi   }
Rdvl(const Register & xd,int64_t multiplier)5598*f5c631daSSadaf Ebrahimi   void Rdvl(const Register& xd, int64_t multiplier) {
5599*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5600*f5c631daSSadaf Ebrahimi     Addvl(xd, xzr, multiplier);
5601*f5c631daSSadaf Ebrahimi   }
Rev(const PRegisterWithLaneSize & pd,const PRegisterWithLaneSize & pn)5602*f5c631daSSadaf Ebrahimi   void Rev(const PRegisterWithLaneSize& pd, const PRegisterWithLaneSize& pn) {
5603*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5604*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5605*f5c631daSSadaf Ebrahimi     rev(pd, pn);
5606*f5c631daSSadaf Ebrahimi   }
Rev(const ZRegister & zd,const ZRegister & zn)5607*f5c631daSSadaf Ebrahimi   void Rev(const ZRegister& zd, const ZRegister& zn) {
5608*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5609*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5610*f5c631daSSadaf Ebrahimi     rev(zd, zn);
5611*f5c631daSSadaf Ebrahimi   }
Revb(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)5612*f5c631daSSadaf Ebrahimi   void Revb(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
5613*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5614*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5615*f5c631daSSadaf Ebrahimi     revb(zd, pg, zn);
5616*f5c631daSSadaf Ebrahimi   }
Revh(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)5617*f5c631daSSadaf Ebrahimi   void Revh(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
5618*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5619*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5620*f5c631daSSadaf Ebrahimi     revh(zd, pg, zn);
5621*f5c631daSSadaf Ebrahimi   }
Revw(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)5622*f5c631daSSadaf Ebrahimi   void Revw(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
5623*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5624*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5625*f5c631daSSadaf Ebrahimi     revw(zd, pg, zn);
5626*f5c631daSSadaf Ebrahimi   }
Saddv(const VRegister & dd,const PRegister & pg,const ZRegister & zn)5627*f5c631daSSadaf Ebrahimi   void Saddv(const VRegister& dd, const PRegister& pg, const ZRegister& zn) {
5628*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5629*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5630*f5c631daSSadaf Ebrahimi     saddv(dd, pg, zn);
5631*f5c631daSSadaf Ebrahimi   }
Scvtf(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)5632*f5c631daSSadaf Ebrahimi   void Scvtf(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
5633*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5634*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5635*f5c631daSSadaf Ebrahimi     scvtf(zd, pg, zn);
5636*f5c631daSSadaf Ebrahimi   }
5637*f5c631daSSadaf Ebrahimi   void Sdiv(const ZRegister& zd,
5638*f5c631daSSadaf Ebrahimi             const PRegisterM& pg,
5639*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
5640*f5c631daSSadaf Ebrahimi             const ZRegister& zm);
5641*f5c631daSSadaf Ebrahimi   void Sdot(const ZRegister& zd,
5642*f5c631daSSadaf Ebrahimi             const ZRegister& za,
5643*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
5644*f5c631daSSadaf Ebrahimi             const ZRegister& zm);
5645*f5c631daSSadaf Ebrahimi   void Sdot(const ZRegister& zd,
5646*f5c631daSSadaf Ebrahimi             const ZRegister& za,
5647*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
5648*f5c631daSSadaf Ebrahimi             const ZRegister& zm,
5649*f5c631daSSadaf Ebrahimi             int index);
Sel(const PRegisterWithLaneSize & pd,const PRegister & pg,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)5650*f5c631daSSadaf Ebrahimi   void Sel(const PRegisterWithLaneSize& pd,
5651*f5c631daSSadaf Ebrahimi            const PRegister& pg,
5652*f5c631daSSadaf Ebrahimi            const PRegisterWithLaneSize& pn,
5653*f5c631daSSadaf Ebrahimi            const PRegisterWithLaneSize& pm) {
5654*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5655*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5656*f5c631daSSadaf Ebrahimi     sel(pd, pg, pn, pm);
5657*f5c631daSSadaf Ebrahimi   }
Sel(const ZRegister & zd,const PRegister & pg,const ZRegister & zn,const ZRegister & zm)5658*f5c631daSSadaf Ebrahimi   void Sel(const ZRegister& zd,
5659*f5c631daSSadaf Ebrahimi            const PRegister& pg,
5660*f5c631daSSadaf Ebrahimi            const ZRegister& zn,
5661*f5c631daSSadaf Ebrahimi            const ZRegister& zm) {
5662*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5663*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5664*f5c631daSSadaf Ebrahimi     sel(zd, pg, zn, zm);
5665*f5c631daSSadaf Ebrahimi   }
Setffr()5666*f5c631daSSadaf Ebrahimi   void Setffr() {
5667*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5668*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5669*f5c631daSSadaf Ebrahimi     setffr();
5670*f5c631daSSadaf Ebrahimi   }
5671*f5c631daSSadaf Ebrahimi   void Smax(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm);
Smaxv(const VRegister & vd,const PRegister & pg,const ZRegister & zn)5672*f5c631daSSadaf Ebrahimi   void Smaxv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) {
5673*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5674*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5675*f5c631daSSadaf Ebrahimi     smaxv(vd, pg, zn);
5676*f5c631daSSadaf Ebrahimi   }
5677*f5c631daSSadaf Ebrahimi   void Smin(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm);
Sminv(const VRegister & vd,const PRegister & pg,const ZRegister & zn)5678*f5c631daSSadaf Ebrahimi   void Sminv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) {
5679*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5680*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5681*f5c631daSSadaf Ebrahimi     sminv(vd, pg, zn);
5682*f5c631daSSadaf Ebrahimi   }
5683*f5c631daSSadaf Ebrahimi   void Splice(const ZRegister& zd,
5684*f5c631daSSadaf Ebrahimi               const PRegister& pg,
5685*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
5686*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
Sqadd(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)5687*f5c631daSSadaf Ebrahimi   void Sqadd(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
5688*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5689*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5690*f5c631daSSadaf Ebrahimi     sqadd(zd, zn, zm);
5691*f5c631daSSadaf Ebrahimi   }
Sqadd(const ZRegister & zd,const ZRegister & zn,IntegerOperand imm)5692*f5c631daSSadaf Ebrahimi   void Sqadd(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm) {
5693*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5694*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(imm.IsUint8() ||
5695*f5c631daSSadaf Ebrahimi                 (imm.IsUint16() && ((imm.AsUint16() & 0xff) == 0)));
5696*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, zn);
5697*f5c631daSSadaf Ebrahimi     sqadd(zd, zd, imm.AsUint16());
5698*f5c631daSSadaf Ebrahimi   }
5699*f5c631daSSadaf Ebrahimi   void Sqdecb(const Register& xd,
5700*f5c631daSSadaf Ebrahimi               const Register& wn,
5701*f5c631daSSadaf Ebrahimi               int pattern = SVE_ALL,
5702*f5c631daSSadaf Ebrahimi               int multiplier = 1) {
5703*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5704*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5705*f5c631daSSadaf Ebrahimi     sqdecb(xd, wn, pattern, multiplier);
5706*f5c631daSSadaf Ebrahimi   }
5707*f5c631daSSadaf Ebrahimi   void Sqdecb(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
5708*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5709*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5710*f5c631daSSadaf Ebrahimi     sqdecb(rdn, pattern, multiplier);
5711*f5c631daSSadaf Ebrahimi   }
5712*f5c631daSSadaf Ebrahimi   void Sqdecd(const Register& xd,
5713*f5c631daSSadaf Ebrahimi               const Register& wn,
5714*f5c631daSSadaf Ebrahimi               int pattern = SVE_ALL,
5715*f5c631daSSadaf Ebrahimi               int multiplier = 1) {
5716*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5717*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5718*f5c631daSSadaf Ebrahimi     sqdecd(xd, wn, pattern, multiplier);
5719*f5c631daSSadaf Ebrahimi   }
5720*f5c631daSSadaf Ebrahimi   void Sqdecd(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
5721*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5722*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5723*f5c631daSSadaf Ebrahimi     sqdecd(rdn, pattern, multiplier);
5724*f5c631daSSadaf Ebrahimi   }
5725*f5c631daSSadaf Ebrahimi   void Sqdecd(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) {
5726*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5727*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5728*f5c631daSSadaf Ebrahimi     sqdecd(zdn, pattern, multiplier);
5729*f5c631daSSadaf Ebrahimi   }
5730*f5c631daSSadaf Ebrahimi   void Sqdech(const Register& xd,
5731*f5c631daSSadaf Ebrahimi               const Register& wn,
5732*f5c631daSSadaf Ebrahimi               int pattern = SVE_ALL,
5733*f5c631daSSadaf Ebrahimi               int multiplier = 1) {
5734*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5735*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5736*f5c631daSSadaf Ebrahimi     sqdech(xd, wn, pattern, multiplier);
5737*f5c631daSSadaf Ebrahimi   }
5738*f5c631daSSadaf Ebrahimi   void Sqdech(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
5739*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5740*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5741*f5c631daSSadaf Ebrahimi     sqdech(rdn, pattern, multiplier);
5742*f5c631daSSadaf Ebrahimi   }
5743*f5c631daSSadaf Ebrahimi   void Sqdech(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) {
5744*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5745*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5746*f5c631daSSadaf Ebrahimi     sqdech(zdn, pattern, multiplier);
5747*f5c631daSSadaf Ebrahimi   }
Sqdecp(const Register & xdn,const PRegisterWithLaneSize & pg,const Register & wdn)5748*f5c631daSSadaf Ebrahimi   void Sqdecp(const Register& xdn,
5749*f5c631daSSadaf Ebrahimi               const PRegisterWithLaneSize& pg,
5750*f5c631daSSadaf Ebrahimi               const Register& wdn) {
5751*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5752*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5753*f5c631daSSadaf Ebrahimi     sqdecp(xdn, pg, wdn);
5754*f5c631daSSadaf Ebrahimi   }
Sqdecp(const Register & xdn,const PRegisterWithLaneSize & pg)5755*f5c631daSSadaf Ebrahimi   void Sqdecp(const Register& xdn, const PRegisterWithLaneSize& pg) {
5756*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5757*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5758*f5c631daSSadaf Ebrahimi     sqdecp(xdn, pg);
5759*f5c631daSSadaf Ebrahimi   }
Sqdecp(const ZRegister & zd,const PRegister & pg,const ZRegister & zn)5760*f5c631daSSadaf Ebrahimi   void Sqdecp(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) {
5761*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5762*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(AreSameFormat(zd, zn));
5763*f5c631daSSadaf Ebrahimi     // `sqdecp` writes every lane, so use an unpredicated movprfx.
5764*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, zn);
5765*f5c631daSSadaf Ebrahimi     sqdecp(zd, pg);
5766*f5c631daSSadaf Ebrahimi   }
Sqdecp(const ZRegister & zdn,const PRegister & pg)5767*f5c631daSSadaf Ebrahimi   void Sqdecp(const ZRegister& zdn, const PRegister& pg) {
5768*f5c631daSSadaf Ebrahimi     Sqdecp(zdn, pg, zdn);
5769*f5c631daSSadaf Ebrahimi   }
5770*f5c631daSSadaf Ebrahimi   void Sqdecw(const Register& xd,
5771*f5c631daSSadaf Ebrahimi               const Register& wn,
5772*f5c631daSSadaf Ebrahimi               int pattern = SVE_ALL,
5773*f5c631daSSadaf Ebrahimi               int multiplier = 1) {
5774*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5775*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5776*f5c631daSSadaf Ebrahimi     sqdecw(xd, wn, pattern, multiplier);
5777*f5c631daSSadaf Ebrahimi   }
5778*f5c631daSSadaf Ebrahimi   void Sqdecw(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
5779*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5780*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5781*f5c631daSSadaf Ebrahimi     sqdecw(rdn, pattern, multiplier);
5782*f5c631daSSadaf Ebrahimi   }
5783*f5c631daSSadaf Ebrahimi   void Sqdecw(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) {
5784*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5785*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5786*f5c631daSSadaf Ebrahimi     sqdecw(zdn, pattern, multiplier);
5787*f5c631daSSadaf Ebrahimi   }
5788*f5c631daSSadaf Ebrahimi   void Sqincb(const Register& xd,
5789*f5c631daSSadaf Ebrahimi               const Register& wn,
5790*f5c631daSSadaf Ebrahimi               int pattern = SVE_ALL,
5791*f5c631daSSadaf Ebrahimi               int multiplier = 1) {
5792*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5793*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5794*f5c631daSSadaf Ebrahimi     sqincb(xd, wn, pattern, multiplier);
5795*f5c631daSSadaf Ebrahimi   }
5796*f5c631daSSadaf Ebrahimi   void Sqincb(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
5797*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5798*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5799*f5c631daSSadaf Ebrahimi     sqincb(rdn, pattern, multiplier);
5800*f5c631daSSadaf Ebrahimi   }
5801*f5c631daSSadaf Ebrahimi   void Sqincd(const Register& xd,
5802*f5c631daSSadaf Ebrahimi               const Register& wn,
5803*f5c631daSSadaf Ebrahimi               int pattern = SVE_ALL,
5804*f5c631daSSadaf Ebrahimi               int multiplier = 1) {
5805*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5806*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5807*f5c631daSSadaf Ebrahimi     sqincd(xd, wn, pattern, multiplier);
5808*f5c631daSSadaf Ebrahimi   }
5809*f5c631daSSadaf Ebrahimi   void Sqincd(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
5810*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5811*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5812*f5c631daSSadaf Ebrahimi     sqincd(rdn, pattern, multiplier);
5813*f5c631daSSadaf Ebrahimi   }
5814*f5c631daSSadaf Ebrahimi   void Sqincd(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) {
5815*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5816*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5817*f5c631daSSadaf Ebrahimi     sqincd(zdn, pattern, multiplier);
5818*f5c631daSSadaf Ebrahimi   }
5819*f5c631daSSadaf Ebrahimi   void Sqinch(const Register& xd,
5820*f5c631daSSadaf Ebrahimi               const Register& wn,
5821*f5c631daSSadaf Ebrahimi               int pattern = SVE_ALL,
5822*f5c631daSSadaf Ebrahimi               int multiplier = 1) {
5823*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5824*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5825*f5c631daSSadaf Ebrahimi     sqinch(xd, wn, pattern, multiplier);
5826*f5c631daSSadaf Ebrahimi   }
5827*f5c631daSSadaf Ebrahimi   void Sqinch(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
5828*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5829*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5830*f5c631daSSadaf Ebrahimi     sqinch(rdn, pattern, multiplier);
5831*f5c631daSSadaf Ebrahimi   }
5832*f5c631daSSadaf Ebrahimi   void Sqinch(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) {
5833*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5834*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5835*f5c631daSSadaf Ebrahimi     sqinch(zdn, pattern, multiplier);
5836*f5c631daSSadaf Ebrahimi   }
Sqincp(const Register & xdn,const PRegisterWithLaneSize & pg,const Register & wdn)5837*f5c631daSSadaf Ebrahimi   void Sqincp(const Register& xdn,
5838*f5c631daSSadaf Ebrahimi               const PRegisterWithLaneSize& pg,
5839*f5c631daSSadaf Ebrahimi               const Register& wdn) {
5840*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5841*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5842*f5c631daSSadaf Ebrahimi     sqincp(xdn, pg, wdn);
5843*f5c631daSSadaf Ebrahimi   }
Sqincp(const Register & xdn,const PRegisterWithLaneSize & pg)5844*f5c631daSSadaf Ebrahimi   void Sqincp(const Register& xdn, const PRegisterWithLaneSize& pg) {
5845*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5846*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5847*f5c631daSSadaf Ebrahimi     sqincp(xdn, pg);
5848*f5c631daSSadaf Ebrahimi   }
Sqincp(const ZRegister & zd,const PRegister & pg,const ZRegister & zn)5849*f5c631daSSadaf Ebrahimi   void Sqincp(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) {
5850*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5851*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(AreSameFormat(zd, zn));
5852*f5c631daSSadaf Ebrahimi     // `sqincp` writes every lane, so use an unpredicated movprfx.
5853*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, zn);
5854*f5c631daSSadaf Ebrahimi     sqincp(zd, pg);
5855*f5c631daSSadaf Ebrahimi   }
Sqincp(const ZRegister & zdn,const PRegister & pg)5856*f5c631daSSadaf Ebrahimi   void Sqincp(const ZRegister& zdn, const PRegister& pg) {
5857*f5c631daSSadaf Ebrahimi     Sqincp(zdn, pg, zdn);
5858*f5c631daSSadaf Ebrahimi   }
5859*f5c631daSSadaf Ebrahimi   void Sqincw(const Register& xd,
5860*f5c631daSSadaf Ebrahimi               const Register& wn,
5861*f5c631daSSadaf Ebrahimi               int pattern = SVE_ALL,
5862*f5c631daSSadaf Ebrahimi               int multiplier = 1) {
5863*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5864*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5865*f5c631daSSadaf Ebrahimi     sqincw(xd, wn, pattern, multiplier);
5866*f5c631daSSadaf Ebrahimi   }
5867*f5c631daSSadaf Ebrahimi   void Sqincw(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
5868*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5869*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5870*f5c631daSSadaf Ebrahimi     sqincw(rdn, pattern, multiplier);
5871*f5c631daSSadaf Ebrahimi   }
5872*f5c631daSSadaf Ebrahimi   void Sqincw(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) {
5873*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5874*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5875*f5c631daSSadaf Ebrahimi     sqincw(zdn, pattern, multiplier);
5876*f5c631daSSadaf Ebrahimi   }
Sqsub(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)5877*f5c631daSSadaf Ebrahimi   void Sqsub(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
5878*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5879*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5880*f5c631daSSadaf Ebrahimi     sqsub(zd, zn, zm);
5881*f5c631daSSadaf Ebrahimi   }
Sqsub(const ZRegister & zd,const ZRegister & zn,IntegerOperand imm)5882*f5c631daSSadaf Ebrahimi   void Sqsub(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm) {
5883*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5884*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(imm.IsUint8() ||
5885*f5c631daSSadaf Ebrahimi                 (imm.IsUint16() && ((imm.AsUint16() & 0xff) == 0)));
5886*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, zn);
5887*f5c631daSSadaf Ebrahimi     sqsub(zd, zd, imm.AsUint16());
5888*f5c631daSSadaf Ebrahimi   }
5889*f5c631daSSadaf Ebrahimi   void St1b(const ZRegister& zt,
5890*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5891*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr);
5892*f5c631daSSadaf Ebrahimi   void St1h(const ZRegister& zt,
5893*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5894*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr);
5895*f5c631daSSadaf Ebrahimi   void St1w(const ZRegister& zt,
5896*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5897*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr);
5898*f5c631daSSadaf Ebrahimi   void St1d(const ZRegister& zt,
5899*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5900*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr);
St2b(const ZRegister & zt1,const ZRegister & zt2,const PRegister & pg,const SVEMemOperand & addr)5901*f5c631daSSadaf Ebrahimi   void St2b(const ZRegister& zt1,
5902*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
5903*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5904*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
5905*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5906*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5907*f5c631daSSadaf Ebrahimi     st2b(zt1, zt2, pg, addr);
5908*f5c631daSSadaf Ebrahimi   }
St2h(const ZRegister & zt1,const ZRegister & zt2,const PRegister & pg,const SVEMemOperand & addr)5909*f5c631daSSadaf Ebrahimi   void St2h(const ZRegister& zt1,
5910*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
5911*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5912*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
5913*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5914*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5915*f5c631daSSadaf Ebrahimi     st2h(zt1, zt2, pg, addr);
5916*f5c631daSSadaf Ebrahimi   }
St2w(const ZRegister & zt1,const ZRegister & zt2,const PRegister & pg,const SVEMemOperand & addr)5917*f5c631daSSadaf Ebrahimi   void St2w(const ZRegister& zt1,
5918*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
5919*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5920*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
5921*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5922*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5923*f5c631daSSadaf Ebrahimi     st2w(zt1, zt2, pg, addr);
5924*f5c631daSSadaf Ebrahimi   }
St2d(const ZRegister & zt1,const ZRegister & zt2,const PRegister & pg,const SVEMemOperand & addr)5925*f5c631daSSadaf Ebrahimi   void St2d(const ZRegister& zt1,
5926*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
5927*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5928*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
5929*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5930*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5931*f5c631daSSadaf Ebrahimi     st2d(zt1, zt2, pg, addr);
5932*f5c631daSSadaf Ebrahimi   }
St3b(const ZRegister & zt1,const ZRegister & zt2,const ZRegister & zt3,const PRegister & pg,const SVEMemOperand & addr)5933*f5c631daSSadaf Ebrahimi   void St3b(const ZRegister& zt1,
5934*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
5935*f5c631daSSadaf Ebrahimi             const ZRegister& zt3,
5936*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5937*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
5938*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5939*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5940*f5c631daSSadaf Ebrahimi     st3b(zt1, zt2, zt3, pg, addr);
5941*f5c631daSSadaf Ebrahimi   }
St3h(const ZRegister & zt1,const ZRegister & zt2,const ZRegister & zt3,const PRegister & pg,const SVEMemOperand & addr)5942*f5c631daSSadaf Ebrahimi   void St3h(const ZRegister& zt1,
5943*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
5944*f5c631daSSadaf Ebrahimi             const ZRegister& zt3,
5945*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5946*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
5947*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5948*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5949*f5c631daSSadaf Ebrahimi     st3h(zt1, zt2, zt3, pg, addr);
5950*f5c631daSSadaf Ebrahimi   }
St3w(const ZRegister & zt1,const ZRegister & zt2,const ZRegister & zt3,const PRegister & pg,const SVEMemOperand & addr)5951*f5c631daSSadaf Ebrahimi   void St3w(const ZRegister& zt1,
5952*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
5953*f5c631daSSadaf Ebrahimi             const ZRegister& zt3,
5954*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5955*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
5956*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5957*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5958*f5c631daSSadaf Ebrahimi     st3w(zt1, zt2, zt3, pg, addr);
5959*f5c631daSSadaf Ebrahimi   }
St3d(const ZRegister & zt1,const ZRegister & zt2,const ZRegister & zt3,const PRegister & pg,const SVEMemOperand & addr)5960*f5c631daSSadaf Ebrahimi   void St3d(const ZRegister& zt1,
5961*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
5962*f5c631daSSadaf Ebrahimi             const ZRegister& zt3,
5963*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5964*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
5965*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5966*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5967*f5c631daSSadaf Ebrahimi     st3d(zt1, zt2, zt3, pg, addr);
5968*f5c631daSSadaf Ebrahimi   }
St4b(const ZRegister & zt1,const ZRegister & zt2,const ZRegister & zt3,const ZRegister & zt4,const PRegister & pg,const SVEMemOperand & addr)5969*f5c631daSSadaf Ebrahimi   void St4b(const ZRegister& zt1,
5970*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
5971*f5c631daSSadaf Ebrahimi             const ZRegister& zt3,
5972*f5c631daSSadaf Ebrahimi             const ZRegister& zt4,
5973*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5974*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
5975*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5976*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5977*f5c631daSSadaf Ebrahimi     st4b(zt1, zt2, zt3, zt4, pg, addr);
5978*f5c631daSSadaf Ebrahimi   }
St4h(const ZRegister & zt1,const ZRegister & zt2,const ZRegister & zt3,const ZRegister & zt4,const PRegister & pg,const SVEMemOperand & addr)5979*f5c631daSSadaf Ebrahimi   void St4h(const ZRegister& zt1,
5980*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
5981*f5c631daSSadaf Ebrahimi             const ZRegister& zt3,
5982*f5c631daSSadaf Ebrahimi             const ZRegister& zt4,
5983*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5984*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
5985*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5986*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5987*f5c631daSSadaf Ebrahimi     st4h(zt1, zt2, zt3, zt4, pg, addr);
5988*f5c631daSSadaf Ebrahimi   }
St4w(const ZRegister & zt1,const ZRegister & zt2,const ZRegister & zt3,const ZRegister & zt4,const PRegister & pg,const SVEMemOperand & addr)5989*f5c631daSSadaf Ebrahimi   void St4w(const ZRegister& zt1,
5990*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
5991*f5c631daSSadaf Ebrahimi             const ZRegister& zt3,
5992*f5c631daSSadaf Ebrahimi             const ZRegister& zt4,
5993*f5c631daSSadaf Ebrahimi             const PRegister& pg,
5994*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
5995*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
5996*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
5997*f5c631daSSadaf Ebrahimi     st4w(zt1, zt2, zt3, zt4, pg, addr);
5998*f5c631daSSadaf Ebrahimi   }
St4d(const ZRegister & zt1,const ZRegister & zt2,const ZRegister & zt3,const ZRegister & zt4,const PRegister & pg,const SVEMemOperand & addr)5999*f5c631daSSadaf Ebrahimi   void St4d(const ZRegister& zt1,
6000*f5c631daSSadaf Ebrahimi             const ZRegister& zt2,
6001*f5c631daSSadaf Ebrahimi             const ZRegister& zt3,
6002*f5c631daSSadaf Ebrahimi             const ZRegister& zt4,
6003*f5c631daSSadaf Ebrahimi             const PRegister& pg,
6004*f5c631daSSadaf Ebrahimi             const SVEMemOperand& addr) {
6005*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6006*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6007*f5c631daSSadaf Ebrahimi     st4d(zt1, zt2, zt3, zt4, pg, addr);
6008*f5c631daSSadaf Ebrahimi   }
6009*f5c631daSSadaf Ebrahimi   void Stnt1b(const ZRegister& zt,
6010*f5c631daSSadaf Ebrahimi               const PRegister& pg,
6011*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
6012*f5c631daSSadaf Ebrahimi   void Stnt1d(const ZRegister& zt,
6013*f5c631daSSadaf Ebrahimi               const PRegister& pg,
6014*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
6015*f5c631daSSadaf Ebrahimi   void Stnt1h(const ZRegister& zt,
6016*f5c631daSSadaf Ebrahimi               const PRegister& pg,
6017*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
6018*f5c631daSSadaf Ebrahimi   void Stnt1w(const ZRegister& zt,
6019*f5c631daSSadaf Ebrahimi               const PRegister& pg,
6020*f5c631daSSadaf Ebrahimi               const SVEMemOperand& addr);
Str(const CPURegister & rt,const SVEMemOperand & addr)6021*f5c631daSSadaf Ebrahimi   void Str(const CPURegister& rt, const SVEMemOperand& addr) {
6022*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6023*f5c631daSSadaf Ebrahimi     SVELoadStoreScalarImmHelper(rt, addr, &MacroAssembler::str);
6024*f5c631daSSadaf Ebrahimi   }
6025*f5c631daSSadaf Ebrahimi   void Sub(const ZRegister& zd,
6026*f5c631daSSadaf Ebrahimi            const PRegisterM& pg,
6027*f5c631daSSadaf Ebrahimi            const ZRegister& zn,
6028*f5c631daSSadaf Ebrahimi            const ZRegister& zm);
Sub(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6029*f5c631daSSadaf Ebrahimi   void Sub(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6030*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6031*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6032*f5c631daSSadaf Ebrahimi     sub(zd, zn, zm);
6033*f5c631daSSadaf Ebrahimi   }
Sub(const ZRegister & zd,const ZRegister & zn,IntegerOperand imm)6034*f5c631daSSadaf Ebrahimi   void Sub(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm) {
6035*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6036*f5c631daSSadaf Ebrahimi     AddSubHelper(kSubImmediate, zd, zn, imm);
6037*f5c631daSSadaf Ebrahimi   }
6038*f5c631daSSadaf Ebrahimi   void Sub(const ZRegister& zd, IntegerOperand imm, const ZRegister& zm);
Sunpkhi(const ZRegister & zd,const ZRegister & zn)6039*f5c631daSSadaf Ebrahimi   void Sunpkhi(const ZRegister& zd, const ZRegister& zn) {
6040*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6041*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6042*f5c631daSSadaf Ebrahimi     sunpkhi(zd, zn);
6043*f5c631daSSadaf Ebrahimi   }
Sunpklo(const ZRegister & zd,const ZRegister & zn)6044*f5c631daSSadaf Ebrahimi   void Sunpklo(const ZRegister& zd, const ZRegister& zn) {
6045*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6046*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6047*f5c631daSSadaf Ebrahimi     sunpklo(zd, zn);
6048*f5c631daSSadaf Ebrahimi   }
Sxtb(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)6049*f5c631daSSadaf Ebrahimi   void Sxtb(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
6050*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6051*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6052*f5c631daSSadaf Ebrahimi     sxtb(zd, pg, zn);
6053*f5c631daSSadaf Ebrahimi   }
Sxth(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)6054*f5c631daSSadaf Ebrahimi   void Sxth(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
6055*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6056*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6057*f5c631daSSadaf Ebrahimi     sxth(zd, pg, zn);
6058*f5c631daSSadaf Ebrahimi   }
Sxtw(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)6059*f5c631daSSadaf Ebrahimi   void Sxtw(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
6060*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6061*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6062*f5c631daSSadaf Ebrahimi     sxtw(zd, pg, zn);
6063*f5c631daSSadaf Ebrahimi   }
Tbl(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6064*f5c631daSSadaf Ebrahimi   void Tbl(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6065*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6066*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6067*f5c631daSSadaf Ebrahimi     tbl(zd, zn, zm);
6068*f5c631daSSadaf Ebrahimi   }
Trn1(const PRegisterWithLaneSize & pd,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)6069*f5c631daSSadaf Ebrahimi   void Trn1(const PRegisterWithLaneSize& pd,
6070*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn,
6071*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pm) {
6072*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6073*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6074*f5c631daSSadaf Ebrahimi     trn1(pd, pn, pm);
6075*f5c631daSSadaf Ebrahimi   }
Trn1(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6076*f5c631daSSadaf Ebrahimi   void Trn1(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6077*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6078*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6079*f5c631daSSadaf Ebrahimi     trn1(zd, zn, zm);
6080*f5c631daSSadaf Ebrahimi   }
Trn2(const PRegisterWithLaneSize & pd,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)6081*f5c631daSSadaf Ebrahimi   void Trn2(const PRegisterWithLaneSize& pd,
6082*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn,
6083*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pm) {
6084*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6085*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6086*f5c631daSSadaf Ebrahimi     trn2(pd, pn, pm);
6087*f5c631daSSadaf Ebrahimi   }
Trn2(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6088*f5c631daSSadaf Ebrahimi   void Trn2(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6089*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6090*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6091*f5c631daSSadaf Ebrahimi     trn2(zd, zn, zm);
6092*f5c631daSSadaf Ebrahimi   }
Uaddv(const VRegister & dd,const PRegister & pg,const ZRegister & zn)6093*f5c631daSSadaf Ebrahimi   void Uaddv(const VRegister& dd, const PRegister& pg, const ZRegister& zn) {
6094*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6095*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6096*f5c631daSSadaf Ebrahimi     uaddv(dd, pg, zn);
6097*f5c631daSSadaf Ebrahimi   }
Ucvtf(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)6098*f5c631daSSadaf Ebrahimi   void Ucvtf(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
6099*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6100*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6101*f5c631daSSadaf Ebrahimi     ucvtf(zd, pg, zn);
6102*f5c631daSSadaf Ebrahimi   }
6103*f5c631daSSadaf Ebrahimi   void Udiv(const ZRegister& zd,
6104*f5c631daSSadaf Ebrahimi             const PRegisterM& pg,
6105*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
6106*f5c631daSSadaf Ebrahimi             const ZRegister& zm);
6107*f5c631daSSadaf Ebrahimi   void Udot(const ZRegister& zd,
6108*f5c631daSSadaf Ebrahimi             const ZRegister& za,
6109*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
6110*f5c631daSSadaf Ebrahimi             const ZRegister& zm);
6111*f5c631daSSadaf Ebrahimi   void Udot(const ZRegister& zd,
6112*f5c631daSSadaf Ebrahimi             const ZRegister& za,
6113*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
6114*f5c631daSSadaf Ebrahimi             const ZRegister& zm,
6115*f5c631daSSadaf Ebrahimi             int index);
6116*f5c631daSSadaf Ebrahimi   void Umax(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm);
Umaxv(const VRegister & vd,const PRegister & pg,const ZRegister & zn)6117*f5c631daSSadaf Ebrahimi   void Umaxv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) {
6118*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6119*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6120*f5c631daSSadaf Ebrahimi     umaxv(vd, pg, zn);
6121*f5c631daSSadaf Ebrahimi   }
6122*f5c631daSSadaf Ebrahimi   void Umin(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm);
Uminv(const VRegister & vd,const PRegister & pg,const ZRegister & zn)6123*f5c631daSSadaf Ebrahimi   void Uminv(const VRegister& vd, const PRegister& pg, const ZRegister& zn) {
6124*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6125*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6126*f5c631daSSadaf Ebrahimi     uminv(vd, pg, zn);
6127*f5c631daSSadaf Ebrahimi   }
Uqadd(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6128*f5c631daSSadaf Ebrahimi   void Uqadd(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6129*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6130*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6131*f5c631daSSadaf Ebrahimi     uqadd(zd, zn, zm);
6132*f5c631daSSadaf Ebrahimi   }
Uqadd(const ZRegister & zd,const ZRegister & zn,IntegerOperand imm)6133*f5c631daSSadaf Ebrahimi   void Uqadd(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm) {
6134*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6135*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(imm.IsUint8() ||
6136*f5c631daSSadaf Ebrahimi                 (imm.IsUint16() && ((imm.AsUint16() & 0xff) == 0)));
6137*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, zn);
6138*f5c631daSSadaf Ebrahimi     uqadd(zd, zd, imm.AsUint16());
6139*f5c631daSSadaf Ebrahimi   }
6140*f5c631daSSadaf Ebrahimi   void Uqdecb(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
6141*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6142*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6143*f5c631daSSadaf Ebrahimi     uqdecb(rdn, pattern, multiplier);
6144*f5c631daSSadaf Ebrahimi   }
6145*f5c631daSSadaf Ebrahimi   void Uqdecd(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
6146*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6147*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6148*f5c631daSSadaf Ebrahimi     uqdecd(rdn, pattern, multiplier);
6149*f5c631daSSadaf Ebrahimi   }
6150*f5c631daSSadaf Ebrahimi   void Uqdecd(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) {
6151*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6152*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6153*f5c631daSSadaf Ebrahimi     uqdecd(zdn, pattern, multiplier);
6154*f5c631daSSadaf Ebrahimi   }
6155*f5c631daSSadaf Ebrahimi   void Uqdech(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
6156*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6157*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6158*f5c631daSSadaf Ebrahimi     uqdech(rdn, pattern, multiplier);
6159*f5c631daSSadaf Ebrahimi   }
6160*f5c631daSSadaf Ebrahimi   void Uqdech(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) {
6161*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6162*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6163*f5c631daSSadaf Ebrahimi     uqdech(zdn, pattern, multiplier);
6164*f5c631daSSadaf Ebrahimi   }
6165*f5c631daSSadaf Ebrahimi   // The saturation is based on the size of `rn`. The result is zero-extended
6166*f5c631daSSadaf Ebrahimi   // into `rd`, which must be at least as big.
Uqdecp(const Register & rd,const PRegisterWithLaneSize & pg,const Register & rn)6167*f5c631daSSadaf Ebrahimi   void Uqdecp(const Register& rd,
6168*f5c631daSSadaf Ebrahimi               const PRegisterWithLaneSize& pg,
6169*f5c631daSSadaf Ebrahimi               const Register& rn) {
6170*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6171*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(rd.Aliases(rn));
6172*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(rd.GetSizeInBytes() >= rn.GetSizeInBytes());
6173*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6174*f5c631daSSadaf Ebrahimi     if (rn.Is64Bits()) {
6175*f5c631daSSadaf Ebrahimi       uqdecp(rd, pg);
6176*f5c631daSSadaf Ebrahimi     } else {
6177*f5c631daSSadaf Ebrahimi       // Convert <Xd> into <Wd>, to make this more consistent with Sqdecp.
6178*f5c631daSSadaf Ebrahimi       uqdecp(rd.W(), pg);
6179*f5c631daSSadaf Ebrahimi     }
6180*f5c631daSSadaf Ebrahimi   }
Uqdecp(const Register & rdn,const PRegisterWithLaneSize & pg)6181*f5c631daSSadaf Ebrahimi   void Uqdecp(const Register& rdn, const PRegisterWithLaneSize& pg) {
6182*f5c631daSSadaf Ebrahimi     Uqdecp(rdn, pg, rdn);
6183*f5c631daSSadaf Ebrahimi   }
Uqdecp(const ZRegister & zd,const PRegister & pg,const ZRegister & zn)6184*f5c631daSSadaf Ebrahimi   void Uqdecp(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) {
6185*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6186*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(AreSameFormat(zd, zn));
6187*f5c631daSSadaf Ebrahimi     // `sqdecp` writes every lane, so use an unpredicated movprfx.
6188*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, zn);
6189*f5c631daSSadaf Ebrahimi     uqdecp(zd, pg);
6190*f5c631daSSadaf Ebrahimi   }
Uqdecp(const ZRegister & zdn,const PRegister & pg)6191*f5c631daSSadaf Ebrahimi   void Uqdecp(const ZRegister& zdn, const PRegister& pg) {
6192*f5c631daSSadaf Ebrahimi     Uqdecp(zdn, pg, zdn);
6193*f5c631daSSadaf Ebrahimi   }
6194*f5c631daSSadaf Ebrahimi   void Uqdecw(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
6195*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6196*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6197*f5c631daSSadaf Ebrahimi     uqdecw(rdn, pattern, multiplier);
6198*f5c631daSSadaf Ebrahimi   }
6199*f5c631daSSadaf Ebrahimi   void Uqdecw(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) {
6200*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6201*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6202*f5c631daSSadaf Ebrahimi     uqdecw(zdn, pattern, multiplier);
6203*f5c631daSSadaf Ebrahimi   }
6204*f5c631daSSadaf Ebrahimi   void Uqincb(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
6205*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6206*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6207*f5c631daSSadaf Ebrahimi     uqincb(rdn, pattern, multiplier);
6208*f5c631daSSadaf Ebrahimi   }
6209*f5c631daSSadaf Ebrahimi   void Uqincd(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
6210*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6211*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6212*f5c631daSSadaf Ebrahimi     uqincd(rdn, pattern, multiplier);
6213*f5c631daSSadaf Ebrahimi   }
6214*f5c631daSSadaf Ebrahimi   void Uqincd(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) {
6215*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6216*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6217*f5c631daSSadaf Ebrahimi     uqincd(zdn, pattern, multiplier);
6218*f5c631daSSadaf Ebrahimi   }
6219*f5c631daSSadaf Ebrahimi   void Uqinch(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
6220*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6221*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6222*f5c631daSSadaf Ebrahimi     uqinch(rdn, pattern, multiplier);
6223*f5c631daSSadaf Ebrahimi   }
6224*f5c631daSSadaf Ebrahimi   void Uqinch(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) {
6225*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6226*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6227*f5c631daSSadaf Ebrahimi     uqinch(zdn, pattern, multiplier);
6228*f5c631daSSadaf Ebrahimi   }
6229*f5c631daSSadaf Ebrahimi   // The saturation is based on the size of `rn`. The result is zero-extended
6230*f5c631daSSadaf Ebrahimi   // into `rd`, which must be at least as big.
Uqincp(const Register & rd,const PRegisterWithLaneSize & pg,const Register & rn)6231*f5c631daSSadaf Ebrahimi   void Uqincp(const Register& rd,
6232*f5c631daSSadaf Ebrahimi               const PRegisterWithLaneSize& pg,
6233*f5c631daSSadaf Ebrahimi               const Register& rn) {
6234*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6235*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(rd.Aliases(rn));
6236*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(rd.GetSizeInBytes() >= rn.GetSizeInBytes());
6237*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6238*f5c631daSSadaf Ebrahimi     if (rn.Is64Bits()) {
6239*f5c631daSSadaf Ebrahimi       uqincp(rd, pg);
6240*f5c631daSSadaf Ebrahimi     } else {
6241*f5c631daSSadaf Ebrahimi       // Convert <Xd> into <Wd>, to make this more consistent with Sqincp.
6242*f5c631daSSadaf Ebrahimi       uqincp(rd.W(), pg);
6243*f5c631daSSadaf Ebrahimi     }
6244*f5c631daSSadaf Ebrahimi   }
Uqincp(const Register & rdn,const PRegisterWithLaneSize & pg)6245*f5c631daSSadaf Ebrahimi   void Uqincp(const Register& rdn, const PRegisterWithLaneSize& pg) {
6246*f5c631daSSadaf Ebrahimi     Uqincp(rdn, pg, rdn);
6247*f5c631daSSadaf Ebrahimi   }
Uqincp(const ZRegister & zd,const PRegister & pg,const ZRegister & zn)6248*f5c631daSSadaf Ebrahimi   void Uqincp(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) {
6249*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6250*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(AreSameFormat(zd, zn));
6251*f5c631daSSadaf Ebrahimi     // `sqincp` writes every lane, so use an unpredicated movprfx.
6252*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, zn);
6253*f5c631daSSadaf Ebrahimi     uqincp(zd, pg);
6254*f5c631daSSadaf Ebrahimi   }
Uqincp(const ZRegister & zdn,const PRegister & pg)6255*f5c631daSSadaf Ebrahimi   void Uqincp(const ZRegister& zdn, const PRegister& pg) {
6256*f5c631daSSadaf Ebrahimi     Uqincp(zdn, pg, zdn);
6257*f5c631daSSadaf Ebrahimi   }
6258*f5c631daSSadaf Ebrahimi   void Uqincw(const Register& rdn, int pattern = SVE_ALL, int multiplier = 1) {
6259*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6260*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6261*f5c631daSSadaf Ebrahimi     uqincw(rdn, pattern, multiplier);
6262*f5c631daSSadaf Ebrahimi   }
6263*f5c631daSSadaf Ebrahimi   void Uqincw(const ZRegister& zdn, int pattern = SVE_ALL, int multiplier = 1) {
6264*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6265*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6266*f5c631daSSadaf Ebrahimi     uqincw(zdn, pattern, multiplier);
6267*f5c631daSSadaf Ebrahimi   }
Uqsub(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6268*f5c631daSSadaf Ebrahimi   void Uqsub(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6269*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6270*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6271*f5c631daSSadaf Ebrahimi     uqsub(zd, zn, zm);
6272*f5c631daSSadaf Ebrahimi   }
Uqsub(const ZRegister & zd,const ZRegister & zn,IntegerOperand imm)6273*f5c631daSSadaf Ebrahimi   void Uqsub(const ZRegister& zd, const ZRegister& zn, IntegerOperand imm) {
6274*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6275*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(imm.IsUint8() ||
6276*f5c631daSSadaf Ebrahimi                 (imm.IsUint16() && ((imm.AsUint16() & 0xff) == 0)));
6277*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, zn);
6278*f5c631daSSadaf Ebrahimi     uqsub(zd, zd, imm.AsUint16());
6279*f5c631daSSadaf Ebrahimi   }
Uunpkhi(const ZRegister & zd,const ZRegister & zn)6280*f5c631daSSadaf Ebrahimi   void Uunpkhi(const ZRegister& zd, const ZRegister& zn) {
6281*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6282*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6283*f5c631daSSadaf Ebrahimi     uunpkhi(zd, zn);
6284*f5c631daSSadaf Ebrahimi   }
Uunpklo(const ZRegister & zd,const ZRegister & zn)6285*f5c631daSSadaf Ebrahimi   void Uunpklo(const ZRegister& zd, const ZRegister& zn) {
6286*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6287*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6288*f5c631daSSadaf Ebrahimi     uunpklo(zd, zn);
6289*f5c631daSSadaf Ebrahimi   }
Uxtb(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)6290*f5c631daSSadaf Ebrahimi   void Uxtb(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
6291*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6292*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6293*f5c631daSSadaf Ebrahimi     uxtb(zd, pg, zn);
6294*f5c631daSSadaf Ebrahimi   }
Uxth(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)6295*f5c631daSSadaf Ebrahimi   void Uxth(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
6296*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6297*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6298*f5c631daSSadaf Ebrahimi     uxth(zd, pg, zn);
6299*f5c631daSSadaf Ebrahimi   }
Uxtw(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)6300*f5c631daSSadaf Ebrahimi   void Uxtw(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
6301*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6302*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6303*f5c631daSSadaf Ebrahimi     uxtw(zd, pg, zn);
6304*f5c631daSSadaf Ebrahimi   }
Uzp1(const PRegisterWithLaneSize & pd,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)6305*f5c631daSSadaf Ebrahimi   void Uzp1(const PRegisterWithLaneSize& pd,
6306*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn,
6307*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pm) {
6308*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6309*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6310*f5c631daSSadaf Ebrahimi     uzp1(pd, pn, pm);
6311*f5c631daSSadaf Ebrahimi   }
Uzp1(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6312*f5c631daSSadaf Ebrahimi   void Uzp1(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6313*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6314*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6315*f5c631daSSadaf Ebrahimi     uzp1(zd, zn, zm);
6316*f5c631daSSadaf Ebrahimi   }
Uzp2(const PRegisterWithLaneSize & pd,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)6317*f5c631daSSadaf Ebrahimi   void Uzp2(const PRegisterWithLaneSize& pd,
6318*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn,
6319*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pm) {
6320*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6321*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6322*f5c631daSSadaf Ebrahimi     uzp2(pd, pn, pm);
6323*f5c631daSSadaf Ebrahimi   }
Uzp2(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6324*f5c631daSSadaf Ebrahimi   void Uzp2(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6325*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6326*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6327*f5c631daSSadaf Ebrahimi     uzp2(zd, zn, zm);
6328*f5c631daSSadaf Ebrahimi   }
Whilele(const PRegisterWithLaneSize & pd,const Register & rn,const Register & rm)6329*f5c631daSSadaf Ebrahimi   void Whilele(const PRegisterWithLaneSize& pd,
6330*f5c631daSSadaf Ebrahimi                const Register& rn,
6331*f5c631daSSadaf Ebrahimi                const Register& rm) {
6332*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6333*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6334*f5c631daSSadaf Ebrahimi     whilele(pd, rn, rm);
6335*f5c631daSSadaf Ebrahimi   }
Whilelo(const PRegisterWithLaneSize & pd,const Register & rn,const Register & rm)6336*f5c631daSSadaf Ebrahimi   void Whilelo(const PRegisterWithLaneSize& pd,
6337*f5c631daSSadaf Ebrahimi                const Register& rn,
6338*f5c631daSSadaf Ebrahimi                const Register& rm) {
6339*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6340*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6341*f5c631daSSadaf Ebrahimi     whilelo(pd, rn, rm);
6342*f5c631daSSadaf Ebrahimi   }
Whilels(const PRegisterWithLaneSize & pd,const Register & rn,const Register & rm)6343*f5c631daSSadaf Ebrahimi   void Whilels(const PRegisterWithLaneSize& pd,
6344*f5c631daSSadaf Ebrahimi                const Register& rn,
6345*f5c631daSSadaf Ebrahimi                const Register& rm) {
6346*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6347*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6348*f5c631daSSadaf Ebrahimi     whilels(pd, rn, rm);
6349*f5c631daSSadaf Ebrahimi   }
Whilelt(const PRegisterWithLaneSize & pd,const Register & rn,const Register & rm)6350*f5c631daSSadaf Ebrahimi   void Whilelt(const PRegisterWithLaneSize& pd,
6351*f5c631daSSadaf Ebrahimi                const Register& rn,
6352*f5c631daSSadaf Ebrahimi                const Register& rm) {
6353*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6354*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6355*f5c631daSSadaf Ebrahimi     whilelt(pd, rn, rm);
6356*f5c631daSSadaf Ebrahimi   }
Wrffr(const PRegister & pn)6357*f5c631daSSadaf Ebrahimi   void Wrffr(const PRegister& pn) {
6358*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6359*f5c631daSSadaf Ebrahimi     // Although this is essentially just a move, it writes every bit and so can
6360*f5c631daSSadaf Ebrahimi     // only support b-sized lane because other lane sizes would implicitly clear
6361*f5c631daSSadaf Ebrahimi     // bits in `ffr`.
6362*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!pn.HasLaneSize() || pn.IsLaneSizeB());
6363*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(pn.IsUnqualified());
6364*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6365*f5c631daSSadaf Ebrahimi     wrffr(pn.VnB());
6366*f5c631daSSadaf Ebrahimi   }
Zip1(const PRegisterWithLaneSize & pd,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)6367*f5c631daSSadaf Ebrahimi   void Zip1(const PRegisterWithLaneSize& pd,
6368*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn,
6369*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pm) {
6370*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6371*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6372*f5c631daSSadaf Ebrahimi     zip1(pd, pn, pm);
6373*f5c631daSSadaf Ebrahimi   }
Zip1(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6374*f5c631daSSadaf Ebrahimi   void Zip1(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6375*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6376*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6377*f5c631daSSadaf Ebrahimi     zip1(zd, zn, zm);
6378*f5c631daSSadaf Ebrahimi   }
Zip2(const PRegisterWithLaneSize & pd,const PRegisterWithLaneSize & pn,const PRegisterWithLaneSize & pm)6379*f5c631daSSadaf Ebrahimi   void Zip2(const PRegisterWithLaneSize& pd,
6380*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pn,
6381*f5c631daSSadaf Ebrahimi             const PRegisterWithLaneSize& pm) {
6382*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6383*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6384*f5c631daSSadaf Ebrahimi     zip2(pd, pn, pm);
6385*f5c631daSSadaf Ebrahimi   }
Zip2(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6386*f5c631daSSadaf Ebrahimi   void Zip2(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6387*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6388*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6389*f5c631daSSadaf Ebrahimi     zip2(zd, zn, zm);
6390*f5c631daSSadaf Ebrahimi   }
6391*f5c631daSSadaf Ebrahimi 
6392*f5c631daSSadaf Ebrahimi   // SVE2
6393*f5c631daSSadaf Ebrahimi   void Adclb(const ZRegister& zd,
6394*f5c631daSSadaf Ebrahimi              const ZRegister& za,
6395*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
6396*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
6397*f5c631daSSadaf Ebrahimi   void Adclt(const ZRegister& zd,
6398*f5c631daSSadaf Ebrahimi              const ZRegister& za,
6399*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
6400*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
Addhnb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6401*f5c631daSSadaf Ebrahimi   void Addhnb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6402*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6403*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6404*f5c631daSSadaf Ebrahimi     addhnb(zd, zn, zm);
6405*f5c631daSSadaf Ebrahimi   }
Addhnt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6406*f5c631daSSadaf Ebrahimi   void Addhnt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6407*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6408*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6409*f5c631daSSadaf Ebrahimi     addhnt(zd, zn, zm);
6410*f5c631daSSadaf Ebrahimi   }
6411*f5c631daSSadaf Ebrahimi   void Addp(const ZRegister& zd,
6412*f5c631daSSadaf Ebrahimi             const PRegisterM& pg,
6413*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
6414*f5c631daSSadaf Ebrahimi             const ZRegister& zm);
6415*f5c631daSSadaf Ebrahimi   void Bcax(const ZRegister& zd,
6416*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
6417*f5c631daSSadaf Ebrahimi             const ZRegister& zm,
6418*f5c631daSSadaf Ebrahimi             const ZRegister& zk);
Bdep(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6419*f5c631daSSadaf Ebrahimi   void Bdep(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6420*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6421*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6422*f5c631daSSadaf Ebrahimi     bdep(zd, zn, zm);
6423*f5c631daSSadaf Ebrahimi   }
Bext(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6424*f5c631daSSadaf Ebrahimi   void Bext(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6425*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6426*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6427*f5c631daSSadaf Ebrahimi     bext(zd, zn, zm);
6428*f5c631daSSadaf Ebrahimi   }
Bgrp(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6429*f5c631daSSadaf Ebrahimi   void Bgrp(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6430*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6431*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6432*f5c631daSSadaf Ebrahimi     bgrp(zd, zn, zm);
6433*f5c631daSSadaf Ebrahimi   }
6434*f5c631daSSadaf Ebrahimi   void Bsl(const ZRegister& zd,
6435*f5c631daSSadaf Ebrahimi            const ZRegister& zn,
6436*f5c631daSSadaf Ebrahimi            const ZRegister& zm,
6437*f5c631daSSadaf Ebrahimi            const ZRegister& zk);
6438*f5c631daSSadaf Ebrahimi   void Bsl1n(const ZRegister& zd,
6439*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
6440*f5c631daSSadaf Ebrahimi              const ZRegister& zm,
6441*f5c631daSSadaf Ebrahimi              const ZRegister& zk);
6442*f5c631daSSadaf Ebrahimi   void Bsl2n(const ZRegister& zd,
6443*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
6444*f5c631daSSadaf Ebrahimi              const ZRegister& zm,
6445*f5c631daSSadaf Ebrahimi              const ZRegister& zk);
6446*f5c631daSSadaf Ebrahimi   void Cadd(const ZRegister& zd,
6447*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
6448*f5c631daSSadaf Ebrahimi             const ZRegister& zm,
6449*f5c631daSSadaf Ebrahimi             int rot);
6450*f5c631daSSadaf Ebrahimi   void Cdot(const ZRegister& zd,
6451*f5c631daSSadaf Ebrahimi             const ZRegister& za,
6452*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
6453*f5c631daSSadaf Ebrahimi             const ZRegister& zm,
6454*f5c631daSSadaf Ebrahimi             int index,
6455*f5c631daSSadaf Ebrahimi             int rot);
6456*f5c631daSSadaf Ebrahimi   void Cdot(const ZRegister& zd,
6457*f5c631daSSadaf Ebrahimi             const ZRegister& za,
6458*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
6459*f5c631daSSadaf Ebrahimi             const ZRegister& zm,
6460*f5c631daSSadaf Ebrahimi             int rot);
6461*f5c631daSSadaf Ebrahimi   void Cmla(const ZRegister& zd,
6462*f5c631daSSadaf Ebrahimi             const ZRegister& za,
6463*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
6464*f5c631daSSadaf Ebrahimi             const ZRegister& zm,
6465*f5c631daSSadaf Ebrahimi             int index,
6466*f5c631daSSadaf Ebrahimi             int rot);
6467*f5c631daSSadaf Ebrahimi   void Cmla(const ZRegister& zd,
6468*f5c631daSSadaf Ebrahimi             const ZRegister& za,
6469*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
6470*f5c631daSSadaf Ebrahimi             const ZRegister& zm,
6471*f5c631daSSadaf Ebrahimi             int rot);
6472*f5c631daSSadaf Ebrahimi   void Eor3(const ZRegister& zd,
6473*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
6474*f5c631daSSadaf Ebrahimi             const ZRegister& zm,
6475*f5c631daSSadaf Ebrahimi             const ZRegister& zk);
Eorbt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6476*f5c631daSSadaf Ebrahimi   void Eorbt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6477*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6478*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6479*f5c631daSSadaf Ebrahimi     eorbt(zd, zn, zm);
6480*f5c631daSSadaf Ebrahimi   }
Eortb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6481*f5c631daSSadaf Ebrahimi   void Eortb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6482*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6483*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6484*f5c631daSSadaf Ebrahimi     eortb(zd, zn, zm);
6485*f5c631daSSadaf Ebrahimi   }
6486*f5c631daSSadaf Ebrahimi   void Faddp(const ZRegister& zd,
6487*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
6488*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
6489*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
Fcvtlt(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)6490*f5c631daSSadaf Ebrahimi   void Fcvtlt(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
6491*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6492*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6493*f5c631daSSadaf Ebrahimi     fcvtlt(zd, pg, zn);
6494*f5c631daSSadaf Ebrahimi   }
Fcvtnt(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)6495*f5c631daSSadaf Ebrahimi   void Fcvtnt(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
6496*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6497*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6498*f5c631daSSadaf Ebrahimi     fcvtnt(zd, pg, zn);
6499*f5c631daSSadaf Ebrahimi   }
Fcvtx(const ZRegister & zd,const PRegister & pg,const ZRegister & zn)6500*f5c631daSSadaf Ebrahimi   void Fcvtx(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) {
6501*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6502*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(zn.IsLaneSizeD());
6503*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd.VnD(), pg, zd.VnD());
6504*f5c631daSSadaf Ebrahimi     fcvtx(zd, pg.Merging(), zn);
6505*f5c631daSSadaf Ebrahimi   }
Fcvtxnt(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn)6506*f5c631daSSadaf Ebrahimi   void Fcvtxnt(const ZRegister& zd, const PRegisterM& pg, const ZRegister& zn) {
6507*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6508*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6509*f5c631daSSadaf Ebrahimi     fcvtxnt(zd, pg, zn);
6510*f5c631daSSadaf Ebrahimi   }
Flogb(const ZRegister & zd,const PRegister & pg,const ZRegister & zn)6511*f5c631daSSadaf Ebrahimi   void Flogb(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) {
6512*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6513*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zd);
6514*f5c631daSSadaf Ebrahimi     flogb(zd, pg.Merging(), zn);
6515*f5c631daSSadaf Ebrahimi   }
6516*f5c631daSSadaf Ebrahimi   void Fmaxnmp(const ZRegister& zd,
6517*f5c631daSSadaf Ebrahimi                const PRegisterM& pg,
6518*f5c631daSSadaf Ebrahimi                const ZRegister& zn,
6519*f5c631daSSadaf Ebrahimi                const ZRegister& zm);
6520*f5c631daSSadaf Ebrahimi   void Fmaxp(const ZRegister& zd,
6521*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
6522*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
6523*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
6524*f5c631daSSadaf Ebrahimi   void Fminnmp(const ZRegister& zd,
6525*f5c631daSSadaf Ebrahimi                const PRegisterM& pg,
6526*f5c631daSSadaf Ebrahimi                const ZRegister& zn,
6527*f5c631daSSadaf Ebrahimi                const ZRegister& zm);
6528*f5c631daSSadaf Ebrahimi   void Fminp(const ZRegister& zd,
6529*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
6530*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
6531*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
6532*f5c631daSSadaf Ebrahimi   void Fmlalb(const ZRegister& zd,
6533*f5c631daSSadaf Ebrahimi               const ZRegister& za,
6534*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6535*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
6536*f5c631daSSadaf Ebrahimi   void Fmlalt(const ZRegister& zd,
6537*f5c631daSSadaf Ebrahimi               const ZRegister& za,
6538*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6539*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
6540*f5c631daSSadaf Ebrahimi   void Fmlslb(const ZRegister& zd,
6541*f5c631daSSadaf Ebrahimi               const ZRegister& za,
6542*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6543*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
6544*f5c631daSSadaf Ebrahimi   void Fmlslt(const ZRegister& zd,
6545*f5c631daSSadaf Ebrahimi               const ZRegister& za,
6546*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6547*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
6548*f5c631daSSadaf Ebrahimi   void Fmlalb(const ZRegister& zd,
6549*f5c631daSSadaf Ebrahimi               const ZRegister& za,
6550*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6551*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
6552*f5c631daSSadaf Ebrahimi               int index);
6553*f5c631daSSadaf Ebrahimi   void Fmlalt(const ZRegister& zd,
6554*f5c631daSSadaf Ebrahimi               const ZRegister& za,
6555*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6556*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
6557*f5c631daSSadaf Ebrahimi               int index);
6558*f5c631daSSadaf Ebrahimi   void Fmlslb(const ZRegister& zd,
6559*f5c631daSSadaf Ebrahimi               const ZRegister& za,
6560*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6561*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
6562*f5c631daSSadaf Ebrahimi               int index);
6563*f5c631daSSadaf Ebrahimi   void Fmlslt(const ZRegister& zd,
6564*f5c631daSSadaf Ebrahimi               const ZRegister& za,
6565*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6566*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
6567*f5c631daSSadaf Ebrahimi               int index);
Histcnt(const ZRegister & zd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)6568*f5c631daSSadaf Ebrahimi   void Histcnt(const ZRegister& zd,
6569*f5c631daSSadaf Ebrahimi                const PRegisterZ& pg,
6570*f5c631daSSadaf Ebrahimi                const ZRegister& zn,
6571*f5c631daSSadaf Ebrahimi                const ZRegister& zm) {
6572*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6573*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6574*f5c631daSSadaf Ebrahimi     histcnt(zd, pg, zn, zm);
6575*f5c631daSSadaf Ebrahimi   }
Histseg(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6576*f5c631daSSadaf Ebrahimi   void Histseg(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6577*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6578*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6579*f5c631daSSadaf Ebrahimi     histseg(zd, zn, zm);
6580*f5c631daSSadaf Ebrahimi   }
Ldnt1sb(const ZRegister & zt,const PRegisterZ & pg,const SVEMemOperand & addr)6581*f5c631daSSadaf Ebrahimi   void Ldnt1sb(const ZRegister& zt,
6582*f5c631daSSadaf Ebrahimi                const PRegisterZ& pg,
6583*f5c631daSSadaf Ebrahimi                const SVEMemOperand& addr) {
6584*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6585*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6586*f5c631daSSadaf Ebrahimi     ldnt1sb(zt, pg, addr);
6587*f5c631daSSadaf Ebrahimi   }
Ldnt1sh(const ZRegister & zt,const PRegisterZ & pg,const SVEMemOperand & addr)6588*f5c631daSSadaf Ebrahimi   void Ldnt1sh(const ZRegister& zt,
6589*f5c631daSSadaf Ebrahimi                const PRegisterZ& pg,
6590*f5c631daSSadaf Ebrahimi                const SVEMemOperand& addr) {
6591*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6592*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6593*f5c631daSSadaf Ebrahimi     ldnt1sh(zt, pg, addr);
6594*f5c631daSSadaf Ebrahimi   }
Ldnt1sw(const ZRegister & zt,const PRegisterZ & pg,const SVEMemOperand & addr)6595*f5c631daSSadaf Ebrahimi   void Ldnt1sw(const ZRegister& zt,
6596*f5c631daSSadaf Ebrahimi                const PRegisterZ& pg,
6597*f5c631daSSadaf Ebrahimi                const SVEMemOperand& addr) {
6598*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6599*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6600*f5c631daSSadaf Ebrahimi     ldnt1sw(zt, pg, addr);
6601*f5c631daSSadaf Ebrahimi   }
Match(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)6602*f5c631daSSadaf Ebrahimi   void Match(const PRegisterWithLaneSize& pd,
6603*f5c631daSSadaf Ebrahimi              const PRegisterZ& pg,
6604*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
6605*f5c631daSSadaf Ebrahimi              const ZRegister& zm) {
6606*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6607*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6608*f5c631daSSadaf Ebrahimi     match(pd, pg, zn, zm);
6609*f5c631daSSadaf Ebrahimi   }
6610*f5c631daSSadaf Ebrahimi   void Mla(const ZRegister& zd,
6611*f5c631daSSadaf Ebrahimi            const ZRegister& za,
6612*f5c631daSSadaf Ebrahimi            const ZRegister& zn,
6613*f5c631daSSadaf Ebrahimi            const ZRegister& zm,
6614*f5c631daSSadaf Ebrahimi            int index);
6615*f5c631daSSadaf Ebrahimi   void Mls(const ZRegister& zd,
6616*f5c631daSSadaf Ebrahimi            const ZRegister& za,
6617*f5c631daSSadaf Ebrahimi            const ZRegister& zn,
6618*f5c631daSSadaf Ebrahimi            const ZRegister& zm,
6619*f5c631daSSadaf Ebrahimi            int index);
Mul(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm,int index)6620*f5c631daSSadaf Ebrahimi   void Mul(const ZRegister& zd,
6621*f5c631daSSadaf Ebrahimi            const ZRegister& zn,
6622*f5c631daSSadaf Ebrahimi            const ZRegister& zm,
6623*f5c631daSSadaf Ebrahimi            int index) {
6624*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6625*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6626*f5c631daSSadaf Ebrahimi     mul(zd, zn, zm, index);
6627*f5c631daSSadaf Ebrahimi   }
Mul(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6628*f5c631daSSadaf Ebrahimi   void Mul(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6629*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6630*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6631*f5c631daSSadaf Ebrahimi     mul(zd, zn, zm);
6632*f5c631daSSadaf Ebrahimi   }
6633*f5c631daSSadaf Ebrahimi   void Nbsl(const ZRegister& zd,
6634*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
6635*f5c631daSSadaf Ebrahimi             const ZRegister& zm,
6636*f5c631daSSadaf Ebrahimi             const ZRegister& zk);
Nmatch(const PRegisterWithLaneSize & pd,const PRegisterZ & pg,const ZRegister & zn,const ZRegister & zm)6637*f5c631daSSadaf Ebrahimi   void Nmatch(const PRegisterWithLaneSize& pd,
6638*f5c631daSSadaf Ebrahimi               const PRegisterZ& pg,
6639*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6640*f5c631daSSadaf Ebrahimi               const ZRegister& zm) {
6641*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6642*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6643*f5c631daSSadaf Ebrahimi     nmatch(pd, pg, zn, zm);
6644*f5c631daSSadaf Ebrahimi   }
Pmul(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6645*f5c631daSSadaf Ebrahimi   void Pmul(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6646*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6647*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6648*f5c631daSSadaf Ebrahimi     pmul(zd, zn, zm);
6649*f5c631daSSadaf Ebrahimi   }
Pmullb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6650*f5c631daSSadaf Ebrahimi   void Pmullb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6651*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6652*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6653*f5c631daSSadaf Ebrahimi     pmullb(zd, zn, zm);
6654*f5c631daSSadaf Ebrahimi   }
Pmullt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6655*f5c631daSSadaf Ebrahimi   void Pmullt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6656*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6657*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6658*f5c631daSSadaf Ebrahimi     pmullt(zd, zn, zm);
6659*f5c631daSSadaf Ebrahimi   }
Raddhnb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6660*f5c631daSSadaf Ebrahimi   void Raddhnb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6661*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6662*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6663*f5c631daSSadaf Ebrahimi     raddhnb(zd, zn, zm);
6664*f5c631daSSadaf Ebrahimi   }
Raddhnt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6665*f5c631daSSadaf Ebrahimi   void Raddhnt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6666*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6667*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6668*f5c631daSSadaf Ebrahimi     raddhnt(zd, zn, zm);
6669*f5c631daSSadaf Ebrahimi   }
Rshrnb(const ZRegister & zd,const ZRegister & zn,int shift)6670*f5c631daSSadaf Ebrahimi   void Rshrnb(const ZRegister& zd, const ZRegister& zn, int shift) {
6671*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6672*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6673*f5c631daSSadaf Ebrahimi     rshrnb(zd, zn, shift);
6674*f5c631daSSadaf Ebrahimi   }
Rshrnt(const ZRegister & zd,const ZRegister & zn,int shift)6675*f5c631daSSadaf Ebrahimi   void Rshrnt(const ZRegister& zd, const ZRegister& zn, int shift) {
6676*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6677*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6678*f5c631daSSadaf Ebrahimi     rshrnt(zd, zn, shift);
6679*f5c631daSSadaf Ebrahimi   }
Rsubhnb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6680*f5c631daSSadaf Ebrahimi   void Rsubhnb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6681*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6682*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6683*f5c631daSSadaf Ebrahimi     rsubhnb(zd, zn, zm);
6684*f5c631daSSadaf Ebrahimi   }
Rsubhnt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6685*f5c631daSSadaf Ebrahimi   void Rsubhnt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6686*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6687*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6688*f5c631daSSadaf Ebrahimi     rsubhnt(zd, zn, zm);
6689*f5c631daSSadaf Ebrahimi   }
6690*f5c631daSSadaf Ebrahimi   void Saba(const ZRegister& zd,
6691*f5c631daSSadaf Ebrahimi             const ZRegister& za,
6692*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
6693*f5c631daSSadaf Ebrahimi             const ZRegister& zm);
6694*f5c631daSSadaf Ebrahimi   void Sabalb(const ZRegister& zd,
6695*f5c631daSSadaf Ebrahimi               const ZRegister& za,
6696*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6697*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
6698*f5c631daSSadaf Ebrahimi   void Sabalt(const ZRegister& zd,
6699*f5c631daSSadaf Ebrahimi               const ZRegister& za,
6700*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6701*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
Sabdlb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6702*f5c631daSSadaf Ebrahimi   void Sabdlb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6703*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6704*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6705*f5c631daSSadaf Ebrahimi     sabdlb(zd, zn, zm);
6706*f5c631daSSadaf Ebrahimi   }
Sabdlt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6707*f5c631daSSadaf Ebrahimi   void Sabdlt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6708*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6709*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6710*f5c631daSSadaf Ebrahimi     sabdlt(zd, zn, zm);
6711*f5c631daSSadaf Ebrahimi   }
Sadalp(const ZRegister & zda,const PRegisterM & pg,const ZRegister & zn)6712*f5c631daSSadaf Ebrahimi   void Sadalp(const ZRegister& zda, const PRegisterM& pg, const ZRegister& zn) {
6713*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6714*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6715*f5c631daSSadaf Ebrahimi     sadalp(zda, pg, zn);
6716*f5c631daSSadaf Ebrahimi   }
Saddlb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6717*f5c631daSSadaf Ebrahimi   void Saddlb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6718*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6719*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6720*f5c631daSSadaf Ebrahimi     saddlb(zd, zn, zm);
6721*f5c631daSSadaf Ebrahimi   }
Saddlbt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6722*f5c631daSSadaf Ebrahimi   void Saddlbt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6723*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6724*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6725*f5c631daSSadaf Ebrahimi     saddlbt(zd, zn, zm);
6726*f5c631daSSadaf Ebrahimi   }
Saddlt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6727*f5c631daSSadaf Ebrahimi   void Saddlt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6728*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6729*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6730*f5c631daSSadaf Ebrahimi     saddlt(zd, zn, zm);
6731*f5c631daSSadaf Ebrahimi   }
Saddwb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6732*f5c631daSSadaf Ebrahimi   void Saddwb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6733*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6734*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6735*f5c631daSSadaf Ebrahimi     saddwb(zd, zn, zm);
6736*f5c631daSSadaf Ebrahimi   }
Saddwt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6737*f5c631daSSadaf Ebrahimi   void Saddwt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6738*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6739*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6740*f5c631daSSadaf Ebrahimi     saddwt(zd, zn, zm);
6741*f5c631daSSadaf Ebrahimi   }
6742*f5c631daSSadaf Ebrahimi   void Sbclb(const ZRegister& zd,
6743*f5c631daSSadaf Ebrahimi              const ZRegister& za,
6744*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
6745*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
6746*f5c631daSSadaf Ebrahimi   void Sbclt(const ZRegister& zd,
6747*f5c631daSSadaf Ebrahimi              const ZRegister& za,
6748*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
6749*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
Shrnb(const ZRegister & zd,const ZRegister & zn,int shift)6750*f5c631daSSadaf Ebrahimi   void Shrnb(const ZRegister& zd, const ZRegister& zn, int shift) {
6751*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6752*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6753*f5c631daSSadaf Ebrahimi     shrnb(zd, zn, shift);
6754*f5c631daSSadaf Ebrahimi   }
Shrnt(const ZRegister & zd,const ZRegister & zn,int shift)6755*f5c631daSSadaf Ebrahimi   void Shrnt(const ZRegister& zd, const ZRegister& zn, int shift) {
6756*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6757*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6758*f5c631daSSadaf Ebrahimi     shrnt(zd, zn, shift);
6759*f5c631daSSadaf Ebrahimi   }
6760*f5c631daSSadaf Ebrahimi   void Shsub(const ZRegister& zd,
6761*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
6762*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
6763*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
Sli(const ZRegister & zd,const ZRegister & zn,int shift)6764*f5c631daSSadaf Ebrahimi   void Sli(const ZRegister& zd, const ZRegister& zn, int shift) {
6765*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6766*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6767*f5c631daSSadaf Ebrahimi     sli(zd, zn, shift);
6768*f5c631daSSadaf Ebrahimi   }
6769*f5c631daSSadaf Ebrahimi   void Smaxp(const ZRegister& zd,
6770*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
6771*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
6772*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
6773*f5c631daSSadaf Ebrahimi   void Sminp(const ZRegister& zd,
6774*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
6775*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
6776*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
6777*f5c631daSSadaf Ebrahimi   void Smlalb(const ZRegister& zd,
6778*f5c631daSSadaf Ebrahimi               const ZRegister& za,
6779*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6780*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
6781*f5c631daSSadaf Ebrahimi               int index);
6782*f5c631daSSadaf Ebrahimi   void Smlalb(const ZRegister& zd,
6783*f5c631daSSadaf Ebrahimi               const ZRegister& za,
6784*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6785*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
6786*f5c631daSSadaf Ebrahimi   void Smlalt(const ZRegister& zd,
6787*f5c631daSSadaf Ebrahimi               const ZRegister& za,
6788*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6789*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
6790*f5c631daSSadaf Ebrahimi               int index);
6791*f5c631daSSadaf Ebrahimi   void Smlalt(const ZRegister& zd,
6792*f5c631daSSadaf Ebrahimi               const ZRegister& za,
6793*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6794*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
6795*f5c631daSSadaf Ebrahimi   void Smlslb(const ZRegister& zd,
6796*f5c631daSSadaf Ebrahimi               const ZRegister& za,
6797*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6798*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
6799*f5c631daSSadaf Ebrahimi               int index);
6800*f5c631daSSadaf Ebrahimi   void Smlslb(const ZRegister& zd,
6801*f5c631daSSadaf Ebrahimi               const ZRegister& za,
6802*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6803*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
6804*f5c631daSSadaf Ebrahimi   void Smlslt(const ZRegister& zd,
6805*f5c631daSSadaf Ebrahimi               const ZRegister& za,
6806*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6807*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
6808*f5c631daSSadaf Ebrahimi               int index);
6809*f5c631daSSadaf Ebrahimi   void Smlslt(const ZRegister& zd,
6810*f5c631daSSadaf Ebrahimi               const ZRegister& za,
6811*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6812*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
Smulh(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6813*f5c631daSSadaf Ebrahimi   void Smulh(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6814*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6815*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6816*f5c631daSSadaf Ebrahimi     smulh(zd, zn, zm);
6817*f5c631daSSadaf Ebrahimi   }
Smullb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm,int index)6818*f5c631daSSadaf Ebrahimi   void Smullb(const ZRegister& zd,
6819*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6820*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
6821*f5c631daSSadaf Ebrahimi               int index) {
6822*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6823*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6824*f5c631daSSadaf Ebrahimi     smullb(zd, zn, zm, index);
6825*f5c631daSSadaf Ebrahimi   }
Smullb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6826*f5c631daSSadaf Ebrahimi   void Smullb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6827*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6828*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6829*f5c631daSSadaf Ebrahimi     smullb(zd, zn, zm);
6830*f5c631daSSadaf Ebrahimi   }
Smullt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm,int index)6831*f5c631daSSadaf Ebrahimi   void Smullt(const ZRegister& zd,
6832*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6833*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
6834*f5c631daSSadaf Ebrahimi               int index) {
6835*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6836*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6837*f5c631daSSadaf Ebrahimi     smullt(zd, zn, zm, index);
6838*f5c631daSSadaf Ebrahimi   }
Smullt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6839*f5c631daSSadaf Ebrahimi   void Smullt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6840*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6841*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6842*f5c631daSSadaf Ebrahimi     smullt(zd, zn, zm);
6843*f5c631daSSadaf Ebrahimi   }
Sqabs(const ZRegister & zd,const PRegister & pg,const ZRegister & zn)6844*f5c631daSSadaf Ebrahimi   void Sqabs(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) {
6845*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6846*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zd);
6847*f5c631daSSadaf Ebrahimi     sqabs(zd, pg.Merging(), zn);
6848*f5c631daSSadaf Ebrahimi   }
6849*f5c631daSSadaf Ebrahimi   void Sqcadd(const ZRegister& zd,
6850*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6851*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
6852*f5c631daSSadaf Ebrahimi               int rot);
6853*f5c631daSSadaf Ebrahimi   void Sqdmlalb(const ZRegister& zd,
6854*f5c631daSSadaf Ebrahimi                 const ZRegister& za,
6855*f5c631daSSadaf Ebrahimi                 const ZRegister& zn,
6856*f5c631daSSadaf Ebrahimi                 const ZRegister& zm,
6857*f5c631daSSadaf Ebrahimi                 int index);
6858*f5c631daSSadaf Ebrahimi   void Sqdmlalb(const ZRegister& zd,
6859*f5c631daSSadaf Ebrahimi                 const ZRegister& za,
6860*f5c631daSSadaf Ebrahimi                 const ZRegister& zn,
6861*f5c631daSSadaf Ebrahimi                 const ZRegister& zm);
6862*f5c631daSSadaf Ebrahimi   void Sqdmlalbt(const ZRegister& zd,
6863*f5c631daSSadaf Ebrahimi                  const ZRegister& za,
6864*f5c631daSSadaf Ebrahimi                  const ZRegister& zn,
6865*f5c631daSSadaf Ebrahimi                  const ZRegister& zm);
6866*f5c631daSSadaf Ebrahimi   void Sqdmlalt(const ZRegister& zd,
6867*f5c631daSSadaf Ebrahimi                 const ZRegister& za,
6868*f5c631daSSadaf Ebrahimi                 const ZRegister& zn,
6869*f5c631daSSadaf Ebrahimi                 const ZRegister& zm,
6870*f5c631daSSadaf Ebrahimi                 int index);
6871*f5c631daSSadaf Ebrahimi   void Sqdmlalt(const ZRegister& zd,
6872*f5c631daSSadaf Ebrahimi                 const ZRegister& za,
6873*f5c631daSSadaf Ebrahimi                 const ZRegister& zn,
6874*f5c631daSSadaf Ebrahimi                 const ZRegister& zm);
6875*f5c631daSSadaf Ebrahimi   void Sqdmlslb(const ZRegister& zd,
6876*f5c631daSSadaf Ebrahimi                 const ZRegister& za,
6877*f5c631daSSadaf Ebrahimi                 const ZRegister& zn,
6878*f5c631daSSadaf Ebrahimi                 const ZRegister& zm,
6879*f5c631daSSadaf Ebrahimi                 int index);
6880*f5c631daSSadaf Ebrahimi   void Sqdmlslb(const ZRegister& zd,
6881*f5c631daSSadaf Ebrahimi                 const ZRegister& za,
6882*f5c631daSSadaf Ebrahimi                 const ZRegister& zn,
6883*f5c631daSSadaf Ebrahimi                 const ZRegister& zm);
6884*f5c631daSSadaf Ebrahimi   void Sqdmlslbt(const ZRegister& zd,
6885*f5c631daSSadaf Ebrahimi                  const ZRegister& za,
6886*f5c631daSSadaf Ebrahimi                  const ZRegister& zn,
6887*f5c631daSSadaf Ebrahimi                  const ZRegister& zm);
6888*f5c631daSSadaf Ebrahimi   void Sqdmlslt(const ZRegister& zd,
6889*f5c631daSSadaf Ebrahimi                 const ZRegister& za,
6890*f5c631daSSadaf Ebrahimi                 const ZRegister& zn,
6891*f5c631daSSadaf Ebrahimi                 const ZRegister& zm,
6892*f5c631daSSadaf Ebrahimi                 int index);
6893*f5c631daSSadaf Ebrahimi   void Sqdmlslt(const ZRegister& zd,
6894*f5c631daSSadaf Ebrahimi                 const ZRegister& za,
6895*f5c631daSSadaf Ebrahimi                 const ZRegister& zn,
6896*f5c631daSSadaf Ebrahimi                 const ZRegister& zm);
Sqdmulh(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm,int index)6897*f5c631daSSadaf Ebrahimi   void Sqdmulh(const ZRegister& zd,
6898*f5c631daSSadaf Ebrahimi                const ZRegister& zn,
6899*f5c631daSSadaf Ebrahimi                const ZRegister& zm,
6900*f5c631daSSadaf Ebrahimi                int index) {
6901*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6902*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6903*f5c631daSSadaf Ebrahimi     sqdmulh(zd, zn, zm, index);
6904*f5c631daSSadaf Ebrahimi   }
Sqdmulh(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6905*f5c631daSSadaf Ebrahimi   void Sqdmulh(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6906*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6907*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6908*f5c631daSSadaf Ebrahimi     sqdmulh(zd, zn, zm);
6909*f5c631daSSadaf Ebrahimi   }
Sqdmullb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm,int index)6910*f5c631daSSadaf Ebrahimi   void Sqdmullb(const ZRegister& zd,
6911*f5c631daSSadaf Ebrahimi                 const ZRegister& zn,
6912*f5c631daSSadaf Ebrahimi                 const ZRegister& zm,
6913*f5c631daSSadaf Ebrahimi                 int index) {
6914*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6915*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6916*f5c631daSSadaf Ebrahimi     sqdmullb(zd, zn, zm, index);
6917*f5c631daSSadaf Ebrahimi   }
Sqdmullb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6918*f5c631daSSadaf Ebrahimi   void Sqdmullb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6919*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6920*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6921*f5c631daSSadaf Ebrahimi     sqdmullb(zd, zn, zm);
6922*f5c631daSSadaf Ebrahimi   }
Sqdmullt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm,int index)6923*f5c631daSSadaf Ebrahimi   void Sqdmullt(const ZRegister& zd,
6924*f5c631daSSadaf Ebrahimi                 const ZRegister& zn,
6925*f5c631daSSadaf Ebrahimi                 const ZRegister& zm,
6926*f5c631daSSadaf Ebrahimi                 int index) {
6927*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6928*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6929*f5c631daSSadaf Ebrahimi     sqdmullt(zd, zn, zm, index);
6930*f5c631daSSadaf Ebrahimi   }
Sqdmullt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6931*f5c631daSSadaf Ebrahimi   void Sqdmullt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6932*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6933*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6934*f5c631daSSadaf Ebrahimi     sqdmullt(zd, zn, zm);
6935*f5c631daSSadaf Ebrahimi   }
Sqneg(const ZRegister & zd,const PRegister & pg,const ZRegister & zn)6936*f5c631daSSadaf Ebrahimi   void Sqneg(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) {
6937*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6938*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zd);
6939*f5c631daSSadaf Ebrahimi     sqneg(zd, pg.Merging(), zn);
6940*f5c631daSSadaf Ebrahimi   }
6941*f5c631daSSadaf Ebrahimi   void Sqrdcmlah(const ZRegister& zd,
6942*f5c631daSSadaf Ebrahimi                  const ZRegister& za,
6943*f5c631daSSadaf Ebrahimi                  const ZRegister& zn,
6944*f5c631daSSadaf Ebrahimi                  const ZRegister& zm,
6945*f5c631daSSadaf Ebrahimi                  int index,
6946*f5c631daSSadaf Ebrahimi                  int rot);
6947*f5c631daSSadaf Ebrahimi   void Sqrdcmlah(const ZRegister& zd,
6948*f5c631daSSadaf Ebrahimi                  const ZRegister& za,
6949*f5c631daSSadaf Ebrahimi                  const ZRegister& zn,
6950*f5c631daSSadaf Ebrahimi                  const ZRegister& zm,
6951*f5c631daSSadaf Ebrahimi                  int rot);
6952*f5c631daSSadaf Ebrahimi   void Sqrdmlah(const ZRegister& zd,
6953*f5c631daSSadaf Ebrahimi                 const ZRegister& za,
6954*f5c631daSSadaf Ebrahimi                 const ZRegister& zn,
6955*f5c631daSSadaf Ebrahimi                 const ZRegister& zm);
6956*f5c631daSSadaf Ebrahimi   void Sqrdmlah(const ZRegister& zd,
6957*f5c631daSSadaf Ebrahimi                 const ZRegister& za,
6958*f5c631daSSadaf Ebrahimi                 const ZRegister& zn,
6959*f5c631daSSadaf Ebrahimi                 const ZRegister& zm,
6960*f5c631daSSadaf Ebrahimi                 int index);
6961*f5c631daSSadaf Ebrahimi   void Sqrdmlsh(const ZRegister& zd,
6962*f5c631daSSadaf Ebrahimi                 const ZRegister& za,
6963*f5c631daSSadaf Ebrahimi                 const ZRegister& zn,
6964*f5c631daSSadaf Ebrahimi                 const ZRegister& zm);
6965*f5c631daSSadaf Ebrahimi   void Sqrdmlsh(const ZRegister& zd,
6966*f5c631daSSadaf Ebrahimi                 const ZRegister& za,
6967*f5c631daSSadaf Ebrahimi                 const ZRegister& zn,
6968*f5c631daSSadaf Ebrahimi                 const ZRegister& zm,
6969*f5c631daSSadaf Ebrahimi                 int index);
Sqrdmulh(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm,int index)6970*f5c631daSSadaf Ebrahimi   void Sqrdmulh(const ZRegister& zd,
6971*f5c631daSSadaf Ebrahimi                 const ZRegister& zn,
6972*f5c631daSSadaf Ebrahimi                 const ZRegister& zm,
6973*f5c631daSSadaf Ebrahimi                 int index) {
6974*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6975*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6976*f5c631daSSadaf Ebrahimi     sqrdmulh(zd, zn, zm, index);
6977*f5c631daSSadaf Ebrahimi   }
Sqrdmulh(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)6978*f5c631daSSadaf Ebrahimi   void Sqrdmulh(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
6979*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6980*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6981*f5c631daSSadaf Ebrahimi     sqrdmulh(zd, zn, zm);
6982*f5c631daSSadaf Ebrahimi   }
6983*f5c631daSSadaf Ebrahimi   void Sqrshl(const ZRegister& zd,
6984*f5c631daSSadaf Ebrahimi               const PRegisterM& pg,
6985*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
6986*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
Sqrshrnb(const ZRegister & zd,const ZRegister & zn,int shift)6987*f5c631daSSadaf Ebrahimi   void Sqrshrnb(const ZRegister& zd, const ZRegister& zn, int shift) {
6988*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6989*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6990*f5c631daSSadaf Ebrahimi     sqrshrnb(zd, zn, shift);
6991*f5c631daSSadaf Ebrahimi   }
Sqrshrnt(const ZRegister & zd,const ZRegister & zn,int shift)6992*f5c631daSSadaf Ebrahimi   void Sqrshrnt(const ZRegister& zd, const ZRegister& zn, int shift) {
6993*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6994*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
6995*f5c631daSSadaf Ebrahimi     sqrshrnt(zd, zn, shift);
6996*f5c631daSSadaf Ebrahimi   }
Sqrshrunb(const ZRegister & zd,const ZRegister & zn,int shift)6997*f5c631daSSadaf Ebrahimi   void Sqrshrunb(const ZRegister& zd, const ZRegister& zn, int shift) {
6998*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
6999*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7000*f5c631daSSadaf Ebrahimi     sqrshrunb(zd, zn, shift);
7001*f5c631daSSadaf Ebrahimi   }
Sqrshrunt(const ZRegister & zd,const ZRegister & zn,int shift)7002*f5c631daSSadaf Ebrahimi   void Sqrshrunt(const ZRegister& zd, const ZRegister& zn, int shift) {
7003*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7004*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7005*f5c631daSSadaf Ebrahimi     sqrshrunt(zd, zn, shift);
7006*f5c631daSSadaf Ebrahimi   }
Sqshl(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn,int shift)7007*f5c631daSSadaf Ebrahimi   void Sqshl(const ZRegister& zd,
7008*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
7009*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7010*f5c631daSSadaf Ebrahimi              int shift) {
7011*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7012*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
7013*f5c631daSSadaf Ebrahimi     sqshl(zd, pg, zd, shift);
7014*f5c631daSSadaf Ebrahimi   }
7015*f5c631daSSadaf Ebrahimi   void Sqshl(const ZRegister& zd,
7016*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
7017*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7018*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
Sqshlu(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn,int shift)7019*f5c631daSSadaf Ebrahimi   void Sqshlu(const ZRegister& zd,
7020*f5c631daSSadaf Ebrahimi               const PRegisterM& pg,
7021*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
7022*f5c631daSSadaf Ebrahimi               int shift) {
7023*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7024*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
7025*f5c631daSSadaf Ebrahimi     sqshlu(zd, pg, zd, shift);
7026*f5c631daSSadaf Ebrahimi   }
Sqshrnb(const ZRegister & zd,const ZRegister & zn,int shift)7027*f5c631daSSadaf Ebrahimi   void Sqshrnb(const ZRegister& zd, const ZRegister& zn, int shift) {
7028*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7029*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7030*f5c631daSSadaf Ebrahimi     sqshrnb(zd, zn, shift);
7031*f5c631daSSadaf Ebrahimi   }
Sqshrnt(const ZRegister & zd,const ZRegister & zn,int shift)7032*f5c631daSSadaf Ebrahimi   void Sqshrnt(const ZRegister& zd, const ZRegister& zn, int shift) {
7033*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7034*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7035*f5c631daSSadaf Ebrahimi     sqshrnt(zd, zn, shift);
7036*f5c631daSSadaf Ebrahimi   }
Sqshrunb(const ZRegister & zd,const ZRegister & zn,int shift)7037*f5c631daSSadaf Ebrahimi   void Sqshrunb(const ZRegister& zd, const ZRegister& zn, int shift) {
7038*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7039*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7040*f5c631daSSadaf Ebrahimi     sqshrunb(zd, zn, shift);
7041*f5c631daSSadaf Ebrahimi   }
Sqshrunt(const ZRegister & zd,const ZRegister & zn,int shift)7042*f5c631daSSadaf Ebrahimi   void Sqshrunt(const ZRegister& zd, const ZRegister& zn, int shift) {
7043*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7044*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7045*f5c631daSSadaf Ebrahimi     sqshrunt(zd, zn, shift);
7046*f5c631daSSadaf Ebrahimi   }
7047*f5c631daSSadaf Ebrahimi   void Sqsub(const ZRegister& zd,
7048*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
7049*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7050*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
Sqxtnb(const ZRegister & zd,const ZRegister & zn)7051*f5c631daSSadaf Ebrahimi   void Sqxtnb(const ZRegister& zd, const ZRegister& zn) {
7052*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7053*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7054*f5c631daSSadaf Ebrahimi     sqxtnb(zd, zn);
7055*f5c631daSSadaf Ebrahimi   }
Sqxtnt(const ZRegister & zd,const ZRegister & zn)7056*f5c631daSSadaf Ebrahimi   void Sqxtnt(const ZRegister& zd, const ZRegister& zn) {
7057*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7058*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7059*f5c631daSSadaf Ebrahimi     sqxtnt(zd, zn);
7060*f5c631daSSadaf Ebrahimi   }
Sqxtunb(const ZRegister & zd,const ZRegister & zn)7061*f5c631daSSadaf Ebrahimi   void Sqxtunb(const ZRegister& zd, const ZRegister& zn) {
7062*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7063*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7064*f5c631daSSadaf Ebrahimi     sqxtunb(zd, zn);
7065*f5c631daSSadaf Ebrahimi   }
Sqxtunt(const ZRegister & zd,const ZRegister & zn)7066*f5c631daSSadaf Ebrahimi   void Sqxtunt(const ZRegister& zd, const ZRegister& zn) {
7067*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7068*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7069*f5c631daSSadaf Ebrahimi     sqxtunt(zd, zn);
7070*f5c631daSSadaf Ebrahimi   }
Sri(const ZRegister & zd,const ZRegister & zn,int shift)7071*f5c631daSSadaf Ebrahimi   void Sri(const ZRegister& zd, const ZRegister& zn, int shift) {
7072*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7073*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7074*f5c631daSSadaf Ebrahimi     sri(zd, zn, shift);
7075*f5c631daSSadaf Ebrahimi   }
7076*f5c631daSSadaf Ebrahimi   void Srshl(const ZRegister& zd,
7077*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
7078*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7079*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
Srshr(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn,int shift)7080*f5c631daSSadaf Ebrahimi   void Srshr(const ZRegister& zd,
7081*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
7082*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7083*f5c631daSSadaf Ebrahimi              int shift) {
7084*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7085*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
7086*f5c631daSSadaf Ebrahimi     srshr(zd, pg, zd, shift);
7087*f5c631daSSadaf Ebrahimi   }
7088*f5c631daSSadaf Ebrahimi   void Srsra(const ZRegister& zd,
7089*f5c631daSSadaf Ebrahimi              const ZRegister& za,
7090*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7091*f5c631daSSadaf Ebrahimi              int shift);
Sshllb(const ZRegister & zd,const ZRegister & zn,int shift)7092*f5c631daSSadaf Ebrahimi   void Sshllb(const ZRegister& zd, const ZRegister& zn, int shift) {
7093*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7094*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7095*f5c631daSSadaf Ebrahimi     sshllb(zd, zn, shift);
7096*f5c631daSSadaf Ebrahimi   }
Sshllt(const ZRegister & zd,const ZRegister & zn,int shift)7097*f5c631daSSadaf Ebrahimi   void Sshllt(const ZRegister& zd, const ZRegister& zn, int shift) {
7098*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7099*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7100*f5c631daSSadaf Ebrahimi     sshllt(zd, zn, shift);
7101*f5c631daSSadaf Ebrahimi   }
7102*f5c631daSSadaf Ebrahimi   void Ssra(const ZRegister& zd,
7103*f5c631daSSadaf Ebrahimi             const ZRegister& za,
7104*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
7105*f5c631daSSadaf Ebrahimi             int shift);
Ssublb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7106*f5c631daSSadaf Ebrahimi   void Ssublb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7107*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7108*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7109*f5c631daSSadaf Ebrahimi     ssublb(zd, zn, zm);
7110*f5c631daSSadaf Ebrahimi   }
Ssublbt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7111*f5c631daSSadaf Ebrahimi   void Ssublbt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7112*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7113*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7114*f5c631daSSadaf Ebrahimi     ssublbt(zd, zn, zm);
7115*f5c631daSSadaf Ebrahimi   }
Ssublt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7116*f5c631daSSadaf Ebrahimi   void Ssublt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7117*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7118*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7119*f5c631daSSadaf Ebrahimi     ssublt(zd, zn, zm);
7120*f5c631daSSadaf Ebrahimi   }
Ssubltb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7121*f5c631daSSadaf Ebrahimi   void Ssubltb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7122*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7123*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7124*f5c631daSSadaf Ebrahimi     ssubltb(zd, zn, zm);
7125*f5c631daSSadaf Ebrahimi   }
Ssubwb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7126*f5c631daSSadaf Ebrahimi   void Ssubwb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7127*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7128*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7129*f5c631daSSadaf Ebrahimi     ssubwb(zd, zn, zm);
7130*f5c631daSSadaf Ebrahimi   }
Ssubwt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7131*f5c631daSSadaf Ebrahimi   void Ssubwt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7132*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7133*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7134*f5c631daSSadaf Ebrahimi     ssubwt(zd, zn, zm);
7135*f5c631daSSadaf Ebrahimi   }
Subhnb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7136*f5c631daSSadaf Ebrahimi   void Subhnb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7137*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7138*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7139*f5c631daSSadaf Ebrahimi     subhnb(zd, zn, zm);
7140*f5c631daSSadaf Ebrahimi   }
Subhnt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7141*f5c631daSSadaf Ebrahimi   void Subhnt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7142*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7143*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7144*f5c631daSSadaf Ebrahimi     subhnt(zd, zn, zm);
7145*f5c631daSSadaf Ebrahimi   }
7146*f5c631daSSadaf Ebrahimi   void Suqadd(const ZRegister& zd,
7147*f5c631daSSadaf Ebrahimi               const PRegisterM& pg,
7148*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
7149*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
Tbl(const ZRegister & zd,const ZRegister & zn1,const ZRegister & zn2,const ZRegister & zm)7150*f5c631daSSadaf Ebrahimi   void Tbl(const ZRegister& zd,
7151*f5c631daSSadaf Ebrahimi            const ZRegister& zn1,
7152*f5c631daSSadaf Ebrahimi            const ZRegister& zn2,
7153*f5c631daSSadaf Ebrahimi            const ZRegister& zm) {
7154*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7155*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7156*f5c631daSSadaf Ebrahimi     tbl(zd, zn1, zn2, zm);
7157*f5c631daSSadaf Ebrahimi   }
Tbx(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7158*f5c631daSSadaf Ebrahimi   void Tbx(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7159*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7160*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7161*f5c631daSSadaf Ebrahimi     tbx(zd, zn, zm);
7162*f5c631daSSadaf Ebrahimi   }
7163*f5c631daSSadaf Ebrahimi   void Uaba(const ZRegister& zd,
7164*f5c631daSSadaf Ebrahimi             const ZRegister& za,
7165*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
7166*f5c631daSSadaf Ebrahimi             const ZRegister& zm);
7167*f5c631daSSadaf Ebrahimi   void Uabalb(const ZRegister& zd,
7168*f5c631daSSadaf Ebrahimi               const ZRegister& za,
7169*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
7170*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
7171*f5c631daSSadaf Ebrahimi   void Uabalt(const ZRegister& zd,
7172*f5c631daSSadaf Ebrahimi               const ZRegister& za,
7173*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
7174*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
Uabdlb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7175*f5c631daSSadaf Ebrahimi   void Uabdlb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7176*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7177*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7178*f5c631daSSadaf Ebrahimi     uabdlb(zd, zn, zm);
7179*f5c631daSSadaf Ebrahimi   }
Uabdlt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7180*f5c631daSSadaf Ebrahimi   void Uabdlt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7181*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7182*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7183*f5c631daSSadaf Ebrahimi     uabdlt(zd, zn, zm);
7184*f5c631daSSadaf Ebrahimi   }
Uadalp(const ZRegister & zda,const PRegisterM & pg,const ZRegister & zn)7185*f5c631daSSadaf Ebrahimi   void Uadalp(const ZRegister& zda, const PRegisterM& pg, const ZRegister& zn) {
7186*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7187*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7188*f5c631daSSadaf Ebrahimi     uadalp(zda, pg, zn);
7189*f5c631daSSadaf Ebrahimi   }
Uaddlb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7190*f5c631daSSadaf Ebrahimi   void Uaddlb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7191*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7192*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7193*f5c631daSSadaf Ebrahimi     uaddlb(zd, zn, zm);
7194*f5c631daSSadaf Ebrahimi   }
Uaddlt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7195*f5c631daSSadaf Ebrahimi   void Uaddlt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7196*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7197*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7198*f5c631daSSadaf Ebrahimi     uaddlt(zd, zn, zm);
7199*f5c631daSSadaf Ebrahimi   }
Uaddwb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7200*f5c631daSSadaf Ebrahimi   void Uaddwb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7201*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7202*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7203*f5c631daSSadaf Ebrahimi     uaddwb(zd, zn, zm);
7204*f5c631daSSadaf Ebrahimi   }
Uaddwt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7205*f5c631daSSadaf Ebrahimi   void Uaddwt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7206*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7207*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7208*f5c631daSSadaf Ebrahimi     uaddwt(zd, zn, zm);
7209*f5c631daSSadaf Ebrahimi   }
7210*f5c631daSSadaf Ebrahimi   void Uhsub(const ZRegister& zd,
7211*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
7212*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7213*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
7214*f5c631daSSadaf Ebrahimi   void Umaxp(const ZRegister& zd,
7215*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
7216*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7217*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
7218*f5c631daSSadaf Ebrahimi   void Uminp(const ZRegister& zd,
7219*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
7220*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7221*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
7222*f5c631daSSadaf Ebrahimi   void Umlalb(const ZRegister& zd,
7223*f5c631daSSadaf Ebrahimi               const ZRegister& za,
7224*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
7225*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
7226*f5c631daSSadaf Ebrahimi               int index);
7227*f5c631daSSadaf Ebrahimi   void Umlalb(const ZRegister& zd,
7228*f5c631daSSadaf Ebrahimi               const ZRegister& za,
7229*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
7230*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
7231*f5c631daSSadaf Ebrahimi   void Umlalt(const ZRegister& zd,
7232*f5c631daSSadaf Ebrahimi               const ZRegister& za,
7233*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
7234*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
7235*f5c631daSSadaf Ebrahimi               int index);
7236*f5c631daSSadaf Ebrahimi   void Umlalt(const ZRegister& zd,
7237*f5c631daSSadaf Ebrahimi               const ZRegister& za,
7238*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
7239*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
7240*f5c631daSSadaf Ebrahimi   void Umlslb(const ZRegister& zd,
7241*f5c631daSSadaf Ebrahimi               const ZRegister& za,
7242*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
7243*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
7244*f5c631daSSadaf Ebrahimi               int index);
7245*f5c631daSSadaf Ebrahimi   void Umlslb(const ZRegister& zd,
7246*f5c631daSSadaf Ebrahimi               const ZRegister& za,
7247*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
7248*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
7249*f5c631daSSadaf Ebrahimi   void Umlslt(const ZRegister& zd,
7250*f5c631daSSadaf Ebrahimi               const ZRegister& za,
7251*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
7252*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
7253*f5c631daSSadaf Ebrahimi               int index);
7254*f5c631daSSadaf Ebrahimi   void Umlslt(const ZRegister& zd,
7255*f5c631daSSadaf Ebrahimi               const ZRegister& za,
7256*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
7257*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
Umulh(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7258*f5c631daSSadaf Ebrahimi   void Umulh(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7259*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7260*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7261*f5c631daSSadaf Ebrahimi     umulh(zd, zn, zm);
7262*f5c631daSSadaf Ebrahimi   }
Umullb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm,int index)7263*f5c631daSSadaf Ebrahimi   void Umullb(const ZRegister& zd,
7264*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
7265*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
7266*f5c631daSSadaf Ebrahimi               int index) {
7267*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7268*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7269*f5c631daSSadaf Ebrahimi     umullb(zd, zn, zm, index);
7270*f5c631daSSadaf Ebrahimi   }
Umullb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7271*f5c631daSSadaf Ebrahimi   void Umullb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7272*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7273*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7274*f5c631daSSadaf Ebrahimi     umullb(zd, zn, zm);
7275*f5c631daSSadaf Ebrahimi   }
Umullt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm,int index)7276*f5c631daSSadaf Ebrahimi   void Umullt(const ZRegister& zd,
7277*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
7278*f5c631daSSadaf Ebrahimi               const ZRegister& zm,
7279*f5c631daSSadaf Ebrahimi               int index) {
7280*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7281*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7282*f5c631daSSadaf Ebrahimi     umullt(zd, zn, zm, index);
7283*f5c631daSSadaf Ebrahimi   }
Umullt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7284*f5c631daSSadaf Ebrahimi   void Umullt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7285*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7286*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7287*f5c631daSSadaf Ebrahimi     umullt(zd, zn, zm);
7288*f5c631daSSadaf Ebrahimi   }
7289*f5c631daSSadaf Ebrahimi   void Uqrshl(const ZRegister& zd,
7290*f5c631daSSadaf Ebrahimi               const PRegisterM& pg,
7291*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
7292*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
Uqrshrnb(const ZRegister & zd,const ZRegister & zn,int shift)7293*f5c631daSSadaf Ebrahimi   void Uqrshrnb(const ZRegister& zd, const ZRegister& zn, int shift) {
7294*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7295*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7296*f5c631daSSadaf Ebrahimi     uqrshrnb(zd, zn, shift);
7297*f5c631daSSadaf Ebrahimi   }
Uqrshrnt(const ZRegister & zd,const ZRegister & zn,int shift)7298*f5c631daSSadaf Ebrahimi   void Uqrshrnt(const ZRegister& zd, const ZRegister& zn, int shift) {
7299*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7300*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7301*f5c631daSSadaf Ebrahimi     uqrshrnt(zd, zn, shift);
7302*f5c631daSSadaf Ebrahimi   }
Uqshl(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn,int shift)7303*f5c631daSSadaf Ebrahimi   void Uqshl(const ZRegister& zd,
7304*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
7305*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7306*f5c631daSSadaf Ebrahimi              int shift) {
7307*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7308*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
7309*f5c631daSSadaf Ebrahimi     uqshl(zd, pg, zd, shift);
7310*f5c631daSSadaf Ebrahimi   }
7311*f5c631daSSadaf Ebrahimi   void Uqshl(const ZRegister& zd,
7312*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
7313*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7314*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
Uqshrnb(const ZRegister & zd,const ZRegister & zn,int shift)7315*f5c631daSSadaf Ebrahimi   void Uqshrnb(const ZRegister& zd, const ZRegister& zn, int shift) {
7316*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7317*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7318*f5c631daSSadaf Ebrahimi     uqshrnb(zd, zn, shift);
7319*f5c631daSSadaf Ebrahimi   }
Uqshrnt(const ZRegister & zd,const ZRegister & zn,int shift)7320*f5c631daSSadaf Ebrahimi   void Uqshrnt(const ZRegister& zd, const ZRegister& zn, int shift) {
7321*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7322*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7323*f5c631daSSadaf Ebrahimi     uqshrnt(zd, zn, shift);
7324*f5c631daSSadaf Ebrahimi   }
7325*f5c631daSSadaf Ebrahimi   void Uqsub(const ZRegister& zd,
7326*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
7327*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7328*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
Uqxtnb(const ZRegister & zd,const ZRegister & zn)7329*f5c631daSSadaf Ebrahimi   void Uqxtnb(const ZRegister& zd, const ZRegister& zn) {
7330*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7331*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7332*f5c631daSSadaf Ebrahimi     uqxtnb(zd, zn);
7333*f5c631daSSadaf Ebrahimi   }
Uqxtnt(const ZRegister & zd,const ZRegister & zn)7334*f5c631daSSadaf Ebrahimi   void Uqxtnt(const ZRegister& zd, const ZRegister& zn) {
7335*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7336*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7337*f5c631daSSadaf Ebrahimi     uqxtnt(zd, zn);
7338*f5c631daSSadaf Ebrahimi   }
Urecpe(const ZRegister & zd,const PRegister & pg,const ZRegister & zn)7339*f5c631daSSadaf Ebrahimi   void Urecpe(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) {
7340*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7341*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zd);
7342*f5c631daSSadaf Ebrahimi     urecpe(zd, pg.Merging(), zn);
7343*f5c631daSSadaf Ebrahimi   }
7344*f5c631daSSadaf Ebrahimi   void Urshl(const ZRegister& zd,
7345*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
7346*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7347*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
Urshr(const ZRegister & zd,const PRegisterM & pg,const ZRegister & zn,int shift)7348*f5c631daSSadaf Ebrahimi   void Urshr(const ZRegister& zd,
7349*f5c631daSSadaf Ebrahimi              const PRegisterM& pg,
7350*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7351*f5c631daSSadaf Ebrahimi              int shift) {
7352*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7353*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zn);
7354*f5c631daSSadaf Ebrahimi     urshr(zd, pg, zd, shift);
7355*f5c631daSSadaf Ebrahimi   }
Ursqrte(const ZRegister & zd,const PRegister & pg,const ZRegister & zn)7356*f5c631daSSadaf Ebrahimi   void Ursqrte(const ZRegister& zd, const PRegister& pg, const ZRegister& zn) {
7357*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7358*f5c631daSSadaf Ebrahimi     MovprfxHelperScope guard(this, zd, pg, zd);
7359*f5c631daSSadaf Ebrahimi     ursqrte(zd, pg.Merging(), zn);
7360*f5c631daSSadaf Ebrahimi   }
7361*f5c631daSSadaf Ebrahimi   void Ursra(const ZRegister& zd,
7362*f5c631daSSadaf Ebrahimi              const ZRegister& za,
7363*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7364*f5c631daSSadaf Ebrahimi              int shift);
Ushllb(const ZRegister & zd,const ZRegister & zn,int shift)7365*f5c631daSSadaf Ebrahimi   void Ushllb(const ZRegister& zd, const ZRegister& zn, int shift) {
7366*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7367*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7368*f5c631daSSadaf Ebrahimi     ushllb(zd, zn, shift);
7369*f5c631daSSadaf Ebrahimi   }
Ushllt(const ZRegister & zd,const ZRegister & zn,int shift)7370*f5c631daSSadaf Ebrahimi   void Ushllt(const ZRegister& zd, const ZRegister& zn, int shift) {
7371*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7372*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7373*f5c631daSSadaf Ebrahimi     ushllt(zd, zn, shift);
7374*f5c631daSSadaf Ebrahimi   }
7375*f5c631daSSadaf Ebrahimi   void Usqadd(const ZRegister& zd,
7376*f5c631daSSadaf Ebrahimi               const PRegisterM& pg,
7377*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
7378*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
7379*f5c631daSSadaf Ebrahimi   void Usra(const ZRegister& zd,
7380*f5c631daSSadaf Ebrahimi             const ZRegister& za,
7381*f5c631daSSadaf Ebrahimi             const ZRegister& zn,
7382*f5c631daSSadaf Ebrahimi             int shift);
Usublb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7383*f5c631daSSadaf Ebrahimi   void Usublb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7384*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7385*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7386*f5c631daSSadaf Ebrahimi     usublb(zd, zn, zm);
7387*f5c631daSSadaf Ebrahimi   }
Usublt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7388*f5c631daSSadaf Ebrahimi   void Usublt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7389*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7390*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7391*f5c631daSSadaf Ebrahimi     usublt(zd, zn, zm);
7392*f5c631daSSadaf Ebrahimi   }
Usubwb(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7393*f5c631daSSadaf Ebrahimi   void Usubwb(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7394*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7395*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7396*f5c631daSSadaf Ebrahimi     usubwb(zd, zn, zm);
7397*f5c631daSSadaf Ebrahimi   }
Usubwt(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm)7398*f5c631daSSadaf Ebrahimi   void Usubwt(const ZRegister& zd, const ZRegister& zn, const ZRegister& zm) {
7399*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7400*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7401*f5c631daSSadaf Ebrahimi     usubwt(zd, zn, zm);
7402*f5c631daSSadaf Ebrahimi   }
Whilege(const PRegisterWithLaneSize & pd,const Register & rn,const Register & rm)7403*f5c631daSSadaf Ebrahimi   void Whilege(const PRegisterWithLaneSize& pd,
7404*f5c631daSSadaf Ebrahimi                const Register& rn,
7405*f5c631daSSadaf Ebrahimi                const Register& rm) {
7406*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7407*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7408*f5c631daSSadaf Ebrahimi     whilege(pd, rn, rm);
7409*f5c631daSSadaf Ebrahimi   }
Whilegt(const PRegisterWithLaneSize & pd,const Register & rn,const Register & rm)7410*f5c631daSSadaf Ebrahimi   void Whilegt(const PRegisterWithLaneSize& pd,
7411*f5c631daSSadaf Ebrahimi                const Register& rn,
7412*f5c631daSSadaf Ebrahimi                const Register& rm) {
7413*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7414*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7415*f5c631daSSadaf Ebrahimi     whilegt(pd, rn, rm);
7416*f5c631daSSadaf Ebrahimi   }
Whilehi(const PRegisterWithLaneSize & pd,const Register & rn,const Register & rm)7417*f5c631daSSadaf Ebrahimi   void Whilehi(const PRegisterWithLaneSize& pd,
7418*f5c631daSSadaf Ebrahimi                const Register& rn,
7419*f5c631daSSadaf Ebrahimi                const Register& rm) {
7420*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7421*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7422*f5c631daSSadaf Ebrahimi     whilehi(pd, rn, rm);
7423*f5c631daSSadaf Ebrahimi   }
Whilehs(const PRegisterWithLaneSize & pd,const Register & rn,const Register & rm)7424*f5c631daSSadaf Ebrahimi   void Whilehs(const PRegisterWithLaneSize& pd,
7425*f5c631daSSadaf Ebrahimi                const Register& rn,
7426*f5c631daSSadaf Ebrahimi                const Register& rm) {
7427*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7428*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7429*f5c631daSSadaf Ebrahimi     whilehs(pd, rn, rm);
7430*f5c631daSSadaf Ebrahimi   }
Whilerw(const PRegisterWithLaneSize & pd,const Register & rn,const Register & rm)7431*f5c631daSSadaf Ebrahimi   void Whilerw(const PRegisterWithLaneSize& pd,
7432*f5c631daSSadaf Ebrahimi                const Register& rn,
7433*f5c631daSSadaf Ebrahimi                const Register& rm) {
7434*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7435*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7436*f5c631daSSadaf Ebrahimi     whilerw(pd, rn, rm);
7437*f5c631daSSadaf Ebrahimi   }
Whilewr(const PRegisterWithLaneSize & pd,const Register & rn,const Register & rm)7438*f5c631daSSadaf Ebrahimi   void Whilewr(const PRegisterWithLaneSize& pd,
7439*f5c631daSSadaf Ebrahimi                const Register& rn,
7440*f5c631daSSadaf Ebrahimi                const Register& rm) {
7441*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7442*f5c631daSSadaf Ebrahimi     SingleEmissionCheckScope guard(this);
7443*f5c631daSSadaf Ebrahimi     whilewr(pd, rn, rm);
7444*f5c631daSSadaf Ebrahimi   }
Xar(const ZRegister & zd,const ZRegister & zn,const ZRegister & zm,int shift)7445*f5c631daSSadaf Ebrahimi   void Xar(const ZRegister& zd,
7446*f5c631daSSadaf Ebrahimi            const ZRegister& zn,
7447*f5c631daSSadaf Ebrahimi            const ZRegister& zm,
7448*f5c631daSSadaf Ebrahimi            int shift) {
7449*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(allow_macro_instructions_);
7450*f5c631daSSadaf Ebrahimi     if (zd.Aliases(zm)) {
7451*f5c631daSSadaf Ebrahimi       SingleEmissionCheckScope guard(this);
7452*f5c631daSSadaf Ebrahimi       xar(zd, zm, zn, shift);
7453*f5c631daSSadaf Ebrahimi     } else {
7454*f5c631daSSadaf Ebrahimi       MovprfxHelperScope guard(this, zd, zn);
7455*f5c631daSSadaf Ebrahimi       xar(zd, zd, zm, shift);
7456*f5c631daSSadaf Ebrahimi     }
7457*f5c631daSSadaf Ebrahimi   }
7458*f5c631daSSadaf Ebrahimi   void Fmmla(const ZRegister& zd,
7459*f5c631daSSadaf Ebrahimi              const ZRegister& za,
7460*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7461*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
7462*f5c631daSSadaf Ebrahimi   void Smmla(const ZRegister& zd,
7463*f5c631daSSadaf Ebrahimi              const ZRegister& za,
7464*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7465*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
7466*f5c631daSSadaf Ebrahimi   void Ummla(const ZRegister& zd,
7467*f5c631daSSadaf Ebrahimi              const ZRegister& za,
7468*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7469*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
7470*f5c631daSSadaf Ebrahimi   void Usmmla(const ZRegister& zd,
7471*f5c631daSSadaf Ebrahimi               const ZRegister& za,
7472*f5c631daSSadaf Ebrahimi               const ZRegister& zn,
7473*f5c631daSSadaf Ebrahimi               const ZRegister& zm);
7474*f5c631daSSadaf Ebrahimi   void Usdot(const ZRegister& zd,
7475*f5c631daSSadaf Ebrahimi              const ZRegister& za,
7476*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7477*f5c631daSSadaf Ebrahimi              const ZRegister& zm);
7478*f5c631daSSadaf Ebrahimi   void Usdot(const ZRegister& zd,
7479*f5c631daSSadaf Ebrahimi              const ZRegister& za,
7480*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7481*f5c631daSSadaf Ebrahimi              const ZRegister& zm,
7482*f5c631daSSadaf Ebrahimi              int index);
7483*f5c631daSSadaf Ebrahimi   void Sudot(const ZRegister& zd,
7484*f5c631daSSadaf Ebrahimi              const ZRegister& za,
7485*f5c631daSSadaf Ebrahimi              const ZRegister& zn,
7486*f5c631daSSadaf Ebrahimi              const ZRegister& zm,
7487*f5c631daSSadaf Ebrahimi              int index);
7488*f5c631daSSadaf Ebrahimi 
7489*f5c631daSSadaf Ebrahimi   template <typename T>
CreateLiteralDestroyedWithPool(T value)7490*f5c631daSSadaf Ebrahimi   Literal<T>* CreateLiteralDestroyedWithPool(T value) {
7491*f5c631daSSadaf Ebrahimi     return new Literal<T>(value,
7492*f5c631daSSadaf Ebrahimi                           &literal_pool_,
7493*f5c631daSSadaf Ebrahimi                           RawLiteral::kDeletedOnPoolDestruction);
7494*f5c631daSSadaf Ebrahimi   }
7495*f5c631daSSadaf Ebrahimi 
7496*f5c631daSSadaf Ebrahimi   template <typename T>
CreateLiteralDestroyedWithPool(T high64,T low64)7497*f5c631daSSadaf Ebrahimi   Literal<T>* CreateLiteralDestroyedWithPool(T high64, T low64) {
7498*f5c631daSSadaf Ebrahimi     return new Literal<T>(high64,
7499*f5c631daSSadaf Ebrahimi                           low64,
7500*f5c631daSSadaf Ebrahimi                           &literal_pool_,
7501*f5c631daSSadaf Ebrahimi                           RawLiteral::kDeletedOnPoolDestruction);
7502*f5c631daSSadaf Ebrahimi   }
7503*f5c631daSSadaf Ebrahimi 
7504*f5c631daSSadaf Ebrahimi   // Push the system stack pointer (sp) down to allow the same to be done to
7505*f5c631daSSadaf Ebrahimi   // the current stack pointer (according to StackPointer()). This must be
7506*f5c631daSSadaf Ebrahimi   // called _before_ accessing the memory.
7507*f5c631daSSadaf Ebrahimi   //
7508*f5c631daSSadaf Ebrahimi   // This is necessary when pushing or otherwise adding things to the stack, to
7509*f5c631daSSadaf Ebrahimi   // satisfy the AAPCS64 constraint that the memory below the system stack
7510*f5c631daSSadaf Ebrahimi   // pointer is not accessed.
7511*f5c631daSSadaf Ebrahimi   //
7512*f5c631daSSadaf Ebrahimi   // This method asserts that StackPointer() is not sp, since the call does
7513*f5c631daSSadaf Ebrahimi   // not make sense in that context.
7514*f5c631daSSadaf Ebrahimi   //
7515*f5c631daSSadaf Ebrahimi   // TODO: This method can only accept values of 'space' that can be encoded in
7516*f5c631daSSadaf Ebrahimi   // one instruction. Refer to the implementation for details.
7517*f5c631daSSadaf Ebrahimi   void BumpSystemStackPointer(const Operand& space);
7518*f5c631daSSadaf Ebrahimi 
AllowMacroInstructions()7519*f5c631daSSadaf Ebrahimi   virtual bool AllowMacroInstructions() const VIXL_OVERRIDE {
7520*f5c631daSSadaf Ebrahimi     return allow_macro_instructions_;
7521*f5c631daSSadaf Ebrahimi   }
7522*f5c631daSSadaf Ebrahimi 
ArePoolsBlocked()7523*f5c631daSSadaf Ebrahimi   virtual bool ArePoolsBlocked() const VIXL_OVERRIDE {
7524*f5c631daSSadaf Ebrahimi     return IsLiteralPoolBlocked() && IsVeneerPoolBlocked();
7525*f5c631daSSadaf Ebrahimi   }
7526*f5c631daSSadaf Ebrahimi 
SetGenerateSimulatorCode(bool value)7527*f5c631daSSadaf Ebrahimi   void SetGenerateSimulatorCode(bool value) {
7528*f5c631daSSadaf Ebrahimi     generate_simulator_code_ = value;
7529*f5c631daSSadaf Ebrahimi   }
7530*f5c631daSSadaf Ebrahimi 
GenerateSimulatorCode()7531*f5c631daSSadaf Ebrahimi   bool GenerateSimulatorCode() const { return generate_simulator_code_; }
7532*f5c631daSSadaf Ebrahimi 
GetLiteralPoolSize()7533*f5c631daSSadaf Ebrahimi   size_t GetLiteralPoolSize() const { return literal_pool_.GetSize(); }
7534*f5c631daSSadaf Ebrahimi   VIXL_DEPRECATED("GetLiteralPoolSize", size_t LiteralPoolSize() const) {
7535*f5c631daSSadaf Ebrahimi     return GetLiteralPoolSize();
7536*f5c631daSSadaf Ebrahimi   }
7537*f5c631daSSadaf Ebrahimi 
GetLiteralPoolMaxSize()7538*f5c631daSSadaf Ebrahimi   size_t GetLiteralPoolMaxSize() const { return literal_pool_.GetMaxSize(); }
7539*f5c631daSSadaf Ebrahimi   VIXL_DEPRECATED("GetLiteralPoolMaxSize", size_t LiteralPoolMaxSize() const) {
7540*f5c631daSSadaf Ebrahimi     return GetLiteralPoolMaxSize();
7541*f5c631daSSadaf Ebrahimi   }
7542*f5c631daSSadaf Ebrahimi 
GetVeneerPoolMaxSize()7543*f5c631daSSadaf Ebrahimi   size_t GetVeneerPoolMaxSize() const { return veneer_pool_.GetMaxSize(); }
7544*f5c631daSSadaf Ebrahimi   VIXL_DEPRECATED("GetVeneerPoolMaxSize", size_t VeneerPoolMaxSize() const) {
7545*f5c631daSSadaf Ebrahimi     return GetVeneerPoolMaxSize();
7546*f5c631daSSadaf Ebrahimi   }
7547*f5c631daSSadaf Ebrahimi 
7548*f5c631daSSadaf Ebrahimi   // The number of unresolved branches that may require a veneer.
GetNumberOfPotentialVeneers()7549*f5c631daSSadaf Ebrahimi   int GetNumberOfPotentialVeneers() const {
7550*f5c631daSSadaf Ebrahimi     return veneer_pool_.GetNumberOfPotentialVeneers();
7551*f5c631daSSadaf Ebrahimi   }
7552*f5c631daSSadaf Ebrahimi   VIXL_DEPRECATED("GetNumberOfPotentialVeneers",
NumberOfPotentialVeneers()7553*f5c631daSSadaf Ebrahimi                   int NumberOfPotentialVeneers() const) {
7554*f5c631daSSadaf Ebrahimi     return GetNumberOfPotentialVeneers();
7555*f5c631daSSadaf Ebrahimi   }
7556*f5c631daSSadaf Ebrahimi 
GetNextCheckPoint()7557*f5c631daSSadaf Ebrahimi   ptrdiff_t GetNextCheckPoint() const {
7558*f5c631daSSadaf Ebrahimi     ptrdiff_t next_checkpoint_for_pools =
7559*f5c631daSSadaf Ebrahimi         std::min(literal_pool_.GetCheckpoint(), veneer_pool_.GetCheckpoint());
7560*f5c631daSSadaf Ebrahimi     return std::min(next_checkpoint_for_pools,
7561*f5c631daSSadaf Ebrahimi                     static_cast<ptrdiff_t>(GetBuffer().GetCapacity()));
7562*f5c631daSSadaf Ebrahimi   }
7563*f5c631daSSadaf Ebrahimi   VIXL_DEPRECATED("GetNextCheckPoint", ptrdiff_t NextCheckPoint()) {
7564*f5c631daSSadaf Ebrahimi     return GetNextCheckPoint();
7565*f5c631daSSadaf Ebrahimi   }
7566*f5c631daSSadaf Ebrahimi 
EmitLiteralPool(LiteralPool::EmitOption option)7567*f5c631daSSadaf Ebrahimi   void EmitLiteralPool(LiteralPool::EmitOption option) {
7568*f5c631daSSadaf Ebrahimi     if (!literal_pool_.IsEmpty()) literal_pool_.Emit(option);
7569*f5c631daSSadaf Ebrahimi 
7570*f5c631daSSadaf Ebrahimi     checkpoint_ = GetNextCheckPoint();
7571*f5c631daSSadaf Ebrahimi     recommended_checkpoint_ = literal_pool_.GetNextRecommendedCheckpoint();
7572*f5c631daSSadaf Ebrahimi   }
7573*f5c631daSSadaf Ebrahimi 
7574*f5c631daSSadaf Ebrahimi   void CheckEmitFor(size_t amount);
EnsureEmitFor(size_t amount)7575*f5c631daSSadaf Ebrahimi   void EnsureEmitFor(size_t amount) {
7576*f5c631daSSadaf Ebrahimi     ptrdiff_t offset = amount;
7577*f5c631daSSadaf Ebrahimi     ptrdiff_t max_pools_size =
7578*f5c631daSSadaf Ebrahimi         literal_pool_.GetMaxSize() + veneer_pool_.GetMaxSize();
7579*f5c631daSSadaf Ebrahimi     ptrdiff_t cursor = GetCursorOffset();
7580*f5c631daSSadaf Ebrahimi     if ((cursor >= recommended_checkpoint_) ||
7581*f5c631daSSadaf Ebrahimi         ((cursor + offset + max_pools_size) >= checkpoint_)) {
7582*f5c631daSSadaf Ebrahimi       CheckEmitFor(amount);
7583*f5c631daSSadaf Ebrahimi     }
7584*f5c631daSSadaf Ebrahimi   }
7585*f5c631daSSadaf Ebrahimi 
7586*f5c631daSSadaf Ebrahimi   void CheckEmitPoolsFor(size_t amount);
EnsureEmitPoolsFor(size_t amount)7587*f5c631daSSadaf Ebrahimi   virtual void EnsureEmitPoolsFor(size_t amount) VIXL_OVERRIDE {
7588*f5c631daSSadaf Ebrahimi     ptrdiff_t offset = amount;
7589*f5c631daSSadaf Ebrahimi     ptrdiff_t max_pools_size =
7590*f5c631daSSadaf Ebrahimi         literal_pool_.GetMaxSize() + veneer_pool_.GetMaxSize();
7591*f5c631daSSadaf Ebrahimi     ptrdiff_t cursor = GetCursorOffset();
7592*f5c631daSSadaf Ebrahimi     if ((cursor >= recommended_checkpoint_) ||
7593*f5c631daSSadaf Ebrahimi         ((cursor + offset + max_pools_size) >= checkpoint_)) {
7594*f5c631daSSadaf Ebrahimi       CheckEmitPoolsFor(amount);
7595*f5c631daSSadaf Ebrahimi     }
7596*f5c631daSSadaf Ebrahimi   }
7597*f5c631daSSadaf Ebrahimi 
7598*f5c631daSSadaf Ebrahimi   // Set the current stack pointer, but don't generate any code.
SetStackPointer(const Register & stack_pointer)7599*f5c631daSSadaf Ebrahimi   void SetStackPointer(const Register& stack_pointer) {
7600*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(!GetScratchRegisterList()->IncludesAliasOf(stack_pointer));
7601*f5c631daSSadaf Ebrahimi     sp_ = stack_pointer;
7602*f5c631daSSadaf Ebrahimi   }
7603*f5c631daSSadaf Ebrahimi 
7604*f5c631daSSadaf Ebrahimi   // Return the current stack pointer, as set by SetStackPointer.
StackPointer()7605*f5c631daSSadaf Ebrahimi   const Register& StackPointer() const { return sp_; }
7606*f5c631daSSadaf Ebrahimi 
GetScratchRegisterList()7607*f5c631daSSadaf Ebrahimi   CPURegList* GetScratchRegisterList() { return &tmp_list_; }
7608*f5c631daSSadaf Ebrahimi   VIXL_DEPRECATED("GetScratchRegisterList", CPURegList* TmpList()) {
7609*f5c631daSSadaf Ebrahimi     return GetScratchRegisterList();
7610*f5c631daSSadaf Ebrahimi   }
7611*f5c631daSSadaf Ebrahimi 
GetScratchVRegisterList()7612*f5c631daSSadaf Ebrahimi   CPURegList* GetScratchVRegisterList() { return &v_tmp_list_; }
7613*f5c631daSSadaf Ebrahimi   VIXL_DEPRECATED("GetScratchVRegisterList", CPURegList* FPTmpList()) {
7614*f5c631daSSadaf Ebrahimi     return GetScratchVRegisterList();
7615*f5c631daSSadaf Ebrahimi   }
7616*f5c631daSSadaf Ebrahimi 
GetScratchPRegisterList()7617*f5c631daSSadaf Ebrahimi   CPURegList* GetScratchPRegisterList() { return &p_tmp_list_; }
7618*f5c631daSSadaf Ebrahimi 
7619*f5c631daSSadaf Ebrahimi   // Get or set the current (most-deeply-nested) UseScratchRegisterScope.
SetCurrentScratchRegisterScope(UseScratchRegisterScope * scope)7620*f5c631daSSadaf Ebrahimi   void SetCurrentScratchRegisterScope(UseScratchRegisterScope* scope) {
7621*f5c631daSSadaf Ebrahimi     current_scratch_scope_ = scope;
7622*f5c631daSSadaf Ebrahimi   }
GetCurrentScratchRegisterScope()7623*f5c631daSSadaf Ebrahimi   UseScratchRegisterScope* GetCurrentScratchRegisterScope() {
7624*f5c631daSSadaf Ebrahimi     return current_scratch_scope_;
7625*f5c631daSSadaf Ebrahimi   }
7626*f5c631daSSadaf Ebrahimi 
7627*f5c631daSSadaf Ebrahimi   // Like printf, but print at run-time from generated code.
7628*f5c631daSSadaf Ebrahimi   //
7629*f5c631daSSadaf Ebrahimi   // The caller must ensure that arguments for floating-point placeholders
7630*f5c631daSSadaf Ebrahimi   // (such as %e, %f or %g) are VRegisters in format 1S or 1D, and that
7631*f5c631daSSadaf Ebrahimi   // arguments for integer placeholders are Registers.
7632*f5c631daSSadaf Ebrahimi   //
7633*f5c631daSSadaf Ebrahimi   // At the moment it is only possible to print the value of sp if it is the
7634*f5c631daSSadaf Ebrahimi   // current stack pointer. Otherwise, the MacroAssembler will automatically
7635*f5c631daSSadaf Ebrahimi   // update sp on every push (using BumpSystemStackPointer), so determining its
7636*f5c631daSSadaf Ebrahimi   // value is difficult.
7637*f5c631daSSadaf Ebrahimi   //
7638*f5c631daSSadaf Ebrahimi   // Format placeholders that refer to more than one argument, or to a specific
7639*f5c631daSSadaf Ebrahimi   // argument, are not supported. This includes formats like "%1$d" or "%.*d".
7640*f5c631daSSadaf Ebrahimi   //
7641*f5c631daSSadaf Ebrahimi   // This function automatically preserves caller-saved registers so that
7642*f5c631daSSadaf Ebrahimi   // calling code can use Printf at any point without having to worry about
7643*f5c631daSSadaf Ebrahimi   // corruption. The preservation mechanism generates a lot of code. If this is
7644*f5c631daSSadaf Ebrahimi   // a problem, preserve the important registers manually and then call
7645*f5c631daSSadaf Ebrahimi   // PrintfNoPreserve. Callee-saved registers are not used by Printf, and are
7646*f5c631daSSadaf Ebrahimi   // implicitly preserved.
7647*f5c631daSSadaf Ebrahimi   void Printf(const char* format,
7648*f5c631daSSadaf Ebrahimi               CPURegister arg0 = NoCPUReg,
7649*f5c631daSSadaf Ebrahimi               CPURegister arg1 = NoCPUReg,
7650*f5c631daSSadaf Ebrahimi               CPURegister arg2 = NoCPUReg,
7651*f5c631daSSadaf Ebrahimi               CPURegister arg3 = NoCPUReg);
7652*f5c631daSSadaf Ebrahimi 
7653*f5c631daSSadaf Ebrahimi   // Like Printf, but don't preserve any caller-saved registers, not even 'lr'.
7654*f5c631daSSadaf Ebrahimi   //
7655*f5c631daSSadaf Ebrahimi   // The return code from the system printf call will be returned in x0.
7656*f5c631daSSadaf Ebrahimi   void PrintfNoPreserve(const char* format,
7657*f5c631daSSadaf Ebrahimi                         const CPURegister& arg0 = NoCPUReg,
7658*f5c631daSSadaf Ebrahimi                         const CPURegister& arg1 = NoCPUReg,
7659*f5c631daSSadaf Ebrahimi                         const CPURegister& arg2 = NoCPUReg,
7660*f5c631daSSadaf Ebrahimi                         const CPURegister& arg3 = NoCPUReg);
7661*f5c631daSSadaf Ebrahimi 
7662*f5c631daSSadaf Ebrahimi   // Trace control when running the debug simulator.
7663*f5c631daSSadaf Ebrahimi   //
7664*f5c631daSSadaf Ebrahimi   // For example:
7665*f5c631daSSadaf Ebrahimi   //
7666*f5c631daSSadaf Ebrahimi   // __ Trace(LOG_REGS, TRACE_ENABLE);
7667*f5c631daSSadaf Ebrahimi   // Will add registers to the trace if it wasn't already the case.
7668*f5c631daSSadaf Ebrahimi   //
7669*f5c631daSSadaf Ebrahimi   // __ Trace(LOG_DISASM, TRACE_DISABLE);
7670*f5c631daSSadaf Ebrahimi   // Will stop logging disassembly. It has no effect if the disassembly wasn't
7671*f5c631daSSadaf Ebrahimi   // already being logged.
7672*f5c631daSSadaf Ebrahimi   void Trace(TraceParameters parameters, TraceCommand command);
7673*f5c631daSSadaf Ebrahimi 
7674*f5c631daSSadaf Ebrahimi   // Log the requested data independently of what is being traced.
7675*f5c631daSSadaf Ebrahimi   //
7676*f5c631daSSadaf Ebrahimi   // For example:
7677*f5c631daSSadaf Ebrahimi   //
7678*f5c631daSSadaf Ebrahimi   // __ Log(LOG_FLAGS)
7679*f5c631daSSadaf Ebrahimi   // Will output the flags.
7680*f5c631daSSadaf Ebrahimi   void Log(TraceParameters parameters);
7681*f5c631daSSadaf Ebrahimi 
7682*f5c631daSSadaf Ebrahimi   // Enable or disable CPU features dynamically. This mechanism allows users to
7683*f5c631daSSadaf Ebrahimi   // strictly check the use of CPU features in different regions of code.
7684*f5c631daSSadaf Ebrahimi   void SetSimulatorCPUFeatures(const CPUFeatures& features);
7685*f5c631daSSadaf Ebrahimi   void EnableSimulatorCPUFeatures(const CPUFeatures& features);
7686*f5c631daSSadaf Ebrahimi   void DisableSimulatorCPUFeatures(const CPUFeatures& features);
7687*f5c631daSSadaf Ebrahimi   void SaveSimulatorCPUFeatures();
7688*f5c631daSSadaf Ebrahimi   void RestoreSimulatorCPUFeatures();
7689*f5c631daSSadaf Ebrahimi 
GetLiteralPool()7690*f5c631daSSadaf Ebrahimi   LiteralPool* GetLiteralPool() { return &literal_pool_; }
7691*f5c631daSSadaf Ebrahimi 
7692*f5c631daSSadaf Ebrahimi // Support for simulated runtime calls.
7693*f5c631daSSadaf Ebrahimi 
7694*f5c631daSSadaf Ebrahimi // `CallRuntime` requires variadic templating, that is only available from
7695*f5c631daSSadaf Ebrahimi // C++11.
7696*f5c631daSSadaf Ebrahimi #if __cplusplus >= 201103L
7697*f5c631daSSadaf Ebrahimi #define VIXL_HAS_MACROASSEMBLER_RUNTIME_CALL_SUPPORT
7698*f5c631daSSadaf Ebrahimi #endif  // #if __cplusplus >= 201103L
7699*f5c631daSSadaf Ebrahimi 
7700*f5c631daSSadaf Ebrahimi #ifdef VIXL_HAS_MACROASSEMBLER_RUNTIME_CALL_SUPPORT
7701*f5c631daSSadaf Ebrahimi   template <typename R, typename... P>
7702*f5c631daSSadaf Ebrahimi   void CallRuntimeHelper(R (*function)(P...), RuntimeCallType call_type);
7703*f5c631daSSadaf Ebrahimi 
7704*f5c631daSSadaf Ebrahimi   template <typename R, typename... P>
CallRuntime(R (* function)(P...))7705*f5c631daSSadaf Ebrahimi   void CallRuntime(R (*function)(P...)) {
7706*f5c631daSSadaf Ebrahimi     CallRuntimeHelper(function, kCallRuntime);
7707*f5c631daSSadaf Ebrahimi   }
7708*f5c631daSSadaf Ebrahimi 
7709*f5c631daSSadaf Ebrahimi   template <typename R, typename... P>
TailCallRuntime(R (* function)(P...))7710*f5c631daSSadaf Ebrahimi   void TailCallRuntime(R (*function)(P...)) {
7711*f5c631daSSadaf Ebrahimi     CallRuntimeHelper(function, kTailCallRuntime);
7712*f5c631daSSadaf Ebrahimi   }
7713*f5c631daSSadaf Ebrahimi #endif  // #ifdef VIXL_HAS_MACROASSEMBLER_RUNTIME_CALL_SUPPORT
7714*f5c631daSSadaf Ebrahimi 
7715*f5c631daSSadaf Ebrahimi  protected:
BlockLiteralPool()7716*f5c631daSSadaf Ebrahimi   void BlockLiteralPool() { literal_pool_.Block(); }
ReleaseLiteralPool()7717*f5c631daSSadaf Ebrahimi   void ReleaseLiteralPool() { literal_pool_.Release(); }
IsLiteralPoolBlocked()7718*f5c631daSSadaf Ebrahimi   bool IsLiteralPoolBlocked() const { return literal_pool_.IsBlocked(); }
BlockVeneerPool()7719*f5c631daSSadaf Ebrahimi   void BlockVeneerPool() { veneer_pool_.Block(); }
ReleaseVeneerPool()7720*f5c631daSSadaf Ebrahimi   void ReleaseVeneerPool() { veneer_pool_.Release(); }
IsVeneerPoolBlocked()7721*f5c631daSSadaf Ebrahimi   bool IsVeneerPoolBlocked() const { return veneer_pool_.IsBlocked(); }
7722*f5c631daSSadaf Ebrahimi 
BlockPools()7723*f5c631daSSadaf Ebrahimi   virtual void BlockPools() VIXL_OVERRIDE {
7724*f5c631daSSadaf Ebrahimi     BlockLiteralPool();
7725*f5c631daSSadaf Ebrahimi     BlockVeneerPool();
7726*f5c631daSSadaf Ebrahimi   }
7727*f5c631daSSadaf Ebrahimi 
ReleasePools()7728*f5c631daSSadaf Ebrahimi   virtual void ReleasePools() VIXL_OVERRIDE {
7729*f5c631daSSadaf Ebrahimi     ReleaseLiteralPool();
7730*f5c631daSSadaf Ebrahimi     ReleaseVeneerPool();
7731*f5c631daSSadaf Ebrahimi   }
7732*f5c631daSSadaf Ebrahimi 
7733*f5c631daSSadaf Ebrahimi   // The scopes below need to able to block and release a particular pool.
7734*f5c631daSSadaf Ebrahimi   // TODO: Consider removing those scopes or move them to
7735*f5c631daSSadaf Ebrahimi   // code-generation-scopes-vixl.h.
7736*f5c631daSSadaf Ebrahimi   friend class BlockPoolsScope;
7737*f5c631daSSadaf Ebrahimi   friend class BlockLiteralPoolScope;
7738*f5c631daSSadaf Ebrahimi   friend class BlockVeneerPoolScope;
7739*f5c631daSSadaf Ebrahimi 
SetAllowMacroInstructions(bool value)7740*f5c631daSSadaf Ebrahimi   virtual void SetAllowMacroInstructions(bool value) VIXL_OVERRIDE {
7741*f5c631daSSadaf Ebrahimi     allow_macro_instructions_ = value;
7742*f5c631daSSadaf Ebrahimi   }
7743*f5c631daSSadaf Ebrahimi 
7744*f5c631daSSadaf Ebrahimi   // Helper used to query information about code generation and to generate
7745*f5c631daSSadaf Ebrahimi   // code for `csel`.
7746*f5c631daSSadaf Ebrahimi   // Here and for the related helpers below:
7747*f5c631daSSadaf Ebrahimi   // - Code is generated when `masm` is not `NULL`.
7748*f5c631daSSadaf Ebrahimi   // - On return and when set, `should_synthesise_left` and
7749*f5c631daSSadaf Ebrahimi   //   `should_synthesise_right` will indicate whether `left` and `right`
7750*f5c631daSSadaf Ebrahimi   //   should be synthesized in a temporary register.
7751*f5c631daSSadaf Ebrahimi   static void CselHelper(MacroAssembler* masm,
7752*f5c631daSSadaf Ebrahimi                          const Register& rd,
7753*f5c631daSSadaf Ebrahimi                          Operand left,
7754*f5c631daSSadaf Ebrahimi                          Operand right,
7755*f5c631daSSadaf Ebrahimi                          Condition cond,
7756*f5c631daSSadaf Ebrahimi                          bool* should_synthesise_left = NULL,
7757*f5c631daSSadaf Ebrahimi                          bool* should_synthesise_right = NULL);
7758*f5c631daSSadaf Ebrahimi 
7759*f5c631daSSadaf Ebrahimi   // The helper returns `true` if it can handle the specified arguments.
7760*f5c631daSSadaf Ebrahimi   // Also see comments for `CselHelper()`.
7761*f5c631daSSadaf Ebrahimi   static bool CselSubHelperTwoImmediates(MacroAssembler* masm,
7762*f5c631daSSadaf Ebrahimi                                          const Register& rd,
7763*f5c631daSSadaf Ebrahimi                                          int64_t left,
7764*f5c631daSSadaf Ebrahimi                                          int64_t right,
7765*f5c631daSSadaf Ebrahimi                                          Condition cond,
7766*f5c631daSSadaf Ebrahimi                                          bool* should_synthesise_left,
7767*f5c631daSSadaf Ebrahimi                                          bool* should_synthesise_right);
7768*f5c631daSSadaf Ebrahimi 
7769*f5c631daSSadaf Ebrahimi   // See comments for `CselHelper()`.
7770*f5c631daSSadaf Ebrahimi   static bool CselSubHelperTwoOrderedImmediates(MacroAssembler* masm,
7771*f5c631daSSadaf Ebrahimi                                                 const Register& rd,
7772*f5c631daSSadaf Ebrahimi                                                 int64_t left,
7773*f5c631daSSadaf Ebrahimi                                                 int64_t right,
7774*f5c631daSSadaf Ebrahimi                                                 Condition cond);
7775*f5c631daSSadaf Ebrahimi 
7776*f5c631daSSadaf Ebrahimi   // See comments for `CselHelper()`.
7777*f5c631daSSadaf Ebrahimi   static void CselSubHelperRightSmallImmediate(MacroAssembler* masm,
7778*f5c631daSSadaf Ebrahimi                                                UseScratchRegisterScope* temps,
7779*f5c631daSSadaf Ebrahimi                                                const Register& rd,
7780*f5c631daSSadaf Ebrahimi                                                const Operand& left,
7781*f5c631daSSadaf Ebrahimi                                                const Operand& right,
7782*f5c631daSSadaf Ebrahimi                                                Condition cond,
7783*f5c631daSSadaf Ebrahimi                                                bool* should_synthesise_left);
7784*f5c631daSSadaf Ebrahimi 
7785*f5c631daSSadaf Ebrahimi   // Generate code to calculate the address represented by `addr` and write it
7786*f5c631daSSadaf Ebrahimi   // into `xd`. This is used as a common fall-back for out-of-range load and
7787*f5c631daSSadaf Ebrahimi   // store operands.
7788*f5c631daSSadaf Ebrahimi   //
7789*f5c631daSSadaf Ebrahimi   // The vl_divisor_log2 argument is used to scale the VL, for use with
7790*f5c631daSSadaf Ebrahimi   // SVE_MUL_VL.
7791*f5c631daSSadaf Ebrahimi   void CalculateSVEAddress(const Register& xd,
7792*f5c631daSSadaf Ebrahimi                            const SVEMemOperand& addr,
7793*f5c631daSSadaf Ebrahimi                            int vl_divisor_log2 = 0);
7794*f5c631daSSadaf Ebrahimi 
CalculateSVEAddress(const Register & xd,const SVEMemOperand & addr,const CPURegister & rt)7795*f5c631daSSadaf Ebrahimi   void CalculateSVEAddress(const Register& xd,
7796*f5c631daSSadaf Ebrahimi                            const SVEMemOperand& addr,
7797*f5c631daSSadaf Ebrahimi                            const CPURegister& rt) {
7798*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(rt.IsPRegister() || rt.IsZRegister());
7799*f5c631daSSadaf Ebrahimi     int vl_divisor_log2 = rt.IsPRegister() ? kZRegBitsPerPRegBitLog2 : 0;
7800*f5c631daSSadaf Ebrahimi     CalculateSVEAddress(xd, addr, vl_divisor_log2);
7801*f5c631daSSadaf Ebrahimi   }
7802*f5c631daSSadaf Ebrahimi 
SetFPNaNPropagationOption(FPMacroNaNPropagationOption nan_option)7803*f5c631daSSadaf Ebrahimi   void SetFPNaNPropagationOption(FPMacroNaNPropagationOption nan_option) {
7804*f5c631daSSadaf Ebrahimi     fp_nan_propagation_ = nan_option;
7805*f5c631daSSadaf Ebrahimi   }
7806*f5c631daSSadaf Ebrahimi 
ResolveFPNaNPropagationOption(FPMacroNaNPropagationOption * nan_option)7807*f5c631daSSadaf Ebrahimi   void ResolveFPNaNPropagationOption(FPMacroNaNPropagationOption* nan_option) {
7808*f5c631daSSadaf Ebrahimi     // The input option has priority over the option that has set.
7809*f5c631daSSadaf Ebrahimi     if (*nan_option == NoFPMacroNaNPropagationSelected) {
7810*f5c631daSSadaf Ebrahimi       *nan_option = fp_nan_propagation_;
7811*f5c631daSSadaf Ebrahimi     }
7812*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(*nan_option != NoFPMacroNaNPropagationSelected);
7813*f5c631daSSadaf Ebrahimi   }
7814*f5c631daSSadaf Ebrahimi 
7815*f5c631daSSadaf Ebrahimi  private:
7816*f5c631daSSadaf Ebrahimi   // The actual Push and Pop implementations. These don't generate any code
7817*f5c631daSSadaf Ebrahimi   // other than that required for the push or pop. This allows
7818*f5c631daSSadaf Ebrahimi   // (Push|Pop)CPURegList to bundle together setup code for a large block of
7819*f5c631daSSadaf Ebrahimi   // registers.
7820*f5c631daSSadaf Ebrahimi   //
7821*f5c631daSSadaf Ebrahimi   // Note that size is per register, and is specified in bytes.
7822*f5c631daSSadaf Ebrahimi   void PushHelper(int count,
7823*f5c631daSSadaf Ebrahimi                   int size,
7824*f5c631daSSadaf Ebrahimi                   const CPURegister& src0,
7825*f5c631daSSadaf Ebrahimi                   const CPURegister& src1,
7826*f5c631daSSadaf Ebrahimi                   const CPURegister& src2,
7827*f5c631daSSadaf Ebrahimi                   const CPURegister& src3);
7828*f5c631daSSadaf Ebrahimi   void PopHelper(int count,
7829*f5c631daSSadaf Ebrahimi                  int size,
7830*f5c631daSSadaf Ebrahimi                  const CPURegister& dst0,
7831*f5c631daSSadaf Ebrahimi                  const CPURegister& dst1,
7832*f5c631daSSadaf Ebrahimi                  const CPURegister& dst2,
7833*f5c631daSSadaf Ebrahimi                  const CPURegister& dst3);
7834*f5c631daSSadaf Ebrahimi 
7835*f5c631daSSadaf Ebrahimi   void Movi16bitHelper(const VRegister& vd, uint64_t imm);
7836*f5c631daSSadaf Ebrahimi   void Movi32bitHelper(const VRegister& vd, uint64_t imm);
7837*f5c631daSSadaf Ebrahimi   void Movi64bitHelper(const VRegister& vd, uint64_t imm);
7838*f5c631daSSadaf Ebrahimi 
7839*f5c631daSSadaf Ebrahimi   // Perform necessary maintenance operations before a push or pop.
7840*f5c631daSSadaf Ebrahimi   //
7841*f5c631daSSadaf Ebrahimi   // Note that size is per register, and is specified in bytes.
7842*f5c631daSSadaf Ebrahimi   void PrepareForPush(int count, int size);
7843*f5c631daSSadaf Ebrahimi   void PrepareForPop(int count, int size);
7844*f5c631daSSadaf Ebrahimi 
7845*f5c631daSSadaf Ebrahimi   // The actual implementation of load and store operations for CPURegList.
7846*f5c631daSSadaf Ebrahimi   enum LoadStoreCPURegListAction { kLoad, kStore };
7847*f5c631daSSadaf Ebrahimi   void LoadStoreCPURegListHelper(LoadStoreCPURegListAction operation,
7848*f5c631daSSadaf Ebrahimi                                  CPURegList registers,
7849*f5c631daSSadaf Ebrahimi                                  const MemOperand& mem);
7850*f5c631daSSadaf Ebrahimi   // Returns a MemOperand suitable for loading or storing a CPURegList at `dst`.
7851*f5c631daSSadaf Ebrahimi   // This helper may allocate registers from `scratch_scope` and generate code
7852*f5c631daSSadaf Ebrahimi   // to compute an intermediate address. The resulting MemOperand is only valid
7853*f5c631daSSadaf Ebrahimi   // as long as `scratch_scope` remains valid.
7854*f5c631daSSadaf Ebrahimi   MemOperand BaseMemOperandForLoadStoreCPURegList(
7855*f5c631daSSadaf Ebrahimi       const CPURegList& registers,
7856*f5c631daSSadaf Ebrahimi       const MemOperand& mem,
7857*f5c631daSSadaf Ebrahimi       UseScratchRegisterScope* scratch_scope);
7858*f5c631daSSadaf Ebrahimi 
LabelIsOutOfRange(Label * label,ImmBranchType branch_type)7859*f5c631daSSadaf Ebrahimi   bool LabelIsOutOfRange(Label* label, ImmBranchType branch_type) {
7860*f5c631daSSadaf Ebrahimi     return !Instruction::IsValidImmPCOffset(branch_type,
7861*f5c631daSSadaf Ebrahimi                                             label->GetLocation() -
7862*f5c631daSSadaf Ebrahimi                                                 GetCursorOffset());
7863*f5c631daSSadaf Ebrahimi   }
7864*f5c631daSSadaf Ebrahimi 
7865*f5c631daSSadaf Ebrahimi   void ConfigureSimulatorCPUFeaturesHelper(const CPUFeatures& features,
7866*f5c631daSSadaf Ebrahimi                                            DebugHltOpcode action);
7867*f5c631daSSadaf Ebrahimi 
7868*f5c631daSSadaf Ebrahimi   void CompareHelper(Condition cond,
7869*f5c631daSSadaf Ebrahimi                      const PRegisterWithLaneSize& pd,
7870*f5c631daSSadaf Ebrahimi                      const PRegisterZ& pg,
7871*f5c631daSSadaf Ebrahimi                      const ZRegister& zn,
7872*f5c631daSSadaf Ebrahimi                      IntegerOperand imm);
7873*f5c631daSSadaf Ebrahimi 
7874*f5c631daSSadaf Ebrahimi   // E.g. Ld1rb.
7875*f5c631daSSadaf Ebrahimi   typedef void (Assembler::*SVELoadBroadcastFn)(const ZRegister& zt,
7876*f5c631daSSadaf Ebrahimi                                                 const PRegisterZ& pg,
7877*f5c631daSSadaf Ebrahimi                                                 const SVEMemOperand& addr);
7878*f5c631daSSadaf Ebrahimi 
7879*f5c631daSSadaf Ebrahimi   void SVELoadBroadcastImmHelper(const ZRegister& zt,
7880*f5c631daSSadaf Ebrahimi                                  const PRegisterZ& pg,
7881*f5c631daSSadaf Ebrahimi                                  const SVEMemOperand& addr,
7882*f5c631daSSadaf Ebrahimi                                  SVELoadBroadcastFn fn,
7883*f5c631daSSadaf Ebrahimi                                  int divisor);
7884*f5c631daSSadaf Ebrahimi 
7885*f5c631daSSadaf Ebrahimi   // E.g. ldr/str
7886*f5c631daSSadaf Ebrahimi   typedef void (Assembler::*SVELoadStoreFn)(const CPURegister& rt,
7887*f5c631daSSadaf Ebrahimi                                             const SVEMemOperand& addr);
7888*f5c631daSSadaf Ebrahimi 
7889*f5c631daSSadaf Ebrahimi   void SVELoadStoreScalarImmHelper(const CPURegister& rt,
7890*f5c631daSSadaf Ebrahimi                                    const SVEMemOperand& addr,
7891*f5c631daSSadaf Ebrahimi                                    SVELoadStoreFn fn);
7892*f5c631daSSadaf Ebrahimi 
7893*f5c631daSSadaf Ebrahimi   typedef void (Assembler::*SVELoad1Fn)(const ZRegister& zt,
7894*f5c631daSSadaf Ebrahimi                                         const PRegisterZ& pg,
7895*f5c631daSSadaf Ebrahimi                                         const SVEMemOperand& addr);
7896*f5c631daSSadaf Ebrahimi   typedef void (Assembler::*SVEStore1Fn)(const ZRegister& zt,
7897*f5c631daSSadaf Ebrahimi                                          const PRegister& pg,
7898*f5c631daSSadaf Ebrahimi                                          const SVEMemOperand& addr);
7899*f5c631daSSadaf Ebrahimi 
7900*f5c631daSSadaf Ebrahimi   // Helper for predicated Z register loads with addressing modes not directly
7901*f5c631daSSadaf Ebrahimi   // encodable in the instruction. The supported_modifier parameter indicates
7902*f5c631daSSadaf Ebrahimi   // which offset modifier the calling instruction encoder supports (eg.
7903*f5c631daSSadaf Ebrahimi   // SVE_MUL_VL). The ratio log2 of VL to memory access size is passed as
7904*f5c631daSSadaf Ebrahimi   // vl_divisor_log2; pass -1 to indicate no dependency.
7905*f5c631daSSadaf Ebrahimi   template <typename Tg, typename Tf>
7906*f5c631daSSadaf Ebrahimi   void SVELoadStoreNTBroadcastQOHelper(
7907*f5c631daSSadaf Ebrahimi       const ZRegister& zt,
7908*f5c631daSSadaf Ebrahimi       const Tg& pg,
7909*f5c631daSSadaf Ebrahimi       const SVEMemOperand& addr,
7910*f5c631daSSadaf Ebrahimi       Tf fn,
7911*f5c631daSSadaf Ebrahimi       int imm_bits,
7912*f5c631daSSadaf Ebrahimi       int shift_amount,
7913*f5c631daSSadaf Ebrahimi       SVEOffsetModifier supported_modifier = NO_SVE_OFFSET_MODIFIER,
7914*f5c631daSSadaf Ebrahimi       int vl_divisor_log2 = 0);
7915*f5c631daSSadaf Ebrahimi 
7916*f5c631daSSadaf Ebrahimi   template <typename Tg, typename Tf>
7917*f5c631daSSadaf Ebrahimi   void SVELoadStore1Helper(int msize_in_bytes_log2,
7918*f5c631daSSadaf Ebrahimi                            const ZRegister& zt,
7919*f5c631daSSadaf Ebrahimi                            const Tg& pg,
7920*f5c631daSSadaf Ebrahimi                            const SVEMemOperand& addr,
7921*f5c631daSSadaf Ebrahimi                            Tf fn);
7922*f5c631daSSadaf Ebrahimi 
7923*f5c631daSSadaf Ebrahimi   template <typename Tf>
7924*f5c631daSSadaf Ebrahimi   void SVELoadFFHelper(int msize_in_bytes_log2,
7925*f5c631daSSadaf Ebrahimi                        const ZRegister& zt,
7926*f5c631daSSadaf Ebrahimi                        const PRegisterZ& pg,
7927*f5c631daSSadaf Ebrahimi                        const SVEMemOperand& addr,
7928*f5c631daSSadaf Ebrahimi                        Tf fn);
7929*f5c631daSSadaf Ebrahimi 
7930*f5c631daSSadaf Ebrahimi   typedef void (MacroAssembler::*IntWideImmMacroFn)(const ZRegister& zd,
7931*f5c631daSSadaf Ebrahimi                                                     const ZRegister& zn,
7932*f5c631daSSadaf Ebrahimi                                                     IntegerOperand imm);
7933*f5c631daSSadaf Ebrahimi 
7934*f5c631daSSadaf Ebrahimi   typedef void (Assembler::*IntWideImmShiftFn)(const ZRegister& zd,
7935*f5c631daSSadaf Ebrahimi                                                const ZRegister& zn,
7936*f5c631daSSadaf Ebrahimi                                                int imm,
7937*f5c631daSSadaf Ebrahimi                                                int shift);
7938*f5c631daSSadaf Ebrahimi 
7939*f5c631daSSadaf Ebrahimi   typedef void (Assembler::*Int3ArithFn)(const ZRegister& zd,
7940*f5c631daSSadaf Ebrahimi                                          const ZRegister& zn,
7941*f5c631daSSadaf Ebrahimi                                          const ZRegister& zm);
7942*f5c631daSSadaf Ebrahimi 
7943*f5c631daSSadaf Ebrahimi   typedef void (Assembler::*Int4ArithFn)(const ZRegister& zd,
7944*f5c631daSSadaf Ebrahimi                                          const ZRegister& za,
7945*f5c631daSSadaf Ebrahimi                                          const ZRegister& zn,
7946*f5c631daSSadaf Ebrahimi                                          const ZRegister& zm);
7947*f5c631daSSadaf Ebrahimi 
7948*f5c631daSSadaf Ebrahimi   typedef void (Assembler::*IntArithImmFn)(const ZRegister& zd,
7949*f5c631daSSadaf Ebrahimi                                            const ZRegister& zn,
7950*f5c631daSSadaf Ebrahimi                                            int imm);
7951*f5c631daSSadaf Ebrahimi 
7952*f5c631daSSadaf Ebrahimi   typedef void (Assembler::*ZZZImmFn)(const ZRegister& zd,
7953*f5c631daSSadaf Ebrahimi                                       const ZRegister& zn,
7954*f5c631daSSadaf Ebrahimi                                       const ZRegister& zm,
7955*f5c631daSSadaf Ebrahimi                                       int imm);
7956*f5c631daSSadaf Ebrahimi 
7957*f5c631daSSadaf Ebrahimi   typedef void (MacroAssembler::*SVEArithPredicatedFn)(const ZRegister& zd,
7958*f5c631daSSadaf Ebrahimi                                                        const PRegisterM& pg,
7959*f5c631daSSadaf Ebrahimi                                                        const ZRegister& zn,
7960*f5c631daSSadaf Ebrahimi                                                        const ZRegister& zm);
7961*f5c631daSSadaf Ebrahimi 
7962*f5c631daSSadaf Ebrahimi   void IntWideImmHelper(IntArithImmFn imm_fn,
7963*f5c631daSSadaf Ebrahimi                         SVEArithPredicatedFn reg_fn,
7964*f5c631daSSadaf Ebrahimi                         const ZRegister& zd,
7965*f5c631daSSadaf Ebrahimi                         const ZRegister& zn,
7966*f5c631daSSadaf Ebrahimi                         IntegerOperand imm,
7967*f5c631daSSadaf Ebrahimi                         bool is_signed_imm);
7968*f5c631daSSadaf Ebrahimi 
7969*f5c631daSSadaf Ebrahimi   enum AddSubHelperOption { kAddImmediate, kSubImmediate };
7970*f5c631daSSadaf Ebrahimi 
7971*f5c631daSSadaf Ebrahimi   void AddSubHelper(AddSubHelperOption option,
7972*f5c631daSSadaf Ebrahimi                     const ZRegister& zd,
7973*f5c631daSSadaf Ebrahimi                     const ZRegister& zn,
7974*f5c631daSSadaf Ebrahimi                     IntegerOperand imm);
7975*f5c631daSSadaf Ebrahimi 
7976*f5c631daSSadaf Ebrahimi   // Try to emit an add- or sub-like instruction (imm_fn) with `imm`, or the
7977*f5c631daSSadaf Ebrahimi   // corresponding sub- or add-like instruction (n_imm_fn) with a negated `imm`.
7978*f5c631daSSadaf Ebrahimi   // A `movprfx` is automatically generated if one is required. If successful,
7979*f5c631daSSadaf Ebrahimi   // return true. Otherwise, return false.
7980*f5c631daSSadaf Ebrahimi   //
7981*f5c631daSSadaf Ebrahimi   // This helper uses two's complement equivalences, for example treating 0xffff
7982*f5c631daSSadaf Ebrahimi   // as -1 for H-sized lanes.
7983*f5c631daSSadaf Ebrahimi   bool TrySingleAddSub(AddSubHelperOption option,
7984*f5c631daSSadaf Ebrahimi                        const ZRegister& zd,
7985*f5c631daSSadaf Ebrahimi                        const ZRegister& zn,
7986*f5c631daSSadaf Ebrahimi                        IntegerOperand imm);
7987*f5c631daSSadaf Ebrahimi 
7988*f5c631daSSadaf Ebrahimi   void AbsoluteDifferenceAccumulate(Int3ArithFn fn,
7989*f5c631daSSadaf Ebrahimi                                     const ZRegister& zd,
7990*f5c631daSSadaf Ebrahimi                                     const ZRegister& za,
7991*f5c631daSSadaf Ebrahimi                                     const ZRegister& zn,
7992*f5c631daSSadaf Ebrahimi                                     const ZRegister& zm);
7993*f5c631daSSadaf Ebrahimi 
7994*f5c631daSSadaf Ebrahimi   void FourRegDestructiveHelper(Int3ArithFn fn,
7995*f5c631daSSadaf Ebrahimi                                 const ZRegister& zd,
7996*f5c631daSSadaf Ebrahimi                                 const ZRegister& za,
7997*f5c631daSSadaf Ebrahimi                                 const ZRegister& zn,
7998*f5c631daSSadaf Ebrahimi                                 const ZRegister& zm);
7999*f5c631daSSadaf Ebrahimi 
8000*f5c631daSSadaf Ebrahimi   void FourRegDestructiveHelper(Int4ArithFn fn,
8001*f5c631daSSadaf Ebrahimi                                 const ZRegister& zd,
8002*f5c631daSSadaf Ebrahimi                                 const ZRegister& za,
8003*f5c631daSSadaf Ebrahimi                                 const ZRegister& zn,
8004*f5c631daSSadaf Ebrahimi                                 const ZRegister& zm);
8005*f5c631daSSadaf Ebrahimi 
8006*f5c631daSSadaf Ebrahimi   void SVEDotIndexHelper(ZZZImmFn fn,
8007*f5c631daSSadaf Ebrahimi                          const ZRegister& zd,
8008*f5c631daSSadaf Ebrahimi                          const ZRegister& za,
8009*f5c631daSSadaf Ebrahimi                          const ZRegister& zn,
8010*f5c631daSSadaf Ebrahimi                          const ZRegister& zm,
8011*f5c631daSSadaf Ebrahimi                          int index);
8012*f5c631daSSadaf Ebrahimi 
8013*f5c631daSSadaf Ebrahimi   // For noncommutative arithmetic operations.
8014*f5c631daSSadaf Ebrahimi   void NoncommutativeArithmeticHelper(const ZRegister& zd,
8015*f5c631daSSadaf Ebrahimi                                       const PRegisterM& pg,
8016*f5c631daSSadaf Ebrahimi                                       const ZRegister& zn,
8017*f5c631daSSadaf Ebrahimi                                       const ZRegister& zm,
8018*f5c631daSSadaf Ebrahimi                                       SVEArithPredicatedFn fn,
8019*f5c631daSSadaf Ebrahimi                                       SVEArithPredicatedFn rev_fn);
8020*f5c631daSSadaf Ebrahimi 
8021*f5c631daSSadaf Ebrahimi   void FPCommutativeArithmeticHelper(const ZRegister& zd,
8022*f5c631daSSadaf Ebrahimi                                      const PRegisterM& pg,
8023*f5c631daSSadaf Ebrahimi                                      const ZRegister& zn,
8024*f5c631daSSadaf Ebrahimi                                      const ZRegister& zm,
8025*f5c631daSSadaf Ebrahimi                                      SVEArithPredicatedFn fn,
8026*f5c631daSSadaf Ebrahimi                                      FPMacroNaNPropagationOption nan_option);
8027*f5c631daSSadaf Ebrahimi 
8028*f5c631daSSadaf Ebrahimi   // Floating-point fused multiply-add vectors (predicated), writing addend.
8029*f5c631daSSadaf Ebrahimi   typedef void (Assembler::*SVEMulAddPredicatedZdaFn)(const ZRegister& zda,
8030*f5c631daSSadaf Ebrahimi                                                       const PRegisterM& pg,
8031*f5c631daSSadaf Ebrahimi                                                       const ZRegister& zn,
8032*f5c631daSSadaf Ebrahimi                                                       const ZRegister& zm);
8033*f5c631daSSadaf Ebrahimi 
8034*f5c631daSSadaf Ebrahimi   // Floating-point fused multiply-add vectors (predicated), writing
8035*f5c631daSSadaf Ebrahimi   // multiplicand.
8036*f5c631daSSadaf Ebrahimi   typedef void (Assembler::*SVEMulAddPredicatedZdnFn)(const ZRegister& zdn,
8037*f5c631daSSadaf Ebrahimi                                                       const PRegisterM& pg,
8038*f5c631daSSadaf Ebrahimi                                                       const ZRegister& zn,
8039*f5c631daSSadaf Ebrahimi                                                       const ZRegister& zm);
8040*f5c631daSSadaf Ebrahimi 
8041*f5c631daSSadaf Ebrahimi   void FPMulAddHelper(const ZRegister& zd,
8042*f5c631daSSadaf Ebrahimi                       const PRegisterM& pg,
8043*f5c631daSSadaf Ebrahimi                       const ZRegister& za,
8044*f5c631daSSadaf Ebrahimi                       const ZRegister& zn,
8045*f5c631daSSadaf Ebrahimi                       const ZRegister& zm,
8046*f5c631daSSadaf Ebrahimi                       SVEMulAddPredicatedZdaFn fn_zda,
8047*f5c631daSSadaf Ebrahimi                       SVEMulAddPredicatedZdnFn fn_zdn,
8048*f5c631daSSadaf Ebrahimi                       FPMacroNaNPropagationOption nan_option);
8049*f5c631daSSadaf Ebrahimi 
8050*f5c631daSSadaf Ebrahimi   typedef void (Assembler::*SVEMulAddIndexFn)(const ZRegister& zda,
8051*f5c631daSSadaf Ebrahimi                                               const ZRegister& zn,
8052*f5c631daSSadaf Ebrahimi                                               const ZRegister& zm,
8053*f5c631daSSadaf Ebrahimi                                               int index);
8054*f5c631daSSadaf Ebrahimi 
8055*f5c631daSSadaf Ebrahimi   void FourRegOneImmDestructiveHelper(ZZZImmFn fn,
8056*f5c631daSSadaf Ebrahimi                                       const ZRegister& zd,
8057*f5c631daSSadaf Ebrahimi                                       const ZRegister& za,
8058*f5c631daSSadaf Ebrahimi                                       const ZRegister& zn,
8059*f5c631daSSadaf Ebrahimi                                       const ZRegister& zm,
8060*f5c631daSSadaf Ebrahimi                                       int imm);
8061*f5c631daSSadaf Ebrahimi 
8062*f5c631daSSadaf Ebrahimi   void ShiftRightAccumulate(IntArithImmFn fn,
8063*f5c631daSSadaf Ebrahimi                             const ZRegister& zd,
8064*f5c631daSSadaf Ebrahimi                             const ZRegister& za,
8065*f5c631daSSadaf Ebrahimi                             const ZRegister& zn,
8066*f5c631daSSadaf Ebrahimi                             int imm);
8067*f5c631daSSadaf Ebrahimi 
8068*f5c631daSSadaf Ebrahimi   void ComplexAddition(ZZZImmFn fn,
8069*f5c631daSSadaf Ebrahimi                        const ZRegister& zd,
8070*f5c631daSSadaf Ebrahimi                        const ZRegister& zn,
8071*f5c631daSSadaf Ebrahimi                        const ZRegister& zm,
8072*f5c631daSSadaf Ebrahimi                        int rot);
8073*f5c631daSSadaf Ebrahimi 
8074*f5c631daSSadaf Ebrahimi   // Tell whether any of the macro instruction can be used. When false the
8075*f5c631daSSadaf Ebrahimi   // MacroAssembler will assert if a method which can emit a variable number
8076*f5c631daSSadaf Ebrahimi   // of instructions is called.
8077*f5c631daSSadaf Ebrahimi   bool allow_macro_instructions_;
8078*f5c631daSSadaf Ebrahimi 
8079*f5c631daSSadaf Ebrahimi   // Indicates whether we should generate simulator or native code.
8080*f5c631daSSadaf Ebrahimi   bool generate_simulator_code_;
8081*f5c631daSSadaf Ebrahimi 
8082*f5c631daSSadaf Ebrahimi   // The register to use as a stack pointer for stack operations.
8083*f5c631daSSadaf Ebrahimi   Register sp_;
8084*f5c631daSSadaf Ebrahimi 
8085*f5c631daSSadaf Ebrahimi   // Scratch registers available for use by the MacroAssembler.
8086*f5c631daSSadaf Ebrahimi   CPURegList tmp_list_;
8087*f5c631daSSadaf Ebrahimi   CPURegList v_tmp_list_;
8088*f5c631daSSadaf Ebrahimi   CPURegList p_tmp_list_;
8089*f5c631daSSadaf Ebrahimi 
8090*f5c631daSSadaf Ebrahimi   UseScratchRegisterScope* current_scratch_scope_;
8091*f5c631daSSadaf Ebrahimi 
8092*f5c631daSSadaf Ebrahimi   LiteralPool literal_pool_;
8093*f5c631daSSadaf Ebrahimi   VeneerPool veneer_pool_;
8094*f5c631daSSadaf Ebrahimi 
8095*f5c631daSSadaf Ebrahimi   ptrdiff_t checkpoint_;
8096*f5c631daSSadaf Ebrahimi   ptrdiff_t recommended_checkpoint_;
8097*f5c631daSSadaf Ebrahimi 
8098*f5c631daSSadaf Ebrahimi   FPMacroNaNPropagationOption fp_nan_propagation_;
8099*f5c631daSSadaf Ebrahimi 
8100*f5c631daSSadaf Ebrahimi   friend class Pool;
8101*f5c631daSSadaf Ebrahimi   friend class LiteralPool;
8102*f5c631daSSadaf Ebrahimi };
8103*f5c631daSSadaf Ebrahimi 
8104*f5c631daSSadaf Ebrahimi 
GetOtherPoolsMaxSize()8105*f5c631daSSadaf Ebrahimi inline size_t VeneerPool::GetOtherPoolsMaxSize() const {
8106*f5c631daSSadaf Ebrahimi   return masm_->GetLiteralPoolMaxSize();
8107*f5c631daSSadaf Ebrahimi }
8108*f5c631daSSadaf Ebrahimi 
8109*f5c631daSSadaf Ebrahimi 
GetOtherPoolsMaxSize()8110*f5c631daSSadaf Ebrahimi inline size_t LiteralPool::GetOtherPoolsMaxSize() const {
8111*f5c631daSSadaf Ebrahimi   return masm_->GetVeneerPoolMaxSize();
8112*f5c631daSSadaf Ebrahimi }
8113*f5c631daSSadaf Ebrahimi 
8114*f5c631daSSadaf Ebrahimi 
SetNextRecommendedCheckpoint(ptrdiff_t offset)8115*f5c631daSSadaf Ebrahimi inline void LiteralPool::SetNextRecommendedCheckpoint(ptrdiff_t offset) {
8116*f5c631daSSadaf Ebrahimi   masm_->recommended_checkpoint_ =
8117*f5c631daSSadaf Ebrahimi       std::min(masm_->recommended_checkpoint_, offset);
8118*f5c631daSSadaf Ebrahimi   recommended_checkpoint_ = offset;
8119*f5c631daSSadaf Ebrahimi }
8120*f5c631daSSadaf Ebrahimi 
8121*f5c631daSSadaf Ebrahimi class InstructionAccurateScope : public ExactAssemblyScope {
8122*f5c631daSSadaf Ebrahimi  public:
8123*f5c631daSSadaf Ebrahimi   VIXL_DEPRECATED("ExactAssemblyScope",
8124*f5c631daSSadaf Ebrahimi                   InstructionAccurateScope(MacroAssembler* masm,
8125*f5c631daSSadaf Ebrahimi                                            int64_t count,
8126*f5c631daSSadaf Ebrahimi                                            SizePolicy size_policy = kExactSize))
ExactAssemblyScope(masm,count * kInstructionSize,size_policy)8127*f5c631daSSadaf Ebrahimi       : ExactAssemblyScope(masm, count * kInstructionSize, size_policy) {}
8128*f5c631daSSadaf Ebrahimi };
8129*f5c631daSSadaf Ebrahimi 
8130*f5c631daSSadaf Ebrahimi class BlockLiteralPoolScope {
8131*f5c631daSSadaf Ebrahimi  public:
BlockLiteralPoolScope(MacroAssembler * masm)8132*f5c631daSSadaf Ebrahimi   explicit BlockLiteralPoolScope(MacroAssembler* masm) : masm_(masm) {
8133*f5c631daSSadaf Ebrahimi     masm_->BlockLiteralPool();
8134*f5c631daSSadaf Ebrahimi   }
8135*f5c631daSSadaf Ebrahimi 
~BlockLiteralPoolScope()8136*f5c631daSSadaf Ebrahimi   ~BlockLiteralPoolScope() { masm_->ReleaseLiteralPool(); }
8137*f5c631daSSadaf Ebrahimi 
8138*f5c631daSSadaf Ebrahimi  private:
8139*f5c631daSSadaf Ebrahimi   MacroAssembler* masm_;
8140*f5c631daSSadaf Ebrahimi };
8141*f5c631daSSadaf Ebrahimi 
8142*f5c631daSSadaf Ebrahimi 
8143*f5c631daSSadaf Ebrahimi class BlockVeneerPoolScope {
8144*f5c631daSSadaf Ebrahimi  public:
BlockVeneerPoolScope(MacroAssembler * masm)8145*f5c631daSSadaf Ebrahimi   explicit BlockVeneerPoolScope(MacroAssembler* masm) : masm_(masm) {
8146*f5c631daSSadaf Ebrahimi     masm_->BlockVeneerPool();
8147*f5c631daSSadaf Ebrahimi   }
8148*f5c631daSSadaf Ebrahimi 
~BlockVeneerPoolScope()8149*f5c631daSSadaf Ebrahimi   ~BlockVeneerPoolScope() { masm_->ReleaseVeneerPool(); }
8150*f5c631daSSadaf Ebrahimi 
8151*f5c631daSSadaf Ebrahimi  private:
8152*f5c631daSSadaf Ebrahimi   MacroAssembler* masm_;
8153*f5c631daSSadaf Ebrahimi };
8154*f5c631daSSadaf Ebrahimi 
8155*f5c631daSSadaf Ebrahimi 
8156*f5c631daSSadaf Ebrahimi class BlockPoolsScope {
8157*f5c631daSSadaf Ebrahimi  public:
BlockPoolsScope(MacroAssembler * masm)8158*f5c631daSSadaf Ebrahimi   explicit BlockPoolsScope(MacroAssembler* masm) : masm_(masm) {
8159*f5c631daSSadaf Ebrahimi     masm_->BlockPools();
8160*f5c631daSSadaf Ebrahimi   }
8161*f5c631daSSadaf Ebrahimi 
~BlockPoolsScope()8162*f5c631daSSadaf Ebrahimi   ~BlockPoolsScope() { masm_->ReleasePools(); }
8163*f5c631daSSadaf Ebrahimi 
8164*f5c631daSSadaf Ebrahimi  private:
8165*f5c631daSSadaf Ebrahimi   MacroAssembler* masm_;
8166*f5c631daSSadaf Ebrahimi };
8167*f5c631daSSadaf Ebrahimi 
MovprfxHelperScope(MacroAssembler * masm,const ZRegister & dst,const ZRegister & src)8168*f5c631daSSadaf Ebrahimi MovprfxHelperScope::MovprfxHelperScope(MacroAssembler* masm,
8169*f5c631daSSadaf Ebrahimi                                        const ZRegister& dst,
8170*f5c631daSSadaf Ebrahimi                                        const ZRegister& src)
8171*f5c631daSSadaf Ebrahimi     : ExactAssemblyScope(masm,
8172*f5c631daSSadaf Ebrahimi                          ShouldGenerateMovprfx(dst, src)
8173*f5c631daSSadaf Ebrahimi                              ? (2 * kInstructionSize)
8174*f5c631daSSadaf Ebrahimi                              : kInstructionSize) {
8175*f5c631daSSadaf Ebrahimi   if (ShouldGenerateMovprfx(dst, src)) {
8176*f5c631daSSadaf Ebrahimi     masm->movprfx(dst, src);
8177*f5c631daSSadaf Ebrahimi   }
8178*f5c631daSSadaf Ebrahimi }
8179*f5c631daSSadaf Ebrahimi 
MovprfxHelperScope(MacroAssembler * masm,const ZRegister & dst,const PRegister & pg,const ZRegister & src)8180*f5c631daSSadaf Ebrahimi MovprfxHelperScope::MovprfxHelperScope(MacroAssembler* masm,
8181*f5c631daSSadaf Ebrahimi                                        const ZRegister& dst,
8182*f5c631daSSadaf Ebrahimi                                        const PRegister& pg,
8183*f5c631daSSadaf Ebrahimi                                        const ZRegister& src)
8184*f5c631daSSadaf Ebrahimi     : ExactAssemblyScope(masm,
8185*f5c631daSSadaf Ebrahimi                          ShouldGenerateMovprfx(dst, pg, src)
8186*f5c631daSSadaf Ebrahimi                              ? (2 * kInstructionSize)
8187*f5c631daSSadaf Ebrahimi                              : kInstructionSize) {
8188*f5c631daSSadaf Ebrahimi   if (ShouldGenerateMovprfx(dst, pg, src)) {
8189*f5c631daSSadaf Ebrahimi     masm->movprfx(dst, pg, src);
8190*f5c631daSSadaf Ebrahimi   }
8191*f5c631daSSadaf Ebrahimi }
8192*f5c631daSSadaf Ebrahimi 
8193*f5c631daSSadaf Ebrahimi // This scope utility allows scratch registers to be managed safely. The
8194*f5c631daSSadaf Ebrahimi // MacroAssembler's GetScratch*RegisterList() are used as a pool of scratch
8195*f5c631daSSadaf Ebrahimi // registers. These registers can be allocated on demand, and will be returned
8196*f5c631daSSadaf Ebrahimi // at the end of the scope.
8197*f5c631daSSadaf Ebrahimi //
8198*f5c631daSSadaf Ebrahimi // When the scope ends, the MacroAssembler's lists will be restored to their
8199*f5c631daSSadaf Ebrahimi // original state, even if the lists were modified by some other means.
8200*f5c631daSSadaf Ebrahimi class UseScratchRegisterScope {
8201*f5c631daSSadaf Ebrahimi  public:
8202*f5c631daSSadaf Ebrahimi   // This constructor implicitly calls `Open` to initialise the scope (`masm`
8203*f5c631daSSadaf Ebrahimi   // must not be `NULL`), so it is ready to use immediately after it has been
8204*f5c631daSSadaf Ebrahimi   // constructed.
UseScratchRegisterScope(MacroAssembler * masm)8205*f5c631daSSadaf Ebrahimi   explicit UseScratchRegisterScope(MacroAssembler* masm)
8206*f5c631daSSadaf Ebrahimi       : masm_(NULL),
8207*f5c631daSSadaf Ebrahimi         parent_(NULL),
8208*f5c631daSSadaf Ebrahimi         old_available_(0),
8209*f5c631daSSadaf Ebrahimi         old_available_v_(0),
8210*f5c631daSSadaf Ebrahimi         old_available_p_(0) {
8211*f5c631daSSadaf Ebrahimi     Open(masm);
8212*f5c631daSSadaf Ebrahimi   }
8213*f5c631daSSadaf Ebrahimi   // This constructor does not implicitly initialise the scope. Instead, the
8214*f5c631daSSadaf Ebrahimi   // user is required to explicitly call the `Open` function before using the
8215*f5c631daSSadaf Ebrahimi   // scope.
UseScratchRegisterScope()8216*f5c631daSSadaf Ebrahimi   UseScratchRegisterScope()
8217*f5c631daSSadaf Ebrahimi       : masm_(NULL),
8218*f5c631daSSadaf Ebrahimi         parent_(NULL),
8219*f5c631daSSadaf Ebrahimi         old_available_(0),
8220*f5c631daSSadaf Ebrahimi         old_available_v_(0),
8221*f5c631daSSadaf Ebrahimi         old_available_p_(0) {}
8222*f5c631daSSadaf Ebrahimi 
8223*f5c631daSSadaf Ebrahimi   // This function performs the actual initialisation work.
8224*f5c631daSSadaf Ebrahimi   void Open(MacroAssembler* masm);
8225*f5c631daSSadaf Ebrahimi 
8226*f5c631daSSadaf Ebrahimi   // The destructor always implicitly calls the `Close` function.
~UseScratchRegisterScope()8227*f5c631daSSadaf Ebrahimi   ~UseScratchRegisterScope() { Close(); }
8228*f5c631daSSadaf Ebrahimi 
8229*f5c631daSSadaf Ebrahimi   // This function performs the cleaning-up work. It must succeed even if the
8230*f5c631daSSadaf Ebrahimi   // scope has not been opened. It is safe to call multiple times.
8231*f5c631daSSadaf Ebrahimi   void Close();
8232*f5c631daSSadaf Ebrahimi 
8233*f5c631daSSadaf Ebrahimi 
8234*f5c631daSSadaf Ebrahimi   bool IsAvailable(const CPURegister& reg) const;
8235*f5c631daSSadaf Ebrahimi 
8236*f5c631daSSadaf Ebrahimi   // Take a register from the appropriate temps list. It will be returned
8237*f5c631daSSadaf Ebrahimi   // automatically when the scope ends.
AcquireW()8238*f5c631daSSadaf Ebrahimi   Register AcquireW() {
8239*f5c631daSSadaf Ebrahimi     return AcquireFrom(masm_->GetScratchRegisterList()).W();
8240*f5c631daSSadaf Ebrahimi   }
AcquireX()8241*f5c631daSSadaf Ebrahimi   Register AcquireX() {
8242*f5c631daSSadaf Ebrahimi     return AcquireFrom(masm_->GetScratchRegisterList()).X();
8243*f5c631daSSadaf Ebrahimi   }
AcquireH()8244*f5c631daSSadaf Ebrahimi   VRegister AcquireH() {
8245*f5c631daSSadaf Ebrahimi     return AcquireFrom(masm_->GetScratchVRegisterList()).H();
8246*f5c631daSSadaf Ebrahimi   }
AcquireS()8247*f5c631daSSadaf Ebrahimi   VRegister AcquireS() {
8248*f5c631daSSadaf Ebrahimi     return AcquireFrom(masm_->GetScratchVRegisterList()).S();
8249*f5c631daSSadaf Ebrahimi   }
AcquireD()8250*f5c631daSSadaf Ebrahimi   VRegister AcquireD() {
8251*f5c631daSSadaf Ebrahimi     return AcquireFrom(masm_->GetScratchVRegisterList()).D();
8252*f5c631daSSadaf Ebrahimi   }
AcquireZ()8253*f5c631daSSadaf Ebrahimi   ZRegister AcquireZ() {
8254*f5c631daSSadaf Ebrahimi     return AcquireFrom(masm_->GetScratchVRegisterList()).Z();
8255*f5c631daSSadaf Ebrahimi   }
AcquireP()8256*f5c631daSSadaf Ebrahimi   PRegister AcquireP() {
8257*f5c631daSSadaf Ebrahimi     // Prefer to allocate p8-p15 if we can, to leave p0-p7 available for use as
8258*f5c631daSSadaf Ebrahimi     // governing predicates.
8259*f5c631daSSadaf Ebrahimi     CPURegList* available = masm_->GetScratchPRegisterList();
8260*f5c631daSSadaf Ebrahimi     RegList preferred = ~kGoverningPRegisterMask;
8261*f5c631daSSadaf Ebrahimi     if ((available->GetList() & preferred) != 0) {
8262*f5c631daSSadaf Ebrahimi       return AcquireFrom(available, preferred).P();
8263*f5c631daSSadaf Ebrahimi     }
8264*f5c631daSSadaf Ebrahimi     return AcquireFrom(available).P();
8265*f5c631daSSadaf Ebrahimi   }
8266*f5c631daSSadaf Ebrahimi   // Acquire a P register suitable for use as a governing predicate in
8267*f5c631daSSadaf Ebrahimi   // instructions which only accept p0-p7 for that purpose.
AcquireGoverningP()8268*f5c631daSSadaf Ebrahimi   PRegister AcquireGoverningP() {
8269*f5c631daSSadaf Ebrahimi     CPURegList* available = masm_->GetScratchPRegisterList();
8270*f5c631daSSadaf Ebrahimi     return AcquireFrom(available, kGoverningPRegisterMask).P();
8271*f5c631daSSadaf Ebrahimi   }
8272*f5c631daSSadaf Ebrahimi 
8273*f5c631daSSadaf Ebrahimi   Register AcquireRegisterOfSize(int size_in_bits);
AcquireSameSizeAs(const Register & reg)8274*f5c631daSSadaf Ebrahimi   Register AcquireSameSizeAs(const Register& reg) {
8275*f5c631daSSadaf Ebrahimi     return AcquireRegisterOfSize(reg.GetSizeInBits());
8276*f5c631daSSadaf Ebrahimi   }
8277*f5c631daSSadaf Ebrahimi   VRegister AcquireVRegisterOfSize(int size_in_bits);
AcquireSameSizeAs(const VRegister & reg)8278*f5c631daSSadaf Ebrahimi   VRegister AcquireSameSizeAs(const VRegister& reg) {
8279*f5c631daSSadaf Ebrahimi     return AcquireVRegisterOfSize(reg.GetSizeInBits());
8280*f5c631daSSadaf Ebrahimi   }
AcquireCPURegisterOfSize(int size_in_bits)8281*f5c631daSSadaf Ebrahimi   CPURegister AcquireCPURegisterOfSize(int size_in_bits) {
8282*f5c631daSSadaf Ebrahimi     return masm_->GetScratchRegisterList()->IsEmpty()
8283*f5c631daSSadaf Ebrahimi                ? CPURegister(AcquireVRegisterOfSize(size_in_bits))
8284*f5c631daSSadaf Ebrahimi                : CPURegister(AcquireRegisterOfSize(size_in_bits));
8285*f5c631daSSadaf Ebrahimi   }
8286*f5c631daSSadaf Ebrahimi 
8287*f5c631daSSadaf Ebrahimi   // Acquire a register big enough to represent one lane of `vector`.
AcquireRegisterToHoldLane(const CPURegister & vector)8288*f5c631daSSadaf Ebrahimi   Register AcquireRegisterToHoldLane(const CPURegister& vector) {
8289*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(vector.GetLaneSizeInBits() <= kXRegSize);
8290*f5c631daSSadaf Ebrahimi     return (vector.GetLaneSizeInBits() > kWRegSize) ? AcquireX() : AcquireW();
8291*f5c631daSSadaf Ebrahimi   }
8292*f5c631daSSadaf Ebrahimi 
8293*f5c631daSSadaf Ebrahimi 
8294*f5c631daSSadaf Ebrahimi   // Explicitly release an acquired (or excluded) register, putting it back in
8295*f5c631daSSadaf Ebrahimi   // the appropriate temps list.
8296*f5c631daSSadaf Ebrahimi   void Release(const CPURegister& reg);
8297*f5c631daSSadaf Ebrahimi 
8298*f5c631daSSadaf Ebrahimi 
8299*f5c631daSSadaf Ebrahimi   // Make the specified registers available as scratch registers for the
8300*f5c631daSSadaf Ebrahimi   // duration of this scope.
8301*f5c631daSSadaf Ebrahimi   void Include(const CPURegList& list);
8302*f5c631daSSadaf Ebrahimi   void Include(const Register& reg1,
8303*f5c631daSSadaf Ebrahimi                const Register& reg2 = NoReg,
8304*f5c631daSSadaf Ebrahimi                const Register& reg3 = NoReg,
8305*f5c631daSSadaf Ebrahimi                const Register& reg4 = NoReg);
8306*f5c631daSSadaf Ebrahimi   void Include(const VRegister& reg1,
8307*f5c631daSSadaf Ebrahimi                const VRegister& reg2 = NoVReg,
8308*f5c631daSSadaf Ebrahimi                const VRegister& reg3 = NoVReg,
8309*f5c631daSSadaf Ebrahimi                const VRegister& reg4 = NoVReg);
8310*f5c631daSSadaf Ebrahimi   void Include(const CPURegister& reg1,
8311*f5c631daSSadaf Ebrahimi                const CPURegister& reg2 = NoCPUReg,
8312*f5c631daSSadaf Ebrahimi                const CPURegister& reg3 = NoCPUReg,
8313*f5c631daSSadaf Ebrahimi                const CPURegister& reg4 = NoCPUReg);
8314*f5c631daSSadaf Ebrahimi 
8315*f5c631daSSadaf Ebrahimi 
8316*f5c631daSSadaf Ebrahimi   // Make sure that the specified registers are not available in this scope.
8317*f5c631daSSadaf Ebrahimi   // This can be used to prevent helper functions from using sensitive
8318*f5c631daSSadaf Ebrahimi   // registers, for example.
8319*f5c631daSSadaf Ebrahimi   void Exclude(const CPURegList& list);
8320*f5c631daSSadaf Ebrahimi   void Exclude(const Register& reg1,
8321*f5c631daSSadaf Ebrahimi                const Register& reg2 = NoReg,
8322*f5c631daSSadaf Ebrahimi                const Register& reg3 = NoReg,
8323*f5c631daSSadaf Ebrahimi                const Register& reg4 = NoReg);
8324*f5c631daSSadaf Ebrahimi   void Exclude(const VRegister& reg1,
8325*f5c631daSSadaf Ebrahimi                const VRegister& reg2 = NoVReg,
8326*f5c631daSSadaf Ebrahimi                const VRegister& reg3 = NoVReg,
8327*f5c631daSSadaf Ebrahimi                const VRegister& reg4 = NoVReg);
8328*f5c631daSSadaf Ebrahimi   void Exclude(const CPURegister& reg1,
8329*f5c631daSSadaf Ebrahimi                const CPURegister& reg2 = NoCPUReg,
8330*f5c631daSSadaf Ebrahimi                const CPURegister& reg3 = NoCPUReg,
8331*f5c631daSSadaf Ebrahimi                const CPURegister& reg4 = NoCPUReg);
8332*f5c631daSSadaf Ebrahimi 
8333*f5c631daSSadaf Ebrahimi   // Convenience for excluding registers that are part of Operands. This is
8334*f5c631daSSadaf Ebrahimi   // useful for sequences like this:
8335*f5c631daSSadaf Ebrahimi   //
8336*f5c631daSSadaf Ebrahimi   //    // Use 'rd' as a scratch, but only if it's not aliased by an input.
8337*f5c631daSSadaf Ebrahimi   //    temps.Include(rd);
8338*f5c631daSSadaf Ebrahimi   //    temps.Exclude(rn);
8339*f5c631daSSadaf Ebrahimi   //    temps.Exclude(operand);
8340*f5c631daSSadaf Ebrahimi   //
8341*f5c631daSSadaf Ebrahimi   // Otherwise, a conditional check is needed on the last 'Exclude'.
Exclude(const Operand & operand)8342*f5c631daSSadaf Ebrahimi   void Exclude(const Operand& operand) {
8343*f5c631daSSadaf Ebrahimi     if (operand.IsShiftedRegister() || operand.IsExtendedRegister()) {
8344*f5c631daSSadaf Ebrahimi       Exclude(operand.GetRegister());
8345*f5c631daSSadaf Ebrahimi     } else {
8346*f5c631daSSadaf Ebrahimi       VIXL_ASSERT(operand.IsImmediate());
8347*f5c631daSSadaf Ebrahimi     }
8348*f5c631daSSadaf Ebrahimi   }
8349*f5c631daSSadaf Ebrahimi 
8350*f5c631daSSadaf Ebrahimi   // Prevent any scratch registers from being used in this scope.
8351*f5c631daSSadaf Ebrahimi   void ExcludeAll();
8352*f5c631daSSadaf Ebrahimi 
8353*f5c631daSSadaf Ebrahimi  private:
8354*f5c631daSSadaf Ebrahimi   static CPURegister AcquireFrom(CPURegList* available,
8355*f5c631daSSadaf Ebrahimi                                  RegList mask = ~static_cast<RegList>(0));
8356*f5c631daSSadaf Ebrahimi 
8357*f5c631daSSadaf Ebrahimi   static void ReleaseByCode(CPURegList* available, int code);
8358*f5c631daSSadaf Ebrahimi   static void ReleaseByRegList(CPURegList* available, RegList regs);
8359*f5c631daSSadaf Ebrahimi   static void IncludeByRegList(CPURegList* available, RegList exclude);
8360*f5c631daSSadaf Ebrahimi   static void ExcludeByRegList(CPURegList* available, RegList exclude);
8361*f5c631daSSadaf Ebrahimi 
8362*f5c631daSSadaf Ebrahimi   CPURegList* GetAvailableListFor(CPURegister::RegisterBank bank);
8363*f5c631daSSadaf Ebrahimi 
8364*f5c631daSSadaf Ebrahimi   static const RegList kGoverningPRegisterMask =
8365*f5c631daSSadaf Ebrahimi       (static_cast<RegList>(1) << kNumberOfGoverningPRegisters) - 1;
8366*f5c631daSSadaf Ebrahimi 
8367*f5c631daSSadaf Ebrahimi   // The MacroAssembler maintains a list of available scratch registers, and
8368*f5c631daSSadaf Ebrahimi   // also keeps track of the most recently-opened scope so that on destruction
8369*f5c631daSSadaf Ebrahimi   // we can check that scopes do not outlive their parents.
8370*f5c631daSSadaf Ebrahimi   MacroAssembler* masm_;
8371*f5c631daSSadaf Ebrahimi   UseScratchRegisterScope* parent_;
8372*f5c631daSSadaf Ebrahimi 
8373*f5c631daSSadaf Ebrahimi   // The state of the available lists at the start of this scope.
8374*f5c631daSSadaf Ebrahimi   RegList old_available_;    // kRegister
8375*f5c631daSSadaf Ebrahimi   RegList old_available_v_;  // kVRegister / kZRegister
8376*f5c631daSSadaf Ebrahimi   RegList old_available_p_;  // kPRegister
8377*f5c631daSSadaf Ebrahimi 
8378*f5c631daSSadaf Ebrahimi   // Disallow copy constructor and operator=.
UseScratchRegisterScope(const UseScratchRegisterScope &)8379*f5c631daSSadaf Ebrahimi   VIXL_NO_RETURN_IN_DEBUG_MODE UseScratchRegisterScope(
8380*f5c631daSSadaf Ebrahimi       const UseScratchRegisterScope&) {
8381*f5c631daSSadaf Ebrahimi     VIXL_UNREACHABLE();
8382*f5c631daSSadaf Ebrahimi   }
8383*f5c631daSSadaf Ebrahimi   VIXL_NO_RETURN_IN_DEBUG_MODE void operator=(const UseScratchRegisterScope&) {
8384*f5c631daSSadaf Ebrahimi     VIXL_UNREACHABLE();
8385*f5c631daSSadaf Ebrahimi   }
8386*f5c631daSSadaf Ebrahimi };
8387*f5c631daSSadaf Ebrahimi 
8388*f5c631daSSadaf Ebrahimi 
8389*f5c631daSSadaf Ebrahimi // Like CPUFeaturesScope, but also generate Simulation pseudo-instructions to
8390*f5c631daSSadaf Ebrahimi // control a Simulator's CPUFeatures dynamically.
8391*f5c631daSSadaf Ebrahimi //
8392*f5c631daSSadaf Ebrahimi // One major difference from CPUFeaturesScope is that this scope cannot offer
8393*f5c631daSSadaf Ebrahimi // a writable "CPUFeatures* GetCPUFeatures()", because every write to the
8394*f5c631daSSadaf Ebrahimi // features needs a corresponding macro instruction.
8395*f5c631daSSadaf Ebrahimi class SimulationCPUFeaturesScope {
8396*f5c631daSSadaf Ebrahimi  public:
8397*f5c631daSSadaf Ebrahimi   template <typename... T>
SimulationCPUFeaturesScope(MacroAssembler * masm,T...features)8398*f5c631daSSadaf Ebrahimi   explicit SimulationCPUFeaturesScope(MacroAssembler* masm, T... features)
8399*f5c631daSSadaf Ebrahimi       : masm_(masm), cpu_features_scope_(masm, features...) {
8400*f5c631daSSadaf Ebrahimi     masm_->SaveSimulatorCPUFeatures();
8401*f5c631daSSadaf Ebrahimi     masm_->EnableSimulatorCPUFeatures(CPUFeatures(features...));
8402*f5c631daSSadaf Ebrahimi   }
8403*f5c631daSSadaf Ebrahimi 
~SimulationCPUFeaturesScope()8404*f5c631daSSadaf Ebrahimi   ~SimulationCPUFeaturesScope() { masm_->RestoreSimulatorCPUFeatures(); }
8405*f5c631daSSadaf Ebrahimi 
GetCPUFeatures()8406*f5c631daSSadaf Ebrahimi   const CPUFeatures* GetCPUFeatures() const {
8407*f5c631daSSadaf Ebrahimi     return cpu_features_scope_.GetCPUFeatures();
8408*f5c631daSSadaf Ebrahimi   }
8409*f5c631daSSadaf Ebrahimi 
SetCPUFeatures(const CPUFeatures & cpu_features)8410*f5c631daSSadaf Ebrahimi   void SetCPUFeatures(const CPUFeatures& cpu_features) {
8411*f5c631daSSadaf Ebrahimi     cpu_features_scope_.SetCPUFeatures(cpu_features);
8412*f5c631daSSadaf Ebrahimi     masm_->SetSimulatorCPUFeatures(cpu_features);
8413*f5c631daSSadaf Ebrahimi   }
8414*f5c631daSSadaf Ebrahimi 
8415*f5c631daSSadaf Ebrahimi  private:
8416*f5c631daSSadaf Ebrahimi   MacroAssembler* masm_;
8417*f5c631daSSadaf Ebrahimi   CPUFeaturesScope cpu_features_scope_;
8418*f5c631daSSadaf Ebrahimi };
8419*f5c631daSSadaf Ebrahimi 
8420*f5c631daSSadaf Ebrahimi 
8421*f5c631daSSadaf Ebrahimi // Variadic templating is only available from C++11.
8422*f5c631daSSadaf Ebrahimi #ifdef VIXL_HAS_MACROASSEMBLER_RUNTIME_CALL_SUPPORT
8423*f5c631daSSadaf Ebrahimi 
8424*f5c631daSSadaf Ebrahimi // `R` stands for 'return type', and `P` for 'parameter types'.
8425*f5c631daSSadaf Ebrahimi template <typename R, typename... P>
CallRuntimeHelper(R (* function)(P...),RuntimeCallType call_type)8426*f5c631daSSadaf Ebrahimi void MacroAssembler::CallRuntimeHelper(R (*function)(P...),
8427*f5c631daSSadaf Ebrahimi                                        RuntimeCallType call_type) {
8428*f5c631daSSadaf Ebrahimi   if (generate_simulator_code_) {
8429*f5c631daSSadaf Ebrahimi #ifdef VIXL_HAS_SIMULATED_RUNTIME_CALL_SUPPORT
8430*f5c631daSSadaf Ebrahimi     uintptr_t runtime_call_wrapper_address = reinterpret_cast<uintptr_t>(
8431*f5c631daSSadaf Ebrahimi         &(Simulator::RuntimeCallStructHelper<R, P...>::Wrapper));
8432*f5c631daSSadaf Ebrahimi     uintptr_t function_address = reinterpret_cast<uintptr_t>(function);
8433*f5c631daSSadaf Ebrahimi 
8434*f5c631daSSadaf Ebrahimi     EmissionCheckScope guard(this,
8435*f5c631daSSadaf Ebrahimi                              kRuntimeCallLength,
8436*f5c631daSSadaf Ebrahimi                              CodeBufferCheckScope::kExactSize);
8437*f5c631daSSadaf Ebrahimi     Label start;
8438*f5c631daSSadaf Ebrahimi     bind(&start);
8439*f5c631daSSadaf Ebrahimi     {
8440*f5c631daSSadaf Ebrahimi       ExactAssemblyScope scope(this, kInstructionSize);
8441*f5c631daSSadaf Ebrahimi       hlt(kRuntimeCallOpcode);
8442*f5c631daSSadaf Ebrahimi     }
8443*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(GetSizeOfCodeGeneratedSince(&start) ==
8444*f5c631daSSadaf Ebrahimi                 kRuntimeCallWrapperOffset);
8445*f5c631daSSadaf Ebrahimi     dc(runtime_call_wrapper_address);
8446*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(GetSizeOfCodeGeneratedSince(&start) ==
8447*f5c631daSSadaf Ebrahimi                 kRuntimeCallFunctionOffset);
8448*f5c631daSSadaf Ebrahimi     dc(function_address);
8449*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(GetSizeOfCodeGeneratedSince(&start) == kRuntimeCallTypeOffset);
8450*f5c631daSSadaf Ebrahimi     dc32(call_type);
8451*f5c631daSSadaf Ebrahimi     VIXL_ASSERT(GetSizeOfCodeGeneratedSince(&start) == kRuntimeCallLength);
8452*f5c631daSSadaf Ebrahimi #else
8453*f5c631daSSadaf Ebrahimi     VIXL_UNREACHABLE();
8454*f5c631daSSadaf Ebrahimi #endif  // #ifdef VIXL_HAS_SIMULATED_RUNTIME_CALL_SUPPORT
8455*f5c631daSSadaf Ebrahimi   } else {
8456*f5c631daSSadaf Ebrahimi     UseScratchRegisterScope temps(this);
8457*f5c631daSSadaf Ebrahimi     Register temp = temps.AcquireX();
8458*f5c631daSSadaf Ebrahimi     Mov(temp, reinterpret_cast<uint64_t>(function));
8459*f5c631daSSadaf Ebrahimi     if (call_type == kTailCallRuntime) {
8460*f5c631daSSadaf Ebrahimi       Br(temp);
8461*f5c631daSSadaf Ebrahimi     } else {
8462*f5c631daSSadaf Ebrahimi       VIXL_ASSERT(call_type == kCallRuntime);
8463*f5c631daSSadaf Ebrahimi       Blr(temp);
8464*f5c631daSSadaf Ebrahimi     }
8465*f5c631daSSadaf Ebrahimi   }
8466*f5c631daSSadaf Ebrahimi }
8467*f5c631daSSadaf Ebrahimi 
8468*f5c631daSSadaf Ebrahimi #endif  // #ifdef VIXL_HAS_MACROASSEMBLER_RUNTIME_CALL_SUPPORT
8469*f5c631daSSadaf Ebrahimi 
8470*f5c631daSSadaf Ebrahimi }  // namespace aarch64
8471*f5c631daSSadaf Ebrahimi 
8472*f5c631daSSadaf Ebrahimi // Required InvalSet template specialisations.
8473*f5c631daSSadaf Ebrahimi // TODO: These template specialisations should not live in this file.  Move
8474*f5c631daSSadaf Ebrahimi // VeneerPool out of the aarch64 namespace in order to share its implementation
8475*f5c631daSSadaf Ebrahimi // later.
8476*f5c631daSSadaf Ebrahimi template <>
8477*f5c631daSSadaf Ebrahimi inline ptrdiff_t InvalSet<aarch64::VeneerPool::BranchInfo,
8478*f5c631daSSadaf Ebrahimi                           aarch64::VeneerPool::kNPreallocatedInfos,
8479*f5c631daSSadaf Ebrahimi                           ptrdiff_t,
8480*f5c631daSSadaf Ebrahimi                           aarch64::VeneerPool::kInvalidOffset,
8481*f5c631daSSadaf Ebrahimi                           aarch64::VeneerPool::kReclaimFrom,
8482*f5c631daSSadaf Ebrahimi                           aarch64::VeneerPool::kReclaimFactor>::
GetKey(const aarch64::VeneerPool::BranchInfo & branch_info)8483*f5c631daSSadaf Ebrahimi     GetKey(const aarch64::VeneerPool::BranchInfo& branch_info) {
8484*f5c631daSSadaf Ebrahimi   return branch_info.first_unreacheable_pc_;
8485*f5c631daSSadaf Ebrahimi }
8486*f5c631daSSadaf Ebrahimi template <>
8487*f5c631daSSadaf Ebrahimi inline void InvalSet<aarch64::VeneerPool::BranchInfo,
8488*f5c631daSSadaf Ebrahimi                      aarch64::VeneerPool::kNPreallocatedInfos,
8489*f5c631daSSadaf Ebrahimi                      ptrdiff_t,
8490*f5c631daSSadaf Ebrahimi                      aarch64::VeneerPool::kInvalidOffset,
8491*f5c631daSSadaf Ebrahimi                      aarch64::VeneerPool::kReclaimFrom,
8492*f5c631daSSadaf Ebrahimi                      aarch64::VeneerPool::kReclaimFactor>::
SetKey(aarch64::VeneerPool::BranchInfo * branch_info,ptrdiff_t key)8493*f5c631daSSadaf Ebrahimi     SetKey(aarch64::VeneerPool::BranchInfo* branch_info, ptrdiff_t key) {
8494*f5c631daSSadaf Ebrahimi   branch_info->first_unreacheable_pc_ = key;
8495*f5c631daSSadaf Ebrahimi }
8496*f5c631daSSadaf Ebrahimi 
8497*f5c631daSSadaf Ebrahimi }  // namespace vixl
8498*f5c631daSSadaf Ebrahimi 
8499*f5c631daSSadaf Ebrahimi #endif  // VIXL_AARCH64_MACRO_ASSEMBLER_AARCH64_H_
8500