• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2015, VIXL authors
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are met:
6 //
7 //   * Redistributions of source code must retain the above copyright notice,
8 //     this list of conditions and the following disclaimer.
9 //   * Redistributions in binary form must reproduce the above copyright
10 //     notice, this list of conditions and the following disclaimer in the
11 //     documentation and/or other materials provided with the distribution.
12 //   * Neither the name of ARM Limited nor the names of its contributors may
13 //     be used to endorse or promote products derived from this software
14 //     without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
17 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 // POSSIBILITY OF SUCH DAMAGE.
27 
28 #ifndef VIXL_AARCH32_MACRO_ASSEMBLER_AARCH32_H_
29 #define VIXL_AARCH32_MACRO_ASSEMBLER_AARCH32_H_
30 
31 #include "code-generation-scopes-vixl.h"
32 #include "macro-assembler-interface.h"
33 #include "utils-vixl.h"
34 
35 #include "aarch32/instructions-aarch32.h"
36 #include "aarch32/assembler-aarch32.h"
37 #include "aarch32/operands-aarch32.h"
38 
39 namespace vixl {
40 namespace aarch32 {
41 
42 class UseScratchRegisterScope;
43 
44 enum FlagsUpdate { LeaveFlags = 0, SetFlags = 1, DontCare = 2 };
45 
46 // LiteralPool class, defined as a container for literals
47 class LiteralPool {
48  public:
49   typedef std::list<RawLiteral*>::iterator RawLiteralListIterator;
50 
51  public:
LiteralPool()52   LiteralPool() : size_(0) {}
~LiteralPool()53   ~LiteralPool() {
54     VIXL_ASSERT(literals_.empty() && (size_ == 0));
55     for (RawLiteralListIterator literal_it = keep_until_delete_.begin();
56          literal_it != keep_until_delete_.end();
57          literal_it++) {
58       delete *literal_it;
59     }
60     keep_until_delete_.clear();
61   }
62 
GetSize()63   unsigned GetSize() const { return size_; }
64 
65   // Add a literal to the literal container.
AddLiteral(RawLiteral * literal)66   void AddLiteral(RawLiteral* literal) {
67     // Manually placed literals can't be added to a literal pool.
68     VIXL_ASSERT(!literal->IsManuallyPlaced());
69     VIXL_ASSERT(!literal->IsBound());
70     if (literal->GetPositionInPool() == Label::kMaxOffset) {
71       uint32_t position = GetSize();
72       literal->SetPositionInPool(position);
73       literals_.push_back(literal);
74       size_ += literal->GetAlignedSize();
75     }
76   }
77 
78   // First literal to be emitted.
GetFirst()79   RawLiteralListIterator GetFirst() { return literals_.begin(); }
80 
81   // Mark the end of the literal container.
GetEnd()82   RawLiteralListIterator GetEnd() { return literals_.end(); }
83 
84   // Remove all the literals from the container.
85   // If the literal's memory management has been delegated to the container
86   // it will be delete'd.
Clear()87   void Clear() {
88     for (RawLiteralListIterator literal_it = GetFirst(); literal_it != GetEnd();
89          literal_it++) {
90       RawLiteral* literal = *literal_it;
91       switch (literal->GetDeletionPolicy()) {
92         case RawLiteral::kDeletedOnPlacementByPool:
93           delete literal;
94           break;
95         case RawLiteral::kDeletedOnPoolDestruction:
96           keep_until_delete_.push_back(literal);
97           break;
98         case RawLiteral::kManuallyDeleted:
99           break;
100       }
101     }
102     literals_.clear();
103     size_ = 0;
104   }
105 
106  private:
107   // Size (in bytes and including alignments) of the literal pool.
108   unsigned size_;
109 
110   // Literal container.
111   std::list<RawLiteral*> literals_;
112   // Already bound Literal container the app requested this pool to keep.
113   std::list<RawLiteral*> keep_until_delete_;
114 };
115 
116 
117 // Macro assembler for aarch32 instruction set.
118 class MacroAssembler : public Assembler, public MacroAssemblerInterface {
119  public:
120   enum EmitOption { kBranchRequired, kNoBranchRequired };
121 
AsAssemblerBase()122   virtual internal::AssemblerBase* AsAssemblerBase() VIXL_OVERRIDE {
123     return this;
124   }
125 
ArePoolsBlocked()126   virtual bool ArePoolsBlocked() const VIXL_OVERRIDE {
127     return IsLiteralPoolBlocked() && IsVeneerPoolBlocked();
128   }
129 
130  private:
131   class MacroEmissionCheckScope : public EmissionCheckScope {
132    public:
MacroEmissionCheckScope(MacroAssemblerInterface * masm)133     explicit MacroEmissionCheckScope(MacroAssemblerInterface* masm)
134         : EmissionCheckScope(masm, kTypicalMacroInstructionMaxSize) {}
135 
136    private:
137     static const size_t kTypicalMacroInstructionMaxSize =
138         8 * kMaxInstructionSizeInBytes;
139   };
140 
141   class MacroAssemblerContext {
142    public:
MacroAssemblerContext()143     MacroAssemblerContext() : count_(0) {}
~MacroAssemblerContext()144     ~MacroAssemblerContext() {}
GetRecursiveCount()145     unsigned GetRecursiveCount() const { return count_; }
Up(const char * loc)146     void Up(const char* loc) {
147       location_stack_[count_] = loc;
148       count_++;
149       if (count_ >= kMaxRecursion) {
150         printf(
151             "Recursion limit reached; unable to resolve macro assembler "
152             "call.\n");
153         printf("Macro assembler context stack:\n");
154         for (unsigned i = 0; i < kMaxRecursion; i++) {
155           printf("%10s %s\n", (i == 0) ? "oldest -> " : "", location_stack_[i]);
156         }
157         VIXL_ABORT();
158       }
159     }
Down()160     void Down() {
161       VIXL_ASSERT((count_ > 0) && (count_ < kMaxRecursion));
162       count_--;
163     }
164 
165    private:
166     unsigned count_;
167     static const uint32_t kMaxRecursion = 6;
168     const char* location_stack_[kMaxRecursion];
169   };
170 
171   // This scope is used at each Delegate entry to avoid infinite recursion of
172   // Delegate calls. The limit is defined by
173   // MacroAssemblerContext::kMaxRecursion.
174   class ContextScope {
175    public:
ContextScope(MacroAssembler * const masm,const char * loc)176     explicit ContextScope(MacroAssembler* const masm, const char* loc)
177         : masm_(masm) {
178       VIXL_ASSERT(masm_->AllowMacroInstructions());
179       masm_->GetContext()->Up(loc);
180     }
~ContextScope()181     ~ContextScope() { masm_->GetContext()->Down(); }
182 
183    private:
184     MacroAssembler* const masm_;
185   };
186 
GetContext()187   MacroAssemblerContext* GetContext() { return &context_; }
188 
189   class ITScope {
190    public:
191     ITScope(MacroAssembler* masm, Condition* cond, bool can_use_it = false)
masm_(masm)192         : masm_(masm), cond_(*cond), can_use_it_(can_use_it) {
193       if (!cond_.Is(al) && masm->IsUsingT32()) {
194         if (can_use_it_) {
195           // IT is not deprecated (that implies a 16 bit T32 instruction).
196           // We generate an IT instruction and a conditional instruction.
197           masm->it(cond_);
198         } else {
199           // The usage of IT is deprecated for the instruction.
200           // We generate a conditional branch and an unconditional instruction.
201           // TODO: Use a scope utility with a size check. To do that, we'd need
202           // one with Open() and Close() implemented.
203           masm_->EnsureEmitFor(kMaxT32MacroInstructionSizeInBytes);
204           // Generate the branch.
205           masm_->b(cond_.Negate(), Narrow, &label_);
206           // Tell the macro-assembler to generate unconditional instructions.
207           *cond = al;
208         }
209       }
210 #ifdef VIXL_DEBUG
211       initial_cursor_offset_ = masm->GetCursorOffset();
212 #else
213       USE(initial_cursor_offset_);
214 #endif
215     }
~ITScope()216     ~ITScope() {
217       if (label_.IsReferenced()) {
218         // We only use the label for conditional T32 instructions for which we
219         // cannot use IT.
220         VIXL_ASSERT(!cond_.Is(al));
221         VIXL_ASSERT(masm_->IsUsingT32());
222         VIXL_ASSERT(!can_use_it_);
223         VIXL_ASSERT(masm_->GetCursorOffset() - initial_cursor_offset_ <=
224                     kMaxT32MacroInstructionSizeInBytes);
225         masm_->BindHelper(&label_);
226       } else if (masm_->IsUsingT32() && !cond_.Is(al)) {
227         // If we've generated a conditional T32 instruction but haven't used the
228         // label, we must have used IT. Check that we did not generate a
229         // deprecated sequence.
230         VIXL_ASSERT(can_use_it_);
231         VIXL_ASSERT(masm_->GetCursorOffset() - initial_cursor_offset_ <=
232                     k16BitT32InstructionSizeInBytes);
233       }
234     }
235 
236    private:
237     MacroAssembler* masm_;
238     Condition cond_;
239     Label label_;
240     bool can_use_it_;
241     uint32_t initial_cursor_offset_;
242   };
243 
244   template <Assembler::InstructionCondDtDL asmfn>
245   class EmitLiteralCondDtDL {
246    public:
EmitLiteralCondDtDL(DataType dt,DRegister rt)247     EmitLiteralCondDtDL(DataType dt, DRegister rt) : dt_(dt), rt_(rt) {}
emit(MacroAssembler * const masm,Condition cond,RawLiteral * const literal)248     void emit(MacroAssembler* const masm,
249               Condition cond,
250               RawLiteral* const literal) {
251       (masm->*asmfn)(cond, dt_, rt_, literal);
252     }
253 
254    private:
255     DataType dt_;
256     DRegister rt_;
257   };
258 
259   template <Assembler::InstructionCondDtSL asmfn>
260   class EmitLiteralCondDtSL {
261    public:
EmitLiteralCondDtSL(DataType dt,SRegister rt)262     EmitLiteralCondDtSL(DataType dt, SRegister rt) : dt_(dt), rt_(rt) {}
emit(MacroAssembler * const masm,Condition cond,RawLiteral * const literal)263     void emit(MacroAssembler* const masm,
264               Condition cond,
265               RawLiteral* const literal) {
266       (masm->*asmfn)(cond, dt_, rt_, literal);
267     }
268 
269    private:
270     DataType dt_;
271     SRegister rt_;
272   };
273 
274   template <Assembler::InstructionCondRL asmfn>
275   class EmitLiteralCondRL {
276    public:
EmitLiteralCondRL(Register rt)277     explicit EmitLiteralCondRL(Register rt) : rt_(rt) {}
emit(MacroAssembler * const masm,Condition cond,RawLiteral * const literal)278     void emit(MacroAssembler* const masm,
279               Condition cond,
280               RawLiteral* const literal) {
281       (masm->*asmfn)(cond, rt_, literal);
282     }
283 
284    private:
285     Register rt_;
286   };
287 
288   template <Assembler::InstructionCondRRL asmfn>
289   class EmitLiteralCondRRL {
290    public:
EmitLiteralCondRRL(Register rt,Register rt2)291     EmitLiteralCondRRL(Register rt, Register rt2) : rt_(rt), rt2_(rt2) {}
emit(MacroAssembler * const masm,Condition cond,RawLiteral * const literal)292     void emit(MacroAssembler* const masm,
293               Condition cond,
294               RawLiteral* const literal) {
295       (masm->*asmfn)(cond, rt_, rt2_, literal);
296     }
297 
298    private:
299     Register rt_, rt2_;
300   };
301 
302   class LiteralPoolManager {
303    public:
LiteralPoolManager(MacroAssembler * const masm)304     explicit LiteralPoolManager(MacroAssembler* const masm)
305         : masm_(masm), monitor_(0) {
306       ResetCheckpoint();
307     }
308 
ResetCheckpoint()309     void ResetCheckpoint() { checkpoint_ = Label::kMaxOffset; }
310 
GetLiteralPool()311     LiteralPool* GetLiteralPool() { return &literal_pool_; }
GetCheckpoint()312     Label::Offset GetCheckpoint() const {
313       // Make room for a branch over the pools.
314       return checkpoint_ - kMaxInstructionSizeInBytes;
315     }
GetLiteralPoolSize()316     size_t GetLiteralPoolSize() const { return literal_pool_.GetSize(); }
317 
318     // Checks if the insertion of the literal will put the forward reference
319     // too far in the literal pool.
320     // This function is called after generating an instruction with a literal.
321     // We want to know if the literal can be reached by the instruction.
322     // If not, we will unwind the instruction, generate the pool (without the
323     // last literal) and generate the instruction again.
324     // "literal" is the literal we want to insert into the pool.
325     // "from" is the location where the instruction which uses the literal has
326     // been generated.
WasInsertedTooFar(RawLiteral * literal)327     bool WasInsertedTooFar(RawLiteral* literal) const {
328       // Last accessible location for the instruction we just generated, which
329       // uses the literal.
330       Label::ForwardReference& reference = literal->GetBackForwardRef();
331       Label::Offset new_checkpoint = AlignDown(reference.GetCheckpoint(), 4);
332 
333       // TODO: We should not need to get the min of new_checkpoint and the
334       // existing checkpoint. The existing checkpoint should already have
335       // been checked when reserving space for this load literal instruction.
336       // The assertion below asserts that we don't need the min operation here.
337       Label::Offset checkpoint =
338           std::min(new_checkpoint, literal->GetAlignedCheckpoint(4));
339       bool literal_in_pool =
340           (literal->GetPositionInPool() != Label::kMaxOffset);
341       Label::Offset position_in_pool = literal_in_pool
342                                            ? literal->GetPositionInPool()
343                                            : literal_pool_.GetSize();
344       // Compare the checkpoint to the location where the literal should be
345       // added.
346       // We add space for two instructions: one branch and one potential veneer
347       // which may be added after the check. In this particular use case, no
348       // veneer can be added but, this way, we are consistent with all the
349       // literal pool checks.
350       int32_t from =
351           reference.GetLocation() + masm_->GetArchitectureStatePCOffset();
352       bool too_far =
353           checkpoint < from + position_in_pool +
354                            2 * static_cast<int32_t>(kMaxInstructionSizeInBytes);
355       // Assert if the literal is already in the pool and the existing
356       // checkpoint triggers a rewind here, as this means the pool should
357       // already have been emitted (perhaps we have not reserved enough space
358       // for the instruction we are about to rewind).
359       VIXL_ASSERT(!(too_far && (literal->GetCheckpoint() < new_checkpoint)));
360       return too_far;
361     }
362 
363     // Set the different checkpoints where the literal pool has to be emited.
UpdateCheckpoint(RawLiteral * literal)364     void UpdateCheckpoint(RawLiteral* literal) {
365       // The literal should have been placed somewhere in the literal pool
366       VIXL_ASSERT(literal->GetPositionInPool() != Label::kMaxOffset);
367       // TODO(all): Consider AddForwardRef as a  virtual so the checkpoint is
368       //   updated when inserted. Or move checkpoint_ into Label,
369       literal->UpdateCheckpoint();
370       Label::Offset tmp =
371           literal->GetAlignedCheckpoint(4) - literal->GetPositionInPool();
372       if (checkpoint_ > tmp) {
373         checkpoint_ = tmp;
374         masm_->ComputeCheckpoint();
375       }
376     }
377 
IsEmpty()378     bool IsEmpty() const { return GetLiteralPoolSize() == 0; }
379 
Block()380     void Block() { monitor_++; }
Release()381     void Release() {
382       VIXL_ASSERT(IsBlocked());
383       if (--monitor_ == 0) {
384         // Ensure the pool has not been blocked for too long.
385         VIXL_ASSERT(masm_->GetCursorOffset() <= checkpoint_);
386       }
387     }
IsBlocked()388     bool IsBlocked() const { return monitor_ != 0; }
389 
390    private:
391     MacroAssembler* const masm_;
392     LiteralPool literal_pool_;
393 
394     // Max offset in the code buffer where the literal needs to be
395     // emitted. A default value of Label::kMaxOffset means that the checkpoint
396     // is invalid.
397     Label::Offset checkpoint_;
398     // Indicates whether the emission of this pool is blocked.
399     int monitor_;
400   };
401 
402   void PerformEnsureEmit(Label::Offset target, uint32_t extra_size);
403 
404  protected:
BlockPools()405   virtual void BlockPools() VIXL_OVERRIDE {
406     BlockLiteralPool();
407     BlockVeneerPool();
408   }
ReleasePools()409   virtual void ReleasePools() VIXL_OVERRIDE {
410     ReleaseLiteralPool();
411     ReleaseVeneerPool();
412   }
EnsureEmitPoolsFor(size_t size)413   virtual void EnsureEmitPoolsFor(size_t size) VIXL_OVERRIDE {
414     // TODO: Optimise this. It also checks that there is space in the buffer,
415     // which we do not need to do here.
416     VIXL_ASSERT(IsUint32(size));
417     EnsureEmitFor(static_cast<uint32_t>(size));
418   }
419 
420   // Tell whether any of the macro instruction can be used. When false the
421   // MacroAssembler will assert if a method which can emit a variable number
422   // of instructions is called.
SetAllowMacroInstructions(bool value)423   virtual void SetAllowMacroInstructions(bool value) VIXL_OVERRIDE {
424     allow_macro_instructions_ = value;
425   }
426 
BlockLiteralPool()427   void BlockLiteralPool() { literal_pool_manager_.Block(); }
ReleaseLiteralPool()428   void ReleaseLiteralPool() { literal_pool_manager_.Release(); }
IsLiteralPoolBlocked()429   bool IsLiteralPoolBlocked() const {
430     return literal_pool_manager_.IsBlocked();
431   }
BlockVeneerPool()432   void BlockVeneerPool() { veneer_pool_manager_.Block(); }
ReleaseVeneerPool()433   void ReleaseVeneerPool() { veneer_pool_manager_.Release(); }
IsVeneerPoolBlocked()434   bool IsVeneerPoolBlocked() const { return veneer_pool_manager_.IsBlocked(); }
435 
436   void HandleOutOfBoundsImmediate(Condition cond, Register tmp, uint32_t imm);
437   void PadToMinimumBranchRange(Label* label);
438 
439   // Generate the instruction and if it's not possible revert the whole thing.
440   // emit the literal pool and regenerate the instruction.
441   // Note: The instruction is generated via
442   // void T::emit(MacroAssembler* const, RawLiteral* const)
443   template <typename T>
GenerateInstruction(Condition cond,T instr_callback,RawLiteral * const literal)444   void GenerateInstruction(Condition cond,
445                            T instr_callback,
446                            RawLiteral* const literal) {
447     int32_t cursor = GetCursorOffset();
448     // Emit the instruction, via the assembler
449     {
450       MacroEmissionCheckScope guard(this);
451       // The ITScope can change the condition and we want to be able to revert
452       // this.
453       Condition c(cond);
454       ITScope it_scope(this, &c);
455       instr_callback.emit(this, c, literal);
456     }
457     if (!literal->IsManuallyPlaced() && !literal->IsBound() &&
458         !IsLiteralPoolBlocked()) {
459       if (WasInsertedTooFar(literal)) {
460         // The instruction's data is too far: revert the emission
461         GetBuffer()->Rewind(cursor);
462         literal->InvalidateLastForwardReference(RawLiteral::kNoUpdateNecessary);
463         EmitLiteralPool(kBranchRequired);
464         MacroEmissionCheckScope guard(this);
465         ITScope it_scope(this, &cond);
466         instr_callback.emit(this, cond, literal);
467       }
468       // The literal pool above might have included the literal - in which
469       // case it will now be bound.
470       if (!literal->IsBound()) {
471         literal_pool_manager_.GetLiteralPool()->AddLiteral(literal);
472         literal_pool_manager_.UpdateCheckpoint(literal);
473       }
474     }
475   }
476 
477  public:
478   explicit MacroAssembler(InstructionSet isa = kDefaultISA)
Assembler(isa)479       : Assembler(isa),
480         available_(r12),
481         current_scratch_scope_(NULL),
482         checkpoint_(Label::kMaxOffset),
483         literal_pool_manager_(this),
484         veneer_pool_manager_(this),
485         generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE) {
486 #ifdef VIXL_DEBUG
487     SetAllowMacroInstructions(true);
488 #else
489     USE(literal_pool_manager_);
490     USE(allow_macro_instructions_);
491 #endif
492     ComputeCheckpoint();
493   }
494   explicit MacroAssembler(size_t size, InstructionSet isa = kDefaultISA)
Assembler(size,isa)495       : Assembler(size, isa),
496         available_(r12),
497         current_scratch_scope_(NULL),
498         checkpoint_(Label::kMaxOffset),
499         literal_pool_manager_(this),
500         veneer_pool_manager_(this),
501         generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE) {
502 #ifdef VIXL_DEBUG
503     SetAllowMacroInstructions(true);
504 #endif
505     ComputeCheckpoint();
506   }
507   MacroAssembler(byte* buffer, size_t size, InstructionSet isa = kDefaultISA)
Assembler(buffer,size,isa)508       : Assembler(buffer, size, isa),
509         available_(r12),
510         current_scratch_scope_(NULL),
511         checkpoint_(Label::kMaxOffset),
512         literal_pool_manager_(this),
513         veneer_pool_manager_(this),
514         generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE) {
515 #ifdef VIXL_DEBUG
516     SetAllowMacroInstructions(true);
517 #endif
518     ComputeCheckpoint();
519   }
520 
GenerateSimulatorCode()521   bool GenerateSimulatorCode() const { return generate_simulator_code_; }
522 
AllowMacroInstructions()523   virtual bool AllowMacroInstructions() const VIXL_OVERRIDE {
524     return allow_macro_instructions_;
525   }
526 
FinalizeCode()527   void FinalizeCode() {
528     EmitLiteralPool(kNoBranchRequired);
529     Assembler::FinalizeCode();
530   }
531 
GetScratchRegisterList()532   RegisterList* GetScratchRegisterList() { return &available_; }
GetScratchVRegisterList()533   VRegisterList* GetScratchVRegisterList() { return &available_vfp_; }
534 
535   // Get or set the current (most-deeply-nested) UseScratchRegisterScope.
SetCurrentScratchRegisterScope(UseScratchRegisterScope * scope)536   void SetCurrentScratchRegisterScope(UseScratchRegisterScope* scope) {
537     current_scratch_scope_ = scope;
538   }
GetCurrentScratchRegisterScope()539   UseScratchRegisterScope* GetCurrentScratchRegisterScope() {
540     return current_scratch_scope_;
541   }
542 
543   // Given an address calculation (Register + immediate), generate code to
544   // partially compute the address. The returned MemOperand will perform any
545   // remaining computation in a subsequent load or store instruction.
546   //
547   // The offset provided should be the offset that would be used in a load or
548   // store instruction (if it had sufficient range). This only matters where
549   // base.Is(pc), since load and store instructions align the pc before
550   // dereferencing it.
551   //
552   // TODO: Improve the handling of negative offsets. They are not implemented
553   // precisely for now because they only have a marginal benefit for the
554   // existing uses (in delegates).
555   MemOperand MemOperandComputationHelper(Condition cond,
556                                          Register scratch,
557                                          Register base,
558                                          uint32_t offset,
559                                          uint32_t extra_offset_mask = 0);
560 
561   MemOperand MemOperandComputationHelper(Register scratch,
562                                          Register base,
563                                          uint32_t offset,
564                                          uint32_t extra_offset_mask = 0) {
565     return MemOperandComputationHelper(al,
566                                        scratch,
567                                        base,
568                                        offset,
569                                        extra_offset_mask);
570   }
571   MemOperand MemOperandComputationHelper(Condition cond,
572                                          Register scratch,
573                                          Label* label,
574                                          uint32_t extra_offset_mask = 0) {
575     // Check for buffer space _before_ calculating the offset, in case we
576     // generate a pool that affects the offset calculation.
577     CodeBufferCheckScope scope(this, 4 * kMaxInstructionSizeInBytes);
578     Label::Offset offset =
579         label->GetLocation() -
580         AlignDown(GetCursorOffset() + GetArchitectureStatePCOffset(), 4);
581     return MemOperandComputationHelper(cond,
582                                        scratch,
583                                        pc,
584                                        offset,
585                                        extra_offset_mask);
586   }
587   MemOperand MemOperandComputationHelper(Register scratch,
588                                          Label* label,
589                                          uint32_t extra_offset_mask = 0) {
590     return MemOperandComputationHelper(al, scratch, label, extra_offset_mask);
591   }
592 
593   // Determine the appropriate mask to pass into MemOperandComputationHelper.
594   uint32_t GetOffsetMask(InstructionType type, AddrMode addrmode);
595 
596   // State and type helpers.
IsModifiedImmediate(uint32_t imm)597   bool IsModifiedImmediate(uint32_t imm) {
598     return IsUsingT32() ? ImmediateT32::IsImmediateT32(imm)
599                         : ImmediateA32::IsImmediateA32(imm);
600   }
601 
Bind(Label * label)602   void Bind(Label* label) {
603     VIXL_ASSERT(allow_macro_instructions_);
604     PadToMinimumBranchRange(label);
605     BindHelper(label);
606   }
607 
AddBranchLabel(Label * label)608   void AddBranchLabel(Label* label) {
609     if (label->IsBound()) return;
610     veneer_pool_manager_.AddLabel(label);
611   }
612 
Place(RawLiteral * literal)613   void Place(RawLiteral* literal) {
614     VIXL_ASSERT(allow_macro_instructions_);
615     VIXL_ASSERT(literal->IsManuallyPlaced());
616     // We have two calls to `GetBuffer()->Align()` below, that aligns on word
617     // (4 bytes) boundaries. Only one is taken into account in
618     // `GetAlignedSize()`.
619     static const size_t kMaxAlignSize = 3;
620     size_t size = literal->GetAlignedSize() + kMaxAlignSize;
621     VIXL_ASSERT(IsUint32(size));
622     // TODO: We should use a scope here to check the size of data emitted.  We
623     // currently cannot because `aarch32::CodeBufferCheckScope` currently checks
624     // for pools, so that could lead to an infinite loop.
625     EnsureEmitFor(static_cast<uint32_t>(size));
626     // Literals must be emitted aligned on word (4 bytes) boundaries.
627     GetBuffer()->Align();
628     PlaceHelper(literal);
629     GetBuffer()->Align();
630   }
631 
632   void ComputeCheckpoint();
633 
GetMarginBeforeVeneerEmission()634   int32_t GetMarginBeforeVeneerEmission() const {
635     return veneer_pool_manager_.GetCheckpoint() - GetCursorOffset();
636   }
637 
GetTargetForLiteralEmission()638   Label::Offset GetTargetForLiteralEmission() const {
639     if (literal_pool_manager_.IsEmpty()) return Label::kMaxOffset;
640     // We add an instruction to the size as the instruction which calls this
641     // function may add a veneer and, without this extra instruction, could put
642     // the literals out of range. For example, it's the case for a "B"
643     // instruction. At the beginning of the instruction we call EnsureEmitFor
644     // which calls this function. However, the target of the branch hasn't been
645     // inserted yet in the veneer pool.
646     size_t veneer_max_size =
647         veneer_pool_manager_.GetMaxSize() + kMaxInstructionSizeInBytes;
648     VIXL_ASSERT(IsInt32(veneer_max_size));
649     // We must be able to generate the veneer pool first.
650     Label::Offset tmp = literal_pool_manager_.GetCheckpoint() -
651                         static_cast<Label::Offset>(veneer_max_size);
652     VIXL_ASSERT(tmp >= 0);
653     return tmp;
654   }
655 
GetMarginBeforeLiteralEmission()656   int32_t GetMarginBeforeLiteralEmission() const {
657     Label::Offset tmp = GetTargetForLiteralEmission();
658     VIXL_ASSERT(tmp >= GetCursorOffset());
659     return tmp - GetCursorOffset();
660   }
661 
VeneerPoolIsEmpty()662   bool VeneerPoolIsEmpty() const { return veneer_pool_manager_.IsEmpty(); }
LiteralPoolIsEmpty()663   bool LiteralPoolIsEmpty() const { return literal_pool_manager_.IsEmpty(); }
664 
EnsureEmitFor(uint32_t size)665   void EnsureEmitFor(uint32_t size) {
666     Label::Offset target = GetCursorOffset() + size;
667     if (target <= checkpoint_) return;
668     PerformEnsureEmit(target, size);
669   }
670 
WasInsertedTooFar(RawLiteral * literal)671   bool WasInsertedTooFar(RawLiteral* literal) {
672     return literal_pool_manager_.WasInsertedTooFar(literal);
673   }
674 
AliasesAvailableScratchRegister(Register reg)675   bool AliasesAvailableScratchRegister(Register reg) {
676     return GetScratchRegisterList()->Includes(reg);
677   }
678 
AliasesAvailableScratchRegister(RegisterOrAPSR_nzcv reg)679   bool AliasesAvailableScratchRegister(RegisterOrAPSR_nzcv reg) {
680     if (reg.IsAPSR_nzcv()) return false;
681     return GetScratchRegisterList()->Includes(reg.AsRegister());
682   }
683 
AliasesAvailableScratchRegister(VRegister reg)684   bool AliasesAvailableScratchRegister(VRegister reg) {
685     return GetScratchVRegisterList()->IncludesAliasOf(reg);
686   }
687 
AliasesAvailableScratchRegister(const Operand & operand)688   bool AliasesAvailableScratchRegister(const Operand& operand) {
689     if (operand.IsImmediate()) return false;
690     return AliasesAvailableScratchRegister(operand.GetBaseRegister()) ||
691            (operand.IsRegisterShiftedRegister() &&
692             AliasesAvailableScratchRegister(operand.GetShiftRegister()));
693   }
694 
AliasesAvailableScratchRegister(const NeonOperand & operand)695   bool AliasesAvailableScratchRegister(const NeonOperand& operand) {
696     if (operand.IsImmediate()) return false;
697     return AliasesAvailableScratchRegister(operand.GetRegister());
698   }
699 
AliasesAvailableScratchRegister(SRegisterList list)700   bool AliasesAvailableScratchRegister(SRegisterList list) {
701     for (int n = 0; n < list.GetLength(); n++) {
702       if (AliasesAvailableScratchRegister(list.GetSRegister(n))) return true;
703     }
704     return false;
705   }
706 
AliasesAvailableScratchRegister(DRegisterList list)707   bool AliasesAvailableScratchRegister(DRegisterList list) {
708     for (int n = 0; n < list.GetLength(); n++) {
709       if (AliasesAvailableScratchRegister(list.GetDRegister(n))) return true;
710     }
711     return false;
712   }
713 
AliasesAvailableScratchRegister(NeonRegisterList list)714   bool AliasesAvailableScratchRegister(NeonRegisterList list) {
715     for (int n = 0; n < list.GetLength(); n++) {
716       if (AliasesAvailableScratchRegister(list.GetDRegister(n))) return true;
717     }
718     return false;
719   }
720 
AliasesAvailableScratchRegister(RegisterList list)721   bool AliasesAvailableScratchRegister(RegisterList list) {
722     return GetScratchRegisterList()->Overlaps(list);
723   }
724 
AliasesAvailableScratchRegister(const MemOperand & operand)725   bool AliasesAvailableScratchRegister(const MemOperand& operand) {
726     return AliasesAvailableScratchRegister(operand.GetBaseRegister()) ||
727            (operand.IsShiftedRegister() &&
728             AliasesAvailableScratchRegister(operand.GetOffsetRegister()));
729   }
730 
731   // Emit the literal pool in the code buffer.
732   // Every literal is placed on a 32bit boundary
733   // All the literals in the pool will be removed from the pool and potentially
734   // delete'd.
735   void EmitLiteralPool(LiteralPool* const literal_pool, EmitOption option);
736   void EmitLiteralPool(EmitOption option = kBranchRequired) {
737     VIXL_ASSERT(!IsLiteralPoolBlocked());
738     EmitLiteralPool(literal_pool_manager_.GetLiteralPool(), option);
739     literal_pool_manager_.ResetCheckpoint();
740     ComputeCheckpoint();
741   }
742 
GetLiteralPoolSize()743   size_t GetLiteralPoolSize() const {
744     return literal_pool_manager_.GetLiteralPoolSize();
745   }
746 
747   // Adr with a literal already constructed. Add the literal to the pool if it
748   // is not already done.
Adr(Condition cond,Register rd,RawLiteral * literal)749   void Adr(Condition cond, Register rd, RawLiteral* literal) {
750     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
751     VIXL_ASSERT(allow_macro_instructions_);
752     VIXL_ASSERT(OutsideITBlock());
753     EmitLiteralCondRL<&Assembler::adr> emit_helper(rd);
754     GenerateInstruction(cond, emit_helper, literal);
755   }
Adr(Register rd,RawLiteral * literal)756   void Adr(Register rd, RawLiteral* literal) { Adr(al, rd, literal); }
757 
758   // Loads with literals already constructed. Add the literal to the pool
759   // if it is not already done.
Ldr(Condition cond,Register rt,RawLiteral * literal)760   void Ldr(Condition cond, Register rt, RawLiteral* literal) {
761     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
762     VIXL_ASSERT(allow_macro_instructions_);
763     VIXL_ASSERT(OutsideITBlock());
764     EmitLiteralCondRL<&Assembler::ldr> emit_helper(rt);
765     GenerateInstruction(cond, emit_helper, literal);
766   }
Ldr(Register rt,RawLiteral * literal)767   void Ldr(Register rt, RawLiteral* literal) { Ldr(al, rt, literal); }
768 
Ldrb(Condition cond,Register rt,RawLiteral * literal)769   void Ldrb(Condition cond, Register rt, RawLiteral* literal) {
770     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
771     VIXL_ASSERT(allow_macro_instructions_);
772     VIXL_ASSERT(OutsideITBlock());
773     EmitLiteralCondRL<&Assembler::ldrb> emit_helper(rt);
774     GenerateInstruction(cond, emit_helper, literal);
775   }
Ldrb(Register rt,RawLiteral * literal)776   void Ldrb(Register rt, RawLiteral* literal) { Ldrb(al, rt, literal); }
777 
Ldrd(Condition cond,Register rt,Register rt2,RawLiteral * literal)778   void Ldrd(Condition cond, Register rt, Register rt2, RawLiteral* literal) {
779     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
780     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
781     VIXL_ASSERT(allow_macro_instructions_);
782     VIXL_ASSERT(OutsideITBlock());
783     EmitLiteralCondRRL<&Assembler::ldrd> emit_helper(rt, rt2);
784     GenerateInstruction(cond, emit_helper, literal);
785   }
Ldrd(Register rt,Register rt2,RawLiteral * literal)786   void Ldrd(Register rt, Register rt2, RawLiteral* literal) {
787     Ldrd(al, rt, rt2, literal);
788   }
789 
Ldrh(Condition cond,Register rt,RawLiteral * literal)790   void Ldrh(Condition cond, Register rt, RawLiteral* literal) {
791     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
792     VIXL_ASSERT(allow_macro_instructions_);
793     VIXL_ASSERT(OutsideITBlock());
794     EmitLiteralCondRL<&Assembler::ldrh> emit_helper(rt);
795     GenerateInstruction(cond, emit_helper, literal);
796   }
Ldrh(Register rt,RawLiteral * literal)797   void Ldrh(Register rt, RawLiteral* literal) { Ldrh(al, rt, literal); }
798 
Ldrsb(Condition cond,Register rt,RawLiteral * literal)799   void Ldrsb(Condition cond, Register rt, RawLiteral* literal) {
800     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
801     VIXL_ASSERT(allow_macro_instructions_);
802     VIXL_ASSERT(OutsideITBlock());
803     EmitLiteralCondRL<&Assembler::ldrsb> emit_helper(rt);
804     GenerateInstruction(cond, emit_helper, literal);
805   }
Ldrsb(Register rt,RawLiteral * literal)806   void Ldrsb(Register rt, RawLiteral* literal) { Ldrsb(al, rt, literal); }
807 
Ldrsh(Condition cond,Register rt,RawLiteral * literal)808   void Ldrsh(Condition cond, Register rt, RawLiteral* literal) {
809     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
810     VIXL_ASSERT(allow_macro_instructions_);
811     VIXL_ASSERT(OutsideITBlock());
812     EmitLiteralCondRL<&Assembler::ldrsh> emit_helper(rt);
813     GenerateInstruction(cond, emit_helper, literal);
814   }
Ldrsh(Register rt,RawLiteral * literal)815   void Ldrsh(Register rt, RawLiteral* literal) { Ldrsh(al, rt, literal); }
816 
Vldr(Condition cond,DataType dt,DRegister rd,RawLiteral * literal)817   void Vldr(Condition cond, DataType dt, DRegister rd, RawLiteral* literal) {
818     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
819     VIXL_ASSERT(allow_macro_instructions_);
820     VIXL_ASSERT(OutsideITBlock());
821     EmitLiteralCondDtDL<&Assembler::vldr> emit_helper(dt, rd);
822     GenerateInstruction(cond, emit_helper, literal);
823   }
Vldr(DataType dt,DRegister rd,RawLiteral * literal)824   void Vldr(DataType dt, DRegister rd, RawLiteral* literal) {
825     Vldr(al, dt, rd, literal);
826   }
Vldr(Condition cond,DRegister rd,RawLiteral * literal)827   void Vldr(Condition cond, DRegister rd, RawLiteral* literal) {
828     Vldr(cond, Untyped64, rd, literal);
829   }
Vldr(DRegister rd,RawLiteral * literal)830   void Vldr(DRegister rd, RawLiteral* literal) {
831     Vldr(al, Untyped64, rd, literal);
832   }
833 
Vldr(Condition cond,DataType dt,SRegister rd,RawLiteral * literal)834   void Vldr(Condition cond, DataType dt, SRegister rd, RawLiteral* literal) {
835     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
836     VIXL_ASSERT(allow_macro_instructions_);
837     VIXL_ASSERT(OutsideITBlock());
838     EmitLiteralCondDtSL<&Assembler::vldr> emit_helper(dt, rd);
839     GenerateInstruction(cond, emit_helper, literal);
840   }
Vldr(DataType dt,SRegister rd,RawLiteral * literal)841   void Vldr(DataType dt, SRegister rd, RawLiteral* literal) {
842     Vldr(al, dt, rd, literal);
843   }
Vldr(Condition cond,SRegister rd,RawLiteral * literal)844   void Vldr(Condition cond, SRegister rd, RawLiteral* literal) {
845     Vldr(cond, Untyped32, rd, literal);
846   }
Vldr(SRegister rd,RawLiteral * literal)847   void Vldr(SRegister rd, RawLiteral* literal) {
848     Vldr(al, Untyped32, rd, literal);
849   }
850 
851   // Generic Ldr(register, data)
Ldr(Condition cond,Register rt,uint32_t v)852   void Ldr(Condition cond, Register rt, uint32_t v) {
853     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
854     VIXL_ASSERT(allow_macro_instructions_);
855     VIXL_ASSERT(OutsideITBlock());
856     RawLiteral* literal =
857         new Literal<uint32_t>(v, RawLiteral::kDeletedOnPlacementByPool);
858     EmitLiteralCondRL<&Assembler::ldr> emit_helper(rt);
859     GenerateInstruction(cond, emit_helper, literal);
860   }
861   template <typename T>
Ldr(Register rt,T v)862   void Ldr(Register rt, T v) {
863     Ldr(al, rt, v);
864   }
865 
866   // Generic Ldrd(rt, rt2, data)
Ldrd(Condition cond,Register rt,Register rt2,uint64_t v)867   void Ldrd(Condition cond, Register rt, Register rt2, uint64_t v) {
868     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
869     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
870     VIXL_ASSERT(allow_macro_instructions_);
871     VIXL_ASSERT(OutsideITBlock());
872     RawLiteral* literal =
873         new Literal<uint64_t>(v, RawLiteral::kDeletedOnPlacementByPool);
874     EmitLiteralCondRRL<&Assembler::ldrd> emit_helper(rt, rt2);
875     GenerateInstruction(cond, emit_helper, literal);
876   }
877   template <typename T>
Ldrd(Register rt,Register rt2,T v)878   void Ldrd(Register rt, Register rt2, T v) {
879     Ldrd(al, rt, rt2, v);
880   }
881 
Vldr(Condition cond,SRegister rd,float v)882   void Vldr(Condition cond, SRegister rd, float v) {
883     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
884     VIXL_ASSERT(allow_macro_instructions_);
885     VIXL_ASSERT(OutsideITBlock());
886     RawLiteral* literal =
887         new Literal<float>(v, RawLiteral::kDeletedOnPlacementByPool);
888     EmitLiteralCondDtSL<&Assembler::vldr> emit_helper(Untyped32, rd);
889     GenerateInstruction(cond, emit_helper, literal);
890   }
Vldr(SRegister rd,float v)891   void Vldr(SRegister rd, float v) { Vldr(al, rd, v); }
892 
Vldr(Condition cond,DRegister rd,double v)893   void Vldr(Condition cond, DRegister rd, double v) {
894     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
895     VIXL_ASSERT(allow_macro_instructions_);
896     VIXL_ASSERT(OutsideITBlock());
897     RawLiteral* literal =
898         new Literal<double>(v, RawLiteral::kDeletedOnPlacementByPool);
899     EmitLiteralCondDtDL<&Assembler::vldr> emit_helper(Untyped64, rd);
900     GenerateInstruction(cond, emit_helper, literal);
901   }
Vldr(DRegister rd,double v)902   void Vldr(DRegister rd, double v) { Vldr(al, rd, v); }
903 
Vmov(Condition cond,DRegister rt,double v)904   void Vmov(Condition cond, DRegister rt, double v) { Vmov(cond, F64, rt, v); }
Vmov(DRegister rt,double v)905   void Vmov(DRegister rt, double v) { Vmov(al, F64, rt, v); }
Vmov(Condition cond,SRegister rt,float v)906   void Vmov(Condition cond, SRegister rt, float v) { Vmov(cond, F32, rt, v); }
Vmov(SRegister rt,float v)907   void Vmov(SRegister rt, float v) { Vmov(al, F32, rt, v); }
908 
909   // Claim memory on the stack.
910   // Note that the Claim, Drop, and Peek helpers below ensure that offsets used
911   // are multiples of 32 bits to help maintain 32-bit SP alignment.
912   // We could `Align{Up,Down}(size, 4)`, but that's potentially problematic:
913   //     Claim(3)
914   //     Claim(1)
915   //     Drop(4)
916   // would seem correct, when in fact:
917   //    Claim(3) -> sp = sp - 4
918   //    Claim(1) -> sp = sp - 4
919   //    Drop(4)  -> sp = sp + 4
920   //
Claim(int32_t size)921   void Claim(int32_t size) {
922     if (size == 0) return;
923     // The stack must be kept 32bit aligned.
924     VIXL_ASSERT((size > 0) && ((size % 4) == 0));
925     Sub(sp, sp, size);
926   }
927   // Release memory on the stack
Drop(int32_t size)928   void Drop(int32_t size) {
929     if (size == 0) return;
930     // The stack must be kept 32bit aligned.
931     VIXL_ASSERT((size > 0) && ((size % 4) == 0));
932     Add(sp, sp, size);
933   }
Peek(Register dst,int32_t offset)934   void Peek(Register dst, int32_t offset) {
935     VIXL_ASSERT((offset >= 0) && ((offset % 4) == 0));
936     Ldr(dst, MemOperand(sp, offset));
937   }
Poke(Register src,int32_t offset)938   void Poke(Register src, int32_t offset) {
939     VIXL_ASSERT((offset >= 0) && ((offset % 4) == 0));
940     Str(src, MemOperand(sp, offset));
941   }
942   void Printf(const char* format,
943               CPURegister reg1 = NoReg,
944               CPURegister reg2 = NoReg,
945               CPURegister reg3 = NoReg,
946               CPURegister reg4 = NoReg);
947   // Functions used by Printf for generation.
948   void PushRegister(CPURegister reg);
949   void PreparePrintfArgument(CPURegister reg,
950                              int* core_count,
951                              int* vfp_count,
952                              uint32_t* printf_type);
953   // Handlers for cases not handled by the assembler.
954   // ADD, MOVT, MOVW, SUB, SXTB16, TEQ, UXTB16
955   virtual void Delegate(InstructionType type,
956                         InstructionCondROp instruction,
957                         Condition cond,
958                         Register rn,
959                         const Operand& operand) VIXL_OVERRIDE;
960   // CMN, CMP, MOV, MOVS, MVN, MVNS, SXTB, SXTH, TST, UXTB, UXTH
961   virtual void Delegate(InstructionType type,
962                         InstructionCondSizeROp instruction,
963                         Condition cond,
964                         EncodingSize size,
965                         Register rn,
966                         const Operand& operand) VIXL_OVERRIDE;
967   // ADDW, ORN, ORNS, PKHBT, PKHTB, RSC, RSCS, SUBW, SXTAB, SXTAB16, SXTAH,
968   // UXTAB, UXTAB16, UXTAH
969   virtual void Delegate(InstructionType type,
970                         InstructionCondRROp instruction,
971                         Condition cond,
972                         Register rd,
973                         Register rn,
974                         const Operand& operand) VIXL_OVERRIDE;
975   // ADC, ADCS, ADD, ADDS, AND, ANDS, ASR, ASRS, BIC, BICS, EOR, EORS, LSL,
976   // LSLS, LSR, LSRS, ORR, ORRS, ROR, RORS, RSB, RSBS, SBC, SBCS, SUB, SUBS
977   virtual void Delegate(InstructionType type,
978                         InstructionCondSizeRL instruction,
979                         Condition cond,
980                         EncodingSize size,
981                         Register rd,
982                         Label* label) VIXL_OVERRIDE;
983   bool GenerateSplitInstruction(InstructionCondSizeRROp instruction,
984                                 Condition cond,
985                                 Register rd,
986                                 Register rn,
987                                 uint32_t imm,
988                                 uint32_t mask);
989   virtual void Delegate(InstructionType type,
990                         InstructionCondSizeRROp instruction,
991                         Condition cond,
992                         EncodingSize size,
993                         Register rd,
994                         Register rn,
995                         const Operand& operand) VIXL_OVERRIDE;
996   // CBNZ, CBZ
997   virtual void Delegate(InstructionType type,
998                         InstructionRL instruction,
999                         Register rn,
1000                         Label* label) VIXL_OVERRIDE;
1001   // VMOV
1002   virtual void Delegate(InstructionType type,
1003                         InstructionCondDtSSop instruction,
1004                         Condition cond,
1005                         DataType dt,
1006                         SRegister rd,
1007                         const SOperand& operand) VIXL_OVERRIDE;
1008   // VMOV, VMVN
1009   virtual void Delegate(InstructionType type,
1010                         InstructionCondDtDDop instruction,
1011                         Condition cond,
1012                         DataType dt,
1013                         DRegister rd,
1014                         const DOperand& operand) VIXL_OVERRIDE;
1015   // VMOV, VMVN
1016   virtual void Delegate(InstructionType type,
1017                         InstructionCondDtQQop instruction,
1018                         Condition cond,
1019                         DataType dt,
1020                         QRegister rd,
1021                         const QOperand& operand) VIXL_OVERRIDE;
1022   // LDR, LDRB, LDRH, LDRSB, LDRSH, STR, STRB, STRH
1023   virtual void Delegate(InstructionType type,
1024                         InstructionCondSizeRMop instruction,
1025                         Condition cond,
1026                         EncodingSize size,
1027                         Register rd,
1028                         const MemOperand& operand) VIXL_OVERRIDE;
1029   // LDAEXD, LDRD, LDREXD, STLEX, STLEXB, STLEXH, STRD, STREX, STREXB, STREXH
1030   virtual void Delegate(InstructionType type,
1031                         InstructionCondRL instruction,
1032                         Condition cond,
1033                         Register rt,
1034                         Label* label) VIXL_OVERRIDE;
1035   virtual void Delegate(InstructionType type,
1036                         InstructionCondRRL instruction,
1037                         Condition cond,
1038                         Register rt,
1039                         Register rt2,
1040                         Label* label) VIXL_OVERRIDE;
1041   virtual void Delegate(InstructionType type,
1042                         InstructionCondRRMop instruction,
1043                         Condition cond,
1044                         Register rt,
1045                         Register rt2,
1046                         const MemOperand& operand) VIXL_OVERRIDE;
1047   // VLDR, VSTR
1048   virtual void Delegate(InstructionType type,
1049                         InstructionCondDtSMop instruction,
1050                         Condition cond,
1051                         DataType dt,
1052                         SRegister rd,
1053                         const MemOperand& operand) VIXL_OVERRIDE;
1054   // VLDR, VSTR
1055   virtual void Delegate(InstructionType type,
1056                         InstructionCondDtDMop instruction,
1057                         Condition cond,
1058                         DataType dt,
1059                         DRegister rd,
1060                         const MemOperand& operand) VIXL_OVERRIDE;
1061   // MSR
1062   virtual void Delegate(InstructionType type,
1063                         InstructionCondMsrOp instruction,
1064                         Condition cond,
1065                         MaskedSpecialRegister spec_reg,
1066                         const Operand& operand) VIXL_OVERRIDE;
1067   virtual void Delegate(InstructionType type,
1068                         InstructionCondDtDL instruction,
1069                         Condition cond,
1070                         DataType dt,
1071                         DRegister rd,
1072                         Label* label) VIXL_OVERRIDE;
1073   virtual void Delegate(InstructionType type,
1074                         InstructionCondDtSL instruction,
1075                         Condition cond,
1076                         DataType dt,
1077                         SRegister rd,
1078                         Label* label) VIXL_OVERRIDE;
1079 
1080   // Start of generated code.
1081 
Adc(Condition cond,Register rd,Register rn,const Operand & operand)1082   void Adc(Condition cond, Register rd, Register rn, const Operand& operand) {
1083     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1084     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1085     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1086     VIXL_ASSERT(allow_macro_instructions_);
1087     VIXL_ASSERT(OutsideITBlock());
1088     MacroEmissionCheckScope guard(this);
1089     bool can_use_it =
1090         // ADC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1091         operand.IsPlainRegister() && rn.IsLow() && rd.Is(rn) &&
1092         operand.GetBaseRegister().IsLow();
1093     ITScope it_scope(this, &cond, can_use_it);
1094     adc(cond, rd, rn, operand);
1095   }
Adc(Register rd,Register rn,const Operand & operand)1096   void Adc(Register rd, Register rn, const Operand& operand) {
1097     Adc(al, rd, rn, operand);
1098   }
Adc(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1099   void Adc(FlagsUpdate flags,
1100            Condition cond,
1101            Register rd,
1102            Register rn,
1103            const Operand& operand) {
1104     switch (flags) {
1105       case LeaveFlags:
1106         Adc(cond, rd, rn, operand);
1107         break;
1108       case SetFlags:
1109         Adcs(cond, rd, rn, operand);
1110         break;
1111       case DontCare:
1112         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1113                                    rn.Is(rd) && operand.IsPlainRegister() &&
1114                                    operand.GetBaseRegister().IsLow();
1115         if (setflags_is_smaller) {
1116           Adcs(cond, rd, rn, operand);
1117         } else {
1118           Adc(cond, rd, rn, operand);
1119         }
1120         break;
1121     }
1122   }
Adc(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1123   void Adc(FlagsUpdate flags,
1124            Register rd,
1125            Register rn,
1126            const Operand& operand) {
1127     Adc(flags, al, rd, rn, operand);
1128   }
1129 
Adcs(Condition cond,Register rd,Register rn,const Operand & operand)1130   void Adcs(Condition cond, Register rd, Register rn, const Operand& operand) {
1131     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1132     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1133     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1134     VIXL_ASSERT(allow_macro_instructions_);
1135     VIXL_ASSERT(OutsideITBlock());
1136     MacroEmissionCheckScope guard(this);
1137     ITScope it_scope(this, &cond);
1138     adcs(cond, rd, rn, operand);
1139   }
Adcs(Register rd,Register rn,const Operand & operand)1140   void Adcs(Register rd, Register rn, const Operand& operand) {
1141     Adcs(al, rd, rn, operand);
1142   }
1143 
Add(Condition cond,Register rd,Register rn,const Operand & operand)1144   void Add(Condition cond, Register rd, Register rn, const Operand& operand) {
1145     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1146     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1147     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1148     VIXL_ASSERT(allow_macro_instructions_);
1149     VIXL_ASSERT(OutsideITBlock());
1150     MacroEmissionCheckScope guard(this);
1151     if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) {
1152       uint32_t immediate = operand.GetImmediate();
1153       if (immediate == 0) {
1154         return;
1155       }
1156     }
1157     bool can_use_it =
1158         // ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
1159         (operand.IsImmediate() && (operand.GetImmediate() <= 7) && rn.IsLow() &&
1160          rd.IsLow()) ||
1161         // ADD<c>{<q>} {<Rdn>,} <Rdn>, #<imm8> ; T2
1162         (operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
1163          rd.IsLow() && rn.Is(rd)) ||
1164         // ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1
1165         (operand.IsImmediate() && (operand.GetImmediate() <= 1020) &&
1166          ((operand.GetImmediate() & 0x3) == 0) && rd.IsLow() && rn.IsSP()) ||
1167         // ADD<c>{<q>} <Rd>, <Rn>, <Rm>
1168         (operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
1169          operand.GetBaseRegister().IsLow()) ||
1170         // ADD<c>{<q>} <Rdn>, <Rm> ; T2
1171         (operand.IsPlainRegister() && !rd.IsPC() && rn.Is(rd) &&
1172          !operand.GetBaseRegister().IsSP() &&
1173          !operand.GetBaseRegister().IsPC()) ||
1174         // ADD{<c>}{<q>} {<Rdm>,} SP, <Rdm> ; T1
1175         (operand.IsPlainRegister() && !rd.IsPC() && rn.IsSP() &&
1176          operand.GetBaseRegister().Is(rd));
1177     ITScope it_scope(this, &cond, can_use_it);
1178     add(cond, rd, rn, operand);
1179   }
Add(Register rd,Register rn,const Operand & operand)1180   void Add(Register rd, Register rn, const Operand& operand) {
1181     Add(al, rd, rn, operand);
1182   }
Add(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1183   void Add(FlagsUpdate flags,
1184            Condition cond,
1185            Register rd,
1186            Register rn,
1187            const Operand& operand) {
1188     switch (flags) {
1189       case LeaveFlags:
1190         Add(cond, rd, rn, operand);
1191         break;
1192       case SetFlags:
1193         Adds(cond, rd, rn, operand);
1194         break;
1195       case DontCare:
1196         bool setflags_is_smaller =
1197             IsUsingT32() && cond.Is(al) &&
1198             ((operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
1199               !rd.Is(rn) && operand.GetBaseRegister().IsLow()) ||
1200              (operand.IsImmediate() &&
1201               ((rd.IsLow() && rn.IsLow() && (operand.GetImmediate() < 8)) ||
1202                (rd.IsLow() && rn.Is(rd) && (operand.GetImmediate() < 256)))));
1203         if (setflags_is_smaller) {
1204           Adds(cond, rd, rn, operand);
1205         } else {
1206           bool changed_op_is_smaller =
1207               operand.IsImmediate() && (operand.GetSignedImmediate() < 0) &&
1208               ((rd.IsLow() && rn.IsLow() &&
1209                 (operand.GetSignedImmediate() >= -7)) ||
1210                (rd.IsLow() && rn.Is(rd) &&
1211                 (operand.GetSignedImmediate() >= -255)));
1212           if (changed_op_is_smaller) {
1213             Subs(cond, rd, rn, -operand.GetSignedImmediate());
1214           } else {
1215             Add(cond, rd, rn, operand);
1216           }
1217         }
1218         break;
1219     }
1220   }
Add(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1221   void Add(FlagsUpdate flags,
1222            Register rd,
1223            Register rn,
1224            const Operand& operand) {
1225     Add(flags, al, rd, rn, operand);
1226   }
1227 
Adds(Condition cond,Register rd,Register rn,const Operand & operand)1228   void Adds(Condition cond, Register rd, Register rn, const Operand& operand) {
1229     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1230     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1231     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1232     VIXL_ASSERT(allow_macro_instructions_);
1233     VIXL_ASSERT(OutsideITBlock());
1234     MacroEmissionCheckScope guard(this);
1235     ITScope it_scope(this, &cond);
1236     adds(cond, rd, rn, operand);
1237   }
Adds(Register rd,Register rn,const Operand & operand)1238   void Adds(Register rd, Register rn, const Operand& operand) {
1239     Adds(al, rd, rn, operand);
1240   }
1241 
And(Condition cond,Register rd,Register rn,const Operand & operand)1242   void And(Condition cond, Register rd, Register rn, const Operand& operand) {
1243     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1244     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1245     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1246     VIXL_ASSERT(allow_macro_instructions_);
1247     VIXL_ASSERT(OutsideITBlock());
1248     MacroEmissionCheckScope guard(this);
1249     if (rd.Is(rn) && operand.IsPlainRegister() &&
1250         rd.Is(operand.GetBaseRegister())) {
1251       return;
1252     }
1253     if (cond.Is(al) && operand.IsImmediate()) {
1254       uint32_t immediate = operand.GetImmediate();
1255       if (immediate == 0) {
1256         mov(rd, 0);
1257         return;
1258       }
1259       if ((immediate == 0xffffffff) && rd.Is(rn)) {
1260         return;
1261       }
1262     }
1263     bool can_use_it =
1264         // AND<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1265         operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
1266         operand.GetBaseRegister().IsLow();
1267     ITScope it_scope(this, &cond, can_use_it);
1268     and_(cond, rd, rn, operand);
1269   }
And(Register rd,Register rn,const Operand & operand)1270   void And(Register rd, Register rn, const Operand& operand) {
1271     And(al, rd, rn, operand);
1272   }
And(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1273   void And(FlagsUpdate flags,
1274            Condition cond,
1275            Register rd,
1276            Register rn,
1277            const Operand& operand) {
1278     switch (flags) {
1279       case LeaveFlags:
1280         And(cond, rd, rn, operand);
1281         break;
1282       case SetFlags:
1283         Ands(cond, rd, rn, operand);
1284         break;
1285       case DontCare:
1286         if (operand.IsPlainRegister() && rd.Is(rn) &&
1287             rd.Is(operand.GetBaseRegister())) {
1288           return;
1289         }
1290         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1291                                    rn.Is(rd) && operand.IsPlainRegister() &&
1292                                    operand.GetBaseRegister().IsLow();
1293         if (setflags_is_smaller) {
1294           Ands(cond, rd, rn, operand);
1295         } else {
1296           And(cond, rd, rn, operand);
1297         }
1298         break;
1299     }
1300   }
And(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1301   void And(FlagsUpdate flags,
1302            Register rd,
1303            Register rn,
1304            const Operand& operand) {
1305     And(flags, al, rd, rn, operand);
1306   }
1307 
Ands(Condition cond,Register rd,Register rn,const Operand & operand)1308   void Ands(Condition cond, Register rd, Register rn, const Operand& operand) {
1309     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1310     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1311     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1312     VIXL_ASSERT(allow_macro_instructions_);
1313     VIXL_ASSERT(OutsideITBlock());
1314     MacroEmissionCheckScope guard(this);
1315     ITScope it_scope(this, &cond);
1316     ands(cond, rd, rn, operand);
1317   }
Ands(Register rd,Register rn,const Operand & operand)1318   void Ands(Register rd, Register rn, const Operand& operand) {
1319     Ands(al, rd, rn, operand);
1320   }
1321 
Asr(Condition cond,Register rd,Register rm,const Operand & operand)1322   void Asr(Condition cond, Register rd, Register rm, const Operand& operand) {
1323     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1324     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1325     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1326     VIXL_ASSERT(allow_macro_instructions_);
1327     VIXL_ASSERT(OutsideITBlock());
1328     MacroEmissionCheckScope guard(this);
1329     bool can_use_it =
1330         // ASR<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
1331         (operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
1332          (operand.GetImmediate() <= 32) && rd.IsLow() && rm.IsLow()) ||
1333         // ASR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
1334         (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
1335          operand.GetBaseRegister().IsLow());
1336     ITScope it_scope(this, &cond, can_use_it);
1337     asr(cond, rd, rm, operand);
1338   }
Asr(Register rd,Register rm,const Operand & operand)1339   void Asr(Register rd, Register rm, const Operand& operand) {
1340     Asr(al, rd, rm, operand);
1341   }
Asr(FlagsUpdate flags,Condition cond,Register rd,Register rm,const Operand & operand)1342   void Asr(FlagsUpdate flags,
1343            Condition cond,
1344            Register rd,
1345            Register rm,
1346            const Operand& operand) {
1347     switch (flags) {
1348       case LeaveFlags:
1349         Asr(cond, rd, rm, operand);
1350         break;
1351       case SetFlags:
1352         Asrs(cond, rd, rm, operand);
1353         break;
1354       case DontCare:
1355         bool setflags_is_smaller =
1356             IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() &&
1357             ((operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
1358               (operand.GetImmediate() <= 32)) ||
1359              (operand.IsPlainRegister() && rd.Is(rm)));
1360         if (setflags_is_smaller) {
1361           Asrs(cond, rd, rm, operand);
1362         } else {
1363           Asr(cond, rd, rm, operand);
1364         }
1365         break;
1366     }
1367   }
Asr(FlagsUpdate flags,Register rd,Register rm,const Operand & operand)1368   void Asr(FlagsUpdate flags,
1369            Register rd,
1370            Register rm,
1371            const Operand& operand) {
1372     Asr(flags, al, rd, rm, operand);
1373   }
1374 
Asrs(Condition cond,Register rd,Register rm,const Operand & operand)1375   void Asrs(Condition cond, Register rd, Register rm, const Operand& operand) {
1376     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1377     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1378     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1379     VIXL_ASSERT(allow_macro_instructions_);
1380     VIXL_ASSERT(OutsideITBlock());
1381     MacroEmissionCheckScope guard(this);
1382     ITScope it_scope(this, &cond);
1383     asrs(cond, rd, rm, operand);
1384   }
Asrs(Register rd,Register rm,const Operand & operand)1385   void Asrs(Register rd, Register rm, const Operand& operand) {
1386     Asrs(al, rd, rm, operand);
1387   }
1388 
1389   void B(Condition cond, Label* label, BranchHint hint = kBranchWithoutHint) {
1390     VIXL_ASSERT(allow_macro_instructions_);
1391     VIXL_ASSERT(OutsideITBlock());
1392     MacroEmissionCheckScope guard(this);
1393     if (hint == kNear) {
1394       if (label->IsBound()) {
1395         b(cond, label);
1396       } else {
1397         b(cond, Narrow, label);
1398       }
1399     } else {
1400       b(cond, label);
1401     }
1402     AddBranchLabel(label);
1403   }
1404   void B(Label* label, BranchHint hint = kBranchWithoutHint) {
1405     B(al, label, hint);
1406   }
BPreferNear(Condition cond,Label * label)1407   void BPreferNear(Condition cond, Label* label) { B(cond, label, kNear); }
BPreferNear(Label * label)1408   void BPreferNear(Label* label) { B(al, label, kNear); }
1409 
Bfc(Condition cond,Register rd,uint32_t lsb,const Operand & operand)1410   void Bfc(Condition cond, Register rd, uint32_t lsb, const Operand& operand) {
1411     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1412     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1413     VIXL_ASSERT(allow_macro_instructions_);
1414     VIXL_ASSERT(OutsideITBlock());
1415     MacroEmissionCheckScope guard(this);
1416     ITScope it_scope(this, &cond);
1417     bfc(cond, rd, lsb, operand);
1418   }
Bfc(Register rd,uint32_t lsb,const Operand & operand)1419   void Bfc(Register rd, uint32_t lsb, const Operand& operand) {
1420     Bfc(al, rd, lsb, operand);
1421   }
1422 
Bfi(Condition cond,Register rd,Register rn,uint32_t lsb,const Operand & operand)1423   void Bfi(Condition cond,
1424            Register rd,
1425            Register rn,
1426            uint32_t lsb,
1427            const Operand& operand) {
1428     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1429     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1430     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1431     VIXL_ASSERT(allow_macro_instructions_);
1432     VIXL_ASSERT(OutsideITBlock());
1433     MacroEmissionCheckScope guard(this);
1434     ITScope it_scope(this, &cond);
1435     bfi(cond, rd, rn, lsb, operand);
1436   }
Bfi(Register rd,Register rn,uint32_t lsb,const Operand & operand)1437   void Bfi(Register rd, Register rn, uint32_t lsb, const Operand& operand) {
1438     Bfi(al, rd, rn, lsb, operand);
1439   }
1440 
Bic(Condition cond,Register rd,Register rn,const Operand & operand)1441   void Bic(Condition cond, Register rd, Register rn, const Operand& operand) {
1442     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1443     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1444     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1445     VIXL_ASSERT(allow_macro_instructions_);
1446     VIXL_ASSERT(OutsideITBlock());
1447     MacroEmissionCheckScope guard(this);
1448     if (cond.Is(al) && operand.IsImmediate()) {
1449       uint32_t immediate = operand.GetImmediate();
1450       if ((immediate == 0) && rd.Is(rn)) {
1451         return;
1452       }
1453       if (immediate == 0xffffffff) {
1454         mov(rd, 0);
1455         return;
1456       }
1457     }
1458     bool can_use_it =
1459         // BIC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1460         operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
1461         operand.GetBaseRegister().IsLow();
1462     ITScope it_scope(this, &cond, can_use_it);
1463     bic(cond, rd, rn, operand);
1464   }
Bic(Register rd,Register rn,const Operand & operand)1465   void Bic(Register rd, Register rn, const Operand& operand) {
1466     Bic(al, rd, rn, operand);
1467   }
Bic(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1468   void Bic(FlagsUpdate flags,
1469            Condition cond,
1470            Register rd,
1471            Register rn,
1472            const Operand& operand) {
1473     switch (flags) {
1474       case LeaveFlags:
1475         Bic(cond, rd, rn, operand);
1476         break;
1477       case SetFlags:
1478         Bics(cond, rd, rn, operand);
1479         break;
1480       case DontCare:
1481         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1482                                    rn.Is(rd) && operand.IsPlainRegister() &&
1483                                    operand.GetBaseRegister().IsLow();
1484         if (setflags_is_smaller) {
1485           Bics(cond, rd, rn, operand);
1486         } else {
1487           Bic(cond, rd, rn, operand);
1488         }
1489         break;
1490     }
1491   }
Bic(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1492   void Bic(FlagsUpdate flags,
1493            Register rd,
1494            Register rn,
1495            const Operand& operand) {
1496     Bic(flags, al, rd, rn, operand);
1497   }
1498 
Bics(Condition cond,Register rd,Register rn,const Operand & operand)1499   void Bics(Condition cond, Register rd, Register rn, const Operand& operand) {
1500     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1501     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1502     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1503     VIXL_ASSERT(allow_macro_instructions_);
1504     VIXL_ASSERT(OutsideITBlock());
1505     MacroEmissionCheckScope guard(this);
1506     ITScope it_scope(this, &cond);
1507     bics(cond, rd, rn, operand);
1508   }
Bics(Register rd,Register rn,const Operand & operand)1509   void Bics(Register rd, Register rn, const Operand& operand) {
1510     Bics(al, rd, rn, operand);
1511   }
1512 
Bkpt(Condition cond,uint32_t imm)1513   void Bkpt(Condition cond, uint32_t imm) {
1514     VIXL_ASSERT(allow_macro_instructions_);
1515     VIXL_ASSERT(OutsideITBlock());
1516     MacroEmissionCheckScope guard(this);
1517     ITScope it_scope(this, &cond);
1518     bkpt(cond, imm);
1519   }
Bkpt(uint32_t imm)1520   void Bkpt(uint32_t imm) { Bkpt(al, imm); }
1521 
Bl(Condition cond,Label * label)1522   void Bl(Condition cond, Label* label) {
1523     VIXL_ASSERT(allow_macro_instructions_);
1524     VIXL_ASSERT(OutsideITBlock());
1525     MacroEmissionCheckScope guard(this);
1526     ITScope it_scope(this, &cond);
1527     bl(cond, label);
1528     AddBranchLabel(label);
1529   }
Bl(Label * label)1530   void Bl(Label* label) { Bl(al, label); }
1531 
Blx(Condition cond,Label * label)1532   void Blx(Condition cond, Label* label) {
1533     VIXL_ASSERT(allow_macro_instructions_);
1534     VIXL_ASSERT(OutsideITBlock());
1535     MacroEmissionCheckScope guard(this);
1536     ITScope it_scope(this, &cond);
1537     blx(cond, label);
1538     AddBranchLabel(label);
1539   }
Blx(Label * label)1540   void Blx(Label* label) { Blx(al, label); }
1541 
Blx(Condition cond,Register rm)1542   void Blx(Condition cond, Register rm) {
1543     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1544     VIXL_ASSERT(allow_macro_instructions_);
1545     VIXL_ASSERT(OutsideITBlock());
1546     MacroEmissionCheckScope guard(this);
1547     bool can_use_it =
1548         // BLX{<c>}{<q>} <Rm> ; T1
1549         !rm.IsPC();
1550     ITScope it_scope(this, &cond, can_use_it);
1551     blx(cond, rm);
1552   }
Blx(Register rm)1553   void Blx(Register rm) { Blx(al, rm); }
1554 
Bx(Condition cond,Register rm)1555   void Bx(Condition cond, Register rm) {
1556     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1557     VIXL_ASSERT(allow_macro_instructions_);
1558     VIXL_ASSERT(OutsideITBlock());
1559     MacroEmissionCheckScope guard(this);
1560     bool can_use_it =
1561         // BX{<c>}{<q>} <Rm> ; T1
1562         !rm.IsPC();
1563     ITScope it_scope(this, &cond, can_use_it);
1564     bx(cond, rm);
1565   }
Bx(Register rm)1566   void Bx(Register rm) { Bx(al, rm); }
1567 
Bxj(Condition cond,Register rm)1568   void Bxj(Condition cond, Register rm) {
1569     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1570     VIXL_ASSERT(allow_macro_instructions_);
1571     VIXL_ASSERT(OutsideITBlock());
1572     MacroEmissionCheckScope guard(this);
1573     ITScope it_scope(this, &cond);
1574     bxj(cond, rm);
1575   }
Bxj(Register rm)1576   void Bxj(Register rm) { Bxj(al, rm); }
1577 
Cbnz(Register rn,Label * label)1578   void Cbnz(Register rn, Label* label) {
1579     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1580     VIXL_ASSERT(allow_macro_instructions_);
1581     VIXL_ASSERT(OutsideITBlock());
1582     MacroEmissionCheckScope guard(this);
1583     cbnz(rn, label);
1584     AddBranchLabel(label);
1585   }
1586 
Cbz(Register rn,Label * label)1587   void Cbz(Register rn, Label* label) {
1588     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1589     VIXL_ASSERT(allow_macro_instructions_);
1590     VIXL_ASSERT(OutsideITBlock());
1591     MacroEmissionCheckScope guard(this);
1592     cbz(rn, label);
1593     AddBranchLabel(label);
1594   }
1595 
Clrex(Condition cond)1596   void Clrex(Condition cond) {
1597     VIXL_ASSERT(allow_macro_instructions_);
1598     VIXL_ASSERT(OutsideITBlock());
1599     MacroEmissionCheckScope guard(this);
1600     ITScope it_scope(this, &cond);
1601     clrex(cond);
1602   }
Clrex()1603   void Clrex() { Clrex(al); }
1604 
Clz(Condition cond,Register rd,Register rm)1605   void Clz(Condition cond, Register rd, Register rm) {
1606     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1607     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1608     VIXL_ASSERT(allow_macro_instructions_);
1609     VIXL_ASSERT(OutsideITBlock());
1610     MacroEmissionCheckScope guard(this);
1611     ITScope it_scope(this, &cond);
1612     clz(cond, rd, rm);
1613   }
Clz(Register rd,Register rm)1614   void Clz(Register rd, Register rm) { Clz(al, rd, rm); }
1615 
Cmn(Condition cond,Register rn,const Operand & operand)1616   void Cmn(Condition cond, Register rn, const Operand& operand) {
1617     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1618     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1619     VIXL_ASSERT(allow_macro_instructions_);
1620     VIXL_ASSERT(OutsideITBlock());
1621     MacroEmissionCheckScope guard(this);
1622     bool can_use_it =
1623         // CMN{<c>}{<q>} <Rn>, <Rm> ; T1
1624         operand.IsPlainRegister() && rn.IsLow() &&
1625         operand.GetBaseRegister().IsLow();
1626     ITScope it_scope(this, &cond, can_use_it);
1627     cmn(cond, rn, operand);
1628   }
Cmn(Register rn,const Operand & operand)1629   void Cmn(Register rn, const Operand& operand) { Cmn(al, rn, operand); }
1630 
Cmp(Condition cond,Register rn,const Operand & operand)1631   void Cmp(Condition cond, Register rn, const Operand& operand) {
1632     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1633     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1634     VIXL_ASSERT(allow_macro_instructions_);
1635     VIXL_ASSERT(OutsideITBlock());
1636     MacroEmissionCheckScope guard(this);
1637     bool can_use_it =
1638         // CMP{<c>}{<q>} <Rn>, #<imm8> ; T1
1639         (operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
1640          rn.IsLow()) ||
1641         // CMP{<c>}{<q>} <Rn>, <Rm> ; T1 T2
1642         (operand.IsPlainRegister() && !rn.IsPC() &&
1643          !operand.GetBaseRegister().IsPC());
1644     ITScope it_scope(this, &cond, can_use_it);
1645     cmp(cond, rn, operand);
1646   }
Cmp(Register rn,const Operand & operand)1647   void Cmp(Register rn, const Operand& operand) { Cmp(al, rn, operand); }
1648 
Crc32b(Condition cond,Register rd,Register rn,Register rm)1649   void Crc32b(Condition cond, Register rd, Register rn, Register rm) {
1650     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1651     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1652     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1653     VIXL_ASSERT(allow_macro_instructions_);
1654     VIXL_ASSERT(OutsideITBlock());
1655     MacroEmissionCheckScope guard(this);
1656     ITScope it_scope(this, &cond);
1657     crc32b(cond, rd, rn, rm);
1658   }
Crc32b(Register rd,Register rn,Register rm)1659   void Crc32b(Register rd, Register rn, Register rm) { Crc32b(al, rd, rn, rm); }
1660 
Crc32cb(Condition cond,Register rd,Register rn,Register rm)1661   void Crc32cb(Condition cond, Register rd, Register rn, Register rm) {
1662     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1663     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1664     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1665     VIXL_ASSERT(allow_macro_instructions_);
1666     VIXL_ASSERT(OutsideITBlock());
1667     MacroEmissionCheckScope guard(this);
1668     ITScope it_scope(this, &cond);
1669     crc32cb(cond, rd, rn, rm);
1670   }
Crc32cb(Register rd,Register rn,Register rm)1671   void Crc32cb(Register rd, Register rn, Register rm) {
1672     Crc32cb(al, rd, rn, rm);
1673   }
1674 
Crc32ch(Condition cond,Register rd,Register rn,Register rm)1675   void Crc32ch(Condition cond, Register rd, Register rn, Register rm) {
1676     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1677     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1678     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1679     VIXL_ASSERT(allow_macro_instructions_);
1680     VIXL_ASSERT(OutsideITBlock());
1681     MacroEmissionCheckScope guard(this);
1682     ITScope it_scope(this, &cond);
1683     crc32ch(cond, rd, rn, rm);
1684   }
Crc32ch(Register rd,Register rn,Register rm)1685   void Crc32ch(Register rd, Register rn, Register rm) {
1686     Crc32ch(al, rd, rn, rm);
1687   }
1688 
Crc32cw(Condition cond,Register rd,Register rn,Register rm)1689   void Crc32cw(Condition cond, Register rd, Register rn, Register rm) {
1690     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1691     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1692     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1693     VIXL_ASSERT(allow_macro_instructions_);
1694     VIXL_ASSERT(OutsideITBlock());
1695     MacroEmissionCheckScope guard(this);
1696     ITScope it_scope(this, &cond);
1697     crc32cw(cond, rd, rn, rm);
1698   }
Crc32cw(Register rd,Register rn,Register rm)1699   void Crc32cw(Register rd, Register rn, Register rm) {
1700     Crc32cw(al, rd, rn, rm);
1701   }
1702 
Crc32h(Condition cond,Register rd,Register rn,Register rm)1703   void Crc32h(Condition cond, Register rd, Register rn, Register rm) {
1704     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1705     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1706     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1707     VIXL_ASSERT(allow_macro_instructions_);
1708     VIXL_ASSERT(OutsideITBlock());
1709     MacroEmissionCheckScope guard(this);
1710     ITScope it_scope(this, &cond);
1711     crc32h(cond, rd, rn, rm);
1712   }
Crc32h(Register rd,Register rn,Register rm)1713   void Crc32h(Register rd, Register rn, Register rm) { Crc32h(al, rd, rn, rm); }
1714 
Crc32w(Condition cond,Register rd,Register rn,Register rm)1715   void Crc32w(Condition cond, Register rd, Register rn, Register rm) {
1716     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1717     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1718     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1719     VIXL_ASSERT(allow_macro_instructions_);
1720     VIXL_ASSERT(OutsideITBlock());
1721     MacroEmissionCheckScope guard(this);
1722     ITScope it_scope(this, &cond);
1723     crc32w(cond, rd, rn, rm);
1724   }
Crc32w(Register rd,Register rn,Register rm)1725   void Crc32w(Register rd, Register rn, Register rm) { Crc32w(al, rd, rn, rm); }
1726 
Dmb(Condition cond,MemoryBarrier option)1727   void Dmb(Condition cond, MemoryBarrier option) {
1728     VIXL_ASSERT(allow_macro_instructions_);
1729     VIXL_ASSERT(OutsideITBlock());
1730     MacroEmissionCheckScope guard(this);
1731     ITScope it_scope(this, &cond);
1732     dmb(cond, option);
1733   }
Dmb(MemoryBarrier option)1734   void Dmb(MemoryBarrier option) { Dmb(al, option); }
1735 
Dsb(Condition cond,MemoryBarrier option)1736   void Dsb(Condition cond, MemoryBarrier option) {
1737     VIXL_ASSERT(allow_macro_instructions_);
1738     VIXL_ASSERT(OutsideITBlock());
1739     MacroEmissionCheckScope guard(this);
1740     ITScope it_scope(this, &cond);
1741     dsb(cond, option);
1742   }
Dsb(MemoryBarrier option)1743   void Dsb(MemoryBarrier option) { Dsb(al, option); }
1744 
Eor(Condition cond,Register rd,Register rn,const Operand & operand)1745   void Eor(Condition cond, Register rd, Register rn, const Operand& operand) {
1746     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1747     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1748     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1749     VIXL_ASSERT(allow_macro_instructions_);
1750     VIXL_ASSERT(OutsideITBlock());
1751     MacroEmissionCheckScope guard(this);
1752     if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) {
1753       uint32_t immediate = operand.GetImmediate();
1754       if (immediate == 0) {
1755         return;
1756       }
1757       if (immediate == 0xffffffff) {
1758         mvn(rd, rn);
1759         return;
1760       }
1761     }
1762     bool can_use_it =
1763         // EOR<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1764         operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
1765         operand.GetBaseRegister().IsLow();
1766     ITScope it_scope(this, &cond, can_use_it);
1767     eor(cond, rd, rn, operand);
1768   }
Eor(Register rd,Register rn,const Operand & operand)1769   void Eor(Register rd, Register rn, const Operand& operand) {
1770     Eor(al, rd, rn, operand);
1771   }
Eor(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1772   void Eor(FlagsUpdate flags,
1773            Condition cond,
1774            Register rd,
1775            Register rn,
1776            const Operand& operand) {
1777     switch (flags) {
1778       case LeaveFlags:
1779         Eor(cond, rd, rn, operand);
1780         break;
1781       case SetFlags:
1782         Eors(cond, rd, rn, operand);
1783         break;
1784       case DontCare:
1785         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1786                                    rn.Is(rd) && operand.IsPlainRegister() &&
1787                                    operand.GetBaseRegister().IsLow();
1788         if (setflags_is_smaller) {
1789           Eors(cond, rd, rn, operand);
1790         } else {
1791           Eor(cond, rd, rn, operand);
1792         }
1793         break;
1794     }
1795   }
Eor(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1796   void Eor(FlagsUpdate flags,
1797            Register rd,
1798            Register rn,
1799            const Operand& operand) {
1800     Eor(flags, al, rd, rn, operand);
1801   }
1802 
Eors(Condition cond,Register rd,Register rn,const Operand & operand)1803   void Eors(Condition cond, Register rd, Register rn, const Operand& operand) {
1804     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1805     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1806     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1807     VIXL_ASSERT(allow_macro_instructions_);
1808     VIXL_ASSERT(OutsideITBlock());
1809     MacroEmissionCheckScope guard(this);
1810     ITScope it_scope(this, &cond);
1811     eors(cond, rd, rn, operand);
1812   }
Eors(Register rd,Register rn,const Operand & operand)1813   void Eors(Register rd, Register rn, const Operand& operand) {
1814     Eors(al, rd, rn, operand);
1815   }
1816 
Fldmdbx(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1817   void Fldmdbx(Condition cond,
1818                Register rn,
1819                WriteBack write_back,
1820                DRegisterList dreglist) {
1821     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1822     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
1823     VIXL_ASSERT(allow_macro_instructions_);
1824     VIXL_ASSERT(OutsideITBlock());
1825     MacroEmissionCheckScope guard(this);
1826     ITScope it_scope(this, &cond);
1827     fldmdbx(cond, rn, write_back, dreglist);
1828   }
Fldmdbx(Register rn,WriteBack write_back,DRegisterList dreglist)1829   void Fldmdbx(Register rn, WriteBack write_back, DRegisterList dreglist) {
1830     Fldmdbx(al, rn, write_back, dreglist);
1831   }
1832 
Fldmiax(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1833   void Fldmiax(Condition cond,
1834                Register rn,
1835                WriteBack write_back,
1836                DRegisterList dreglist) {
1837     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1838     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
1839     VIXL_ASSERT(allow_macro_instructions_);
1840     VIXL_ASSERT(OutsideITBlock());
1841     MacroEmissionCheckScope guard(this);
1842     ITScope it_scope(this, &cond);
1843     fldmiax(cond, rn, write_back, dreglist);
1844   }
Fldmiax(Register rn,WriteBack write_back,DRegisterList dreglist)1845   void Fldmiax(Register rn, WriteBack write_back, DRegisterList dreglist) {
1846     Fldmiax(al, rn, write_back, dreglist);
1847   }
1848 
Fstmdbx(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1849   void Fstmdbx(Condition cond,
1850                Register rn,
1851                WriteBack write_back,
1852                DRegisterList dreglist) {
1853     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1854     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
1855     VIXL_ASSERT(allow_macro_instructions_);
1856     VIXL_ASSERT(OutsideITBlock());
1857     MacroEmissionCheckScope guard(this);
1858     ITScope it_scope(this, &cond);
1859     fstmdbx(cond, rn, write_back, dreglist);
1860   }
Fstmdbx(Register rn,WriteBack write_back,DRegisterList dreglist)1861   void Fstmdbx(Register rn, WriteBack write_back, DRegisterList dreglist) {
1862     Fstmdbx(al, rn, write_back, dreglist);
1863   }
1864 
Fstmiax(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1865   void Fstmiax(Condition cond,
1866                Register rn,
1867                WriteBack write_back,
1868                DRegisterList dreglist) {
1869     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1870     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
1871     VIXL_ASSERT(allow_macro_instructions_);
1872     VIXL_ASSERT(OutsideITBlock());
1873     MacroEmissionCheckScope guard(this);
1874     ITScope it_scope(this, &cond);
1875     fstmiax(cond, rn, write_back, dreglist);
1876   }
Fstmiax(Register rn,WriteBack write_back,DRegisterList dreglist)1877   void Fstmiax(Register rn, WriteBack write_back, DRegisterList dreglist) {
1878     Fstmiax(al, rn, write_back, dreglist);
1879   }
1880 
Hlt(Condition cond,uint32_t imm)1881   void Hlt(Condition cond, uint32_t imm) {
1882     VIXL_ASSERT(allow_macro_instructions_);
1883     VIXL_ASSERT(OutsideITBlock());
1884     MacroEmissionCheckScope guard(this);
1885     ITScope it_scope(this, &cond);
1886     hlt(cond, imm);
1887   }
Hlt(uint32_t imm)1888   void Hlt(uint32_t imm) { Hlt(al, imm); }
1889 
Hvc(Condition cond,uint32_t imm)1890   void Hvc(Condition cond, uint32_t imm) {
1891     VIXL_ASSERT(allow_macro_instructions_);
1892     VIXL_ASSERT(OutsideITBlock());
1893     MacroEmissionCheckScope guard(this);
1894     ITScope it_scope(this, &cond);
1895     hvc(cond, imm);
1896   }
Hvc(uint32_t imm)1897   void Hvc(uint32_t imm) { Hvc(al, imm); }
1898 
Isb(Condition cond,MemoryBarrier option)1899   void Isb(Condition cond, MemoryBarrier option) {
1900     VIXL_ASSERT(allow_macro_instructions_);
1901     VIXL_ASSERT(OutsideITBlock());
1902     MacroEmissionCheckScope guard(this);
1903     ITScope it_scope(this, &cond);
1904     isb(cond, option);
1905   }
Isb(MemoryBarrier option)1906   void Isb(MemoryBarrier option) { Isb(al, option); }
1907 
Lda(Condition cond,Register rt,const MemOperand & operand)1908   void Lda(Condition cond, Register rt, const MemOperand& operand) {
1909     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1910     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1911     VIXL_ASSERT(allow_macro_instructions_);
1912     VIXL_ASSERT(OutsideITBlock());
1913     MacroEmissionCheckScope guard(this);
1914     ITScope it_scope(this, &cond);
1915     lda(cond, rt, operand);
1916   }
Lda(Register rt,const MemOperand & operand)1917   void Lda(Register rt, const MemOperand& operand) { Lda(al, rt, operand); }
1918 
Ldab(Condition cond,Register rt,const MemOperand & operand)1919   void Ldab(Condition cond, Register rt, const MemOperand& operand) {
1920     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1921     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1922     VIXL_ASSERT(allow_macro_instructions_);
1923     VIXL_ASSERT(OutsideITBlock());
1924     MacroEmissionCheckScope guard(this);
1925     ITScope it_scope(this, &cond);
1926     ldab(cond, rt, operand);
1927   }
Ldab(Register rt,const MemOperand & operand)1928   void Ldab(Register rt, const MemOperand& operand) { Ldab(al, rt, operand); }
1929 
Ldaex(Condition cond,Register rt,const MemOperand & operand)1930   void Ldaex(Condition cond, Register rt, const MemOperand& operand) {
1931     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1932     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1933     VIXL_ASSERT(allow_macro_instructions_);
1934     VIXL_ASSERT(OutsideITBlock());
1935     MacroEmissionCheckScope guard(this);
1936     ITScope it_scope(this, &cond);
1937     ldaex(cond, rt, operand);
1938   }
Ldaex(Register rt,const MemOperand & operand)1939   void Ldaex(Register rt, const MemOperand& operand) { Ldaex(al, rt, operand); }
1940 
Ldaexb(Condition cond,Register rt,const MemOperand & operand)1941   void Ldaexb(Condition cond, Register rt, const MemOperand& operand) {
1942     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1943     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1944     VIXL_ASSERT(allow_macro_instructions_);
1945     VIXL_ASSERT(OutsideITBlock());
1946     MacroEmissionCheckScope guard(this);
1947     ITScope it_scope(this, &cond);
1948     ldaexb(cond, rt, operand);
1949   }
Ldaexb(Register rt,const MemOperand & operand)1950   void Ldaexb(Register rt, const MemOperand& operand) {
1951     Ldaexb(al, rt, operand);
1952   }
1953 
Ldaexd(Condition cond,Register rt,Register rt2,const MemOperand & operand)1954   void Ldaexd(Condition cond,
1955               Register rt,
1956               Register rt2,
1957               const MemOperand& operand) {
1958     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1959     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
1960     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1961     VIXL_ASSERT(allow_macro_instructions_);
1962     VIXL_ASSERT(OutsideITBlock());
1963     MacroEmissionCheckScope guard(this);
1964     ITScope it_scope(this, &cond);
1965     ldaexd(cond, rt, rt2, operand);
1966   }
Ldaexd(Register rt,Register rt2,const MemOperand & operand)1967   void Ldaexd(Register rt, Register rt2, const MemOperand& operand) {
1968     Ldaexd(al, rt, rt2, operand);
1969   }
1970 
Ldaexh(Condition cond,Register rt,const MemOperand & operand)1971   void Ldaexh(Condition cond, Register rt, const MemOperand& operand) {
1972     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1973     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1974     VIXL_ASSERT(allow_macro_instructions_);
1975     VIXL_ASSERT(OutsideITBlock());
1976     MacroEmissionCheckScope guard(this);
1977     ITScope it_scope(this, &cond);
1978     ldaexh(cond, rt, operand);
1979   }
Ldaexh(Register rt,const MemOperand & operand)1980   void Ldaexh(Register rt, const MemOperand& operand) {
1981     Ldaexh(al, rt, operand);
1982   }
1983 
Ldah(Condition cond,Register rt,const MemOperand & operand)1984   void Ldah(Condition cond, Register rt, const MemOperand& operand) {
1985     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1986     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1987     VIXL_ASSERT(allow_macro_instructions_);
1988     VIXL_ASSERT(OutsideITBlock());
1989     MacroEmissionCheckScope guard(this);
1990     ITScope it_scope(this, &cond);
1991     ldah(cond, rt, operand);
1992   }
Ldah(Register rt,const MemOperand & operand)1993   void Ldah(Register rt, const MemOperand& operand) { Ldah(al, rt, operand); }
1994 
Ldm(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1995   void Ldm(Condition cond,
1996            Register rn,
1997            WriteBack write_back,
1998            RegisterList registers) {
1999     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2000     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2001     VIXL_ASSERT(allow_macro_instructions_);
2002     VIXL_ASSERT(OutsideITBlock());
2003     MacroEmissionCheckScope guard(this);
2004     ITScope it_scope(this, &cond);
2005     ldm(cond, rn, write_back, registers);
2006   }
Ldm(Register rn,WriteBack write_back,RegisterList registers)2007   void Ldm(Register rn, WriteBack write_back, RegisterList registers) {
2008     Ldm(al, rn, write_back, registers);
2009   }
2010 
Ldmda(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2011   void Ldmda(Condition cond,
2012              Register rn,
2013              WriteBack write_back,
2014              RegisterList registers) {
2015     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2016     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2017     VIXL_ASSERT(allow_macro_instructions_);
2018     VIXL_ASSERT(OutsideITBlock());
2019     MacroEmissionCheckScope guard(this);
2020     ITScope it_scope(this, &cond);
2021     ldmda(cond, rn, write_back, registers);
2022   }
Ldmda(Register rn,WriteBack write_back,RegisterList registers)2023   void Ldmda(Register rn, WriteBack write_back, RegisterList registers) {
2024     Ldmda(al, rn, write_back, registers);
2025   }
2026 
Ldmdb(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2027   void Ldmdb(Condition cond,
2028              Register rn,
2029              WriteBack write_back,
2030              RegisterList registers) {
2031     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2032     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2033     VIXL_ASSERT(allow_macro_instructions_);
2034     VIXL_ASSERT(OutsideITBlock());
2035     MacroEmissionCheckScope guard(this);
2036     ITScope it_scope(this, &cond);
2037     ldmdb(cond, rn, write_back, registers);
2038   }
Ldmdb(Register rn,WriteBack write_back,RegisterList registers)2039   void Ldmdb(Register rn, WriteBack write_back, RegisterList registers) {
2040     Ldmdb(al, rn, write_back, registers);
2041   }
2042 
Ldmea(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2043   void Ldmea(Condition cond,
2044              Register rn,
2045              WriteBack write_back,
2046              RegisterList registers) {
2047     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2048     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2049     VIXL_ASSERT(allow_macro_instructions_);
2050     VIXL_ASSERT(OutsideITBlock());
2051     MacroEmissionCheckScope guard(this);
2052     ITScope it_scope(this, &cond);
2053     ldmea(cond, rn, write_back, registers);
2054   }
Ldmea(Register rn,WriteBack write_back,RegisterList registers)2055   void Ldmea(Register rn, WriteBack write_back, RegisterList registers) {
2056     Ldmea(al, rn, write_back, registers);
2057   }
2058 
Ldmed(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2059   void Ldmed(Condition cond,
2060              Register rn,
2061              WriteBack write_back,
2062              RegisterList registers) {
2063     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2064     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2065     VIXL_ASSERT(allow_macro_instructions_);
2066     VIXL_ASSERT(OutsideITBlock());
2067     MacroEmissionCheckScope guard(this);
2068     ITScope it_scope(this, &cond);
2069     ldmed(cond, rn, write_back, registers);
2070   }
Ldmed(Register rn,WriteBack write_back,RegisterList registers)2071   void Ldmed(Register rn, WriteBack write_back, RegisterList registers) {
2072     Ldmed(al, rn, write_back, registers);
2073   }
2074 
Ldmfa(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2075   void Ldmfa(Condition cond,
2076              Register rn,
2077              WriteBack write_back,
2078              RegisterList registers) {
2079     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2080     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2081     VIXL_ASSERT(allow_macro_instructions_);
2082     VIXL_ASSERT(OutsideITBlock());
2083     MacroEmissionCheckScope guard(this);
2084     ITScope it_scope(this, &cond);
2085     ldmfa(cond, rn, write_back, registers);
2086   }
Ldmfa(Register rn,WriteBack write_back,RegisterList registers)2087   void Ldmfa(Register rn, WriteBack write_back, RegisterList registers) {
2088     Ldmfa(al, rn, write_back, registers);
2089   }
2090 
Ldmfd(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2091   void Ldmfd(Condition cond,
2092              Register rn,
2093              WriteBack write_back,
2094              RegisterList registers) {
2095     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2096     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2097     VIXL_ASSERT(allow_macro_instructions_);
2098     VIXL_ASSERT(OutsideITBlock());
2099     MacroEmissionCheckScope guard(this);
2100     ITScope it_scope(this, &cond);
2101     ldmfd(cond, rn, write_back, registers);
2102   }
Ldmfd(Register rn,WriteBack write_back,RegisterList registers)2103   void Ldmfd(Register rn, WriteBack write_back, RegisterList registers) {
2104     Ldmfd(al, rn, write_back, registers);
2105   }
2106 
Ldmib(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2107   void Ldmib(Condition cond,
2108              Register rn,
2109              WriteBack write_back,
2110              RegisterList registers) {
2111     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2112     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2113     VIXL_ASSERT(allow_macro_instructions_);
2114     VIXL_ASSERT(OutsideITBlock());
2115     MacroEmissionCheckScope guard(this);
2116     ITScope it_scope(this, &cond);
2117     ldmib(cond, rn, write_back, registers);
2118   }
Ldmib(Register rn,WriteBack write_back,RegisterList registers)2119   void Ldmib(Register rn, WriteBack write_back, RegisterList registers) {
2120     Ldmib(al, rn, write_back, registers);
2121   }
2122 
Ldr(Condition cond,Register rt,const MemOperand & operand)2123   void Ldr(Condition cond, Register rt, const MemOperand& operand) {
2124     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2125     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2126     VIXL_ASSERT(allow_macro_instructions_);
2127     VIXL_ASSERT(OutsideITBlock());
2128     MacroEmissionCheckScope guard(this);
2129     bool can_use_it =
2130         // LDR{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
2131         (operand.IsImmediate() && rt.IsLow() &&
2132          operand.GetBaseRegister().IsLow() &&
2133          operand.IsOffsetImmediateWithinRange(0, 124, 4) &&
2134          (operand.GetAddrMode() == Offset)) ||
2135         // LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
2136         (operand.IsImmediate() && rt.IsLow() &&
2137          operand.GetBaseRegister().IsSP() &&
2138          operand.IsOffsetImmediateWithinRange(0, 1020, 4) &&
2139          (operand.GetAddrMode() == Offset)) ||
2140         // LDR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2141         (operand.IsPlainRegister() && rt.IsLow() &&
2142          operand.GetBaseRegister().IsLow() &&
2143          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2144          (operand.GetAddrMode() == Offset));
2145     ITScope it_scope(this, &cond, can_use_it);
2146     ldr(cond, rt, operand);
2147   }
Ldr(Register rt,const MemOperand & operand)2148   void Ldr(Register rt, const MemOperand& operand) { Ldr(al, rt, operand); }
2149 
2150 
Ldrb(Condition cond,Register rt,const MemOperand & operand)2151   void Ldrb(Condition cond, Register rt, const MemOperand& operand) {
2152     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2153     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2154     VIXL_ASSERT(allow_macro_instructions_);
2155     VIXL_ASSERT(OutsideITBlock());
2156     MacroEmissionCheckScope guard(this);
2157     bool can_use_it =
2158         // LDRB{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
2159         (operand.IsImmediate() && rt.IsLow() &&
2160          operand.GetBaseRegister().IsLow() &&
2161          operand.IsOffsetImmediateWithinRange(0, 31) &&
2162          (operand.GetAddrMode() == Offset)) ||
2163         // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2164         (operand.IsPlainRegister() && rt.IsLow() &&
2165          operand.GetBaseRegister().IsLow() &&
2166          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2167          (operand.GetAddrMode() == Offset));
2168     ITScope it_scope(this, &cond, can_use_it);
2169     ldrb(cond, rt, operand);
2170   }
Ldrb(Register rt,const MemOperand & operand)2171   void Ldrb(Register rt, const MemOperand& operand) { Ldrb(al, rt, operand); }
2172 
2173 
Ldrd(Condition cond,Register rt,Register rt2,const MemOperand & operand)2174   void Ldrd(Condition cond,
2175             Register rt,
2176             Register rt2,
2177             const MemOperand& operand) {
2178     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2179     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
2180     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2181     VIXL_ASSERT(allow_macro_instructions_);
2182     VIXL_ASSERT(OutsideITBlock());
2183     MacroEmissionCheckScope guard(this);
2184     ITScope it_scope(this, &cond);
2185     ldrd(cond, rt, rt2, operand);
2186   }
Ldrd(Register rt,Register rt2,const MemOperand & operand)2187   void Ldrd(Register rt, Register rt2, const MemOperand& operand) {
2188     Ldrd(al, rt, rt2, operand);
2189   }
2190 
2191 
Ldrex(Condition cond,Register rt,const MemOperand & operand)2192   void Ldrex(Condition cond, Register rt, const MemOperand& operand) {
2193     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2194     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2195     VIXL_ASSERT(allow_macro_instructions_);
2196     VIXL_ASSERT(OutsideITBlock());
2197     MacroEmissionCheckScope guard(this);
2198     ITScope it_scope(this, &cond);
2199     ldrex(cond, rt, operand);
2200   }
Ldrex(Register rt,const MemOperand & operand)2201   void Ldrex(Register rt, const MemOperand& operand) { Ldrex(al, rt, operand); }
2202 
Ldrexb(Condition cond,Register rt,const MemOperand & operand)2203   void Ldrexb(Condition cond, Register rt, const MemOperand& operand) {
2204     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2205     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2206     VIXL_ASSERT(allow_macro_instructions_);
2207     VIXL_ASSERT(OutsideITBlock());
2208     MacroEmissionCheckScope guard(this);
2209     ITScope it_scope(this, &cond);
2210     ldrexb(cond, rt, operand);
2211   }
Ldrexb(Register rt,const MemOperand & operand)2212   void Ldrexb(Register rt, const MemOperand& operand) {
2213     Ldrexb(al, rt, operand);
2214   }
2215 
Ldrexd(Condition cond,Register rt,Register rt2,const MemOperand & operand)2216   void Ldrexd(Condition cond,
2217               Register rt,
2218               Register rt2,
2219               const MemOperand& operand) {
2220     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2221     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
2222     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2223     VIXL_ASSERT(allow_macro_instructions_);
2224     VIXL_ASSERT(OutsideITBlock());
2225     MacroEmissionCheckScope guard(this);
2226     ITScope it_scope(this, &cond);
2227     ldrexd(cond, rt, rt2, operand);
2228   }
Ldrexd(Register rt,Register rt2,const MemOperand & operand)2229   void Ldrexd(Register rt, Register rt2, const MemOperand& operand) {
2230     Ldrexd(al, rt, rt2, operand);
2231   }
2232 
Ldrexh(Condition cond,Register rt,const MemOperand & operand)2233   void Ldrexh(Condition cond, Register rt, const MemOperand& operand) {
2234     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2235     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2236     VIXL_ASSERT(allow_macro_instructions_);
2237     VIXL_ASSERT(OutsideITBlock());
2238     MacroEmissionCheckScope guard(this);
2239     ITScope it_scope(this, &cond);
2240     ldrexh(cond, rt, operand);
2241   }
Ldrexh(Register rt,const MemOperand & operand)2242   void Ldrexh(Register rt, const MemOperand& operand) {
2243     Ldrexh(al, rt, operand);
2244   }
2245 
Ldrh(Condition cond,Register rt,const MemOperand & operand)2246   void Ldrh(Condition cond, Register rt, const MemOperand& operand) {
2247     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2248     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2249     VIXL_ASSERT(allow_macro_instructions_);
2250     VIXL_ASSERT(OutsideITBlock());
2251     MacroEmissionCheckScope guard(this);
2252     bool can_use_it =
2253         // LDRH{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
2254         (operand.IsImmediate() && rt.IsLow() &&
2255          operand.GetBaseRegister().IsLow() &&
2256          operand.IsOffsetImmediateWithinRange(0, 62, 2) &&
2257          (operand.GetAddrMode() == Offset)) ||
2258         // LDRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2259         (operand.IsPlainRegister() && rt.IsLow() &&
2260          operand.GetBaseRegister().IsLow() &&
2261          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2262          (operand.GetAddrMode() == Offset));
2263     ITScope it_scope(this, &cond, can_use_it);
2264     ldrh(cond, rt, operand);
2265   }
Ldrh(Register rt,const MemOperand & operand)2266   void Ldrh(Register rt, const MemOperand& operand) { Ldrh(al, rt, operand); }
2267 
2268 
Ldrsb(Condition cond,Register rt,const MemOperand & operand)2269   void Ldrsb(Condition cond, Register rt, const MemOperand& operand) {
2270     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2271     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2272     VIXL_ASSERT(allow_macro_instructions_);
2273     VIXL_ASSERT(OutsideITBlock());
2274     MacroEmissionCheckScope guard(this);
2275     bool can_use_it =
2276         // LDRSB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2277         operand.IsPlainRegister() && rt.IsLow() &&
2278         operand.GetBaseRegister().IsLow() &&
2279         operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2280         (operand.GetAddrMode() == Offset);
2281     ITScope it_scope(this, &cond, can_use_it);
2282     ldrsb(cond, rt, operand);
2283   }
Ldrsb(Register rt,const MemOperand & operand)2284   void Ldrsb(Register rt, const MemOperand& operand) { Ldrsb(al, rt, operand); }
2285 
2286 
Ldrsh(Condition cond,Register rt,const MemOperand & operand)2287   void Ldrsh(Condition cond, Register rt, const MemOperand& operand) {
2288     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2289     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2290     VIXL_ASSERT(allow_macro_instructions_);
2291     VIXL_ASSERT(OutsideITBlock());
2292     MacroEmissionCheckScope guard(this);
2293     bool can_use_it =
2294         // LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2295         operand.IsPlainRegister() && rt.IsLow() &&
2296         operand.GetBaseRegister().IsLow() &&
2297         operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2298         (operand.GetAddrMode() == Offset);
2299     ITScope it_scope(this, &cond, can_use_it);
2300     ldrsh(cond, rt, operand);
2301   }
Ldrsh(Register rt,const MemOperand & operand)2302   void Ldrsh(Register rt, const MemOperand& operand) { Ldrsh(al, rt, operand); }
2303 
2304 
Lsl(Condition cond,Register rd,Register rm,const Operand & operand)2305   void Lsl(Condition cond, Register rd, Register rm, const Operand& operand) {
2306     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2307     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2308     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2309     VIXL_ASSERT(allow_macro_instructions_);
2310     VIXL_ASSERT(OutsideITBlock());
2311     MacroEmissionCheckScope guard(this);
2312     bool can_use_it =
2313         // LSL<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
2314         (operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2315          (operand.GetImmediate() <= 31) && rd.IsLow() && rm.IsLow()) ||
2316         // LSL<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
2317         (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
2318          operand.GetBaseRegister().IsLow());
2319     ITScope it_scope(this, &cond, can_use_it);
2320     lsl(cond, rd, rm, operand);
2321   }
Lsl(Register rd,Register rm,const Operand & operand)2322   void Lsl(Register rd, Register rm, const Operand& operand) {
2323     Lsl(al, rd, rm, operand);
2324   }
Lsl(FlagsUpdate flags,Condition cond,Register rd,Register rm,const Operand & operand)2325   void Lsl(FlagsUpdate flags,
2326            Condition cond,
2327            Register rd,
2328            Register rm,
2329            const Operand& operand) {
2330     switch (flags) {
2331       case LeaveFlags:
2332         Lsl(cond, rd, rm, operand);
2333         break;
2334       case SetFlags:
2335         Lsls(cond, rd, rm, operand);
2336         break;
2337       case DontCare:
2338         bool setflags_is_smaller =
2339             IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() &&
2340             ((operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2341               (operand.GetImmediate() < 32)) ||
2342              (operand.IsPlainRegister() && rd.Is(rm)));
2343         if (setflags_is_smaller) {
2344           Lsls(cond, rd, rm, operand);
2345         } else {
2346           Lsl(cond, rd, rm, operand);
2347         }
2348         break;
2349     }
2350   }
Lsl(FlagsUpdate flags,Register rd,Register rm,const Operand & operand)2351   void Lsl(FlagsUpdate flags,
2352            Register rd,
2353            Register rm,
2354            const Operand& operand) {
2355     Lsl(flags, al, rd, rm, operand);
2356   }
2357 
Lsls(Condition cond,Register rd,Register rm,const Operand & operand)2358   void Lsls(Condition cond, Register rd, Register rm, const Operand& operand) {
2359     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2360     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2361     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2362     VIXL_ASSERT(allow_macro_instructions_);
2363     VIXL_ASSERT(OutsideITBlock());
2364     MacroEmissionCheckScope guard(this);
2365     ITScope it_scope(this, &cond);
2366     lsls(cond, rd, rm, operand);
2367   }
Lsls(Register rd,Register rm,const Operand & operand)2368   void Lsls(Register rd, Register rm, const Operand& operand) {
2369     Lsls(al, rd, rm, operand);
2370   }
2371 
Lsr(Condition cond,Register rd,Register rm,const Operand & operand)2372   void Lsr(Condition cond, Register rd, Register rm, const Operand& operand) {
2373     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2374     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2375     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2376     VIXL_ASSERT(allow_macro_instructions_);
2377     VIXL_ASSERT(OutsideITBlock());
2378     MacroEmissionCheckScope guard(this);
2379     bool can_use_it =
2380         // LSR<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
2381         (operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2382          (operand.GetImmediate() <= 32) && rd.IsLow() && rm.IsLow()) ||
2383         // LSR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
2384         (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
2385          operand.GetBaseRegister().IsLow());
2386     ITScope it_scope(this, &cond, can_use_it);
2387     lsr(cond, rd, rm, operand);
2388   }
Lsr(Register rd,Register rm,const Operand & operand)2389   void Lsr(Register rd, Register rm, const Operand& operand) {
2390     Lsr(al, rd, rm, operand);
2391   }
Lsr(FlagsUpdate flags,Condition cond,Register rd,Register rm,const Operand & operand)2392   void Lsr(FlagsUpdate flags,
2393            Condition cond,
2394            Register rd,
2395            Register rm,
2396            const Operand& operand) {
2397     switch (flags) {
2398       case LeaveFlags:
2399         Lsr(cond, rd, rm, operand);
2400         break;
2401       case SetFlags:
2402         Lsrs(cond, rd, rm, operand);
2403         break;
2404       case DontCare:
2405         bool setflags_is_smaller =
2406             IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() &&
2407             ((operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2408               (operand.GetImmediate() <= 32)) ||
2409              (operand.IsPlainRegister() && rd.Is(rm)));
2410         if (setflags_is_smaller) {
2411           Lsrs(cond, rd, rm, operand);
2412         } else {
2413           Lsr(cond, rd, rm, operand);
2414         }
2415         break;
2416     }
2417   }
Lsr(FlagsUpdate flags,Register rd,Register rm,const Operand & operand)2418   void Lsr(FlagsUpdate flags,
2419            Register rd,
2420            Register rm,
2421            const Operand& operand) {
2422     Lsr(flags, al, rd, rm, operand);
2423   }
2424 
Lsrs(Condition cond,Register rd,Register rm,const Operand & operand)2425   void Lsrs(Condition cond, Register rd, Register rm, const Operand& operand) {
2426     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2427     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2428     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2429     VIXL_ASSERT(allow_macro_instructions_);
2430     VIXL_ASSERT(OutsideITBlock());
2431     MacroEmissionCheckScope guard(this);
2432     ITScope it_scope(this, &cond);
2433     lsrs(cond, rd, rm, operand);
2434   }
Lsrs(Register rd,Register rm,const Operand & operand)2435   void Lsrs(Register rd, Register rm, const Operand& operand) {
2436     Lsrs(al, rd, rm, operand);
2437   }
2438 
Mla(Condition cond,Register rd,Register rn,Register rm,Register ra)2439   void Mla(Condition cond, Register rd, Register rn, Register rm, Register ra) {
2440     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2441     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2442     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2443     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
2444     VIXL_ASSERT(allow_macro_instructions_);
2445     VIXL_ASSERT(OutsideITBlock());
2446     MacroEmissionCheckScope guard(this);
2447     ITScope it_scope(this, &cond);
2448     mla(cond, rd, rn, rm, ra);
2449   }
Mla(Register rd,Register rn,Register rm,Register ra)2450   void Mla(Register rd, Register rn, Register rm, Register ra) {
2451     Mla(al, rd, rn, rm, ra);
2452   }
Mla(FlagsUpdate flags,Condition cond,Register rd,Register rn,Register rm,Register ra)2453   void Mla(FlagsUpdate flags,
2454            Condition cond,
2455            Register rd,
2456            Register rn,
2457            Register rm,
2458            Register ra) {
2459     switch (flags) {
2460       case LeaveFlags:
2461         Mla(cond, rd, rn, rm, ra);
2462         break;
2463       case SetFlags:
2464         Mlas(cond, rd, rn, rm, ra);
2465         break;
2466       case DontCare:
2467         Mla(cond, rd, rn, rm, ra);
2468         break;
2469     }
2470   }
Mla(FlagsUpdate flags,Register rd,Register rn,Register rm,Register ra)2471   void Mla(
2472       FlagsUpdate flags, Register rd, Register rn, Register rm, Register ra) {
2473     Mla(flags, al, rd, rn, rm, ra);
2474   }
2475 
Mlas(Condition cond,Register rd,Register rn,Register rm,Register ra)2476   void Mlas(
2477       Condition cond, Register rd, Register rn, Register rm, Register ra) {
2478     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2479     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2480     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2481     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
2482     VIXL_ASSERT(allow_macro_instructions_);
2483     VIXL_ASSERT(OutsideITBlock());
2484     MacroEmissionCheckScope guard(this);
2485     ITScope it_scope(this, &cond);
2486     mlas(cond, rd, rn, rm, ra);
2487   }
Mlas(Register rd,Register rn,Register rm,Register ra)2488   void Mlas(Register rd, Register rn, Register rm, Register ra) {
2489     Mlas(al, rd, rn, rm, ra);
2490   }
2491 
Mls(Condition cond,Register rd,Register rn,Register rm,Register ra)2492   void Mls(Condition cond, Register rd, Register rn, Register rm, Register ra) {
2493     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2494     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2495     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2496     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
2497     VIXL_ASSERT(allow_macro_instructions_);
2498     VIXL_ASSERT(OutsideITBlock());
2499     MacroEmissionCheckScope guard(this);
2500     ITScope it_scope(this, &cond);
2501     mls(cond, rd, rn, rm, ra);
2502   }
Mls(Register rd,Register rn,Register rm,Register ra)2503   void Mls(Register rd, Register rn, Register rm, Register ra) {
2504     Mls(al, rd, rn, rm, ra);
2505   }
2506 
Mov(Condition cond,Register rd,const Operand & operand)2507   void Mov(Condition cond, Register rd, const Operand& operand) {
2508     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2509     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2510     VIXL_ASSERT(allow_macro_instructions_);
2511     VIXL_ASSERT(OutsideITBlock());
2512     MacroEmissionCheckScope guard(this);
2513     if (operand.IsPlainRegister() && rd.Is(operand.GetBaseRegister())) {
2514       return;
2515     }
2516     bool can_use_it =
2517         // MOV<c>{<q>} <Rd>, #<imm8> ; T1
2518         (operand.IsImmediate() && rd.IsLow() &&
2519          (operand.GetImmediate() <= 255)) ||
2520         // MOV{<c>}{<q>} <Rd>, <Rm> ; T1
2521         (operand.IsPlainRegister() && !rd.IsPC() &&
2522          !operand.GetBaseRegister().IsPC()) ||
2523         // MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount>} ; T2
2524         (operand.IsImmediateShiftedRegister() && rd.IsLow() &&
2525          operand.GetBaseRegister().IsLow() &&
2526          (operand.GetShift().Is(LSL) || operand.GetShift().Is(LSR) ||
2527           operand.GetShift().Is(ASR))) ||
2528         // MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
2529         // MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
2530         // MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
2531         // MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
2532         (operand.IsRegisterShiftedRegister() &&
2533          rd.Is(operand.GetBaseRegister()) && rd.IsLow() &&
2534          (operand.GetShift().Is(LSL) || operand.GetShift().Is(LSR) ||
2535           operand.GetShift().Is(ASR) || operand.GetShift().Is(ROR)) &&
2536          operand.GetShiftRegister().IsLow());
2537     ITScope it_scope(this, &cond, can_use_it);
2538     mov(cond, rd, operand);
2539   }
Mov(Register rd,const Operand & operand)2540   void Mov(Register rd, const Operand& operand) { Mov(al, rd, operand); }
Mov(FlagsUpdate flags,Condition cond,Register rd,const Operand & operand)2541   void Mov(FlagsUpdate flags,
2542            Condition cond,
2543            Register rd,
2544            const Operand& operand) {
2545     switch (flags) {
2546       case LeaveFlags:
2547         Mov(cond, rd, operand);
2548         break;
2549       case SetFlags:
2550         Movs(cond, rd, operand);
2551         break;
2552       case DontCare:
2553         if (operand.IsPlainRegister() && rd.Is(operand.GetBaseRegister())) {
2554           return;
2555         }
2556         bool setflags_is_smaller =
2557             IsUsingT32() && cond.Is(al) &&
2558             ((operand.IsImmediateShiftedRegister() && rd.IsLow() &&
2559               operand.GetBaseRegister().IsLow() &&
2560               (operand.GetShiftAmount() >= 1) &&
2561               (((operand.GetShiftAmount() <= 32) &&
2562                 ((operand.GetShift().IsLSR() || operand.GetShift().IsASR()))) ||
2563                ((operand.GetShiftAmount() < 32) &&
2564                 operand.GetShift().IsLSL()))) ||
2565              (operand.IsRegisterShiftedRegister() && rd.IsLow() &&
2566               operand.GetBaseRegister().Is(rd) &&
2567               operand.GetShiftRegister().IsLow() &&
2568               (operand.GetShift().IsLSL() || operand.GetShift().IsLSR() ||
2569                operand.GetShift().IsASR() || operand.GetShift().IsROR())) ||
2570              (operand.IsImmediate() && rd.IsLow() &&
2571               (operand.GetImmediate() < 256)));
2572         if (setflags_is_smaller) {
2573           Movs(cond, rd, operand);
2574         } else {
2575           Mov(cond, rd, operand);
2576         }
2577         break;
2578     }
2579   }
Mov(FlagsUpdate flags,Register rd,const Operand & operand)2580   void Mov(FlagsUpdate flags, Register rd, const Operand& operand) {
2581     Mov(flags, al, rd, operand);
2582   }
2583 
Movs(Condition cond,Register rd,const Operand & operand)2584   void Movs(Condition cond, Register rd, const Operand& operand) {
2585     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2586     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2587     VIXL_ASSERT(allow_macro_instructions_);
2588     VIXL_ASSERT(OutsideITBlock());
2589     MacroEmissionCheckScope guard(this);
2590     ITScope it_scope(this, &cond);
2591     movs(cond, rd, operand);
2592   }
Movs(Register rd,const Operand & operand)2593   void Movs(Register rd, const Operand& operand) { Movs(al, rd, operand); }
2594 
Movt(Condition cond,Register rd,const Operand & operand)2595   void Movt(Condition cond, Register rd, const Operand& operand) {
2596     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2597     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2598     VIXL_ASSERT(allow_macro_instructions_);
2599     VIXL_ASSERT(OutsideITBlock());
2600     MacroEmissionCheckScope guard(this);
2601     ITScope it_scope(this, &cond);
2602     movt(cond, rd, operand);
2603   }
Movt(Register rd,const Operand & operand)2604   void Movt(Register rd, const Operand& operand) { Movt(al, rd, operand); }
2605 
Mrs(Condition cond,Register rd,SpecialRegister spec_reg)2606   void Mrs(Condition cond, Register rd, SpecialRegister spec_reg) {
2607     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2608     VIXL_ASSERT(allow_macro_instructions_);
2609     VIXL_ASSERT(OutsideITBlock());
2610     MacroEmissionCheckScope guard(this);
2611     ITScope it_scope(this, &cond);
2612     mrs(cond, rd, spec_reg);
2613   }
Mrs(Register rd,SpecialRegister spec_reg)2614   void Mrs(Register rd, SpecialRegister spec_reg) { Mrs(al, rd, spec_reg); }
2615 
Msr(Condition cond,MaskedSpecialRegister spec_reg,const Operand & operand)2616   void Msr(Condition cond,
2617            MaskedSpecialRegister spec_reg,
2618            const Operand& operand) {
2619     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2620     VIXL_ASSERT(allow_macro_instructions_);
2621     VIXL_ASSERT(OutsideITBlock());
2622     MacroEmissionCheckScope guard(this);
2623     ITScope it_scope(this, &cond);
2624     msr(cond, spec_reg, operand);
2625   }
Msr(MaskedSpecialRegister spec_reg,const Operand & operand)2626   void Msr(MaskedSpecialRegister spec_reg, const Operand& operand) {
2627     Msr(al, spec_reg, operand);
2628   }
2629 
Mul(Condition cond,Register rd,Register rn,Register rm)2630   void Mul(Condition cond, Register rd, Register rn, Register rm) {
2631     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2632     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2633     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2634     VIXL_ASSERT(allow_macro_instructions_);
2635     VIXL_ASSERT(OutsideITBlock());
2636     MacroEmissionCheckScope guard(this);
2637     bool can_use_it =
2638         // MUL<c>{<q>} <Rdm>, <Rn>{, <Rdm>} ; T1
2639         rd.Is(rm) && rn.IsLow() && rm.IsLow();
2640     ITScope it_scope(this, &cond, can_use_it);
2641     mul(cond, rd, rn, rm);
2642   }
Mul(Register rd,Register rn,Register rm)2643   void Mul(Register rd, Register rn, Register rm) { Mul(al, rd, rn, rm); }
Mul(FlagsUpdate flags,Condition cond,Register rd,Register rn,Register rm)2644   void Mul(FlagsUpdate flags,
2645            Condition cond,
2646            Register rd,
2647            Register rn,
2648            Register rm) {
2649     switch (flags) {
2650       case LeaveFlags:
2651         Mul(cond, rd, rn, rm);
2652         break;
2653       case SetFlags:
2654         Muls(cond, rd, rn, rm);
2655         break;
2656       case DontCare:
2657         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
2658                                    rn.IsLow() && rm.Is(rd);
2659         if (setflags_is_smaller) {
2660           Muls(cond, rd, rn, rm);
2661         } else {
2662           Mul(cond, rd, rn, rm);
2663         }
2664         break;
2665     }
2666   }
Mul(FlagsUpdate flags,Register rd,Register rn,Register rm)2667   void Mul(FlagsUpdate flags, Register rd, Register rn, Register rm) {
2668     Mul(flags, al, rd, rn, rm);
2669   }
2670 
Muls(Condition cond,Register rd,Register rn,Register rm)2671   void Muls(Condition cond, Register rd, Register rn, Register rm) {
2672     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2673     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2674     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2675     VIXL_ASSERT(allow_macro_instructions_);
2676     VIXL_ASSERT(OutsideITBlock());
2677     MacroEmissionCheckScope guard(this);
2678     ITScope it_scope(this, &cond);
2679     muls(cond, rd, rn, rm);
2680   }
Muls(Register rd,Register rn,Register rm)2681   void Muls(Register rd, Register rn, Register rm) { Muls(al, rd, rn, rm); }
2682 
Mvn(Condition cond,Register rd,const Operand & operand)2683   void Mvn(Condition cond, Register rd, const Operand& operand) {
2684     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2685     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2686     VIXL_ASSERT(allow_macro_instructions_);
2687     VIXL_ASSERT(OutsideITBlock());
2688     MacroEmissionCheckScope guard(this);
2689     bool can_use_it =
2690         // MVN<c>{<q>} <Rd>, <Rm> ; T1
2691         operand.IsPlainRegister() && rd.IsLow() &&
2692         operand.GetBaseRegister().IsLow();
2693     ITScope it_scope(this, &cond, can_use_it);
2694     mvn(cond, rd, operand);
2695   }
Mvn(Register rd,const Operand & operand)2696   void Mvn(Register rd, const Operand& operand) { Mvn(al, rd, operand); }
Mvn(FlagsUpdate flags,Condition cond,Register rd,const Operand & operand)2697   void Mvn(FlagsUpdate flags,
2698            Condition cond,
2699            Register rd,
2700            const Operand& operand) {
2701     switch (flags) {
2702       case LeaveFlags:
2703         Mvn(cond, rd, operand);
2704         break;
2705       case SetFlags:
2706         Mvns(cond, rd, operand);
2707         break;
2708       case DontCare:
2709         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
2710                                    operand.IsPlainRegister() &&
2711                                    operand.GetBaseRegister().IsLow();
2712         if (setflags_is_smaller) {
2713           Mvns(cond, rd, operand);
2714         } else {
2715           Mvn(cond, rd, operand);
2716         }
2717         break;
2718     }
2719   }
Mvn(FlagsUpdate flags,Register rd,const Operand & operand)2720   void Mvn(FlagsUpdate flags, Register rd, const Operand& operand) {
2721     Mvn(flags, al, rd, operand);
2722   }
2723 
Mvns(Condition cond,Register rd,const Operand & operand)2724   void Mvns(Condition cond, Register rd, const Operand& operand) {
2725     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2726     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2727     VIXL_ASSERT(allow_macro_instructions_);
2728     VIXL_ASSERT(OutsideITBlock());
2729     MacroEmissionCheckScope guard(this);
2730     ITScope it_scope(this, &cond);
2731     mvns(cond, rd, operand);
2732   }
Mvns(Register rd,const Operand & operand)2733   void Mvns(Register rd, const Operand& operand) { Mvns(al, rd, operand); }
2734 
Nop(Condition cond)2735   void Nop(Condition cond) {
2736     VIXL_ASSERT(allow_macro_instructions_);
2737     VIXL_ASSERT(OutsideITBlock());
2738     MacroEmissionCheckScope guard(this);
2739     ITScope it_scope(this, &cond);
2740     nop(cond);
2741   }
Nop()2742   void Nop() { Nop(al); }
2743 
Orn(Condition cond,Register rd,Register rn,const Operand & operand)2744   void Orn(Condition cond, Register rd, Register rn, const Operand& operand) {
2745     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2746     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2747     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2748     VIXL_ASSERT(allow_macro_instructions_);
2749     VIXL_ASSERT(OutsideITBlock());
2750     MacroEmissionCheckScope guard(this);
2751     if (cond.Is(al) && operand.IsImmediate()) {
2752       uint32_t immediate = operand.GetImmediate();
2753       if (immediate == 0) {
2754         mvn(rd, 0);
2755         return;
2756       }
2757       if ((immediate == 0xffffffff) && rd.Is(rn)) {
2758         return;
2759       }
2760     }
2761     ITScope it_scope(this, &cond);
2762     orn(cond, rd, rn, operand);
2763   }
Orn(Register rd,Register rn,const Operand & operand)2764   void Orn(Register rd, Register rn, const Operand& operand) {
2765     Orn(al, rd, rn, operand);
2766   }
Orn(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)2767   void Orn(FlagsUpdate flags,
2768            Condition cond,
2769            Register rd,
2770            Register rn,
2771            const Operand& operand) {
2772     switch (flags) {
2773       case LeaveFlags:
2774         Orn(cond, rd, rn, operand);
2775         break;
2776       case SetFlags:
2777         Orns(cond, rd, rn, operand);
2778         break;
2779       case DontCare:
2780         Orn(cond, rd, rn, operand);
2781         break;
2782     }
2783   }
Orn(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)2784   void Orn(FlagsUpdate flags,
2785            Register rd,
2786            Register rn,
2787            const Operand& operand) {
2788     Orn(flags, al, rd, rn, operand);
2789   }
2790 
Orns(Condition cond,Register rd,Register rn,const Operand & operand)2791   void Orns(Condition cond, Register rd, Register rn, const Operand& operand) {
2792     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2793     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2794     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2795     VIXL_ASSERT(allow_macro_instructions_);
2796     VIXL_ASSERT(OutsideITBlock());
2797     MacroEmissionCheckScope guard(this);
2798     ITScope it_scope(this, &cond);
2799     orns(cond, rd, rn, operand);
2800   }
Orns(Register rd,Register rn,const Operand & operand)2801   void Orns(Register rd, Register rn, const Operand& operand) {
2802     Orns(al, rd, rn, operand);
2803   }
2804 
Orr(Condition cond,Register rd,Register rn,const Operand & operand)2805   void Orr(Condition cond, Register rd, Register rn, const Operand& operand) {
2806     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2807     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2808     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2809     VIXL_ASSERT(allow_macro_instructions_);
2810     VIXL_ASSERT(OutsideITBlock());
2811     MacroEmissionCheckScope guard(this);
2812     if (rd.Is(rn) && operand.IsPlainRegister() &&
2813         rd.Is(operand.GetBaseRegister())) {
2814       return;
2815     }
2816     if (cond.Is(al) && operand.IsImmediate()) {
2817       uint32_t immediate = operand.GetImmediate();
2818       if ((immediate == 0) && rd.Is(rn)) {
2819         return;
2820       }
2821       if (immediate == 0xffffffff) {
2822         mvn(rd, 0);
2823         return;
2824       }
2825     }
2826     bool can_use_it =
2827         // ORR<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
2828         operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
2829         operand.GetBaseRegister().IsLow();
2830     ITScope it_scope(this, &cond, can_use_it);
2831     orr(cond, rd, rn, operand);
2832   }
Orr(Register rd,Register rn,const Operand & operand)2833   void Orr(Register rd, Register rn, const Operand& operand) {
2834     Orr(al, rd, rn, operand);
2835   }
Orr(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)2836   void Orr(FlagsUpdate flags,
2837            Condition cond,
2838            Register rd,
2839            Register rn,
2840            const Operand& operand) {
2841     switch (flags) {
2842       case LeaveFlags:
2843         Orr(cond, rd, rn, operand);
2844         break;
2845       case SetFlags:
2846         Orrs(cond, rd, rn, operand);
2847         break;
2848       case DontCare:
2849         if (operand.IsPlainRegister() && rd.Is(rn) &&
2850             rd.Is(operand.GetBaseRegister())) {
2851           return;
2852         }
2853         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
2854                                    rn.Is(rd) && operand.IsPlainRegister() &&
2855                                    operand.GetBaseRegister().IsLow();
2856         if (setflags_is_smaller) {
2857           Orrs(cond, rd, rn, operand);
2858         } else {
2859           Orr(cond, rd, rn, operand);
2860         }
2861         break;
2862     }
2863   }
Orr(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)2864   void Orr(FlagsUpdate flags,
2865            Register rd,
2866            Register rn,
2867            const Operand& operand) {
2868     Orr(flags, al, rd, rn, operand);
2869   }
2870 
Orrs(Condition cond,Register rd,Register rn,const Operand & operand)2871   void Orrs(Condition cond, Register rd, Register rn, const Operand& operand) {
2872     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2873     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2874     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2875     VIXL_ASSERT(allow_macro_instructions_);
2876     VIXL_ASSERT(OutsideITBlock());
2877     MacroEmissionCheckScope guard(this);
2878     ITScope it_scope(this, &cond);
2879     orrs(cond, rd, rn, operand);
2880   }
Orrs(Register rd,Register rn,const Operand & operand)2881   void Orrs(Register rd, Register rn, const Operand& operand) {
2882     Orrs(al, rd, rn, operand);
2883   }
2884 
Pkhbt(Condition cond,Register rd,Register rn,const Operand & operand)2885   void Pkhbt(Condition cond, Register rd, Register rn, const Operand& operand) {
2886     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2887     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2888     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2889     VIXL_ASSERT(allow_macro_instructions_);
2890     VIXL_ASSERT(OutsideITBlock());
2891     MacroEmissionCheckScope guard(this);
2892     ITScope it_scope(this, &cond);
2893     pkhbt(cond, rd, rn, operand);
2894   }
Pkhbt(Register rd,Register rn,const Operand & operand)2895   void Pkhbt(Register rd, Register rn, const Operand& operand) {
2896     Pkhbt(al, rd, rn, operand);
2897   }
2898 
Pkhtb(Condition cond,Register rd,Register rn,const Operand & operand)2899   void Pkhtb(Condition cond, Register rd, Register rn, const Operand& operand) {
2900     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2901     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2902     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2903     VIXL_ASSERT(allow_macro_instructions_);
2904     VIXL_ASSERT(OutsideITBlock());
2905     MacroEmissionCheckScope guard(this);
2906     ITScope it_scope(this, &cond);
2907     pkhtb(cond, rd, rn, operand);
2908   }
Pkhtb(Register rd,Register rn,const Operand & operand)2909   void Pkhtb(Register rd, Register rn, const Operand& operand) {
2910     Pkhtb(al, rd, rn, operand);
2911   }
2912 
Pld(Condition cond,Label * label)2913   void Pld(Condition cond, Label* label) {
2914     VIXL_ASSERT(allow_macro_instructions_);
2915     VIXL_ASSERT(OutsideITBlock());
2916     MacroEmissionCheckScope guard(this);
2917     ITScope it_scope(this, &cond);
2918     pld(cond, label);
2919   }
Pld(Label * label)2920   void Pld(Label* label) { Pld(al, label); }
2921 
Pld(Condition cond,const MemOperand & operand)2922   void Pld(Condition cond, const MemOperand& operand) {
2923     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2924     VIXL_ASSERT(allow_macro_instructions_);
2925     VIXL_ASSERT(OutsideITBlock());
2926     MacroEmissionCheckScope guard(this);
2927     ITScope it_scope(this, &cond);
2928     pld(cond, operand);
2929   }
Pld(const MemOperand & operand)2930   void Pld(const MemOperand& operand) { Pld(al, operand); }
2931 
Pldw(Condition cond,const MemOperand & operand)2932   void Pldw(Condition cond, const MemOperand& operand) {
2933     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2934     VIXL_ASSERT(allow_macro_instructions_);
2935     VIXL_ASSERT(OutsideITBlock());
2936     MacroEmissionCheckScope guard(this);
2937     ITScope it_scope(this, &cond);
2938     pldw(cond, operand);
2939   }
Pldw(const MemOperand & operand)2940   void Pldw(const MemOperand& operand) { Pldw(al, operand); }
2941 
Pli(Condition cond,const MemOperand & operand)2942   void Pli(Condition cond, const MemOperand& operand) {
2943     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2944     VIXL_ASSERT(allow_macro_instructions_);
2945     VIXL_ASSERT(OutsideITBlock());
2946     MacroEmissionCheckScope guard(this);
2947     ITScope it_scope(this, &cond);
2948     pli(cond, operand);
2949   }
Pli(const MemOperand & operand)2950   void Pli(const MemOperand& operand) { Pli(al, operand); }
2951 
Pli(Condition cond,Label * label)2952   void Pli(Condition cond, Label* label) {
2953     VIXL_ASSERT(allow_macro_instructions_);
2954     VIXL_ASSERT(OutsideITBlock());
2955     MacroEmissionCheckScope guard(this);
2956     ITScope it_scope(this, &cond);
2957     pli(cond, label);
2958   }
Pli(Label * label)2959   void Pli(Label* label) { Pli(al, label); }
2960 
Pop(Condition cond,RegisterList registers)2961   void Pop(Condition cond, RegisterList registers) {
2962     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2963     VIXL_ASSERT(allow_macro_instructions_);
2964     VIXL_ASSERT(OutsideITBlock());
2965     MacroEmissionCheckScope guard(this);
2966     ITScope it_scope(this, &cond);
2967     pop(cond, registers);
2968   }
Pop(RegisterList registers)2969   void Pop(RegisterList registers) { Pop(al, registers); }
2970 
Pop(Condition cond,Register rt)2971   void Pop(Condition cond, Register rt) {
2972     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2973     VIXL_ASSERT(allow_macro_instructions_);
2974     VIXL_ASSERT(OutsideITBlock());
2975     MacroEmissionCheckScope guard(this);
2976     ITScope it_scope(this, &cond);
2977     pop(cond, rt);
2978   }
Pop(Register rt)2979   void Pop(Register rt) { Pop(al, rt); }
2980 
Push(Condition cond,RegisterList registers)2981   void Push(Condition cond, RegisterList registers) {
2982     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2983     VIXL_ASSERT(allow_macro_instructions_);
2984     VIXL_ASSERT(OutsideITBlock());
2985     MacroEmissionCheckScope guard(this);
2986     ITScope it_scope(this, &cond);
2987     push(cond, registers);
2988   }
Push(RegisterList registers)2989   void Push(RegisterList registers) { Push(al, registers); }
2990 
Push(Condition cond,Register rt)2991   void Push(Condition cond, Register rt) {
2992     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2993     VIXL_ASSERT(allow_macro_instructions_);
2994     VIXL_ASSERT(OutsideITBlock());
2995     MacroEmissionCheckScope guard(this);
2996     ITScope it_scope(this, &cond);
2997     push(cond, rt);
2998   }
Push(Register rt)2999   void Push(Register rt) { Push(al, rt); }
3000 
Qadd(Condition cond,Register rd,Register rm,Register rn)3001   void Qadd(Condition cond, Register rd, Register rm, Register rn) {
3002     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3003     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3004     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3005     VIXL_ASSERT(allow_macro_instructions_);
3006     VIXL_ASSERT(OutsideITBlock());
3007     MacroEmissionCheckScope guard(this);
3008     ITScope it_scope(this, &cond);
3009     qadd(cond, rd, rm, rn);
3010   }
Qadd(Register rd,Register rm,Register rn)3011   void Qadd(Register rd, Register rm, Register rn) { Qadd(al, rd, rm, rn); }
3012 
Qadd16(Condition cond,Register rd,Register rn,Register rm)3013   void Qadd16(Condition cond, Register rd, Register rn, Register rm) {
3014     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3015     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3016     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3017     VIXL_ASSERT(allow_macro_instructions_);
3018     VIXL_ASSERT(OutsideITBlock());
3019     MacroEmissionCheckScope guard(this);
3020     ITScope it_scope(this, &cond);
3021     qadd16(cond, rd, rn, rm);
3022   }
Qadd16(Register rd,Register rn,Register rm)3023   void Qadd16(Register rd, Register rn, Register rm) { Qadd16(al, rd, rn, rm); }
3024 
Qadd8(Condition cond,Register rd,Register rn,Register rm)3025   void Qadd8(Condition cond, Register rd, Register rn, Register rm) {
3026     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3027     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3028     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3029     VIXL_ASSERT(allow_macro_instructions_);
3030     VIXL_ASSERT(OutsideITBlock());
3031     MacroEmissionCheckScope guard(this);
3032     ITScope it_scope(this, &cond);
3033     qadd8(cond, rd, rn, rm);
3034   }
Qadd8(Register rd,Register rn,Register rm)3035   void Qadd8(Register rd, Register rn, Register rm) { Qadd8(al, rd, rn, rm); }
3036 
Qasx(Condition cond,Register rd,Register rn,Register rm)3037   void Qasx(Condition cond, Register rd, Register rn, Register rm) {
3038     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3039     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3040     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3041     VIXL_ASSERT(allow_macro_instructions_);
3042     VIXL_ASSERT(OutsideITBlock());
3043     MacroEmissionCheckScope guard(this);
3044     ITScope it_scope(this, &cond);
3045     qasx(cond, rd, rn, rm);
3046   }
Qasx(Register rd,Register rn,Register rm)3047   void Qasx(Register rd, Register rn, Register rm) { Qasx(al, rd, rn, rm); }
3048 
Qdadd(Condition cond,Register rd,Register rm,Register rn)3049   void Qdadd(Condition cond, Register rd, Register rm, Register rn) {
3050     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3051     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3052     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3053     VIXL_ASSERT(allow_macro_instructions_);
3054     VIXL_ASSERT(OutsideITBlock());
3055     MacroEmissionCheckScope guard(this);
3056     ITScope it_scope(this, &cond);
3057     qdadd(cond, rd, rm, rn);
3058   }
Qdadd(Register rd,Register rm,Register rn)3059   void Qdadd(Register rd, Register rm, Register rn) { Qdadd(al, rd, rm, rn); }
3060 
Qdsub(Condition cond,Register rd,Register rm,Register rn)3061   void Qdsub(Condition cond, Register rd, Register rm, Register rn) {
3062     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3063     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3064     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3065     VIXL_ASSERT(allow_macro_instructions_);
3066     VIXL_ASSERT(OutsideITBlock());
3067     MacroEmissionCheckScope guard(this);
3068     ITScope it_scope(this, &cond);
3069     qdsub(cond, rd, rm, rn);
3070   }
Qdsub(Register rd,Register rm,Register rn)3071   void Qdsub(Register rd, Register rm, Register rn) { Qdsub(al, rd, rm, rn); }
3072 
Qsax(Condition cond,Register rd,Register rn,Register rm)3073   void Qsax(Condition cond, Register rd, Register rn, Register rm) {
3074     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3075     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3076     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3077     VIXL_ASSERT(allow_macro_instructions_);
3078     VIXL_ASSERT(OutsideITBlock());
3079     MacroEmissionCheckScope guard(this);
3080     ITScope it_scope(this, &cond);
3081     qsax(cond, rd, rn, rm);
3082   }
Qsax(Register rd,Register rn,Register rm)3083   void Qsax(Register rd, Register rn, Register rm) { Qsax(al, rd, rn, rm); }
3084 
Qsub(Condition cond,Register rd,Register rm,Register rn)3085   void Qsub(Condition cond, Register rd, Register rm, Register rn) {
3086     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3087     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3088     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3089     VIXL_ASSERT(allow_macro_instructions_);
3090     VIXL_ASSERT(OutsideITBlock());
3091     MacroEmissionCheckScope guard(this);
3092     ITScope it_scope(this, &cond);
3093     qsub(cond, rd, rm, rn);
3094   }
Qsub(Register rd,Register rm,Register rn)3095   void Qsub(Register rd, Register rm, Register rn) { Qsub(al, rd, rm, rn); }
3096 
Qsub16(Condition cond,Register rd,Register rn,Register rm)3097   void Qsub16(Condition cond, Register rd, Register rn, Register rm) {
3098     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3099     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3100     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3101     VIXL_ASSERT(allow_macro_instructions_);
3102     VIXL_ASSERT(OutsideITBlock());
3103     MacroEmissionCheckScope guard(this);
3104     ITScope it_scope(this, &cond);
3105     qsub16(cond, rd, rn, rm);
3106   }
Qsub16(Register rd,Register rn,Register rm)3107   void Qsub16(Register rd, Register rn, Register rm) { Qsub16(al, rd, rn, rm); }
3108 
Qsub8(Condition cond,Register rd,Register rn,Register rm)3109   void Qsub8(Condition cond, Register rd, Register rn, Register rm) {
3110     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3111     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3112     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3113     VIXL_ASSERT(allow_macro_instructions_);
3114     VIXL_ASSERT(OutsideITBlock());
3115     MacroEmissionCheckScope guard(this);
3116     ITScope it_scope(this, &cond);
3117     qsub8(cond, rd, rn, rm);
3118   }
Qsub8(Register rd,Register rn,Register rm)3119   void Qsub8(Register rd, Register rn, Register rm) { Qsub8(al, rd, rn, rm); }
3120 
Rbit(Condition cond,Register rd,Register rm)3121   void Rbit(Condition cond, Register rd, Register rm) {
3122     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3123     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3124     VIXL_ASSERT(allow_macro_instructions_);
3125     VIXL_ASSERT(OutsideITBlock());
3126     MacroEmissionCheckScope guard(this);
3127     ITScope it_scope(this, &cond);
3128     rbit(cond, rd, rm);
3129   }
Rbit(Register rd,Register rm)3130   void Rbit(Register rd, Register rm) { Rbit(al, rd, rm); }
3131 
Rev(Condition cond,Register rd,Register rm)3132   void Rev(Condition cond, Register rd, Register rm) {
3133     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3134     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3135     VIXL_ASSERT(allow_macro_instructions_);
3136     VIXL_ASSERT(OutsideITBlock());
3137     MacroEmissionCheckScope guard(this);
3138     ITScope it_scope(this, &cond);
3139     rev(cond, rd, rm);
3140   }
Rev(Register rd,Register rm)3141   void Rev(Register rd, Register rm) { Rev(al, rd, rm); }
3142 
Rev16(Condition cond,Register rd,Register rm)3143   void Rev16(Condition cond, Register rd, Register rm) {
3144     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3145     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3146     VIXL_ASSERT(allow_macro_instructions_);
3147     VIXL_ASSERT(OutsideITBlock());
3148     MacroEmissionCheckScope guard(this);
3149     ITScope it_scope(this, &cond);
3150     rev16(cond, rd, rm);
3151   }
Rev16(Register rd,Register rm)3152   void Rev16(Register rd, Register rm) { Rev16(al, rd, rm); }
3153 
Revsh(Condition cond,Register rd,Register rm)3154   void Revsh(Condition cond, Register rd, Register rm) {
3155     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3156     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3157     VIXL_ASSERT(allow_macro_instructions_);
3158     VIXL_ASSERT(OutsideITBlock());
3159     MacroEmissionCheckScope guard(this);
3160     ITScope it_scope(this, &cond);
3161     revsh(cond, rd, rm);
3162   }
Revsh(Register rd,Register rm)3163   void Revsh(Register rd, Register rm) { Revsh(al, rd, rm); }
3164 
Ror(Condition cond,Register rd,Register rm,const Operand & operand)3165   void Ror(Condition cond, Register rd, Register rm, const Operand& operand) {
3166     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3167     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3168     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3169     VIXL_ASSERT(allow_macro_instructions_);
3170     VIXL_ASSERT(OutsideITBlock());
3171     MacroEmissionCheckScope guard(this);
3172     bool can_use_it =
3173         // ROR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
3174         operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
3175         operand.GetBaseRegister().IsLow();
3176     ITScope it_scope(this, &cond, can_use_it);
3177     ror(cond, rd, rm, operand);
3178   }
Ror(Register rd,Register rm,const Operand & operand)3179   void Ror(Register rd, Register rm, const Operand& operand) {
3180     Ror(al, rd, rm, operand);
3181   }
Ror(FlagsUpdate flags,Condition cond,Register rd,Register rm,const Operand & operand)3182   void Ror(FlagsUpdate flags,
3183            Condition cond,
3184            Register rd,
3185            Register rm,
3186            const Operand& operand) {
3187     switch (flags) {
3188       case LeaveFlags:
3189         Ror(cond, rd, rm, operand);
3190         break;
3191       case SetFlags:
3192         Rors(cond, rd, rm, operand);
3193         break;
3194       case DontCare:
3195         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3196                                    rm.IsLow() && operand.IsPlainRegister() &&
3197                                    rd.Is(rm);
3198         if (setflags_is_smaller) {
3199           Rors(cond, rd, rm, operand);
3200         } else {
3201           Ror(cond, rd, rm, operand);
3202         }
3203         break;
3204     }
3205   }
Ror(FlagsUpdate flags,Register rd,Register rm,const Operand & operand)3206   void Ror(FlagsUpdate flags,
3207            Register rd,
3208            Register rm,
3209            const Operand& operand) {
3210     Ror(flags, al, rd, rm, operand);
3211   }
3212 
Rors(Condition cond,Register rd,Register rm,const Operand & operand)3213   void Rors(Condition cond, Register rd, Register rm, const Operand& operand) {
3214     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3215     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3216     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3217     VIXL_ASSERT(allow_macro_instructions_);
3218     VIXL_ASSERT(OutsideITBlock());
3219     MacroEmissionCheckScope guard(this);
3220     ITScope it_scope(this, &cond);
3221     rors(cond, rd, rm, operand);
3222   }
Rors(Register rd,Register rm,const Operand & operand)3223   void Rors(Register rd, Register rm, const Operand& operand) {
3224     Rors(al, rd, rm, operand);
3225   }
3226 
Rrx(Condition cond,Register rd,Register rm)3227   void Rrx(Condition cond, Register rd, Register rm) {
3228     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3229     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3230     VIXL_ASSERT(allow_macro_instructions_);
3231     VIXL_ASSERT(OutsideITBlock());
3232     MacroEmissionCheckScope guard(this);
3233     ITScope it_scope(this, &cond);
3234     rrx(cond, rd, rm);
3235   }
Rrx(Register rd,Register rm)3236   void Rrx(Register rd, Register rm) { Rrx(al, rd, rm); }
Rrx(FlagsUpdate flags,Condition cond,Register rd,Register rm)3237   void Rrx(FlagsUpdate flags, Condition cond, Register rd, Register rm) {
3238     switch (flags) {
3239       case LeaveFlags:
3240         Rrx(cond, rd, rm);
3241         break;
3242       case SetFlags:
3243         Rrxs(cond, rd, rm);
3244         break;
3245       case DontCare:
3246         Rrx(cond, rd, rm);
3247         break;
3248     }
3249   }
Rrx(FlagsUpdate flags,Register rd,Register rm)3250   void Rrx(FlagsUpdate flags, Register rd, Register rm) {
3251     Rrx(flags, al, rd, rm);
3252   }
3253 
Rrxs(Condition cond,Register rd,Register rm)3254   void Rrxs(Condition cond, Register rd, Register rm) {
3255     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3256     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3257     VIXL_ASSERT(allow_macro_instructions_);
3258     VIXL_ASSERT(OutsideITBlock());
3259     MacroEmissionCheckScope guard(this);
3260     ITScope it_scope(this, &cond);
3261     rrxs(cond, rd, rm);
3262   }
Rrxs(Register rd,Register rm)3263   void Rrxs(Register rd, Register rm) { Rrxs(al, rd, rm); }
3264 
Rsb(Condition cond,Register rd,Register rn,const Operand & operand)3265   void Rsb(Condition cond, Register rd, Register rn, const Operand& operand) {
3266     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3267     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3268     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3269     VIXL_ASSERT(allow_macro_instructions_);
3270     VIXL_ASSERT(OutsideITBlock());
3271     MacroEmissionCheckScope guard(this);
3272     bool can_use_it =
3273         // RSB<c>{<q>} {<Rd>, }<Rn>, #0 ; T1
3274         operand.IsImmediate() && rd.IsLow() && rn.IsLow() &&
3275         (operand.GetImmediate() == 0);
3276     ITScope it_scope(this, &cond, can_use_it);
3277     rsb(cond, rd, rn, operand);
3278   }
Rsb(Register rd,Register rn,const Operand & operand)3279   void Rsb(Register rd, Register rn, const Operand& operand) {
3280     Rsb(al, rd, rn, operand);
3281   }
Rsb(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)3282   void Rsb(FlagsUpdate flags,
3283            Condition cond,
3284            Register rd,
3285            Register rn,
3286            const Operand& operand) {
3287     switch (flags) {
3288       case LeaveFlags:
3289         Rsb(cond, rd, rn, operand);
3290         break;
3291       case SetFlags:
3292         Rsbs(cond, rd, rn, operand);
3293         break;
3294       case DontCare:
3295         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3296                                    rn.IsLow() && operand.IsImmediate() &&
3297                                    (operand.GetImmediate() == 0);
3298         if (setflags_is_smaller) {
3299           Rsbs(cond, rd, rn, operand);
3300         } else {
3301           Rsb(cond, rd, rn, operand);
3302         }
3303         break;
3304     }
3305   }
Rsb(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)3306   void Rsb(FlagsUpdate flags,
3307            Register rd,
3308            Register rn,
3309            const Operand& operand) {
3310     Rsb(flags, al, rd, rn, operand);
3311   }
3312 
Rsbs(Condition cond,Register rd,Register rn,const Operand & operand)3313   void Rsbs(Condition cond, Register rd, Register rn, const Operand& operand) {
3314     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3315     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3316     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3317     VIXL_ASSERT(allow_macro_instructions_);
3318     VIXL_ASSERT(OutsideITBlock());
3319     MacroEmissionCheckScope guard(this);
3320     ITScope it_scope(this, &cond);
3321     rsbs(cond, rd, rn, operand);
3322   }
Rsbs(Register rd,Register rn,const Operand & operand)3323   void Rsbs(Register rd, Register rn, const Operand& operand) {
3324     Rsbs(al, rd, rn, operand);
3325   }
3326 
Rsc(Condition cond,Register rd,Register rn,const Operand & operand)3327   void Rsc(Condition cond, Register rd, Register rn, const Operand& operand) {
3328     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3329     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3330     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3331     VIXL_ASSERT(allow_macro_instructions_);
3332     VIXL_ASSERT(OutsideITBlock());
3333     MacroEmissionCheckScope guard(this);
3334     ITScope it_scope(this, &cond);
3335     rsc(cond, rd, rn, operand);
3336   }
Rsc(Register rd,Register rn,const Operand & operand)3337   void Rsc(Register rd, Register rn, const Operand& operand) {
3338     Rsc(al, rd, rn, operand);
3339   }
Rsc(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)3340   void Rsc(FlagsUpdate flags,
3341            Condition cond,
3342            Register rd,
3343            Register rn,
3344            const Operand& operand) {
3345     switch (flags) {
3346       case LeaveFlags:
3347         Rsc(cond, rd, rn, operand);
3348         break;
3349       case SetFlags:
3350         Rscs(cond, rd, rn, operand);
3351         break;
3352       case DontCare:
3353         Rsc(cond, rd, rn, operand);
3354         break;
3355     }
3356   }
Rsc(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)3357   void Rsc(FlagsUpdate flags,
3358            Register rd,
3359            Register rn,
3360            const Operand& operand) {
3361     Rsc(flags, al, rd, rn, operand);
3362   }
3363 
Rscs(Condition cond,Register rd,Register rn,const Operand & operand)3364   void Rscs(Condition cond, Register rd, Register rn, const Operand& operand) {
3365     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3366     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3367     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3368     VIXL_ASSERT(allow_macro_instructions_);
3369     VIXL_ASSERT(OutsideITBlock());
3370     MacroEmissionCheckScope guard(this);
3371     ITScope it_scope(this, &cond);
3372     rscs(cond, rd, rn, operand);
3373   }
Rscs(Register rd,Register rn,const Operand & operand)3374   void Rscs(Register rd, Register rn, const Operand& operand) {
3375     Rscs(al, rd, rn, operand);
3376   }
3377 
Sadd16(Condition cond,Register rd,Register rn,Register rm)3378   void Sadd16(Condition cond, Register rd, Register rn, Register rm) {
3379     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3380     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3381     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3382     VIXL_ASSERT(allow_macro_instructions_);
3383     VIXL_ASSERT(OutsideITBlock());
3384     MacroEmissionCheckScope guard(this);
3385     ITScope it_scope(this, &cond);
3386     sadd16(cond, rd, rn, rm);
3387   }
Sadd16(Register rd,Register rn,Register rm)3388   void Sadd16(Register rd, Register rn, Register rm) { Sadd16(al, rd, rn, rm); }
3389 
Sadd8(Condition cond,Register rd,Register rn,Register rm)3390   void Sadd8(Condition cond, Register rd, Register rn, Register rm) {
3391     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3392     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3393     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3394     VIXL_ASSERT(allow_macro_instructions_);
3395     VIXL_ASSERT(OutsideITBlock());
3396     MacroEmissionCheckScope guard(this);
3397     ITScope it_scope(this, &cond);
3398     sadd8(cond, rd, rn, rm);
3399   }
Sadd8(Register rd,Register rn,Register rm)3400   void Sadd8(Register rd, Register rn, Register rm) { Sadd8(al, rd, rn, rm); }
3401 
Sasx(Condition cond,Register rd,Register rn,Register rm)3402   void Sasx(Condition cond, Register rd, Register rn, Register rm) {
3403     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3404     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3405     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3406     VIXL_ASSERT(allow_macro_instructions_);
3407     VIXL_ASSERT(OutsideITBlock());
3408     MacroEmissionCheckScope guard(this);
3409     ITScope it_scope(this, &cond);
3410     sasx(cond, rd, rn, rm);
3411   }
Sasx(Register rd,Register rn,Register rm)3412   void Sasx(Register rd, Register rn, Register rm) { Sasx(al, rd, rn, rm); }
3413 
Sbc(Condition cond,Register rd,Register rn,const Operand & operand)3414   void Sbc(Condition cond, Register rd, Register rn, const Operand& operand) {
3415     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3416     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3417     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3418     VIXL_ASSERT(allow_macro_instructions_);
3419     VIXL_ASSERT(OutsideITBlock());
3420     MacroEmissionCheckScope guard(this);
3421     bool can_use_it =
3422         // SBC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
3423         operand.IsPlainRegister() && rn.IsLow() && rd.Is(rn) &&
3424         operand.GetBaseRegister().IsLow();
3425     ITScope it_scope(this, &cond, can_use_it);
3426     sbc(cond, rd, rn, operand);
3427   }
Sbc(Register rd,Register rn,const Operand & operand)3428   void Sbc(Register rd, Register rn, const Operand& operand) {
3429     Sbc(al, rd, rn, operand);
3430   }
Sbc(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)3431   void Sbc(FlagsUpdate flags,
3432            Condition cond,
3433            Register rd,
3434            Register rn,
3435            const Operand& operand) {
3436     switch (flags) {
3437       case LeaveFlags:
3438         Sbc(cond, rd, rn, operand);
3439         break;
3440       case SetFlags:
3441         Sbcs(cond, rd, rn, operand);
3442         break;
3443       case DontCare:
3444         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3445                                    rn.Is(rd) && operand.IsPlainRegister() &&
3446                                    operand.GetBaseRegister().IsLow();
3447         if (setflags_is_smaller) {
3448           Sbcs(cond, rd, rn, operand);
3449         } else {
3450           Sbc(cond, rd, rn, operand);
3451         }
3452         break;
3453     }
3454   }
Sbc(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)3455   void Sbc(FlagsUpdate flags,
3456            Register rd,
3457            Register rn,
3458            const Operand& operand) {
3459     Sbc(flags, al, rd, rn, operand);
3460   }
3461 
Sbcs(Condition cond,Register rd,Register rn,const Operand & operand)3462   void Sbcs(Condition cond, Register rd, Register rn, const Operand& operand) {
3463     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3464     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3465     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3466     VIXL_ASSERT(allow_macro_instructions_);
3467     VIXL_ASSERT(OutsideITBlock());
3468     MacroEmissionCheckScope guard(this);
3469     ITScope it_scope(this, &cond);
3470     sbcs(cond, rd, rn, operand);
3471   }
Sbcs(Register rd,Register rn,const Operand & operand)3472   void Sbcs(Register rd, Register rn, const Operand& operand) {
3473     Sbcs(al, rd, rn, operand);
3474   }
3475 
Sbfx(Condition cond,Register rd,Register rn,uint32_t lsb,const Operand & operand)3476   void Sbfx(Condition cond,
3477             Register rd,
3478             Register rn,
3479             uint32_t lsb,
3480             const Operand& operand) {
3481     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3482     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3483     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3484     VIXL_ASSERT(allow_macro_instructions_);
3485     VIXL_ASSERT(OutsideITBlock());
3486     MacroEmissionCheckScope guard(this);
3487     ITScope it_scope(this, &cond);
3488     sbfx(cond, rd, rn, lsb, operand);
3489   }
Sbfx(Register rd,Register rn,uint32_t lsb,const Operand & operand)3490   void Sbfx(Register rd, Register rn, uint32_t lsb, const Operand& operand) {
3491     Sbfx(al, rd, rn, lsb, operand);
3492   }
3493 
Sdiv(Condition cond,Register rd,Register rn,Register rm)3494   void Sdiv(Condition cond, Register rd, Register rn, Register rm) {
3495     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3496     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3497     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3498     VIXL_ASSERT(allow_macro_instructions_);
3499     VIXL_ASSERT(OutsideITBlock());
3500     MacroEmissionCheckScope guard(this);
3501     ITScope it_scope(this, &cond);
3502     sdiv(cond, rd, rn, rm);
3503   }
Sdiv(Register rd,Register rn,Register rm)3504   void Sdiv(Register rd, Register rn, Register rm) { Sdiv(al, rd, rn, rm); }
3505 
Sel(Condition cond,Register rd,Register rn,Register rm)3506   void Sel(Condition cond, Register rd, Register rn, Register rm) {
3507     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3508     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3509     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3510     VIXL_ASSERT(allow_macro_instructions_);
3511     VIXL_ASSERT(OutsideITBlock());
3512     MacroEmissionCheckScope guard(this);
3513     ITScope it_scope(this, &cond);
3514     sel(cond, rd, rn, rm);
3515   }
Sel(Register rd,Register rn,Register rm)3516   void Sel(Register rd, Register rn, Register rm) { Sel(al, rd, rn, rm); }
3517 
Shadd16(Condition cond,Register rd,Register rn,Register rm)3518   void Shadd16(Condition cond, Register rd, Register rn, Register rm) {
3519     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3520     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3521     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3522     VIXL_ASSERT(allow_macro_instructions_);
3523     VIXL_ASSERT(OutsideITBlock());
3524     MacroEmissionCheckScope guard(this);
3525     ITScope it_scope(this, &cond);
3526     shadd16(cond, rd, rn, rm);
3527   }
Shadd16(Register rd,Register rn,Register rm)3528   void Shadd16(Register rd, Register rn, Register rm) {
3529     Shadd16(al, rd, rn, rm);
3530   }
3531 
Shadd8(Condition cond,Register rd,Register rn,Register rm)3532   void Shadd8(Condition cond, Register rd, Register rn, Register rm) {
3533     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3534     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3535     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3536     VIXL_ASSERT(allow_macro_instructions_);
3537     VIXL_ASSERT(OutsideITBlock());
3538     MacroEmissionCheckScope guard(this);
3539     ITScope it_scope(this, &cond);
3540     shadd8(cond, rd, rn, rm);
3541   }
Shadd8(Register rd,Register rn,Register rm)3542   void Shadd8(Register rd, Register rn, Register rm) { Shadd8(al, rd, rn, rm); }
3543 
Shasx(Condition cond,Register rd,Register rn,Register rm)3544   void Shasx(Condition cond, Register rd, Register rn, Register rm) {
3545     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3546     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3547     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3548     VIXL_ASSERT(allow_macro_instructions_);
3549     VIXL_ASSERT(OutsideITBlock());
3550     MacroEmissionCheckScope guard(this);
3551     ITScope it_scope(this, &cond);
3552     shasx(cond, rd, rn, rm);
3553   }
Shasx(Register rd,Register rn,Register rm)3554   void Shasx(Register rd, Register rn, Register rm) { Shasx(al, rd, rn, rm); }
3555 
Shsax(Condition cond,Register rd,Register rn,Register rm)3556   void Shsax(Condition cond, Register rd, Register rn, Register rm) {
3557     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3558     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3559     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3560     VIXL_ASSERT(allow_macro_instructions_);
3561     VIXL_ASSERT(OutsideITBlock());
3562     MacroEmissionCheckScope guard(this);
3563     ITScope it_scope(this, &cond);
3564     shsax(cond, rd, rn, rm);
3565   }
Shsax(Register rd,Register rn,Register rm)3566   void Shsax(Register rd, Register rn, Register rm) { Shsax(al, rd, rn, rm); }
3567 
Shsub16(Condition cond,Register rd,Register rn,Register rm)3568   void Shsub16(Condition cond, Register rd, Register rn, Register rm) {
3569     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3570     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3571     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3572     VIXL_ASSERT(allow_macro_instructions_);
3573     VIXL_ASSERT(OutsideITBlock());
3574     MacroEmissionCheckScope guard(this);
3575     ITScope it_scope(this, &cond);
3576     shsub16(cond, rd, rn, rm);
3577   }
Shsub16(Register rd,Register rn,Register rm)3578   void Shsub16(Register rd, Register rn, Register rm) {
3579     Shsub16(al, rd, rn, rm);
3580   }
3581 
Shsub8(Condition cond,Register rd,Register rn,Register rm)3582   void Shsub8(Condition cond, Register rd, Register rn, Register rm) {
3583     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3584     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3585     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3586     VIXL_ASSERT(allow_macro_instructions_);
3587     VIXL_ASSERT(OutsideITBlock());
3588     MacroEmissionCheckScope guard(this);
3589     ITScope it_scope(this, &cond);
3590     shsub8(cond, rd, rn, rm);
3591   }
Shsub8(Register rd,Register rn,Register rm)3592   void Shsub8(Register rd, Register rn, Register rm) { Shsub8(al, rd, rn, rm); }
3593 
Smlabb(Condition cond,Register rd,Register rn,Register rm,Register ra)3594   void Smlabb(
3595       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3596     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3597     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3598     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3599     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3600     VIXL_ASSERT(allow_macro_instructions_);
3601     VIXL_ASSERT(OutsideITBlock());
3602     MacroEmissionCheckScope guard(this);
3603     ITScope it_scope(this, &cond);
3604     smlabb(cond, rd, rn, rm, ra);
3605   }
Smlabb(Register rd,Register rn,Register rm,Register ra)3606   void Smlabb(Register rd, Register rn, Register rm, Register ra) {
3607     Smlabb(al, rd, rn, rm, ra);
3608   }
3609 
Smlabt(Condition cond,Register rd,Register rn,Register rm,Register ra)3610   void Smlabt(
3611       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3612     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3613     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3614     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3615     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3616     VIXL_ASSERT(allow_macro_instructions_);
3617     VIXL_ASSERT(OutsideITBlock());
3618     MacroEmissionCheckScope guard(this);
3619     ITScope it_scope(this, &cond);
3620     smlabt(cond, rd, rn, rm, ra);
3621   }
Smlabt(Register rd,Register rn,Register rm,Register ra)3622   void Smlabt(Register rd, Register rn, Register rm, Register ra) {
3623     Smlabt(al, rd, rn, rm, ra);
3624   }
3625 
Smlad(Condition cond,Register rd,Register rn,Register rm,Register ra)3626   void Smlad(
3627       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3628     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3629     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3630     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3631     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3632     VIXL_ASSERT(allow_macro_instructions_);
3633     VIXL_ASSERT(OutsideITBlock());
3634     MacroEmissionCheckScope guard(this);
3635     ITScope it_scope(this, &cond);
3636     smlad(cond, rd, rn, rm, ra);
3637   }
Smlad(Register rd,Register rn,Register rm,Register ra)3638   void Smlad(Register rd, Register rn, Register rm, Register ra) {
3639     Smlad(al, rd, rn, rm, ra);
3640   }
3641 
Smladx(Condition cond,Register rd,Register rn,Register rm,Register ra)3642   void Smladx(
3643       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3644     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3645     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3646     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3647     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3648     VIXL_ASSERT(allow_macro_instructions_);
3649     VIXL_ASSERT(OutsideITBlock());
3650     MacroEmissionCheckScope guard(this);
3651     ITScope it_scope(this, &cond);
3652     smladx(cond, rd, rn, rm, ra);
3653   }
Smladx(Register rd,Register rn,Register rm,Register ra)3654   void Smladx(Register rd, Register rn, Register rm, Register ra) {
3655     Smladx(al, rd, rn, rm, ra);
3656   }
3657 
Smlal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3658   void Smlal(
3659       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3660     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3661     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3662     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3663     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3664     VIXL_ASSERT(allow_macro_instructions_);
3665     VIXL_ASSERT(OutsideITBlock());
3666     MacroEmissionCheckScope guard(this);
3667     ITScope it_scope(this, &cond);
3668     smlal(cond, rdlo, rdhi, rn, rm);
3669   }
Smlal(Register rdlo,Register rdhi,Register rn,Register rm)3670   void Smlal(Register rdlo, Register rdhi, Register rn, Register rm) {
3671     Smlal(al, rdlo, rdhi, rn, rm);
3672   }
3673 
Smlalbb(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3674   void Smlalbb(
3675       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3676     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3677     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3678     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3679     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3680     VIXL_ASSERT(allow_macro_instructions_);
3681     VIXL_ASSERT(OutsideITBlock());
3682     MacroEmissionCheckScope guard(this);
3683     ITScope it_scope(this, &cond);
3684     smlalbb(cond, rdlo, rdhi, rn, rm);
3685   }
Smlalbb(Register rdlo,Register rdhi,Register rn,Register rm)3686   void Smlalbb(Register rdlo, Register rdhi, Register rn, Register rm) {
3687     Smlalbb(al, rdlo, rdhi, rn, rm);
3688   }
3689 
Smlalbt(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3690   void Smlalbt(
3691       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3692     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3693     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3694     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3695     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3696     VIXL_ASSERT(allow_macro_instructions_);
3697     VIXL_ASSERT(OutsideITBlock());
3698     MacroEmissionCheckScope guard(this);
3699     ITScope it_scope(this, &cond);
3700     smlalbt(cond, rdlo, rdhi, rn, rm);
3701   }
Smlalbt(Register rdlo,Register rdhi,Register rn,Register rm)3702   void Smlalbt(Register rdlo, Register rdhi, Register rn, Register rm) {
3703     Smlalbt(al, rdlo, rdhi, rn, rm);
3704   }
3705 
Smlald(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3706   void Smlald(
3707       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3708     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3709     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3710     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3711     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3712     VIXL_ASSERT(allow_macro_instructions_);
3713     VIXL_ASSERT(OutsideITBlock());
3714     MacroEmissionCheckScope guard(this);
3715     ITScope it_scope(this, &cond);
3716     smlald(cond, rdlo, rdhi, rn, rm);
3717   }
Smlald(Register rdlo,Register rdhi,Register rn,Register rm)3718   void Smlald(Register rdlo, Register rdhi, Register rn, Register rm) {
3719     Smlald(al, rdlo, rdhi, rn, rm);
3720   }
3721 
Smlaldx(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3722   void Smlaldx(
3723       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3724     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3725     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3726     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3727     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3728     VIXL_ASSERT(allow_macro_instructions_);
3729     VIXL_ASSERT(OutsideITBlock());
3730     MacroEmissionCheckScope guard(this);
3731     ITScope it_scope(this, &cond);
3732     smlaldx(cond, rdlo, rdhi, rn, rm);
3733   }
Smlaldx(Register rdlo,Register rdhi,Register rn,Register rm)3734   void Smlaldx(Register rdlo, Register rdhi, Register rn, Register rm) {
3735     Smlaldx(al, rdlo, rdhi, rn, rm);
3736   }
3737 
Smlals(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3738   void Smlals(
3739       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3740     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3741     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3742     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3743     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3744     VIXL_ASSERT(allow_macro_instructions_);
3745     VIXL_ASSERT(OutsideITBlock());
3746     MacroEmissionCheckScope guard(this);
3747     ITScope it_scope(this, &cond);
3748     smlals(cond, rdlo, rdhi, rn, rm);
3749   }
Smlals(Register rdlo,Register rdhi,Register rn,Register rm)3750   void Smlals(Register rdlo, Register rdhi, Register rn, Register rm) {
3751     Smlals(al, rdlo, rdhi, rn, rm);
3752   }
3753 
Smlaltb(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3754   void Smlaltb(
3755       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3756     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3757     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3758     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3759     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3760     VIXL_ASSERT(allow_macro_instructions_);
3761     VIXL_ASSERT(OutsideITBlock());
3762     MacroEmissionCheckScope guard(this);
3763     ITScope it_scope(this, &cond);
3764     smlaltb(cond, rdlo, rdhi, rn, rm);
3765   }
Smlaltb(Register rdlo,Register rdhi,Register rn,Register rm)3766   void Smlaltb(Register rdlo, Register rdhi, Register rn, Register rm) {
3767     Smlaltb(al, rdlo, rdhi, rn, rm);
3768   }
3769 
Smlaltt(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3770   void Smlaltt(
3771       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3772     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3773     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3774     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3775     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3776     VIXL_ASSERT(allow_macro_instructions_);
3777     VIXL_ASSERT(OutsideITBlock());
3778     MacroEmissionCheckScope guard(this);
3779     ITScope it_scope(this, &cond);
3780     smlaltt(cond, rdlo, rdhi, rn, rm);
3781   }
Smlaltt(Register rdlo,Register rdhi,Register rn,Register rm)3782   void Smlaltt(Register rdlo, Register rdhi, Register rn, Register rm) {
3783     Smlaltt(al, rdlo, rdhi, rn, rm);
3784   }
3785 
Smlatb(Condition cond,Register rd,Register rn,Register rm,Register ra)3786   void Smlatb(
3787       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3788     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3789     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3790     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3791     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3792     VIXL_ASSERT(allow_macro_instructions_);
3793     VIXL_ASSERT(OutsideITBlock());
3794     MacroEmissionCheckScope guard(this);
3795     ITScope it_scope(this, &cond);
3796     smlatb(cond, rd, rn, rm, ra);
3797   }
Smlatb(Register rd,Register rn,Register rm,Register ra)3798   void Smlatb(Register rd, Register rn, Register rm, Register ra) {
3799     Smlatb(al, rd, rn, rm, ra);
3800   }
3801 
Smlatt(Condition cond,Register rd,Register rn,Register rm,Register ra)3802   void Smlatt(
3803       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3804     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3805     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3806     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3807     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3808     VIXL_ASSERT(allow_macro_instructions_);
3809     VIXL_ASSERT(OutsideITBlock());
3810     MacroEmissionCheckScope guard(this);
3811     ITScope it_scope(this, &cond);
3812     smlatt(cond, rd, rn, rm, ra);
3813   }
Smlatt(Register rd,Register rn,Register rm,Register ra)3814   void Smlatt(Register rd, Register rn, Register rm, Register ra) {
3815     Smlatt(al, rd, rn, rm, ra);
3816   }
3817 
Smlawb(Condition cond,Register rd,Register rn,Register rm,Register ra)3818   void Smlawb(
3819       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3820     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3821     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3822     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3823     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3824     VIXL_ASSERT(allow_macro_instructions_);
3825     VIXL_ASSERT(OutsideITBlock());
3826     MacroEmissionCheckScope guard(this);
3827     ITScope it_scope(this, &cond);
3828     smlawb(cond, rd, rn, rm, ra);
3829   }
Smlawb(Register rd,Register rn,Register rm,Register ra)3830   void Smlawb(Register rd, Register rn, Register rm, Register ra) {
3831     Smlawb(al, rd, rn, rm, ra);
3832   }
3833 
Smlawt(Condition cond,Register rd,Register rn,Register rm,Register ra)3834   void Smlawt(
3835       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3836     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3837     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3838     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3839     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3840     VIXL_ASSERT(allow_macro_instructions_);
3841     VIXL_ASSERT(OutsideITBlock());
3842     MacroEmissionCheckScope guard(this);
3843     ITScope it_scope(this, &cond);
3844     smlawt(cond, rd, rn, rm, ra);
3845   }
Smlawt(Register rd,Register rn,Register rm,Register ra)3846   void Smlawt(Register rd, Register rn, Register rm, Register ra) {
3847     Smlawt(al, rd, rn, rm, ra);
3848   }
3849 
Smlsd(Condition cond,Register rd,Register rn,Register rm,Register ra)3850   void Smlsd(
3851       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3852     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3853     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3854     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3855     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3856     VIXL_ASSERT(allow_macro_instructions_);
3857     VIXL_ASSERT(OutsideITBlock());
3858     MacroEmissionCheckScope guard(this);
3859     ITScope it_scope(this, &cond);
3860     smlsd(cond, rd, rn, rm, ra);
3861   }
Smlsd(Register rd,Register rn,Register rm,Register ra)3862   void Smlsd(Register rd, Register rn, Register rm, Register ra) {
3863     Smlsd(al, rd, rn, rm, ra);
3864   }
3865 
Smlsdx(Condition cond,Register rd,Register rn,Register rm,Register ra)3866   void Smlsdx(
3867       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3868     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3869     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3870     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3871     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3872     VIXL_ASSERT(allow_macro_instructions_);
3873     VIXL_ASSERT(OutsideITBlock());
3874     MacroEmissionCheckScope guard(this);
3875     ITScope it_scope(this, &cond);
3876     smlsdx(cond, rd, rn, rm, ra);
3877   }
Smlsdx(Register rd,Register rn,Register rm,Register ra)3878   void Smlsdx(Register rd, Register rn, Register rm, Register ra) {
3879     Smlsdx(al, rd, rn, rm, ra);
3880   }
3881 
Smlsld(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3882   void Smlsld(
3883       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3884     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3885     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3886     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3887     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3888     VIXL_ASSERT(allow_macro_instructions_);
3889     VIXL_ASSERT(OutsideITBlock());
3890     MacroEmissionCheckScope guard(this);
3891     ITScope it_scope(this, &cond);
3892     smlsld(cond, rdlo, rdhi, rn, rm);
3893   }
Smlsld(Register rdlo,Register rdhi,Register rn,Register rm)3894   void Smlsld(Register rdlo, Register rdhi, Register rn, Register rm) {
3895     Smlsld(al, rdlo, rdhi, rn, rm);
3896   }
3897 
Smlsldx(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3898   void Smlsldx(
3899       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3900     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3901     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3902     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3903     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3904     VIXL_ASSERT(allow_macro_instructions_);
3905     VIXL_ASSERT(OutsideITBlock());
3906     MacroEmissionCheckScope guard(this);
3907     ITScope it_scope(this, &cond);
3908     smlsldx(cond, rdlo, rdhi, rn, rm);
3909   }
Smlsldx(Register rdlo,Register rdhi,Register rn,Register rm)3910   void Smlsldx(Register rdlo, Register rdhi, Register rn, Register rm) {
3911     Smlsldx(al, rdlo, rdhi, rn, rm);
3912   }
3913 
Smmla(Condition cond,Register rd,Register rn,Register rm,Register ra)3914   void Smmla(
3915       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3916     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3917     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3918     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3919     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3920     VIXL_ASSERT(allow_macro_instructions_);
3921     VIXL_ASSERT(OutsideITBlock());
3922     MacroEmissionCheckScope guard(this);
3923     ITScope it_scope(this, &cond);
3924     smmla(cond, rd, rn, rm, ra);
3925   }
Smmla(Register rd,Register rn,Register rm,Register ra)3926   void Smmla(Register rd, Register rn, Register rm, Register ra) {
3927     Smmla(al, rd, rn, rm, ra);
3928   }
3929 
Smmlar(Condition cond,Register rd,Register rn,Register rm,Register ra)3930   void Smmlar(
3931       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3932     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3933     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3934     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3935     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3936     VIXL_ASSERT(allow_macro_instructions_);
3937     VIXL_ASSERT(OutsideITBlock());
3938     MacroEmissionCheckScope guard(this);
3939     ITScope it_scope(this, &cond);
3940     smmlar(cond, rd, rn, rm, ra);
3941   }
Smmlar(Register rd,Register rn,Register rm,Register ra)3942   void Smmlar(Register rd, Register rn, Register rm, Register ra) {
3943     Smmlar(al, rd, rn, rm, ra);
3944   }
3945 
Smmls(Condition cond,Register rd,Register rn,Register rm,Register ra)3946   void Smmls(
3947       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3948     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3949     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3950     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3951     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3952     VIXL_ASSERT(allow_macro_instructions_);
3953     VIXL_ASSERT(OutsideITBlock());
3954     MacroEmissionCheckScope guard(this);
3955     ITScope it_scope(this, &cond);
3956     smmls(cond, rd, rn, rm, ra);
3957   }
Smmls(Register rd,Register rn,Register rm,Register ra)3958   void Smmls(Register rd, Register rn, Register rm, Register ra) {
3959     Smmls(al, rd, rn, rm, ra);
3960   }
3961 
Smmlsr(Condition cond,Register rd,Register rn,Register rm,Register ra)3962   void Smmlsr(
3963       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3964     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3965     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3966     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3967     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3968     VIXL_ASSERT(allow_macro_instructions_);
3969     VIXL_ASSERT(OutsideITBlock());
3970     MacroEmissionCheckScope guard(this);
3971     ITScope it_scope(this, &cond);
3972     smmlsr(cond, rd, rn, rm, ra);
3973   }
Smmlsr(Register rd,Register rn,Register rm,Register ra)3974   void Smmlsr(Register rd, Register rn, Register rm, Register ra) {
3975     Smmlsr(al, rd, rn, rm, ra);
3976   }
3977 
Smmul(Condition cond,Register rd,Register rn,Register rm)3978   void Smmul(Condition cond, Register rd, Register rn, Register rm) {
3979     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3980     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3981     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3982     VIXL_ASSERT(allow_macro_instructions_);
3983     VIXL_ASSERT(OutsideITBlock());
3984     MacroEmissionCheckScope guard(this);
3985     ITScope it_scope(this, &cond);
3986     smmul(cond, rd, rn, rm);
3987   }
Smmul(Register rd,Register rn,Register rm)3988   void Smmul(Register rd, Register rn, Register rm) { Smmul(al, rd, rn, rm); }
3989 
Smmulr(Condition cond,Register rd,Register rn,Register rm)3990   void Smmulr(Condition cond, Register rd, Register rn, Register rm) {
3991     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3992     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3993     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3994     VIXL_ASSERT(allow_macro_instructions_);
3995     VIXL_ASSERT(OutsideITBlock());
3996     MacroEmissionCheckScope guard(this);
3997     ITScope it_scope(this, &cond);
3998     smmulr(cond, rd, rn, rm);
3999   }
Smmulr(Register rd,Register rn,Register rm)4000   void Smmulr(Register rd, Register rn, Register rm) { Smmulr(al, rd, rn, rm); }
4001 
Smuad(Condition cond,Register rd,Register rn,Register rm)4002   void Smuad(Condition cond, Register rd, Register rn, Register rm) {
4003     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4004     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4005     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4006     VIXL_ASSERT(allow_macro_instructions_);
4007     VIXL_ASSERT(OutsideITBlock());
4008     MacroEmissionCheckScope guard(this);
4009     ITScope it_scope(this, &cond);
4010     smuad(cond, rd, rn, rm);
4011   }
Smuad(Register rd,Register rn,Register rm)4012   void Smuad(Register rd, Register rn, Register rm) { Smuad(al, rd, rn, rm); }
4013 
Smuadx(Condition cond,Register rd,Register rn,Register rm)4014   void Smuadx(Condition cond, Register rd, Register rn, Register rm) {
4015     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4016     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4017     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4018     VIXL_ASSERT(allow_macro_instructions_);
4019     VIXL_ASSERT(OutsideITBlock());
4020     MacroEmissionCheckScope guard(this);
4021     ITScope it_scope(this, &cond);
4022     smuadx(cond, rd, rn, rm);
4023   }
Smuadx(Register rd,Register rn,Register rm)4024   void Smuadx(Register rd, Register rn, Register rm) { Smuadx(al, rd, rn, rm); }
4025 
Smulbb(Condition cond,Register rd,Register rn,Register rm)4026   void Smulbb(Condition cond, Register rd, Register rn, Register rm) {
4027     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4028     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4029     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4030     VIXL_ASSERT(allow_macro_instructions_);
4031     VIXL_ASSERT(OutsideITBlock());
4032     MacroEmissionCheckScope guard(this);
4033     ITScope it_scope(this, &cond);
4034     smulbb(cond, rd, rn, rm);
4035   }
Smulbb(Register rd,Register rn,Register rm)4036   void Smulbb(Register rd, Register rn, Register rm) { Smulbb(al, rd, rn, rm); }
4037 
Smulbt(Condition cond,Register rd,Register rn,Register rm)4038   void Smulbt(Condition cond, Register rd, Register rn, Register rm) {
4039     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4040     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4041     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4042     VIXL_ASSERT(allow_macro_instructions_);
4043     VIXL_ASSERT(OutsideITBlock());
4044     MacroEmissionCheckScope guard(this);
4045     ITScope it_scope(this, &cond);
4046     smulbt(cond, rd, rn, rm);
4047   }
Smulbt(Register rd,Register rn,Register rm)4048   void Smulbt(Register rd, Register rn, Register rm) { Smulbt(al, rd, rn, rm); }
4049 
Smull(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4050   void Smull(
4051       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4052     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4053     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4054     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4055     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4056     VIXL_ASSERT(allow_macro_instructions_);
4057     VIXL_ASSERT(OutsideITBlock());
4058     MacroEmissionCheckScope guard(this);
4059     ITScope it_scope(this, &cond);
4060     smull(cond, rdlo, rdhi, rn, rm);
4061   }
Smull(Register rdlo,Register rdhi,Register rn,Register rm)4062   void Smull(Register rdlo, Register rdhi, Register rn, Register rm) {
4063     Smull(al, rdlo, rdhi, rn, rm);
4064   }
Smull(FlagsUpdate flags,Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4065   void Smull(FlagsUpdate flags,
4066              Condition cond,
4067              Register rdlo,
4068              Register rdhi,
4069              Register rn,
4070              Register rm) {
4071     switch (flags) {
4072       case LeaveFlags:
4073         Smull(cond, rdlo, rdhi, rn, rm);
4074         break;
4075       case SetFlags:
4076         Smulls(cond, rdlo, rdhi, rn, rm);
4077         break;
4078       case DontCare:
4079         Smull(cond, rdlo, rdhi, rn, rm);
4080         break;
4081     }
4082   }
Smull(FlagsUpdate flags,Register rdlo,Register rdhi,Register rn,Register rm)4083   void Smull(FlagsUpdate flags,
4084              Register rdlo,
4085              Register rdhi,
4086              Register rn,
4087              Register rm) {
4088     Smull(flags, al, rdlo, rdhi, rn, rm);
4089   }
4090 
Smulls(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4091   void Smulls(
4092       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4093     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4094     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4095     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4096     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4097     VIXL_ASSERT(allow_macro_instructions_);
4098     VIXL_ASSERT(OutsideITBlock());
4099     MacroEmissionCheckScope guard(this);
4100     ITScope it_scope(this, &cond);
4101     smulls(cond, rdlo, rdhi, rn, rm);
4102   }
Smulls(Register rdlo,Register rdhi,Register rn,Register rm)4103   void Smulls(Register rdlo, Register rdhi, Register rn, Register rm) {
4104     Smulls(al, rdlo, rdhi, rn, rm);
4105   }
4106 
Smultb(Condition cond,Register rd,Register rn,Register rm)4107   void Smultb(Condition cond, Register rd, Register rn, Register rm) {
4108     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4109     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4110     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4111     VIXL_ASSERT(allow_macro_instructions_);
4112     VIXL_ASSERT(OutsideITBlock());
4113     MacroEmissionCheckScope guard(this);
4114     ITScope it_scope(this, &cond);
4115     smultb(cond, rd, rn, rm);
4116   }
Smultb(Register rd,Register rn,Register rm)4117   void Smultb(Register rd, Register rn, Register rm) { Smultb(al, rd, rn, rm); }
4118 
Smultt(Condition cond,Register rd,Register rn,Register rm)4119   void Smultt(Condition cond, Register rd, Register rn, Register rm) {
4120     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4121     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4122     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4123     VIXL_ASSERT(allow_macro_instructions_);
4124     VIXL_ASSERT(OutsideITBlock());
4125     MacroEmissionCheckScope guard(this);
4126     ITScope it_scope(this, &cond);
4127     smultt(cond, rd, rn, rm);
4128   }
Smultt(Register rd,Register rn,Register rm)4129   void Smultt(Register rd, Register rn, Register rm) { Smultt(al, rd, rn, rm); }
4130 
Smulwb(Condition cond,Register rd,Register rn,Register rm)4131   void Smulwb(Condition cond, Register rd, Register rn, Register rm) {
4132     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4133     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4134     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4135     VIXL_ASSERT(allow_macro_instructions_);
4136     VIXL_ASSERT(OutsideITBlock());
4137     MacroEmissionCheckScope guard(this);
4138     ITScope it_scope(this, &cond);
4139     smulwb(cond, rd, rn, rm);
4140   }
Smulwb(Register rd,Register rn,Register rm)4141   void Smulwb(Register rd, Register rn, Register rm) { Smulwb(al, rd, rn, rm); }
4142 
Smulwt(Condition cond,Register rd,Register rn,Register rm)4143   void Smulwt(Condition cond, Register rd, Register rn, Register rm) {
4144     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4145     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4146     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4147     VIXL_ASSERT(allow_macro_instructions_);
4148     VIXL_ASSERT(OutsideITBlock());
4149     MacroEmissionCheckScope guard(this);
4150     ITScope it_scope(this, &cond);
4151     smulwt(cond, rd, rn, rm);
4152   }
Smulwt(Register rd,Register rn,Register rm)4153   void Smulwt(Register rd, Register rn, Register rm) { Smulwt(al, rd, rn, rm); }
4154 
Smusd(Condition cond,Register rd,Register rn,Register rm)4155   void Smusd(Condition cond, Register rd, Register rn, Register rm) {
4156     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4157     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4158     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4159     VIXL_ASSERT(allow_macro_instructions_);
4160     VIXL_ASSERT(OutsideITBlock());
4161     MacroEmissionCheckScope guard(this);
4162     ITScope it_scope(this, &cond);
4163     smusd(cond, rd, rn, rm);
4164   }
Smusd(Register rd,Register rn,Register rm)4165   void Smusd(Register rd, Register rn, Register rm) { Smusd(al, rd, rn, rm); }
4166 
Smusdx(Condition cond,Register rd,Register rn,Register rm)4167   void Smusdx(Condition cond, Register rd, Register rn, Register rm) {
4168     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4169     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4170     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4171     VIXL_ASSERT(allow_macro_instructions_);
4172     VIXL_ASSERT(OutsideITBlock());
4173     MacroEmissionCheckScope guard(this);
4174     ITScope it_scope(this, &cond);
4175     smusdx(cond, rd, rn, rm);
4176   }
Smusdx(Register rd,Register rn,Register rm)4177   void Smusdx(Register rd, Register rn, Register rm) { Smusdx(al, rd, rn, rm); }
4178 
Ssat(Condition cond,Register rd,uint32_t imm,const Operand & operand)4179   void Ssat(Condition cond, Register rd, uint32_t imm, const Operand& operand) {
4180     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4181     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4182     VIXL_ASSERT(allow_macro_instructions_);
4183     VIXL_ASSERT(OutsideITBlock());
4184     MacroEmissionCheckScope guard(this);
4185     ITScope it_scope(this, &cond);
4186     ssat(cond, rd, imm, operand);
4187   }
Ssat(Register rd,uint32_t imm,const Operand & operand)4188   void Ssat(Register rd, uint32_t imm, const Operand& operand) {
4189     Ssat(al, rd, imm, operand);
4190   }
4191 
Ssat16(Condition cond,Register rd,uint32_t imm,Register rn)4192   void Ssat16(Condition cond, Register rd, uint32_t imm, Register rn) {
4193     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4194     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4195     VIXL_ASSERT(allow_macro_instructions_);
4196     VIXL_ASSERT(OutsideITBlock());
4197     MacroEmissionCheckScope guard(this);
4198     ITScope it_scope(this, &cond);
4199     ssat16(cond, rd, imm, rn);
4200   }
Ssat16(Register rd,uint32_t imm,Register rn)4201   void Ssat16(Register rd, uint32_t imm, Register rn) {
4202     Ssat16(al, rd, imm, rn);
4203   }
4204 
Ssax(Condition cond,Register rd,Register rn,Register rm)4205   void Ssax(Condition cond, Register rd, Register rn, Register rm) {
4206     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4207     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4208     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4209     VIXL_ASSERT(allow_macro_instructions_);
4210     VIXL_ASSERT(OutsideITBlock());
4211     MacroEmissionCheckScope guard(this);
4212     ITScope it_scope(this, &cond);
4213     ssax(cond, rd, rn, rm);
4214   }
Ssax(Register rd,Register rn,Register rm)4215   void Ssax(Register rd, Register rn, Register rm) { Ssax(al, rd, rn, rm); }
4216 
Ssub16(Condition cond,Register rd,Register rn,Register rm)4217   void Ssub16(Condition cond, Register rd, Register rn, Register rm) {
4218     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4219     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4220     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4221     VIXL_ASSERT(allow_macro_instructions_);
4222     VIXL_ASSERT(OutsideITBlock());
4223     MacroEmissionCheckScope guard(this);
4224     ITScope it_scope(this, &cond);
4225     ssub16(cond, rd, rn, rm);
4226   }
Ssub16(Register rd,Register rn,Register rm)4227   void Ssub16(Register rd, Register rn, Register rm) { Ssub16(al, rd, rn, rm); }
4228 
Ssub8(Condition cond,Register rd,Register rn,Register rm)4229   void Ssub8(Condition cond, Register rd, Register rn, Register rm) {
4230     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4231     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4232     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4233     VIXL_ASSERT(allow_macro_instructions_);
4234     VIXL_ASSERT(OutsideITBlock());
4235     MacroEmissionCheckScope guard(this);
4236     ITScope it_scope(this, &cond);
4237     ssub8(cond, rd, rn, rm);
4238   }
Ssub8(Register rd,Register rn,Register rm)4239   void Ssub8(Register rd, Register rn, Register rm) { Ssub8(al, rd, rn, rm); }
4240 
Stl(Condition cond,Register rt,const MemOperand & operand)4241   void Stl(Condition cond, Register rt, const MemOperand& operand) {
4242     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4243     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4244     VIXL_ASSERT(allow_macro_instructions_);
4245     VIXL_ASSERT(OutsideITBlock());
4246     MacroEmissionCheckScope guard(this);
4247     ITScope it_scope(this, &cond);
4248     stl(cond, rt, operand);
4249   }
Stl(Register rt,const MemOperand & operand)4250   void Stl(Register rt, const MemOperand& operand) { Stl(al, rt, operand); }
4251 
Stlb(Condition cond,Register rt,const MemOperand & operand)4252   void Stlb(Condition cond, Register rt, const MemOperand& operand) {
4253     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4254     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4255     VIXL_ASSERT(allow_macro_instructions_);
4256     VIXL_ASSERT(OutsideITBlock());
4257     MacroEmissionCheckScope guard(this);
4258     ITScope it_scope(this, &cond);
4259     stlb(cond, rt, operand);
4260   }
Stlb(Register rt,const MemOperand & operand)4261   void Stlb(Register rt, const MemOperand& operand) { Stlb(al, rt, operand); }
4262 
Stlex(Condition cond,Register rd,Register rt,const MemOperand & operand)4263   void Stlex(Condition cond,
4264              Register rd,
4265              Register rt,
4266              const MemOperand& operand) {
4267     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4268     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4269     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4270     VIXL_ASSERT(allow_macro_instructions_);
4271     VIXL_ASSERT(OutsideITBlock());
4272     MacroEmissionCheckScope guard(this);
4273     ITScope it_scope(this, &cond);
4274     stlex(cond, rd, rt, operand);
4275   }
Stlex(Register rd,Register rt,const MemOperand & operand)4276   void Stlex(Register rd, Register rt, const MemOperand& operand) {
4277     Stlex(al, rd, rt, operand);
4278   }
4279 
Stlexb(Condition cond,Register rd,Register rt,const MemOperand & operand)4280   void Stlexb(Condition cond,
4281               Register rd,
4282               Register rt,
4283               const MemOperand& operand) {
4284     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4285     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4286     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4287     VIXL_ASSERT(allow_macro_instructions_);
4288     VIXL_ASSERT(OutsideITBlock());
4289     MacroEmissionCheckScope guard(this);
4290     ITScope it_scope(this, &cond);
4291     stlexb(cond, rd, rt, operand);
4292   }
Stlexb(Register rd,Register rt,const MemOperand & operand)4293   void Stlexb(Register rd, Register rt, const MemOperand& operand) {
4294     Stlexb(al, rd, rt, operand);
4295   }
4296 
Stlexd(Condition cond,Register rd,Register rt,Register rt2,const MemOperand & operand)4297   void Stlexd(Condition cond,
4298               Register rd,
4299               Register rt,
4300               Register rt2,
4301               const MemOperand& operand) {
4302     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4303     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4304     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
4305     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4306     VIXL_ASSERT(allow_macro_instructions_);
4307     VIXL_ASSERT(OutsideITBlock());
4308     MacroEmissionCheckScope guard(this);
4309     ITScope it_scope(this, &cond);
4310     stlexd(cond, rd, rt, rt2, operand);
4311   }
Stlexd(Register rd,Register rt,Register rt2,const MemOperand & operand)4312   void Stlexd(Register rd,
4313               Register rt,
4314               Register rt2,
4315               const MemOperand& operand) {
4316     Stlexd(al, rd, rt, rt2, operand);
4317   }
4318 
Stlexh(Condition cond,Register rd,Register rt,const MemOperand & operand)4319   void Stlexh(Condition cond,
4320               Register rd,
4321               Register rt,
4322               const MemOperand& operand) {
4323     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4324     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4325     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4326     VIXL_ASSERT(allow_macro_instructions_);
4327     VIXL_ASSERT(OutsideITBlock());
4328     MacroEmissionCheckScope guard(this);
4329     ITScope it_scope(this, &cond);
4330     stlexh(cond, rd, rt, operand);
4331   }
Stlexh(Register rd,Register rt,const MemOperand & operand)4332   void Stlexh(Register rd, Register rt, const MemOperand& operand) {
4333     Stlexh(al, rd, rt, operand);
4334   }
4335 
Stlh(Condition cond,Register rt,const MemOperand & operand)4336   void Stlh(Condition cond, Register rt, const MemOperand& operand) {
4337     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4338     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4339     VIXL_ASSERT(allow_macro_instructions_);
4340     VIXL_ASSERT(OutsideITBlock());
4341     MacroEmissionCheckScope guard(this);
4342     ITScope it_scope(this, &cond);
4343     stlh(cond, rt, operand);
4344   }
Stlh(Register rt,const MemOperand & operand)4345   void Stlh(Register rt, const MemOperand& operand) { Stlh(al, rt, operand); }
4346 
Stm(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4347   void Stm(Condition cond,
4348            Register rn,
4349            WriteBack write_back,
4350            RegisterList registers) {
4351     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4352     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4353     VIXL_ASSERT(allow_macro_instructions_);
4354     VIXL_ASSERT(OutsideITBlock());
4355     MacroEmissionCheckScope guard(this);
4356     ITScope it_scope(this, &cond);
4357     stm(cond, rn, write_back, registers);
4358   }
Stm(Register rn,WriteBack write_back,RegisterList registers)4359   void Stm(Register rn, WriteBack write_back, RegisterList registers) {
4360     Stm(al, rn, write_back, registers);
4361   }
4362 
Stmda(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4363   void Stmda(Condition cond,
4364              Register rn,
4365              WriteBack write_back,
4366              RegisterList registers) {
4367     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4368     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4369     VIXL_ASSERT(allow_macro_instructions_);
4370     VIXL_ASSERT(OutsideITBlock());
4371     MacroEmissionCheckScope guard(this);
4372     ITScope it_scope(this, &cond);
4373     stmda(cond, rn, write_back, registers);
4374   }
Stmda(Register rn,WriteBack write_back,RegisterList registers)4375   void Stmda(Register rn, WriteBack write_back, RegisterList registers) {
4376     Stmda(al, rn, write_back, registers);
4377   }
4378 
Stmdb(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4379   void Stmdb(Condition cond,
4380              Register rn,
4381              WriteBack write_back,
4382              RegisterList registers) {
4383     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4384     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4385     VIXL_ASSERT(allow_macro_instructions_);
4386     VIXL_ASSERT(OutsideITBlock());
4387     MacroEmissionCheckScope guard(this);
4388     ITScope it_scope(this, &cond);
4389     stmdb(cond, rn, write_back, registers);
4390   }
Stmdb(Register rn,WriteBack write_back,RegisterList registers)4391   void Stmdb(Register rn, WriteBack write_back, RegisterList registers) {
4392     Stmdb(al, rn, write_back, registers);
4393   }
4394 
Stmea(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4395   void Stmea(Condition cond,
4396              Register rn,
4397              WriteBack write_back,
4398              RegisterList registers) {
4399     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4400     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4401     VIXL_ASSERT(allow_macro_instructions_);
4402     VIXL_ASSERT(OutsideITBlock());
4403     MacroEmissionCheckScope guard(this);
4404     ITScope it_scope(this, &cond);
4405     stmea(cond, rn, write_back, registers);
4406   }
Stmea(Register rn,WriteBack write_back,RegisterList registers)4407   void Stmea(Register rn, WriteBack write_back, RegisterList registers) {
4408     Stmea(al, rn, write_back, registers);
4409   }
4410 
Stmed(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4411   void Stmed(Condition cond,
4412              Register rn,
4413              WriteBack write_back,
4414              RegisterList registers) {
4415     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4416     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4417     VIXL_ASSERT(allow_macro_instructions_);
4418     VIXL_ASSERT(OutsideITBlock());
4419     MacroEmissionCheckScope guard(this);
4420     ITScope it_scope(this, &cond);
4421     stmed(cond, rn, write_back, registers);
4422   }
Stmed(Register rn,WriteBack write_back,RegisterList registers)4423   void Stmed(Register rn, WriteBack write_back, RegisterList registers) {
4424     Stmed(al, rn, write_back, registers);
4425   }
4426 
Stmfa(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4427   void Stmfa(Condition cond,
4428              Register rn,
4429              WriteBack write_back,
4430              RegisterList registers) {
4431     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4432     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4433     VIXL_ASSERT(allow_macro_instructions_);
4434     VIXL_ASSERT(OutsideITBlock());
4435     MacroEmissionCheckScope guard(this);
4436     ITScope it_scope(this, &cond);
4437     stmfa(cond, rn, write_back, registers);
4438   }
Stmfa(Register rn,WriteBack write_back,RegisterList registers)4439   void Stmfa(Register rn, WriteBack write_back, RegisterList registers) {
4440     Stmfa(al, rn, write_back, registers);
4441   }
4442 
Stmfd(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4443   void Stmfd(Condition cond,
4444              Register rn,
4445              WriteBack write_back,
4446              RegisterList registers) {
4447     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4448     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4449     VIXL_ASSERT(allow_macro_instructions_);
4450     VIXL_ASSERT(OutsideITBlock());
4451     MacroEmissionCheckScope guard(this);
4452     ITScope it_scope(this, &cond);
4453     stmfd(cond, rn, write_back, registers);
4454   }
Stmfd(Register rn,WriteBack write_back,RegisterList registers)4455   void Stmfd(Register rn, WriteBack write_back, RegisterList registers) {
4456     Stmfd(al, rn, write_back, registers);
4457   }
4458 
Stmib(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4459   void Stmib(Condition cond,
4460              Register rn,
4461              WriteBack write_back,
4462              RegisterList registers) {
4463     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4464     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4465     VIXL_ASSERT(allow_macro_instructions_);
4466     VIXL_ASSERT(OutsideITBlock());
4467     MacroEmissionCheckScope guard(this);
4468     ITScope it_scope(this, &cond);
4469     stmib(cond, rn, write_back, registers);
4470   }
Stmib(Register rn,WriteBack write_back,RegisterList registers)4471   void Stmib(Register rn, WriteBack write_back, RegisterList registers) {
4472     Stmib(al, rn, write_back, registers);
4473   }
4474 
Str(Condition cond,Register rt,const MemOperand & operand)4475   void Str(Condition cond, Register rt, const MemOperand& operand) {
4476     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4477     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4478     VIXL_ASSERT(allow_macro_instructions_);
4479     VIXL_ASSERT(OutsideITBlock());
4480     MacroEmissionCheckScope guard(this);
4481     bool can_use_it =
4482         // STR{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
4483         (operand.IsImmediate() && rt.IsLow() &&
4484          operand.GetBaseRegister().IsLow() &&
4485          operand.IsOffsetImmediateWithinRange(0, 124, 4) &&
4486          (operand.GetAddrMode() == Offset)) ||
4487         // STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
4488         (operand.IsImmediate() && rt.IsLow() &&
4489          operand.GetBaseRegister().IsSP() &&
4490          operand.IsOffsetImmediateWithinRange(0, 1020, 4) &&
4491          (operand.GetAddrMode() == Offset)) ||
4492         // STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
4493         (operand.IsPlainRegister() && rt.IsLow() &&
4494          operand.GetBaseRegister().IsLow() &&
4495          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
4496          (operand.GetAddrMode() == Offset));
4497     ITScope it_scope(this, &cond, can_use_it);
4498     str(cond, rt, operand);
4499   }
Str(Register rt,const MemOperand & operand)4500   void Str(Register rt, const MemOperand& operand) { Str(al, rt, operand); }
4501 
Strb(Condition cond,Register rt,const MemOperand & operand)4502   void Strb(Condition cond, Register rt, const MemOperand& operand) {
4503     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4504     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4505     VIXL_ASSERT(allow_macro_instructions_);
4506     VIXL_ASSERT(OutsideITBlock());
4507     MacroEmissionCheckScope guard(this);
4508     bool can_use_it =
4509         // STRB{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
4510         (operand.IsImmediate() && rt.IsLow() &&
4511          operand.GetBaseRegister().IsLow() &&
4512          operand.IsOffsetImmediateWithinRange(0, 31) &&
4513          (operand.GetAddrMode() == Offset)) ||
4514         // STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
4515         (operand.IsPlainRegister() && rt.IsLow() &&
4516          operand.GetBaseRegister().IsLow() &&
4517          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
4518          (operand.GetAddrMode() == Offset));
4519     ITScope it_scope(this, &cond, can_use_it);
4520     strb(cond, rt, operand);
4521   }
Strb(Register rt,const MemOperand & operand)4522   void Strb(Register rt, const MemOperand& operand) { Strb(al, rt, operand); }
4523 
Strd(Condition cond,Register rt,Register rt2,const MemOperand & operand)4524   void Strd(Condition cond,
4525             Register rt,
4526             Register rt2,
4527             const MemOperand& operand) {
4528     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4529     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
4530     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4531     VIXL_ASSERT(allow_macro_instructions_);
4532     VIXL_ASSERT(OutsideITBlock());
4533     MacroEmissionCheckScope guard(this);
4534     ITScope it_scope(this, &cond);
4535     strd(cond, rt, rt2, operand);
4536   }
Strd(Register rt,Register rt2,const MemOperand & operand)4537   void Strd(Register rt, Register rt2, const MemOperand& operand) {
4538     Strd(al, rt, rt2, operand);
4539   }
4540 
Strex(Condition cond,Register rd,Register rt,const MemOperand & operand)4541   void Strex(Condition cond,
4542              Register rd,
4543              Register rt,
4544              const MemOperand& operand) {
4545     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4546     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4547     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4548     VIXL_ASSERT(allow_macro_instructions_);
4549     VIXL_ASSERT(OutsideITBlock());
4550     MacroEmissionCheckScope guard(this);
4551     ITScope it_scope(this, &cond);
4552     strex(cond, rd, rt, operand);
4553   }
Strex(Register rd,Register rt,const MemOperand & operand)4554   void Strex(Register rd, Register rt, const MemOperand& operand) {
4555     Strex(al, rd, rt, operand);
4556   }
4557 
Strexb(Condition cond,Register rd,Register rt,const MemOperand & operand)4558   void Strexb(Condition cond,
4559               Register rd,
4560               Register rt,
4561               const MemOperand& operand) {
4562     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4563     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4564     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4565     VIXL_ASSERT(allow_macro_instructions_);
4566     VIXL_ASSERT(OutsideITBlock());
4567     MacroEmissionCheckScope guard(this);
4568     ITScope it_scope(this, &cond);
4569     strexb(cond, rd, rt, operand);
4570   }
Strexb(Register rd,Register rt,const MemOperand & operand)4571   void Strexb(Register rd, Register rt, const MemOperand& operand) {
4572     Strexb(al, rd, rt, operand);
4573   }
4574 
Strexd(Condition cond,Register rd,Register rt,Register rt2,const MemOperand & operand)4575   void Strexd(Condition cond,
4576               Register rd,
4577               Register rt,
4578               Register rt2,
4579               const MemOperand& operand) {
4580     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4581     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4582     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
4583     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4584     VIXL_ASSERT(allow_macro_instructions_);
4585     VIXL_ASSERT(OutsideITBlock());
4586     MacroEmissionCheckScope guard(this);
4587     ITScope it_scope(this, &cond);
4588     strexd(cond, rd, rt, rt2, operand);
4589   }
Strexd(Register rd,Register rt,Register rt2,const MemOperand & operand)4590   void Strexd(Register rd,
4591               Register rt,
4592               Register rt2,
4593               const MemOperand& operand) {
4594     Strexd(al, rd, rt, rt2, operand);
4595   }
4596 
Strexh(Condition cond,Register rd,Register rt,const MemOperand & operand)4597   void Strexh(Condition cond,
4598               Register rd,
4599               Register rt,
4600               const MemOperand& operand) {
4601     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4602     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4603     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4604     VIXL_ASSERT(allow_macro_instructions_);
4605     VIXL_ASSERT(OutsideITBlock());
4606     MacroEmissionCheckScope guard(this);
4607     ITScope it_scope(this, &cond);
4608     strexh(cond, rd, rt, operand);
4609   }
Strexh(Register rd,Register rt,const MemOperand & operand)4610   void Strexh(Register rd, Register rt, const MemOperand& operand) {
4611     Strexh(al, rd, rt, operand);
4612   }
4613 
Strh(Condition cond,Register rt,const MemOperand & operand)4614   void Strh(Condition cond, Register rt, const MemOperand& operand) {
4615     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4616     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4617     VIXL_ASSERT(allow_macro_instructions_);
4618     VIXL_ASSERT(OutsideITBlock());
4619     MacroEmissionCheckScope guard(this);
4620     bool can_use_it =
4621         // STRH{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
4622         (operand.IsImmediate() && rt.IsLow() &&
4623          operand.GetBaseRegister().IsLow() &&
4624          operand.IsOffsetImmediateWithinRange(0, 62, 2) &&
4625          (operand.GetAddrMode() == Offset)) ||
4626         // STRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
4627         (operand.IsPlainRegister() && rt.IsLow() &&
4628          operand.GetBaseRegister().IsLow() &&
4629          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
4630          (operand.GetAddrMode() == Offset));
4631     ITScope it_scope(this, &cond, can_use_it);
4632     strh(cond, rt, operand);
4633   }
Strh(Register rt,const MemOperand & operand)4634   void Strh(Register rt, const MemOperand& operand) { Strh(al, rt, operand); }
4635 
Sub(Condition cond,Register rd,Register rn,const Operand & operand)4636   void Sub(Condition cond, Register rd, Register rn, const Operand& operand) {
4637     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4638     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4639     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4640     VIXL_ASSERT(allow_macro_instructions_);
4641     VIXL_ASSERT(OutsideITBlock());
4642     MacroEmissionCheckScope guard(this);
4643     if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) {
4644       uint32_t immediate = operand.GetImmediate();
4645       if (immediate == 0) {
4646         return;
4647       }
4648     }
4649     bool can_use_it =
4650         // SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
4651         (operand.IsImmediate() && (operand.GetImmediate() <= 7) && rn.IsLow() &&
4652          rd.IsLow()) ||
4653         // SUB<c>{<q>} {<Rdn>,} <Rdn>, #<imm8> ; T2
4654         (operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
4655          rd.IsLow() && rn.Is(rd)) ||
4656         // SUB<c>{<q>} <Rd>, <Rn>, <Rm>
4657         (operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
4658          operand.GetBaseRegister().IsLow());
4659     ITScope it_scope(this, &cond, can_use_it);
4660     sub(cond, rd, rn, operand);
4661   }
Sub(Register rd,Register rn,const Operand & operand)4662   void Sub(Register rd, Register rn, const Operand& operand) {
4663     Sub(al, rd, rn, operand);
4664   }
Sub(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)4665   void Sub(FlagsUpdate flags,
4666            Condition cond,
4667            Register rd,
4668            Register rn,
4669            const Operand& operand) {
4670     switch (flags) {
4671       case LeaveFlags:
4672         Sub(cond, rd, rn, operand);
4673         break;
4674       case SetFlags:
4675         Subs(cond, rd, rn, operand);
4676         break;
4677       case DontCare:
4678         bool setflags_is_smaller =
4679             IsUsingT32() && cond.Is(al) &&
4680             ((operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
4681               operand.GetBaseRegister().IsLow()) ||
4682              (operand.IsImmediate() &&
4683               ((rd.IsLow() && rn.IsLow() && (operand.GetImmediate() < 8)) ||
4684                (rd.IsLow() && rn.Is(rd) && (operand.GetImmediate() < 256)))));
4685         if (setflags_is_smaller) {
4686           Subs(cond, rd, rn, operand);
4687         } else {
4688           bool changed_op_is_smaller =
4689               operand.IsImmediate() && (operand.GetSignedImmediate() < 0) &&
4690               ((rd.IsLow() && rn.IsLow() &&
4691                 (operand.GetSignedImmediate() >= -7)) ||
4692                (rd.IsLow() && rn.Is(rd) &&
4693                 (operand.GetSignedImmediate() >= -255)));
4694           if (changed_op_is_smaller) {
4695             Adds(cond, rd, rn, -operand.GetSignedImmediate());
4696           } else {
4697             Sub(cond, rd, rn, operand);
4698           }
4699         }
4700         break;
4701     }
4702   }
Sub(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)4703   void Sub(FlagsUpdate flags,
4704            Register rd,
4705            Register rn,
4706            const Operand& operand) {
4707     Sub(flags, al, rd, rn, operand);
4708   }
4709 
Subs(Condition cond,Register rd,Register rn,const Operand & operand)4710   void Subs(Condition cond, Register rd, Register rn, const Operand& operand) {
4711     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4712     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4713     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4714     VIXL_ASSERT(allow_macro_instructions_);
4715     VIXL_ASSERT(OutsideITBlock());
4716     MacroEmissionCheckScope guard(this);
4717     ITScope it_scope(this, &cond);
4718     subs(cond, rd, rn, operand);
4719   }
Subs(Register rd,Register rn,const Operand & operand)4720   void Subs(Register rd, Register rn, const Operand& operand) {
4721     Subs(al, rd, rn, operand);
4722   }
4723 
Svc(Condition cond,uint32_t imm)4724   void Svc(Condition cond, uint32_t imm) {
4725     VIXL_ASSERT(allow_macro_instructions_);
4726     VIXL_ASSERT(OutsideITBlock());
4727     MacroEmissionCheckScope guard(this);
4728     ITScope it_scope(this, &cond);
4729     svc(cond, imm);
4730   }
Svc(uint32_t imm)4731   void Svc(uint32_t imm) { Svc(al, imm); }
4732 
Sxtab(Condition cond,Register rd,Register rn,const Operand & operand)4733   void Sxtab(Condition cond, Register rd, Register rn, const Operand& operand) {
4734     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4735     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4736     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4737     VIXL_ASSERT(allow_macro_instructions_);
4738     VIXL_ASSERT(OutsideITBlock());
4739     MacroEmissionCheckScope guard(this);
4740     ITScope it_scope(this, &cond);
4741     sxtab(cond, rd, rn, operand);
4742   }
Sxtab(Register rd,Register rn,const Operand & operand)4743   void Sxtab(Register rd, Register rn, const Operand& operand) {
4744     Sxtab(al, rd, rn, operand);
4745   }
4746 
Sxtab16(Condition cond,Register rd,Register rn,const Operand & operand)4747   void Sxtab16(Condition cond,
4748                Register rd,
4749                Register rn,
4750                const Operand& operand) {
4751     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4752     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4753     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4754     VIXL_ASSERT(allow_macro_instructions_);
4755     VIXL_ASSERT(OutsideITBlock());
4756     MacroEmissionCheckScope guard(this);
4757     ITScope it_scope(this, &cond);
4758     sxtab16(cond, rd, rn, operand);
4759   }
Sxtab16(Register rd,Register rn,const Operand & operand)4760   void Sxtab16(Register rd, Register rn, const Operand& operand) {
4761     Sxtab16(al, rd, rn, operand);
4762   }
4763 
Sxtah(Condition cond,Register rd,Register rn,const Operand & operand)4764   void Sxtah(Condition cond, Register rd, Register rn, const Operand& operand) {
4765     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4766     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4767     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4768     VIXL_ASSERT(allow_macro_instructions_);
4769     VIXL_ASSERT(OutsideITBlock());
4770     MacroEmissionCheckScope guard(this);
4771     ITScope it_scope(this, &cond);
4772     sxtah(cond, rd, rn, operand);
4773   }
Sxtah(Register rd,Register rn,const Operand & operand)4774   void Sxtah(Register rd, Register rn, const Operand& operand) {
4775     Sxtah(al, rd, rn, operand);
4776   }
4777 
Sxtb(Condition cond,Register rd,const Operand & operand)4778   void Sxtb(Condition cond, Register rd, const Operand& operand) {
4779     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4780     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4781     VIXL_ASSERT(allow_macro_instructions_);
4782     VIXL_ASSERT(OutsideITBlock());
4783     MacroEmissionCheckScope guard(this);
4784     ITScope it_scope(this, &cond);
4785     sxtb(cond, rd, operand);
4786   }
Sxtb(Register rd,const Operand & operand)4787   void Sxtb(Register rd, const Operand& operand) { Sxtb(al, rd, operand); }
4788 
Sxtb16(Condition cond,Register rd,const Operand & operand)4789   void Sxtb16(Condition cond, Register rd, const Operand& operand) {
4790     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4791     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4792     VIXL_ASSERT(allow_macro_instructions_);
4793     VIXL_ASSERT(OutsideITBlock());
4794     MacroEmissionCheckScope guard(this);
4795     ITScope it_scope(this, &cond);
4796     sxtb16(cond, rd, operand);
4797   }
Sxtb16(Register rd,const Operand & operand)4798   void Sxtb16(Register rd, const Operand& operand) { Sxtb16(al, rd, operand); }
4799 
Sxth(Condition cond,Register rd,const Operand & operand)4800   void Sxth(Condition cond, Register rd, const Operand& operand) {
4801     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4802     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4803     VIXL_ASSERT(allow_macro_instructions_);
4804     VIXL_ASSERT(OutsideITBlock());
4805     MacroEmissionCheckScope guard(this);
4806     ITScope it_scope(this, &cond);
4807     sxth(cond, rd, operand);
4808   }
Sxth(Register rd,const Operand & operand)4809   void Sxth(Register rd, const Operand& operand) { Sxth(al, rd, operand); }
4810 
Teq(Condition cond,Register rn,const Operand & operand)4811   void Teq(Condition cond, Register rn, const Operand& operand) {
4812     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4813     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4814     VIXL_ASSERT(allow_macro_instructions_);
4815     VIXL_ASSERT(OutsideITBlock());
4816     MacroEmissionCheckScope guard(this);
4817     ITScope it_scope(this, &cond);
4818     teq(cond, rn, operand);
4819   }
Teq(Register rn,const Operand & operand)4820   void Teq(Register rn, const Operand& operand) { Teq(al, rn, operand); }
4821 
Tst(Condition cond,Register rn,const Operand & operand)4822   void Tst(Condition cond, Register rn, const Operand& operand) {
4823     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4824     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4825     VIXL_ASSERT(allow_macro_instructions_);
4826     VIXL_ASSERT(OutsideITBlock());
4827     MacroEmissionCheckScope guard(this);
4828     bool can_use_it =
4829         // TST{<c>}{<q>} <Rn>, <Rm> ; T1
4830         operand.IsPlainRegister() && rn.IsLow() &&
4831         operand.GetBaseRegister().IsLow();
4832     ITScope it_scope(this, &cond, can_use_it);
4833     tst(cond, rn, operand);
4834   }
Tst(Register rn,const Operand & operand)4835   void Tst(Register rn, const Operand& operand) { Tst(al, rn, operand); }
4836 
Uadd16(Condition cond,Register rd,Register rn,Register rm)4837   void Uadd16(Condition cond, Register rd, Register rn, Register rm) {
4838     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4839     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4840     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4841     VIXL_ASSERT(allow_macro_instructions_);
4842     VIXL_ASSERT(OutsideITBlock());
4843     MacroEmissionCheckScope guard(this);
4844     ITScope it_scope(this, &cond);
4845     uadd16(cond, rd, rn, rm);
4846   }
Uadd16(Register rd,Register rn,Register rm)4847   void Uadd16(Register rd, Register rn, Register rm) { Uadd16(al, rd, rn, rm); }
4848 
Uadd8(Condition cond,Register rd,Register rn,Register rm)4849   void Uadd8(Condition cond, Register rd, Register rn, Register rm) {
4850     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4851     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4852     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4853     VIXL_ASSERT(allow_macro_instructions_);
4854     VIXL_ASSERT(OutsideITBlock());
4855     MacroEmissionCheckScope guard(this);
4856     ITScope it_scope(this, &cond);
4857     uadd8(cond, rd, rn, rm);
4858   }
Uadd8(Register rd,Register rn,Register rm)4859   void Uadd8(Register rd, Register rn, Register rm) { Uadd8(al, rd, rn, rm); }
4860 
Uasx(Condition cond,Register rd,Register rn,Register rm)4861   void Uasx(Condition cond, Register rd, Register rn, Register rm) {
4862     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4863     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4864     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4865     VIXL_ASSERT(allow_macro_instructions_);
4866     VIXL_ASSERT(OutsideITBlock());
4867     MacroEmissionCheckScope guard(this);
4868     ITScope it_scope(this, &cond);
4869     uasx(cond, rd, rn, rm);
4870   }
Uasx(Register rd,Register rn,Register rm)4871   void Uasx(Register rd, Register rn, Register rm) { Uasx(al, rd, rn, rm); }
4872 
Ubfx(Condition cond,Register rd,Register rn,uint32_t lsb,const Operand & operand)4873   void Ubfx(Condition cond,
4874             Register rd,
4875             Register rn,
4876             uint32_t lsb,
4877             const Operand& operand) {
4878     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4879     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4880     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4881     VIXL_ASSERT(allow_macro_instructions_);
4882     VIXL_ASSERT(OutsideITBlock());
4883     MacroEmissionCheckScope guard(this);
4884     ITScope it_scope(this, &cond);
4885     ubfx(cond, rd, rn, lsb, operand);
4886   }
Ubfx(Register rd,Register rn,uint32_t lsb,const Operand & operand)4887   void Ubfx(Register rd, Register rn, uint32_t lsb, const Operand& operand) {
4888     Ubfx(al, rd, rn, lsb, operand);
4889   }
4890 
Udf(Condition cond,uint32_t imm)4891   void Udf(Condition cond, uint32_t imm) {
4892     VIXL_ASSERT(allow_macro_instructions_);
4893     VIXL_ASSERT(OutsideITBlock());
4894     MacroEmissionCheckScope guard(this);
4895     ITScope it_scope(this, &cond);
4896     udf(cond, imm);
4897   }
Udf(uint32_t imm)4898   void Udf(uint32_t imm) { Udf(al, imm); }
4899 
Udiv(Condition cond,Register rd,Register rn,Register rm)4900   void Udiv(Condition cond, Register rd, Register rn, Register rm) {
4901     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4902     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4903     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4904     VIXL_ASSERT(allow_macro_instructions_);
4905     VIXL_ASSERT(OutsideITBlock());
4906     MacroEmissionCheckScope guard(this);
4907     ITScope it_scope(this, &cond);
4908     udiv(cond, rd, rn, rm);
4909   }
Udiv(Register rd,Register rn,Register rm)4910   void Udiv(Register rd, Register rn, Register rm) { Udiv(al, rd, rn, rm); }
4911 
Uhadd16(Condition cond,Register rd,Register rn,Register rm)4912   void Uhadd16(Condition cond, Register rd, Register rn, Register rm) {
4913     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4914     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4915     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4916     VIXL_ASSERT(allow_macro_instructions_);
4917     VIXL_ASSERT(OutsideITBlock());
4918     MacroEmissionCheckScope guard(this);
4919     ITScope it_scope(this, &cond);
4920     uhadd16(cond, rd, rn, rm);
4921   }
Uhadd16(Register rd,Register rn,Register rm)4922   void Uhadd16(Register rd, Register rn, Register rm) {
4923     Uhadd16(al, rd, rn, rm);
4924   }
4925 
Uhadd8(Condition cond,Register rd,Register rn,Register rm)4926   void Uhadd8(Condition cond, Register rd, Register rn, Register rm) {
4927     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4928     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4929     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4930     VIXL_ASSERT(allow_macro_instructions_);
4931     VIXL_ASSERT(OutsideITBlock());
4932     MacroEmissionCheckScope guard(this);
4933     ITScope it_scope(this, &cond);
4934     uhadd8(cond, rd, rn, rm);
4935   }
Uhadd8(Register rd,Register rn,Register rm)4936   void Uhadd8(Register rd, Register rn, Register rm) { Uhadd8(al, rd, rn, rm); }
4937 
Uhasx(Condition cond,Register rd,Register rn,Register rm)4938   void Uhasx(Condition cond, Register rd, Register rn, Register rm) {
4939     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4940     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4941     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4942     VIXL_ASSERT(allow_macro_instructions_);
4943     VIXL_ASSERT(OutsideITBlock());
4944     MacroEmissionCheckScope guard(this);
4945     ITScope it_scope(this, &cond);
4946     uhasx(cond, rd, rn, rm);
4947   }
Uhasx(Register rd,Register rn,Register rm)4948   void Uhasx(Register rd, Register rn, Register rm) { Uhasx(al, rd, rn, rm); }
4949 
Uhsax(Condition cond,Register rd,Register rn,Register rm)4950   void Uhsax(Condition cond, Register rd, Register rn, Register rm) {
4951     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4952     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4953     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4954     VIXL_ASSERT(allow_macro_instructions_);
4955     VIXL_ASSERT(OutsideITBlock());
4956     MacroEmissionCheckScope guard(this);
4957     ITScope it_scope(this, &cond);
4958     uhsax(cond, rd, rn, rm);
4959   }
Uhsax(Register rd,Register rn,Register rm)4960   void Uhsax(Register rd, Register rn, Register rm) { Uhsax(al, rd, rn, rm); }
4961 
Uhsub16(Condition cond,Register rd,Register rn,Register rm)4962   void Uhsub16(Condition cond, Register rd, Register rn, Register rm) {
4963     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4964     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4965     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4966     VIXL_ASSERT(allow_macro_instructions_);
4967     VIXL_ASSERT(OutsideITBlock());
4968     MacroEmissionCheckScope guard(this);
4969     ITScope it_scope(this, &cond);
4970     uhsub16(cond, rd, rn, rm);
4971   }
Uhsub16(Register rd,Register rn,Register rm)4972   void Uhsub16(Register rd, Register rn, Register rm) {
4973     Uhsub16(al, rd, rn, rm);
4974   }
4975 
Uhsub8(Condition cond,Register rd,Register rn,Register rm)4976   void Uhsub8(Condition cond, Register rd, Register rn, Register rm) {
4977     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4978     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4979     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4980     VIXL_ASSERT(allow_macro_instructions_);
4981     VIXL_ASSERT(OutsideITBlock());
4982     MacroEmissionCheckScope guard(this);
4983     ITScope it_scope(this, &cond);
4984     uhsub8(cond, rd, rn, rm);
4985   }
Uhsub8(Register rd,Register rn,Register rm)4986   void Uhsub8(Register rd, Register rn, Register rm) { Uhsub8(al, rd, rn, rm); }
4987 
Umaal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4988   void Umaal(
4989       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4990     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4991     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4992     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4993     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4994     VIXL_ASSERT(allow_macro_instructions_);
4995     VIXL_ASSERT(OutsideITBlock());
4996     MacroEmissionCheckScope guard(this);
4997     ITScope it_scope(this, &cond);
4998     umaal(cond, rdlo, rdhi, rn, rm);
4999   }
Umaal(Register rdlo,Register rdhi,Register rn,Register rm)5000   void Umaal(Register rdlo, Register rdhi, Register rn, Register rm) {
5001     Umaal(al, rdlo, rdhi, rn, rm);
5002   }
5003 
Umlal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)5004   void Umlal(
5005       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
5006     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
5007     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
5008     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5009     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5010     VIXL_ASSERT(allow_macro_instructions_);
5011     VIXL_ASSERT(OutsideITBlock());
5012     MacroEmissionCheckScope guard(this);
5013     ITScope it_scope(this, &cond);
5014     umlal(cond, rdlo, rdhi, rn, rm);
5015   }
Umlal(Register rdlo,Register rdhi,Register rn,Register rm)5016   void Umlal(Register rdlo, Register rdhi, Register rn, Register rm) {
5017     Umlal(al, rdlo, rdhi, rn, rm);
5018   }
Umlal(FlagsUpdate flags,Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)5019   void Umlal(FlagsUpdate flags,
5020              Condition cond,
5021              Register rdlo,
5022              Register rdhi,
5023              Register rn,
5024              Register rm) {
5025     switch (flags) {
5026       case LeaveFlags:
5027         Umlal(cond, rdlo, rdhi, rn, rm);
5028         break;
5029       case SetFlags:
5030         Umlals(cond, rdlo, rdhi, rn, rm);
5031         break;
5032       case DontCare:
5033         Umlal(cond, rdlo, rdhi, rn, rm);
5034         break;
5035     }
5036   }
Umlal(FlagsUpdate flags,Register rdlo,Register rdhi,Register rn,Register rm)5037   void Umlal(FlagsUpdate flags,
5038              Register rdlo,
5039              Register rdhi,
5040              Register rn,
5041              Register rm) {
5042     Umlal(flags, al, rdlo, rdhi, rn, rm);
5043   }
5044 
Umlals(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)5045   void Umlals(
5046       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
5047     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
5048     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
5049     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5050     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5051     VIXL_ASSERT(allow_macro_instructions_);
5052     VIXL_ASSERT(OutsideITBlock());
5053     MacroEmissionCheckScope guard(this);
5054     ITScope it_scope(this, &cond);
5055     umlals(cond, rdlo, rdhi, rn, rm);
5056   }
Umlals(Register rdlo,Register rdhi,Register rn,Register rm)5057   void Umlals(Register rdlo, Register rdhi, Register rn, Register rm) {
5058     Umlals(al, rdlo, rdhi, rn, rm);
5059   }
5060 
Umull(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)5061   void Umull(
5062       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
5063     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
5064     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
5065     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5066     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5067     VIXL_ASSERT(allow_macro_instructions_);
5068     VIXL_ASSERT(OutsideITBlock());
5069     MacroEmissionCheckScope guard(this);
5070     ITScope it_scope(this, &cond);
5071     umull(cond, rdlo, rdhi, rn, rm);
5072   }
Umull(Register rdlo,Register rdhi,Register rn,Register rm)5073   void Umull(Register rdlo, Register rdhi, Register rn, Register rm) {
5074     Umull(al, rdlo, rdhi, rn, rm);
5075   }
Umull(FlagsUpdate flags,Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)5076   void Umull(FlagsUpdate flags,
5077              Condition cond,
5078              Register rdlo,
5079              Register rdhi,
5080              Register rn,
5081              Register rm) {
5082     switch (flags) {
5083       case LeaveFlags:
5084         Umull(cond, rdlo, rdhi, rn, rm);
5085         break;
5086       case SetFlags:
5087         Umulls(cond, rdlo, rdhi, rn, rm);
5088         break;
5089       case DontCare:
5090         Umull(cond, rdlo, rdhi, rn, rm);
5091         break;
5092     }
5093   }
Umull(FlagsUpdate flags,Register rdlo,Register rdhi,Register rn,Register rm)5094   void Umull(FlagsUpdate flags,
5095              Register rdlo,
5096              Register rdhi,
5097              Register rn,
5098              Register rm) {
5099     Umull(flags, al, rdlo, rdhi, rn, rm);
5100   }
5101 
Umulls(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)5102   void Umulls(
5103       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
5104     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
5105     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
5106     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5107     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5108     VIXL_ASSERT(allow_macro_instructions_);
5109     VIXL_ASSERT(OutsideITBlock());
5110     MacroEmissionCheckScope guard(this);
5111     ITScope it_scope(this, &cond);
5112     umulls(cond, rdlo, rdhi, rn, rm);
5113   }
Umulls(Register rdlo,Register rdhi,Register rn,Register rm)5114   void Umulls(Register rdlo, Register rdhi, Register rn, Register rm) {
5115     Umulls(al, rdlo, rdhi, rn, rm);
5116   }
5117 
Uqadd16(Condition cond,Register rd,Register rn,Register rm)5118   void Uqadd16(Condition cond, Register rd, Register rn, Register rm) {
5119     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5120     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5121     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5122     VIXL_ASSERT(allow_macro_instructions_);
5123     VIXL_ASSERT(OutsideITBlock());
5124     MacroEmissionCheckScope guard(this);
5125     ITScope it_scope(this, &cond);
5126     uqadd16(cond, rd, rn, rm);
5127   }
Uqadd16(Register rd,Register rn,Register rm)5128   void Uqadd16(Register rd, Register rn, Register rm) {
5129     Uqadd16(al, rd, rn, rm);
5130   }
5131 
Uqadd8(Condition cond,Register rd,Register rn,Register rm)5132   void Uqadd8(Condition cond, Register rd, Register rn, Register rm) {
5133     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5134     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5135     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5136     VIXL_ASSERT(allow_macro_instructions_);
5137     VIXL_ASSERT(OutsideITBlock());
5138     MacroEmissionCheckScope guard(this);
5139     ITScope it_scope(this, &cond);
5140     uqadd8(cond, rd, rn, rm);
5141   }
Uqadd8(Register rd,Register rn,Register rm)5142   void Uqadd8(Register rd, Register rn, Register rm) { Uqadd8(al, rd, rn, rm); }
5143 
Uqasx(Condition cond,Register rd,Register rn,Register rm)5144   void Uqasx(Condition cond, Register rd, Register rn, Register rm) {
5145     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5146     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5147     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5148     VIXL_ASSERT(allow_macro_instructions_);
5149     VIXL_ASSERT(OutsideITBlock());
5150     MacroEmissionCheckScope guard(this);
5151     ITScope it_scope(this, &cond);
5152     uqasx(cond, rd, rn, rm);
5153   }
Uqasx(Register rd,Register rn,Register rm)5154   void Uqasx(Register rd, Register rn, Register rm) { Uqasx(al, rd, rn, rm); }
5155 
Uqsax(Condition cond,Register rd,Register rn,Register rm)5156   void Uqsax(Condition cond, Register rd, Register rn, Register rm) {
5157     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5158     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5159     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5160     VIXL_ASSERT(allow_macro_instructions_);
5161     VIXL_ASSERT(OutsideITBlock());
5162     MacroEmissionCheckScope guard(this);
5163     ITScope it_scope(this, &cond);
5164     uqsax(cond, rd, rn, rm);
5165   }
Uqsax(Register rd,Register rn,Register rm)5166   void Uqsax(Register rd, Register rn, Register rm) { Uqsax(al, rd, rn, rm); }
5167 
Uqsub16(Condition cond,Register rd,Register rn,Register rm)5168   void Uqsub16(Condition cond, Register rd, Register rn, Register rm) {
5169     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5170     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5171     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5172     VIXL_ASSERT(allow_macro_instructions_);
5173     VIXL_ASSERT(OutsideITBlock());
5174     MacroEmissionCheckScope guard(this);
5175     ITScope it_scope(this, &cond);
5176     uqsub16(cond, rd, rn, rm);
5177   }
Uqsub16(Register rd,Register rn,Register rm)5178   void Uqsub16(Register rd, Register rn, Register rm) {
5179     Uqsub16(al, rd, rn, rm);
5180   }
5181 
Uqsub8(Condition cond,Register rd,Register rn,Register rm)5182   void Uqsub8(Condition cond, Register rd, Register rn, Register rm) {
5183     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5184     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5185     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5186     VIXL_ASSERT(allow_macro_instructions_);
5187     VIXL_ASSERT(OutsideITBlock());
5188     MacroEmissionCheckScope guard(this);
5189     ITScope it_scope(this, &cond);
5190     uqsub8(cond, rd, rn, rm);
5191   }
Uqsub8(Register rd,Register rn,Register rm)5192   void Uqsub8(Register rd, Register rn, Register rm) { Uqsub8(al, rd, rn, rm); }
5193 
Usad8(Condition cond,Register rd,Register rn,Register rm)5194   void Usad8(Condition cond, Register rd, Register rn, Register rm) {
5195     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5196     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5197     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5198     VIXL_ASSERT(allow_macro_instructions_);
5199     VIXL_ASSERT(OutsideITBlock());
5200     MacroEmissionCheckScope guard(this);
5201     ITScope it_scope(this, &cond);
5202     usad8(cond, rd, rn, rm);
5203   }
Usad8(Register rd,Register rn,Register rm)5204   void Usad8(Register rd, Register rn, Register rm) { Usad8(al, rd, rn, rm); }
5205 
Usada8(Condition cond,Register rd,Register rn,Register rm,Register ra)5206   void Usada8(
5207       Condition cond, Register rd, Register rn, Register rm, Register ra) {
5208     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5209     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5210     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5211     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
5212     VIXL_ASSERT(allow_macro_instructions_);
5213     VIXL_ASSERT(OutsideITBlock());
5214     MacroEmissionCheckScope guard(this);
5215     ITScope it_scope(this, &cond);
5216     usada8(cond, rd, rn, rm, ra);
5217   }
Usada8(Register rd,Register rn,Register rm,Register ra)5218   void Usada8(Register rd, Register rn, Register rm, Register ra) {
5219     Usada8(al, rd, rn, rm, ra);
5220   }
5221 
Usat(Condition cond,Register rd,uint32_t imm,const Operand & operand)5222   void Usat(Condition cond, Register rd, uint32_t imm, const Operand& operand) {
5223     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5224     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5225     VIXL_ASSERT(allow_macro_instructions_);
5226     VIXL_ASSERT(OutsideITBlock());
5227     MacroEmissionCheckScope guard(this);
5228     ITScope it_scope(this, &cond);
5229     usat(cond, rd, imm, operand);
5230   }
Usat(Register rd,uint32_t imm,const Operand & operand)5231   void Usat(Register rd, uint32_t imm, const Operand& operand) {
5232     Usat(al, rd, imm, operand);
5233   }
5234 
Usat16(Condition cond,Register rd,uint32_t imm,Register rn)5235   void Usat16(Condition cond, Register rd, uint32_t imm, Register rn) {
5236     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5237     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5238     VIXL_ASSERT(allow_macro_instructions_);
5239     VIXL_ASSERT(OutsideITBlock());
5240     MacroEmissionCheckScope guard(this);
5241     ITScope it_scope(this, &cond);
5242     usat16(cond, rd, imm, rn);
5243   }
Usat16(Register rd,uint32_t imm,Register rn)5244   void Usat16(Register rd, uint32_t imm, Register rn) {
5245     Usat16(al, rd, imm, rn);
5246   }
5247 
Usax(Condition cond,Register rd,Register rn,Register rm)5248   void Usax(Condition cond, Register rd, Register rn, Register rm) {
5249     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5250     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5251     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5252     VIXL_ASSERT(allow_macro_instructions_);
5253     VIXL_ASSERT(OutsideITBlock());
5254     MacroEmissionCheckScope guard(this);
5255     ITScope it_scope(this, &cond);
5256     usax(cond, rd, rn, rm);
5257   }
Usax(Register rd,Register rn,Register rm)5258   void Usax(Register rd, Register rn, Register rm) { Usax(al, rd, rn, rm); }
5259 
Usub16(Condition cond,Register rd,Register rn,Register rm)5260   void Usub16(Condition cond, Register rd, Register rn, Register rm) {
5261     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5262     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5263     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5264     VIXL_ASSERT(allow_macro_instructions_);
5265     VIXL_ASSERT(OutsideITBlock());
5266     MacroEmissionCheckScope guard(this);
5267     ITScope it_scope(this, &cond);
5268     usub16(cond, rd, rn, rm);
5269   }
Usub16(Register rd,Register rn,Register rm)5270   void Usub16(Register rd, Register rn, Register rm) { Usub16(al, rd, rn, rm); }
5271 
Usub8(Condition cond,Register rd,Register rn,Register rm)5272   void Usub8(Condition cond, Register rd, Register rn, Register rm) {
5273     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5274     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5275     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5276     VIXL_ASSERT(allow_macro_instructions_);
5277     VIXL_ASSERT(OutsideITBlock());
5278     MacroEmissionCheckScope guard(this);
5279     ITScope it_scope(this, &cond);
5280     usub8(cond, rd, rn, rm);
5281   }
Usub8(Register rd,Register rn,Register rm)5282   void Usub8(Register rd, Register rn, Register rm) { Usub8(al, rd, rn, rm); }
5283 
Uxtab(Condition cond,Register rd,Register rn,const Operand & operand)5284   void Uxtab(Condition cond, Register rd, Register rn, const Operand& operand) {
5285     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5286     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5287     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5288     VIXL_ASSERT(allow_macro_instructions_);
5289     VIXL_ASSERT(OutsideITBlock());
5290     MacroEmissionCheckScope guard(this);
5291     ITScope it_scope(this, &cond);
5292     uxtab(cond, rd, rn, operand);
5293   }
Uxtab(Register rd,Register rn,const Operand & operand)5294   void Uxtab(Register rd, Register rn, const Operand& operand) {
5295     Uxtab(al, rd, rn, operand);
5296   }
5297 
Uxtab16(Condition cond,Register rd,Register rn,const Operand & operand)5298   void Uxtab16(Condition cond,
5299                Register rd,
5300                Register rn,
5301                const Operand& operand) {
5302     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5303     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5304     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5305     VIXL_ASSERT(allow_macro_instructions_);
5306     VIXL_ASSERT(OutsideITBlock());
5307     MacroEmissionCheckScope guard(this);
5308     ITScope it_scope(this, &cond);
5309     uxtab16(cond, rd, rn, operand);
5310   }
Uxtab16(Register rd,Register rn,const Operand & operand)5311   void Uxtab16(Register rd, Register rn, const Operand& operand) {
5312     Uxtab16(al, rd, rn, operand);
5313   }
5314 
Uxtah(Condition cond,Register rd,Register rn,const Operand & operand)5315   void Uxtah(Condition cond, Register rd, Register rn, const Operand& operand) {
5316     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5317     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5318     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5319     VIXL_ASSERT(allow_macro_instructions_);
5320     VIXL_ASSERT(OutsideITBlock());
5321     MacroEmissionCheckScope guard(this);
5322     ITScope it_scope(this, &cond);
5323     uxtah(cond, rd, rn, operand);
5324   }
Uxtah(Register rd,Register rn,const Operand & operand)5325   void Uxtah(Register rd, Register rn, const Operand& operand) {
5326     Uxtah(al, rd, rn, operand);
5327   }
5328 
Uxtb(Condition cond,Register rd,const Operand & operand)5329   void Uxtb(Condition cond, Register rd, const Operand& operand) {
5330     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5331     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5332     VIXL_ASSERT(allow_macro_instructions_);
5333     VIXL_ASSERT(OutsideITBlock());
5334     MacroEmissionCheckScope guard(this);
5335     ITScope it_scope(this, &cond);
5336     uxtb(cond, rd, operand);
5337   }
Uxtb(Register rd,const Operand & operand)5338   void Uxtb(Register rd, const Operand& operand) { Uxtb(al, rd, operand); }
5339 
Uxtb16(Condition cond,Register rd,const Operand & operand)5340   void Uxtb16(Condition cond, Register rd, const Operand& operand) {
5341     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5342     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5343     VIXL_ASSERT(allow_macro_instructions_);
5344     VIXL_ASSERT(OutsideITBlock());
5345     MacroEmissionCheckScope guard(this);
5346     ITScope it_scope(this, &cond);
5347     uxtb16(cond, rd, operand);
5348   }
Uxtb16(Register rd,const Operand & operand)5349   void Uxtb16(Register rd, const Operand& operand) { Uxtb16(al, rd, operand); }
5350 
Uxth(Condition cond,Register rd,const Operand & operand)5351   void Uxth(Condition cond, Register rd, const Operand& operand) {
5352     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5353     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5354     VIXL_ASSERT(allow_macro_instructions_);
5355     VIXL_ASSERT(OutsideITBlock());
5356     MacroEmissionCheckScope guard(this);
5357     ITScope it_scope(this, &cond);
5358     uxth(cond, rd, operand);
5359   }
Uxth(Register rd,const Operand & operand)5360   void Uxth(Register rd, const Operand& operand) { Uxth(al, rd, operand); }
5361 
Vaba(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5362   void Vaba(
5363       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5364     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5365     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5366     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5367     VIXL_ASSERT(allow_macro_instructions_);
5368     VIXL_ASSERT(OutsideITBlock());
5369     MacroEmissionCheckScope guard(this);
5370     ITScope it_scope(this, &cond);
5371     vaba(cond, dt, rd, rn, rm);
5372   }
Vaba(DataType dt,DRegister rd,DRegister rn,DRegister rm)5373   void Vaba(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5374     Vaba(al, dt, rd, rn, rm);
5375   }
5376 
Vaba(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5377   void Vaba(
5378       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5379     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5380     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5381     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5382     VIXL_ASSERT(allow_macro_instructions_);
5383     VIXL_ASSERT(OutsideITBlock());
5384     MacroEmissionCheckScope guard(this);
5385     ITScope it_scope(this, &cond);
5386     vaba(cond, dt, rd, rn, rm);
5387   }
Vaba(DataType dt,QRegister rd,QRegister rn,QRegister rm)5388   void Vaba(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5389     Vaba(al, dt, rd, rn, rm);
5390   }
5391 
Vabal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5392   void Vabal(
5393       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5394     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5395     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5396     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5397     VIXL_ASSERT(allow_macro_instructions_);
5398     VIXL_ASSERT(OutsideITBlock());
5399     MacroEmissionCheckScope guard(this);
5400     ITScope it_scope(this, &cond);
5401     vabal(cond, dt, rd, rn, rm);
5402   }
Vabal(DataType dt,QRegister rd,DRegister rn,DRegister rm)5403   void Vabal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5404     Vabal(al, dt, rd, rn, rm);
5405   }
5406 
Vabd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5407   void Vabd(
5408       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5409     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5410     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5411     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5412     VIXL_ASSERT(allow_macro_instructions_);
5413     VIXL_ASSERT(OutsideITBlock());
5414     MacroEmissionCheckScope guard(this);
5415     ITScope it_scope(this, &cond);
5416     vabd(cond, dt, rd, rn, rm);
5417   }
Vabd(DataType dt,DRegister rd,DRegister rn,DRegister rm)5418   void Vabd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5419     Vabd(al, dt, rd, rn, rm);
5420   }
5421 
Vabd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5422   void Vabd(
5423       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5424     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5425     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5426     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5427     VIXL_ASSERT(allow_macro_instructions_);
5428     VIXL_ASSERT(OutsideITBlock());
5429     MacroEmissionCheckScope guard(this);
5430     ITScope it_scope(this, &cond);
5431     vabd(cond, dt, rd, rn, rm);
5432   }
Vabd(DataType dt,QRegister rd,QRegister rn,QRegister rm)5433   void Vabd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5434     Vabd(al, dt, rd, rn, rm);
5435   }
5436 
Vabdl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5437   void Vabdl(
5438       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5439     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5440     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5441     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5442     VIXL_ASSERT(allow_macro_instructions_);
5443     VIXL_ASSERT(OutsideITBlock());
5444     MacroEmissionCheckScope guard(this);
5445     ITScope it_scope(this, &cond);
5446     vabdl(cond, dt, rd, rn, rm);
5447   }
Vabdl(DataType dt,QRegister rd,DRegister rn,DRegister rm)5448   void Vabdl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5449     Vabdl(al, dt, rd, rn, rm);
5450   }
5451 
Vabs(Condition cond,DataType dt,DRegister rd,DRegister rm)5452   void Vabs(Condition cond, DataType dt, DRegister rd, DRegister rm) {
5453     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5454     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5455     VIXL_ASSERT(allow_macro_instructions_);
5456     VIXL_ASSERT(OutsideITBlock());
5457     MacroEmissionCheckScope guard(this);
5458     ITScope it_scope(this, &cond);
5459     vabs(cond, dt, rd, rm);
5460   }
Vabs(DataType dt,DRegister rd,DRegister rm)5461   void Vabs(DataType dt, DRegister rd, DRegister rm) { Vabs(al, dt, rd, rm); }
5462 
Vabs(Condition cond,DataType dt,QRegister rd,QRegister rm)5463   void Vabs(Condition cond, DataType dt, QRegister rd, QRegister rm) {
5464     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5465     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5466     VIXL_ASSERT(allow_macro_instructions_);
5467     VIXL_ASSERT(OutsideITBlock());
5468     MacroEmissionCheckScope guard(this);
5469     ITScope it_scope(this, &cond);
5470     vabs(cond, dt, rd, rm);
5471   }
Vabs(DataType dt,QRegister rd,QRegister rm)5472   void Vabs(DataType dt, QRegister rd, QRegister rm) { Vabs(al, dt, rd, rm); }
5473 
Vabs(Condition cond,DataType dt,SRegister rd,SRegister rm)5474   void Vabs(Condition cond, DataType dt, SRegister rd, SRegister rm) {
5475     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5476     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5477     VIXL_ASSERT(allow_macro_instructions_);
5478     VIXL_ASSERT(OutsideITBlock());
5479     MacroEmissionCheckScope guard(this);
5480     ITScope it_scope(this, &cond);
5481     vabs(cond, dt, rd, rm);
5482   }
Vabs(DataType dt,SRegister rd,SRegister rm)5483   void Vabs(DataType dt, SRegister rd, SRegister rm) { Vabs(al, dt, rd, rm); }
5484 
Vacge(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5485   void Vacge(
5486       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5487     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5488     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5489     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5490     VIXL_ASSERT(allow_macro_instructions_);
5491     VIXL_ASSERT(OutsideITBlock());
5492     MacroEmissionCheckScope guard(this);
5493     ITScope it_scope(this, &cond);
5494     vacge(cond, dt, rd, rn, rm);
5495   }
Vacge(DataType dt,DRegister rd,DRegister rn,DRegister rm)5496   void Vacge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5497     Vacge(al, dt, rd, rn, rm);
5498   }
5499 
Vacge(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5500   void Vacge(
5501       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5502     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5503     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5504     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5505     VIXL_ASSERT(allow_macro_instructions_);
5506     VIXL_ASSERT(OutsideITBlock());
5507     MacroEmissionCheckScope guard(this);
5508     ITScope it_scope(this, &cond);
5509     vacge(cond, dt, rd, rn, rm);
5510   }
Vacge(DataType dt,QRegister rd,QRegister rn,QRegister rm)5511   void Vacge(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5512     Vacge(al, dt, rd, rn, rm);
5513   }
5514 
Vacgt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5515   void Vacgt(
5516       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5517     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5518     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5519     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5520     VIXL_ASSERT(allow_macro_instructions_);
5521     VIXL_ASSERT(OutsideITBlock());
5522     MacroEmissionCheckScope guard(this);
5523     ITScope it_scope(this, &cond);
5524     vacgt(cond, dt, rd, rn, rm);
5525   }
Vacgt(DataType dt,DRegister rd,DRegister rn,DRegister rm)5526   void Vacgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5527     Vacgt(al, dt, rd, rn, rm);
5528   }
5529 
Vacgt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5530   void Vacgt(
5531       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5532     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5533     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5534     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5535     VIXL_ASSERT(allow_macro_instructions_);
5536     VIXL_ASSERT(OutsideITBlock());
5537     MacroEmissionCheckScope guard(this);
5538     ITScope it_scope(this, &cond);
5539     vacgt(cond, dt, rd, rn, rm);
5540   }
Vacgt(DataType dt,QRegister rd,QRegister rn,QRegister rm)5541   void Vacgt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5542     Vacgt(al, dt, rd, rn, rm);
5543   }
5544 
Vacle(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5545   void Vacle(
5546       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5547     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5548     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5549     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5550     VIXL_ASSERT(allow_macro_instructions_);
5551     VIXL_ASSERT(OutsideITBlock());
5552     MacroEmissionCheckScope guard(this);
5553     ITScope it_scope(this, &cond);
5554     vacle(cond, dt, rd, rn, rm);
5555   }
Vacle(DataType dt,DRegister rd,DRegister rn,DRegister rm)5556   void Vacle(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5557     Vacle(al, dt, rd, rn, rm);
5558   }
5559 
Vacle(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5560   void Vacle(
5561       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5562     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5563     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5564     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5565     VIXL_ASSERT(allow_macro_instructions_);
5566     VIXL_ASSERT(OutsideITBlock());
5567     MacroEmissionCheckScope guard(this);
5568     ITScope it_scope(this, &cond);
5569     vacle(cond, dt, rd, rn, rm);
5570   }
Vacle(DataType dt,QRegister rd,QRegister rn,QRegister rm)5571   void Vacle(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5572     Vacle(al, dt, rd, rn, rm);
5573   }
5574 
Vaclt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5575   void Vaclt(
5576       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5577     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5578     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5579     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5580     VIXL_ASSERT(allow_macro_instructions_);
5581     VIXL_ASSERT(OutsideITBlock());
5582     MacroEmissionCheckScope guard(this);
5583     ITScope it_scope(this, &cond);
5584     vaclt(cond, dt, rd, rn, rm);
5585   }
Vaclt(DataType dt,DRegister rd,DRegister rn,DRegister rm)5586   void Vaclt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5587     Vaclt(al, dt, rd, rn, rm);
5588   }
5589 
Vaclt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5590   void Vaclt(
5591       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5592     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5593     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5594     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5595     VIXL_ASSERT(allow_macro_instructions_);
5596     VIXL_ASSERT(OutsideITBlock());
5597     MacroEmissionCheckScope guard(this);
5598     ITScope it_scope(this, &cond);
5599     vaclt(cond, dt, rd, rn, rm);
5600   }
Vaclt(DataType dt,QRegister rd,QRegister rn,QRegister rm)5601   void Vaclt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5602     Vaclt(al, dt, rd, rn, rm);
5603   }
5604 
Vadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5605   void Vadd(
5606       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5607     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5608     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5609     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5610     VIXL_ASSERT(allow_macro_instructions_);
5611     VIXL_ASSERT(OutsideITBlock());
5612     MacroEmissionCheckScope guard(this);
5613     ITScope it_scope(this, &cond);
5614     vadd(cond, dt, rd, rn, rm);
5615   }
Vadd(DataType dt,DRegister rd,DRegister rn,DRegister rm)5616   void Vadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5617     Vadd(al, dt, rd, rn, rm);
5618   }
5619 
Vadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5620   void Vadd(
5621       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5622     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5623     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5624     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5625     VIXL_ASSERT(allow_macro_instructions_);
5626     VIXL_ASSERT(OutsideITBlock());
5627     MacroEmissionCheckScope guard(this);
5628     ITScope it_scope(this, &cond);
5629     vadd(cond, dt, rd, rn, rm);
5630   }
Vadd(DataType dt,QRegister rd,QRegister rn,QRegister rm)5631   void Vadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5632     Vadd(al, dt, rd, rn, rm);
5633   }
5634 
Vadd(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)5635   void Vadd(
5636       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5637     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5638     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5639     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5640     VIXL_ASSERT(allow_macro_instructions_);
5641     VIXL_ASSERT(OutsideITBlock());
5642     MacroEmissionCheckScope guard(this);
5643     ITScope it_scope(this, &cond);
5644     vadd(cond, dt, rd, rn, rm);
5645   }
Vadd(DataType dt,SRegister rd,SRegister rn,SRegister rm)5646   void Vadd(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5647     Vadd(al, dt, rd, rn, rm);
5648   }
5649 
Vaddhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)5650   void Vaddhn(
5651       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
5652     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5653     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5654     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5655     VIXL_ASSERT(allow_macro_instructions_);
5656     VIXL_ASSERT(OutsideITBlock());
5657     MacroEmissionCheckScope guard(this);
5658     ITScope it_scope(this, &cond);
5659     vaddhn(cond, dt, rd, rn, rm);
5660   }
Vaddhn(DataType dt,DRegister rd,QRegister rn,QRegister rm)5661   void Vaddhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
5662     Vaddhn(al, dt, rd, rn, rm);
5663   }
5664 
Vaddl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5665   void Vaddl(
5666       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5667     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5668     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5669     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5670     VIXL_ASSERT(allow_macro_instructions_);
5671     VIXL_ASSERT(OutsideITBlock());
5672     MacroEmissionCheckScope guard(this);
5673     ITScope it_scope(this, &cond);
5674     vaddl(cond, dt, rd, rn, rm);
5675   }
Vaddl(DataType dt,QRegister rd,DRegister rn,DRegister rm)5676   void Vaddl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5677     Vaddl(al, dt, rd, rn, rm);
5678   }
5679 
Vaddw(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegister rm)5680   void Vaddw(
5681       Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
5682     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5683     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5684     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5685     VIXL_ASSERT(allow_macro_instructions_);
5686     VIXL_ASSERT(OutsideITBlock());
5687     MacroEmissionCheckScope guard(this);
5688     ITScope it_scope(this, &cond);
5689     vaddw(cond, dt, rd, rn, rm);
5690   }
Vaddw(DataType dt,QRegister rd,QRegister rn,DRegister rm)5691   void Vaddw(DataType dt, QRegister rd, QRegister rn, DRegister rm) {
5692     Vaddw(al, dt, rd, rn, rm);
5693   }
5694 
Vand(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5695   void Vand(Condition cond,
5696             DataType dt,
5697             DRegister rd,
5698             DRegister rn,
5699             const DOperand& operand) {
5700     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5701     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5702     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5703     VIXL_ASSERT(allow_macro_instructions_);
5704     VIXL_ASSERT(OutsideITBlock());
5705     MacroEmissionCheckScope guard(this);
5706     ITScope it_scope(this, &cond);
5707     vand(cond, dt, rd, rn, operand);
5708   }
Vand(DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5709   void Vand(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
5710     Vand(al, dt, rd, rn, operand);
5711   }
5712 
Vand(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5713   void Vand(Condition cond,
5714             DataType dt,
5715             QRegister rd,
5716             QRegister rn,
5717             const QOperand& operand) {
5718     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5719     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5720     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5721     VIXL_ASSERT(allow_macro_instructions_);
5722     VIXL_ASSERT(OutsideITBlock());
5723     MacroEmissionCheckScope guard(this);
5724     ITScope it_scope(this, &cond);
5725     vand(cond, dt, rd, rn, operand);
5726   }
Vand(DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5727   void Vand(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
5728     Vand(al, dt, rd, rn, operand);
5729   }
5730 
Vbic(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5731   void Vbic(Condition cond,
5732             DataType dt,
5733             DRegister rd,
5734             DRegister rn,
5735             const DOperand& operand) {
5736     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5737     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5738     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5739     VIXL_ASSERT(allow_macro_instructions_);
5740     VIXL_ASSERT(OutsideITBlock());
5741     MacroEmissionCheckScope guard(this);
5742     ITScope it_scope(this, &cond);
5743     vbic(cond, dt, rd, rn, operand);
5744   }
Vbic(DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5745   void Vbic(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
5746     Vbic(al, dt, rd, rn, operand);
5747   }
5748 
Vbic(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5749   void Vbic(Condition cond,
5750             DataType dt,
5751             QRegister rd,
5752             QRegister rn,
5753             const QOperand& operand) {
5754     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5755     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5756     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5757     VIXL_ASSERT(allow_macro_instructions_);
5758     VIXL_ASSERT(OutsideITBlock());
5759     MacroEmissionCheckScope guard(this);
5760     ITScope it_scope(this, &cond);
5761     vbic(cond, dt, rd, rn, operand);
5762   }
Vbic(DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5763   void Vbic(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
5764     Vbic(al, dt, rd, rn, operand);
5765   }
5766 
Vbif(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5767   void Vbif(
5768       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5769     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5770     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5771     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5772     VIXL_ASSERT(allow_macro_instructions_);
5773     VIXL_ASSERT(OutsideITBlock());
5774     MacroEmissionCheckScope guard(this);
5775     ITScope it_scope(this, &cond);
5776     vbif(cond, dt, rd, rn, rm);
5777   }
Vbif(DataType dt,DRegister rd,DRegister rn,DRegister rm)5778   void Vbif(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5779     Vbif(al, dt, rd, rn, rm);
5780   }
Vbif(Condition cond,DRegister rd,DRegister rn,DRegister rm)5781   void Vbif(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
5782     Vbif(cond, kDataTypeValueNone, rd, rn, rm);
5783   }
Vbif(DRegister rd,DRegister rn,DRegister rm)5784   void Vbif(DRegister rd, DRegister rn, DRegister rm) {
5785     Vbif(al, kDataTypeValueNone, rd, rn, rm);
5786   }
5787 
Vbif(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5788   void Vbif(
5789       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5790     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5791     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5792     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5793     VIXL_ASSERT(allow_macro_instructions_);
5794     VIXL_ASSERT(OutsideITBlock());
5795     MacroEmissionCheckScope guard(this);
5796     ITScope it_scope(this, &cond);
5797     vbif(cond, dt, rd, rn, rm);
5798   }
Vbif(DataType dt,QRegister rd,QRegister rn,QRegister rm)5799   void Vbif(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5800     Vbif(al, dt, rd, rn, rm);
5801   }
Vbif(Condition cond,QRegister rd,QRegister rn,QRegister rm)5802   void Vbif(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
5803     Vbif(cond, kDataTypeValueNone, rd, rn, rm);
5804   }
Vbif(QRegister rd,QRegister rn,QRegister rm)5805   void Vbif(QRegister rd, QRegister rn, QRegister rm) {
5806     Vbif(al, kDataTypeValueNone, rd, rn, rm);
5807   }
5808 
Vbit(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5809   void Vbit(
5810       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5811     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5812     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5813     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5814     VIXL_ASSERT(allow_macro_instructions_);
5815     VIXL_ASSERT(OutsideITBlock());
5816     MacroEmissionCheckScope guard(this);
5817     ITScope it_scope(this, &cond);
5818     vbit(cond, dt, rd, rn, rm);
5819   }
Vbit(DataType dt,DRegister rd,DRegister rn,DRegister rm)5820   void Vbit(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5821     Vbit(al, dt, rd, rn, rm);
5822   }
Vbit(Condition cond,DRegister rd,DRegister rn,DRegister rm)5823   void Vbit(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
5824     Vbit(cond, kDataTypeValueNone, rd, rn, rm);
5825   }
Vbit(DRegister rd,DRegister rn,DRegister rm)5826   void Vbit(DRegister rd, DRegister rn, DRegister rm) {
5827     Vbit(al, kDataTypeValueNone, rd, rn, rm);
5828   }
5829 
Vbit(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5830   void Vbit(
5831       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5832     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5833     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5834     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5835     VIXL_ASSERT(allow_macro_instructions_);
5836     VIXL_ASSERT(OutsideITBlock());
5837     MacroEmissionCheckScope guard(this);
5838     ITScope it_scope(this, &cond);
5839     vbit(cond, dt, rd, rn, rm);
5840   }
Vbit(DataType dt,QRegister rd,QRegister rn,QRegister rm)5841   void Vbit(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5842     Vbit(al, dt, rd, rn, rm);
5843   }
Vbit(Condition cond,QRegister rd,QRegister rn,QRegister rm)5844   void Vbit(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
5845     Vbit(cond, kDataTypeValueNone, rd, rn, rm);
5846   }
Vbit(QRegister rd,QRegister rn,QRegister rm)5847   void Vbit(QRegister rd, QRegister rn, QRegister rm) {
5848     Vbit(al, kDataTypeValueNone, rd, rn, rm);
5849   }
5850 
Vbsl(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5851   void Vbsl(
5852       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5853     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5854     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5855     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5856     VIXL_ASSERT(allow_macro_instructions_);
5857     VIXL_ASSERT(OutsideITBlock());
5858     MacroEmissionCheckScope guard(this);
5859     ITScope it_scope(this, &cond);
5860     vbsl(cond, dt, rd, rn, rm);
5861   }
Vbsl(DataType dt,DRegister rd,DRegister rn,DRegister rm)5862   void Vbsl(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5863     Vbsl(al, dt, rd, rn, rm);
5864   }
Vbsl(Condition cond,DRegister rd,DRegister rn,DRegister rm)5865   void Vbsl(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
5866     Vbsl(cond, kDataTypeValueNone, rd, rn, rm);
5867   }
Vbsl(DRegister rd,DRegister rn,DRegister rm)5868   void Vbsl(DRegister rd, DRegister rn, DRegister rm) {
5869     Vbsl(al, kDataTypeValueNone, rd, rn, rm);
5870   }
5871 
Vbsl(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5872   void Vbsl(
5873       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5874     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5875     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5876     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5877     VIXL_ASSERT(allow_macro_instructions_);
5878     VIXL_ASSERT(OutsideITBlock());
5879     MacroEmissionCheckScope guard(this);
5880     ITScope it_scope(this, &cond);
5881     vbsl(cond, dt, rd, rn, rm);
5882   }
Vbsl(DataType dt,QRegister rd,QRegister rn,QRegister rm)5883   void Vbsl(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5884     Vbsl(al, dt, rd, rn, rm);
5885   }
Vbsl(Condition cond,QRegister rd,QRegister rn,QRegister rm)5886   void Vbsl(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
5887     Vbsl(cond, kDataTypeValueNone, rd, rn, rm);
5888   }
Vbsl(QRegister rd,QRegister rn,QRegister rm)5889   void Vbsl(QRegister rd, QRegister rn, QRegister rm) {
5890     Vbsl(al, kDataTypeValueNone, rd, rn, rm);
5891   }
5892 
Vceq(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5893   void Vceq(Condition cond,
5894             DataType dt,
5895             DRegister rd,
5896             DRegister rm,
5897             const DOperand& operand) {
5898     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5899     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5900     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5901     VIXL_ASSERT(allow_macro_instructions_);
5902     VIXL_ASSERT(OutsideITBlock());
5903     MacroEmissionCheckScope guard(this);
5904     ITScope it_scope(this, &cond);
5905     vceq(cond, dt, rd, rm, operand);
5906   }
Vceq(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5907   void Vceq(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
5908     Vceq(al, dt, rd, rm, operand);
5909   }
5910 
Vceq(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5911   void Vceq(Condition cond,
5912             DataType dt,
5913             QRegister rd,
5914             QRegister rm,
5915             const QOperand& operand) {
5916     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5917     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5918     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5919     VIXL_ASSERT(allow_macro_instructions_);
5920     VIXL_ASSERT(OutsideITBlock());
5921     MacroEmissionCheckScope guard(this);
5922     ITScope it_scope(this, &cond);
5923     vceq(cond, dt, rd, rm, operand);
5924   }
Vceq(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5925   void Vceq(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
5926     Vceq(al, dt, rd, rm, operand);
5927   }
5928 
Vceq(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5929   void Vceq(
5930       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5931     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5932     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5933     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5934     VIXL_ASSERT(allow_macro_instructions_);
5935     VIXL_ASSERT(OutsideITBlock());
5936     MacroEmissionCheckScope guard(this);
5937     ITScope it_scope(this, &cond);
5938     vceq(cond, dt, rd, rn, rm);
5939   }
Vceq(DataType dt,DRegister rd,DRegister rn,DRegister rm)5940   void Vceq(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5941     Vceq(al, dt, rd, rn, rm);
5942   }
5943 
Vceq(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5944   void Vceq(
5945       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5946     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5947     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5948     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5949     VIXL_ASSERT(allow_macro_instructions_);
5950     VIXL_ASSERT(OutsideITBlock());
5951     MacroEmissionCheckScope guard(this);
5952     ITScope it_scope(this, &cond);
5953     vceq(cond, dt, rd, rn, rm);
5954   }
Vceq(DataType dt,QRegister rd,QRegister rn,QRegister rm)5955   void Vceq(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5956     Vceq(al, dt, rd, rn, rm);
5957   }
5958 
Vcge(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5959   void Vcge(Condition cond,
5960             DataType dt,
5961             DRegister rd,
5962             DRegister rm,
5963             const DOperand& operand) {
5964     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5965     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5966     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5967     VIXL_ASSERT(allow_macro_instructions_);
5968     VIXL_ASSERT(OutsideITBlock());
5969     MacroEmissionCheckScope guard(this);
5970     ITScope it_scope(this, &cond);
5971     vcge(cond, dt, rd, rm, operand);
5972   }
Vcge(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5973   void Vcge(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
5974     Vcge(al, dt, rd, rm, operand);
5975   }
5976 
Vcge(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5977   void Vcge(Condition cond,
5978             DataType dt,
5979             QRegister rd,
5980             QRegister rm,
5981             const QOperand& operand) {
5982     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5983     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5984     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5985     VIXL_ASSERT(allow_macro_instructions_);
5986     VIXL_ASSERT(OutsideITBlock());
5987     MacroEmissionCheckScope guard(this);
5988     ITScope it_scope(this, &cond);
5989     vcge(cond, dt, rd, rm, operand);
5990   }
Vcge(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5991   void Vcge(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
5992     Vcge(al, dt, rd, rm, operand);
5993   }
5994 
Vcge(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5995   void Vcge(
5996       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5997     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5998     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5999     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6000     VIXL_ASSERT(allow_macro_instructions_);
6001     VIXL_ASSERT(OutsideITBlock());
6002     MacroEmissionCheckScope guard(this);
6003     ITScope it_scope(this, &cond);
6004     vcge(cond, dt, rd, rn, rm);
6005   }
Vcge(DataType dt,DRegister rd,DRegister rn,DRegister rm)6006   void Vcge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6007     Vcge(al, dt, rd, rn, rm);
6008   }
6009 
Vcge(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6010   void Vcge(
6011       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6012     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6013     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6014     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6015     VIXL_ASSERT(allow_macro_instructions_);
6016     VIXL_ASSERT(OutsideITBlock());
6017     MacroEmissionCheckScope guard(this);
6018     ITScope it_scope(this, &cond);
6019     vcge(cond, dt, rd, rn, rm);
6020   }
Vcge(DataType dt,QRegister rd,QRegister rn,QRegister rm)6021   void Vcge(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6022     Vcge(al, dt, rd, rn, rm);
6023   }
6024 
Vcgt(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6025   void Vcgt(Condition cond,
6026             DataType dt,
6027             DRegister rd,
6028             DRegister rm,
6029             const DOperand& operand) {
6030     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6031     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6032     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6033     VIXL_ASSERT(allow_macro_instructions_);
6034     VIXL_ASSERT(OutsideITBlock());
6035     MacroEmissionCheckScope guard(this);
6036     ITScope it_scope(this, &cond);
6037     vcgt(cond, dt, rd, rm, operand);
6038   }
Vcgt(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6039   void Vcgt(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
6040     Vcgt(al, dt, rd, rm, operand);
6041   }
6042 
Vcgt(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6043   void Vcgt(Condition cond,
6044             DataType dt,
6045             QRegister rd,
6046             QRegister rm,
6047             const QOperand& operand) {
6048     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6049     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6050     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6051     VIXL_ASSERT(allow_macro_instructions_);
6052     VIXL_ASSERT(OutsideITBlock());
6053     MacroEmissionCheckScope guard(this);
6054     ITScope it_scope(this, &cond);
6055     vcgt(cond, dt, rd, rm, operand);
6056   }
Vcgt(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6057   void Vcgt(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
6058     Vcgt(al, dt, rd, rm, operand);
6059   }
6060 
Vcgt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6061   void Vcgt(
6062       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6063     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6064     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6065     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6066     VIXL_ASSERT(allow_macro_instructions_);
6067     VIXL_ASSERT(OutsideITBlock());
6068     MacroEmissionCheckScope guard(this);
6069     ITScope it_scope(this, &cond);
6070     vcgt(cond, dt, rd, rn, rm);
6071   }
Vcgt(DataType dt,DRegister rd,DRegister rn,DRegister rm)6072   void Vcgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6073     Vcgt(al, dt, rd, rn, rm);
6074   }
6075 
Vcgt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6076   void Vcgt(
6077       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6078     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6079     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6080     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6081     VIXL_ASSERT(allow_macro_instructions_);
6082     VIXL_ASSERT(OutsideITBlock());
6083     MacroEmissionCheckScope guard(this);
6084     ITScope it_scope(this, &cond);
6085     vcgt(cond, dt, rd, rn, rm);
6086   }
Vcgt(DataType dt,QRegister rd,QRegister rn,QRegister rm)6087   void Vcgt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6088     Vcgt(al, dt, rd, rn, rm);
6089   }
6090 
Vcle(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6091   void Vcle(Condition cond,
6092             DataType dt,
6093             DRegister rd,
6094             DRegister rm,
6095             const DOperand& operand) {
6096     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6097     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6098     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6099     VIXL_ASSERT(allow_macro_instructions_);
6100     VIXL_ASSERT(OutsideITBlock());
6101     MacroEmissionCheckScope guard(this);
6102     ITScope it_scope(this, &cond);
6103     vcle(cond, dt, rd, rm, operand);
6104   }
Vcle(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6105   void Vcle(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
6106     Vcle(al, dt, rd, rm, operand);
6107   }
6108 
Vcle(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6109   void Vcle(Condition cond,
6110             DataType dt,
6111             QRegister rd,
6112             QRegister rm,
6113             const QOperand& operand) {
6114     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6115     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6116     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6117     VIXL_ASSERT(allow_macro_instructions_);
6118     VIXL_ASSERT(OutsideITBlock());
6119     MacroEmissionCheckScope guard(this);
6120     ITScope it_scope(this, &cond);
6121     vcle(cond, dt, rd, rm, operand);
6122   }
Vcle(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6123   void Vcle(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
6124     Vcle(al, dt, rd, rm, operand);
6125   }
6126 
Vcle(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6127   void Vcle(
6128       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6129     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6130     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6131     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6132     VIXL_ASSERT(allow_macro_instructions_);
6133     VIXL_ASSERT(OutsideITBlock());
6134     MacroEmissionCheckScope guard(this);
6135     ITScope it_scope(this, &cond);
6136     vcle(cond, dt, rd, rn, rm);
6137   }
Vcle(DataType dt,DRegister rd,DRegister rn,DRegister rm)6138   void Vcle(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6139     Vcle(al, dt, rd, rn, rm);
6140   }
6141 
Vcle(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6142   void Vcle(
6143       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6144     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6145     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6146     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6147     VIXL_ASSERT(allow_macro_instructions_);
6148     VIXL_ASSERT(OutsideITBlock());
6149     MacroEmissionCheckScope guard(this);
6150     ITScope it_scope(this, &cond);
6151     vcle(cond, dt, rd, rn, rm);
6152   }
Vcle(DataType dt,QRegister rd,QRegister rn,QRegister rm)6153   void Vcle(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6154     Vcle(al, dt, rd, rn, rm);
6155   }
6156 
Vcls(Condition cond,DataType dt,DRegister rd,DRegister rm)6157   void Vcls(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6158     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6159     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6160     VIXL_ASSERT(allow_macro_instructions_);
6161     VIXL_ASSERT(OutsideITBlock());
6162     MacroEmissionCheckScope guard(this);
6163     ITScope it_scope(this, &cond);
6164     vcls(cond, dt, rd, rm);
6165   }
Vcls(DataType dt,DRegister rd,DRegister rm)6166   void Vcls(DataType dt, DRegister rd, DRegister rm) { Vcls(al, dt, rd, rm); }
6167 
Vcls(Condition cond,DataType dt,QRegister rd,QRegister rm)6168   void Vcls(Condition cond, DataType dt, QRegister rd, QRegister rm) {
6169     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6170     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6171     VIXL_ASSERT(allow_macro_instructions_);
6172     VIXL_ASSERT(OutsideITBlock());
6173     MacroEmissionCheckScope guard(this);
6174     ITScope it_scope(this, &cond);
6175     vcls(cond, dt, rd, rm);
6176   }
Vcls(DataType dt,QRegister rd,QRegister rm)6177   void Vcls(DataType dt, QRegister rd, QRegister rm) { Vcls(al, dt, rd, rm); }
6178 
Vclt(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6179   void Vclt(Condition cond,
6180             DataType dt,
6181             DRegister rd,
6182             DRegister rm,
6183             const DOperand& operand) {
6184     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6185     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6186     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6187     VIXL_ASSERT(allow_macro_instructions_);
6188     VIXL_ASSERT(OutsideITBlock());
6189     MacroEmissionCheckScope guard(this);
6190     ITScope it_scope(this, &cond);
6191     vclt(cond, dt, rd, rm, operand);
6192   }
Vclt(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6193   void Vclt(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
6194     Vclt(al, dt, rd, rm, operand);
6195   }
6196 
Vclt(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6197   void Vclt(Condition cond,
6198             DataType dt,
6199             QRegister rd,
6200             QRegister rm,
6201             const QOperand& operand) {
6202     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6203     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6204     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6205     VIXL_ASSERT(allow_macro_instructions_);
6206     VIXL_ASSERT(OutsideITBlock());
6207     MacroEmissionCheckScope guard(this);
6208     ITScope it_scope(this, &cond);
6209     vclt(cond, dt, rd, rm, operand);
6210   }
Vclt(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6211   void Vclt(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
6212     Vclt(al, dt, rd, rm, operand);
6213   }
6214 
Vclt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6215   void Vclt(
6216       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6217     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6218     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6219     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6220     VIXL_ASSERT(allow_macro_instructions_);
6221     VIXL_ASSERT(OutsideITBlock());
6222     MacroEmissionCheckScope guard(this);
6223     ITScope it_scope(this, &cond);
6224     vclt(cond, dt, rd, rn, rm);
6225   }
Vclt(DataType dt,DRegister rd,DRegister rn,DRegister rm)6226   void Vclt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6227     Vclt(al, dt, rd, rn, rm);
6228   }
6229 
Vclt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6230   void Vclt(
6231       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6232     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6233     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6234     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6235     VIXL_ASSERT(allow_macro_instructions_);
6236     VIXL_ASSERT(OutsideITBlock());
6237     MacroEmissionCheckScope guard(this);
6238     ITScope it_scope(this, &cond);
6239     vclt(cond, dt, rd, rn, rm);
6240   }
Vclt(DataType dt,QRegister rd,QRegister rn,QRegister rm)6241   void Vclt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6242     Vclt(al, dt, rd, rn, rm);
6243   }
6244 
Vclz(Condition cond,DataType dt,DRegister rd,DRegister rm)6245   void Vclz(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6246     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6247     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6248     VIXL_ASSERT(allow_macro_instructions_);
6249     VIXL_ASSERT(OutsideITBlock());
6250     MacroEmissionCheckScope guard(this);
6251     ITScope it_scope(this, &cond);
6252     vclz(cond, dt, rd, rm);
6253   }
Vclz(DataType dt,DRegister rd,DRegister rm)6254   void Vclz(DataType dt, DRegister rd, DRegister rm) { Vclz(al, dt, rd, rm); }
6255 
Vclz(Condition cond,DataType dt,QRegister rd,QRegister rm)6256   void Vclz(Condition cond, DataType dt, QRegister rd, QRegister rm) {
6257     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6258     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6259     VIXL_ASSERT(allow_macro_instructions_);
6260     VIXL_ASSERT(OutsideITBlock());
6261     MacroEmissionCheckScope guard(this);
6262     ITScope it_scope(this, &cond);
6263     vclz(cond, dt, rd, rm);
6264   }
Vclz(DataType dt,QRegister rd,QRegister rm)6265   void Vclz(DataType dt, QRegister rd, QRegister rm) { Vclz(al, dt, rd, rm); }
6266 
Vcmp(Condition cond,DataType dt,SRegister rd,SRegister rm)6267   void Vcmp(Condition cond, DataType dt, SRegister rd, SRegister rm) {
6268     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6269     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6270     VIXL_ASSERT(allow_macro_instructions_);
6271     VIXL_ASSERT(OutsideITBlock());
6272     MacroEmissionCheckScope guard(this);
6273     ITScope it_scope(this, &cond);
6274     vcmp(cond, dt, rd, rm);
6275   }
Vcmp(DataType dt,SRegister rd,SRegister rm)6276   void Vcmp(DataType dt, SRegister rd, SRegister rm) { Vcmp(al, dt, rd, rm); }
6277 
Vcmp(Condition cond,DataType dt,DRegister rd,DRegister rm)6278   void Vcmp(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6279     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6280     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6281     VIXL_ASSERT(allow_macro_instructions_);
6282     VIXL_ASSERT(OutsideITBlock());
6283     MacroEmissionCheckScope guard(this);
6284     ITScope it_scope(this, &cond);
6285     vcmp(cond, dt, rd, rm);
6286   }
Vcmp(DataType dt,DRegister rd,DRegister rm)6287   void Vcmp(DataType dt, DRegister rd, DRegister rm) { Vcmp(al, dt, rd, rm); }
6288 
Vcmp(Condition cond,DataType dt,SRegister rd,double imm)6289   void Vcmp(Condition cond, DataType dt, SRegister rd, double imm) {
6290     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6291     VIXL_ASSERT(allow_macro_instructions_);
6292     VIXL_ASSERT(OutsideITBlock());
6293     MacroEmissionCheckScope guard(this);
6294     ITScope it_scope(this, &cond);
6295     vcmp(cond, dt, rd, imm);
6296   }
Vcmp(DataType dt,SRegister rd,double imm)6297   void Vcmp(DataType dt, SRegister rd, double imm) { Vcmp(al, dt, rd, imm); }
6298 
Vcmp(Condition cond,DataType dt,DRegister rd,double imm)6299   void Vcmp(Condition cond, DataType dt, DRegister rd, double imm) {
6300     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6301     VIXL_ASSERT(allow_macro_instructions_);
6302     VIXL_ASSERT(OutsideITBlock());
6303     MacroEmissionCheckScope guard(this);
6304     ITScope it_scope(this, &cond);
6305     vcmp(cond, dt, rd, imm);
6306   }
Vcmp(DataType dt,DRegister rd,double imm)6307   void Vcmp(DataType dt, DRegister rd, double imm) { Vcmp(al, dt, rd, imm); }
6308 
Vcmpe(Condition cond,DataType dt,SRegister rd,SRegister rm)6309   void Vcmpe(Condition cond, DataType dt, SRegister rd, SRegister rm) {
6310     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6311     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6312     VIXL_ASSERT(allow_macro_instructions_);
6313     VIXL_ASSERT(OutsideITBlock());
6314     MacroEmissionCheckScope guard(this);
6315     ITScope it_scope(this, &cond);
6316     vcmpe(cond, dt, rd, rm);
6317   }
Vcmpe(DataType dt,SRegister rd,SRegister rm)6318   void Vcmpe(DataType dt, SRegister rd, SRegister rm) { Vcmpe(al, dt, rd, rm); }
6319 
Vcmpe(Condition cond,DataType dt,DRegister rd,DRegister rm)6320   void Vcmpe(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6321     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6322     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6323     VIXL_ASSERT(allow_macro_instructions_);
6324     VIXL_ASSERT(OutsideITBlock());
6325     MacroEmissionCheckScope guard(this);
6326     ITScope it_scope(this, &cond);
6327     vcmpe(cond, dt, rd, rm);
6328   }
Vcmpe(DataType dt,DRegister rd,DRegister rm)6329   void Vcmpe(DataType dt, DRegister rd, DRegister rm) { Vcmpe(al, dt, rd, rm); }
6330 
Vcmpe(Condition cond,DataType dt,SRegister rd,double imm)6331   void Vcmpe(Condition cond, DataType dt, SRegister rd, double imm) {
6332     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6333     VIXL_ASSERT(allow_macro_instructions_);
6334     VIXL_ASSERT(OutsideITBlock());
6335     MacroEmissionCheckScope guard(this);
6336     ITScope it_scope(this, &cond);
6337     vcmpe(cond, dt, rd, imm);
6338   }
Vcmpe(DataType dt,SRegister rd,double imm)6339   void Vcmpe(DataType dt, SRegister rd, double imm) { Vcmpe(al, dt, rd, imm); }
6340 
Vcmpe(Condition cond,DataType dt,DRegister rd,double imm)6341   void Vcmpe(Condition cond, DataType dt, DRegister rd, double imm) {
6342     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6343     VIXL_ASSERT(allow_macro_instructions_);
6344     VIXL_ASSERT(OutsideITBlock());
6345     MacroEmissionCheckScope guard(this);
6346     ITScope it_scope(this, &cond);
6347     vcmpe(cond, dt, rd, imm);
6348   }
Vcmpe(DataType dt,DRegister rd,double imm)6349   void Vcmpe(DataType dt, DRegister rd, double imm) { Vcmpe(al, dt, rd, imm); }
6350 
Vcnt(Condition cond,DataType dt,DRegister rd,DRegister rm)6351   void Vcnt(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6352     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6353     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6354     VIXL_ASSERT(allow_macro_instructions_);
6355     VIXL_ASSERT(OutsideITBlock());
6356     MacroEmissionCheckScope guard(this);
6357     ITScope it_scope(this, &cond);
6358     vcnt(cond, dt, rd, rm);
6359   }
Vcnt(DataType dt,DRegister rd,DRegister rm)6360   void Vcnt(DataType dt, DRegister rd, DRegister rm) { Vcnt(al, dt, rd, rm); }
6361 
Vcnt(Condition cond,DataType dt,QRegister rd,QRegister rm)6362   void Vcnt(Condition cond, DataType dt, QRegister rd, QRegister rm) {
6363     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6364     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6365     VIXL_ASSERT(allow_macro_instructions_);
6366     VIXL_ASSERT(OutsideITBlock());
6367     MacroEmissionCheckScope guard(this);
6368     ITScope it_scope(this, &cond);
6369     vcnt(cond, dt, rd, rm);
6370   }
Vcnt(DataType dt,QRegister rd,QRegister rm)6371   void Vcnt(DataType dt, QRegister rd, QRegister rm) { Vcnt(al, dt, rd, rm); }
6372 
Vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,SRegister rm)6373   void Vcvt(
6374       Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6375     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6376     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6377     VIXL_ASSERT(allow_macro_instructions_);
6378     VIXL_ASSERT(OutsideITBlock());
6379     MacroEmissionCheckScope guard(this);
6380     ITScope it_scope(this, &cond);
6381     vcvt(cond, dt1, dt2, rd, rm);
6382   }
Vcvt(DataType dt1,DataType dt2,DRegister rd,SRegister rm)6383   void Vcvt(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6384     Vcvt(al, dt1, dt2, rd, rm);
6385   }
6386 
Vcvt(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)6387   void Vcvt(
6388       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6389     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6390     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6391     VIXL_ASSERT(allow_macro_instructions_);
6392     VIXL_ASSERT(OutsideITBlock());
6393     MacroEmissionCheckScope guard(this);
6394     ITScope it_scope(this, &cond);
6395     vcvt(cond, dt1, dt2, rd, rm);
6396   }
Vcvt(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6397   void Vcvt(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6398     Vcvt(al, dt1, dt2, rd, rm);
6399   }
6400 
Vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm,int32_t fbits)6401   void Vcvt(Condition cond,
6402             DataType dt1,
6403             DataType dt2,
6404             DRegister rd,
6405             DRegister rm,
6406             int32_t fbits) {
6407     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6408     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6409     VIXL_ASSERT(allow_macro_instructions_);
6410     VIXL_ASSERT(OutsideITBlock());
6411     MacroEmissionCheckScope guard(this);
6412     ITScope it_scope(this, &cond);
6413     vcvt(cond, dt1, dt2, rd, rm, fbits);
6414   }
Vcvt(DataType dt1,DataType dt2,DRegister rd,DRegister rm,int32_t fbits)6415   void Vcvt(
6416       DataType dt1, DataType dt2, DRegister rd, DRegister rm, int32_t fbits) {
6417     Vcvt(al, dt1, dt2, rd, rm, fbits);
6418   }
6419 
Vcvt(Condition cond,DataType dt1,DataType dt2,QRegister rd,QRegister rm,int32_t fbits)6420   void Vcvt(Condition cond,
6421             DataType dt1,
6422             DataType dt2,
6423             QRegister rd,
6424             QRegister rm,
6425             int32_t fbits) {
6426     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6427     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6428     VIXL_ASSERT(allow_macro_instructions_);
6429     VIXL_ASSERT(OutsideITBlock());
6430     MacroEmissionCheckScope guard(this);
6431     ITScope it_scope(this, &cond);
6432     vcvt(cond, dt1, dt2, rd, rm, fbits);
6433   }
Vcvt(DataType dt1,DataType dt2,QRegister rd,QRegister rm,int32_t fbits)6434   void Vcvt(
6435       DataType dt1, DataType dt2, QRegister rd, QRegister rm, int32_t fbits) {
6436     Vcvt(al, dt1, dt2, rd, rm, fbits);
6437   }
6438 
Vcvt(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm,int32_t fbits)6439   void Vcvt(Condition cond,
6440             DataType dt1,
6441             DataType dt2,
6442             SRegister rd,
6443             SRegister rm,
6444             int32_t fbits) {
6445     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6446     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6447     VIXL_ASSERT(allow_macro_instructions_);
6448     VIXL_ASSERT(OutsideITBlock());
6449     MacroEmissionCheckScope guard(this);
6450     ITScope it_scope(this, &cond);
6451     vcvt(cond, dt1, dt2, rd, rm, fbits);
6452   }
Vcvt(DataType dt1,DataType dt2,SRegister rd,SRegister rm,int32_t fbits)6453   void Vcvt(
6454       DataType dt1, DataType dt2, SRegister rd, SRegister rm, int32_t fbits) {
6455     Vcvt(al, dt1, dt2, rd, rm, fbits);
6456   }
6457 
Vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)6458   void Vcvt(
6459       Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6460     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6461     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6462     VIXL_ASSERT(allow_macro_instructions_);
6463     VIXL_ASSERT(OutsideITBlock());
6464     MacroEmissionCheckScope guard(this);
6465     ITScope it_scope(this, &cond);
6466     vcvt(cond, dt1, dt2, rd, rm);
6467   }
Vcvt(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6468   void Vcvt(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6469     Vcvt(al, dt1, dt2, rd, rm);
6470   }
6471 
Vcvt(Condition cond,DataType dt1,DataType dt2,QRegister rd,QRegister rm)6472   void Vcvt(
6473       Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6474     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6475     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6476     VIXL_ASSERT(allow_macro_instructions_);
6477     VIXL_ASSERT(OutsideITBlock());
6478     MacroEmissionCheckScope guard(this);
6479     ITScope it_scope(this, &cond);
6480     vcvt(cond, dt1, dt2, rd, rm);
6481   }
Vcvt(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6482   void Vcvt(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6483     Vcvt(al, dt1, dt2, rd, rm);
6484   }
6485 
Vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,QRegister rm)6486   void Vcvt(
6487       Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
6488     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6489     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6490     VIXL_ASSERT(allow_macro_instructions_);
6491     VIXL_ASSERT(OutsideITBlock());
6492     MacroEmissionCheckScope guard(this);
6493     ITScope it_scope(this, &cond);
6494     vcvt(cond, dt1, dt2, rd, rm);
6495   }
Vcvt(DataType dt1,DataType dt2,DRegister rd,QRegister rm)6496   void Vcvt(DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
6497     Vcvt(al, dt1, dt2, rd, rm);
6498   }
6499 
Vcvt(Condition cond,DataType dt1,DataType dt2,QRegister rd,DRegister rm)6500   void Vcvt(
6501       Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
6502     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6503     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6504     VIXL_ASSERT(allow_macro_instructions_);
6505     VIXL_ASSERT(OutsideITBlock());
6506     MacroEmissionCheckScope guard(this);
6507     ITScope it_scope(this, &cond);
6508     vcvt(cond, dt1, dt2, rd, rm);
6509   }
Vcvt(DataType dt1,DataType dt2,QRegister rd,DRegister rm)6510   void Vcvt(DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
6511     Vcvt(al, dt1, dt2, rd, rm);
6512   }
6513 
Vcvt(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6514   void Vcvt(
6515       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6516     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6517     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6518     VIXL_ASSERT(allow_macro_instructions_);
6519     VIXL_ASSERT(OutsideITBlock());
6520     MacroEmissionCheckScope guard(this);
6521     ITScope it_scope(this, &cond);
6522     vcvt(cond, dt1, dt2, rd, rm);
6523   }
Vcvt(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6524   void Vcvt(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6525     Vcvt(al, dt1, dt2, rd, rm);
6526   }
6527 
Vcvta(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6528   void Vcvta(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6529     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6530     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6531     VIXL_ASSERT(allow_macro_instructions_);
6532     VIXL_ASSERT(OutsideITBlock());
6533     MacroEmissionCheckScope guard(this);
6534     vcvta(dt1, dt2, rd, rm);
6535   }
6536 
Vcvta(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6537   void Vcvta(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6538     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6539     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6540     VIXL_ASSERT(allow_macro_instructions_);
6541     VIXL_ASSERT(OutsideITBlock());
6542     MacroEmissionCheckScope guard(this);
6543     vcvta(dt1, dt2, rd, rm);
6544   }
6545 
Vcvta(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6546   void Vcvta(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6547     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6548     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6549     VIXL_ASSERT(allow_macro_instructions_);
6550     VIXL_ASSERT(OutsideITBlock());
6551     MacroEmissionCheckScope guard(this);
6552     vcvta(dt1, dt2, rd, rm);
6553   }
6554 
Vcvta(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6555   void Vcvta(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6556     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6557     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6558     VIXL_ASSERT(allow_macro_instructions_);
6559     VIXL_ASSERT(OutsideITBlock());
6560     MacroEmissionCheckScope guard(this);
6561     vcvta(dt1, dt2, rd, rm);
6562   }
6563 
Vcvtb(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6564   void Vcvtb(
6565       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6566     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6567     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6568     VIXL_ASSERT(allow_macro_instructions_);
6569     VIXL_ASSERT(OutsideITBlock());
6570     MacroEmissionCheckScope guard(this);
6571     ITScope it_scope(this, &cond);
6572     vcvtb(cond, dt1, dt2, rd, rm);
6573   }
Vcvtb(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6574   void Vcvtb(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6575     Vcvtb(al, dt1, dt2, rd, rm);
6576   }
6577 
Vcvtb(Condition cond,DataType dt1,DataType dt2,DRegister rd,SRegister rm)6578   void Vcvtb(
6579       Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6580     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6581     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6582     VIXL_ASSERT(allow_macro_instructions_);
6583     VIXL_ASSERT(OutsideITBlock());
6584     MacroEmissionCheckScope guard(this);
6585     ITScope it_scope(this, &cond);
6586     vcvtb(cond, dt1, dt2, rd, rm);
6587   }
Vcvtb(DataType dt1,DataType dt2,DRegister rd,SRegister rm)6588   void Vcvtb(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6589     Vcvtb(al, dt1, dt2, rd, rm);
6590   }
6591 
Vcvtb(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)6592   void Vcvtb(
6593       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6594     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6595     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6596     VIXL_ASSERT(allow_macro_instructions_);
6597     VIXL_ASSERT(OutsideITBlock());
6598     MacroEmissionCheckScope guard(this);
6599     ITScope it_scope(this, &cond);
6600     vcvtb(cond, dt1, dt2, rd, rm);
6601   }
Vcvtb(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6602   void Vcvtb(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6603     Vcvtb(al, dt1, dt2, rd, rm);
6604   }
6605 
Vcvtm(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6606   void Vcvtm(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6607     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6608     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6609     VIXL_ASSERT(allow_macro_instructions_);
6610     VIXL_ASSERT(OutsideITBlock());
6611     MacroEmissionCheckScope guard(this);
6612     vcvtm(dt1, dt2, rd, rm);
6613   }
6614 
Vcvtm(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6615   void Vcvtm(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6616     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6617     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6618     VIXL_ASSERT(allow_macro_instructions_);
6619     VIXL_ASSERT(OutsideITBlock());
6620     MacroEmissionCheckScope guard(this);
6621     vcvtm(dt1, dt2, rd, rm);
6622   }
6623 
Vcvtm(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6624   void Vcvtm(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6625     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6626     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6627     VIXL_ASSERT(allow_macro_instructions_);
6628     VIXL_ASSERT(OutsideITBlock());
6629     MacroEmissionCheckScope guard(this);
6630     vcvtm(dt1, dt2, rd, rm);
6631   }
6632 
Vcvtm(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6633   void Vcvtm(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6634     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6635     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6636     VIXL_ASSERT(allow_macro_instructions_);
6637     VIXL_ASSERT(OutsideITBlock());
6638     MacroEmissionCheckScope guard(this);
6639     vcvtm(dt1, dt2, rd, rm);
6640   }
6641 
Vcvtn(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6642   void Vcvtn(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6643     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6644     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6645     VIXL_ASSERT(allow_macro_instructions_);
6646     VIXL_ASSERT(OutsideITBlock());
6647     MacroEmissionCheckScope guard(this);
6648     vcvtn(dt1, dt2, rd, rm);
6649   }
6650 
Vcvtn(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6651   void Vcvtn(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6652     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6653     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6654     VIXL_ASSERT(allow_macro_instructions_);
6655     VIXL_ASSERT(OutsideITBlock());
6656     MacroEmissionCheckScope guard(this);
6657     vcvtn(dt1, dt2, rd, rm);
6658   }
6659 
Vcvtn(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6660   void Vcvtn(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6661     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6662     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6663     VIXL_ASSERT(allow_macro_instructions_);
6664     VIXL_ASSERT(OutsideITBlock());
6665     MacroEmissionCheckScope guard(this);
6666     vcvtn(dt1, dt2, rd, rm);
6667   }
6668 
Vcvtn(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6669   void Vcvtn(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6670     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6671     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6672     VIXL_ASSERT(allow_macro_instructions_);
6673     VIXL_ASSERT(OutsideITBlock());
6674     MacroEmissionCheckScope guard(this);
6675     vcvtn(dt1, dt2, rd, rm);
6676   }
6677 
Vcvtp(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6678   void Vcvtp(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6679     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6680     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6681     VIXL_ASSERT(allow_macro_instructions_);
6682     VIXL_ASSERT(OutsideITBlock());
6683     MacroEmissionCheckScope guard(this);
6684     vcvtp(dt1, dt2, rd, rm);
6685   }
6686 
Vcvtp(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6687   void Vcvtp(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6688     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6689     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6690     VIXL_ASSERT(allow_macro_instructions_);
6691     VIXL_ASSERT(OutsideITBlock());
6692     MacroEmissionCheckScope guard(this);
6693     vcvtp(dt1, dt2, rd, rm);
6694   }
6695 
Vcvtp(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6696   void Vcvtp(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6697     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6698     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6699     VIXL_ASSERT(allow_macro_instructions_);
6700     VIXL_ASSERT(OutsideITBlock());
6701     MacroEmissionCheckScope guard(this);
6702     vcvtp(dt1, dt2, rd, rm);
6703   }
6704 
Vcvtp(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6705   void Vcvtp(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6706     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6707     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6708     VIXL_ASSERT(allow_macro_instructions_);
6709     VIXL_ASSERT(OutsideITBlock());
6710     MacroEmissionCheckScope guard(this);
6711     vcvtp(dt1, dt2, rd, rm);
6712   }
6713 
Vcvtr(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6714   void Vcvtr(
6715       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6716     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6717     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6718     VIXL_ASSERT(allow_macro_instructions_);
6719     VIXL_ASSERT(OutsideITBlock());
6720     MacroEmissionCheckScope guard(this);
6721     ITScope it_scope(this, &cond);
6722     vcvtr(cond, dt1, dt2, rd, rm);
6723   }
Vcvtr(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6724   void Vcvtr(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6725     Vcvtr(al, dt1, dt2, rd, rm);
6726   }
6727 
Vcvtr(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)6728   void Vcvtr(
6729       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6730     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6731     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6732     VIXL_ASSERT(allow_macro_instructions_);
6733     VIXL_ASSERT(OutsideITBlock());
6734     MacroEmissionCheckScope guard(this);
6735     ITScope it_scope(this, &cond);
6736     vcvtr(cond, dt1, dt2, rd, rm);
6737   }
Vcvtr(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6738   void Vcvtr(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6739     Vcvtr(al, dt1, dt2, rd, rm);
6740   }
6741 
Vcvtt(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6742   void Vcvtt(
6743       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6744     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6745     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6746     VIXL_ASSERT(allow_macro_instructions_);
6747     VIXL_ASSERT(OutsideITBlock());
6748     MacroEmissionCheckScope guard(this);
6749     ITScope it_scope(this, &cond);
6750     vcvtt(cond, dt1, dt2, rd, rm);
6751   }
Vcvtt(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6752   void Vcvtt(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6753     Vcvtt(al, dt1, dt2, rd, rm);
6754   }
6755 
Vcvtt(Condition cond,DataType dt1,DataType dt2,DRegister rd,SRegister rm)6756   void Vcvtt(
6757       Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6758     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6759     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6760     VIXL_ASSERT(allow_macro_instructions_);
6761     VIXL_ASSERT(OutsideITBlock());
6762     MacroEmissionCheckScope guard(this);
6763     ITScope it_scope(this, &cond);
6764     vcvtt(cond, dt1, dt2, rd, rm);
6765   }
Vcvtt(DataType dt1,DataType dt2,DRegister rd,SRegister rm)6766   void Vcvtt(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6767     Vcvtt(al, dt1, dt2, rd, rm);
6768   }
6769 
Vcvtt(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)6770   void Vcvtt(
6771       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6772     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6773     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6774     VIXL_ASSERT(allow_macro_instructions_);
6775     VIXL_ASSERT(OutsideITBlock());
6776     MacroEmissionCheckScope guard(this);
6777     ITScope it_scope(this, &cond);
6778     vcvtt(cond, dt1, dt2, rd, rm);
6779   }
Vcvtt(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6780   void Vcvtt(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6781     Vcvtt(al, dt1, dt2, rd, rm);
6782   }
6783 
Vdiv(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6784   void Vdiv(
6785       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6786     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6787     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6788     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6789     VIXL_ASSERT(allow_macro_instructions_);
6790     VIXL_ASSERT(OutsideITBlock());
6791     MacroEmissionCheckScope guard(this);
6792     ITScope it_scope(this, &cond);
6793     vdiv(cond, dt, rd, rn, rm);
6794   }
Vdiv(DataType dt,SRegister rd,SRegister rn,SRegister rm)6795   void Vdiv(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6796     Vdiv(al, dt, rd, rn, rm);
6797   }
6798 
Vdiv(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6799   void Vdiv(
6800       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6801     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6802     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6803     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6804     VIXL_ASSERT(allow_macro_instructions_);
6805     VIXL_ASSERT(OutsideITBlock());
6806     MacroEmissionCheckScope guard(this);
6807     ITScope it_scope(this, &cond);
6808     vdiv(cond, dt, rd, rn, rm);
6809   }
Vdiv(DataType dt,DRegister rd,DRegister rn,DRegister rm)6810   void Vdiv(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6811     Vdiv(al, dt, rd, rn, rm);
6812   }
6813 
Vdup(Condition cond,DataType dt,QRegister rd,Register rt)6814   void Vdup(Condition cond, DataType dt, QRegister rd, Register rt) {
6815     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6816     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
6817     VIXL_ASSERT(allow_macro_instructions_);
6818     VIXL_ASSERT(OutsideITBlock());
6819     MacroEmissionCheckScope guard(this);
6820     ITScope it_scope(this, &cond);
6821     vdup(cond, dt, rd, rt);
6822   }
Vdup(DataType dt,QRegister rd,Register rt)6823   void Vdup(DataType dt, QRegister rd, Register rt) { Vdup(al, dt, rd, rt); }
6824 
Vdup(Condition cond,DataType dt,DRegister rd,Register rt)6825   void Vdup(Condition cond, DataType dt, DRegister rd, Register rt) {
6826     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6827     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
6828     VIXL_ASSERT(allow_macro_instructions_);
6829     VIXL_ASSERT(OutsideITBlock());
6830     MacroEmissionCheckScope guard(this);
6831     ITScope it_scope(this, &cond);
6832     vdup(cond, dt, rd, rt);
6833   }
Vdup(DataType dt,DRegister rd,Register rt)6834   void Vdup(DataType dt, DRegister rd, Register rt) { Vdup(al, dt, rd, rt); }
6835 
Vdup(Condition cond,DataType dt,DRegister rd,DRegisterLane rm)6836   void Vdup(Condition cond, DataType dt, DRegister rd, DRegisterLane rm) {
6837     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6838     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6839     VIXL_ASSERT(allow_macro_instructions_);
6840     VIXL_ASSERT(OutsideITBlock());
6841     MacroEmissionCheckScope guard(this);
6842     ITScope it_scope(this, &cond);
6843     vdup(cond, dt, rd, rm);
6844   }
Vdup(DataType dt,DRegister rd,DRegisterLane rm)6845   void Vdup(DataType dt, DRegister rd, DRegisterLane rm) {
6846     Vdup(al, dt, rd, rm);
6847   }
6848 
Vdup(Condition cond,DataType dt,QRegister rd,DRegisterLane rm)6849   void Vdup(Condition cond, DataType dt, QRegister rd, DRegisterLane rm) {
6850     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6851     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6852     VIXL_ASSERT(allow_macro_instructions_);
6853     VIXL_ASSERT(OutsideITBlock());
6854     MacroEmissionCheckScope guard(this);
6855     ITScope it_scope(this, &cond);
6856     vdup(cond, dt, rd, rm);
6857   }
Vdup(DataType dt,QRegister rd,DRegisterLane rm)6858   void Vdup(DataType dt, QRegister rd, DRegisterLane rm) {
6859     Vdup(al, dt, rd, rm);
6860   }
6861 
Veor(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6862   void Veor(
6863       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6864     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6865     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6866     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6867     VIXL_ASSERT(allow_macro_instructions_);
6868     VIXL_ASSERT(OutsideITBlock());
6869     MacroEmissionCheckScope guard(this);
6870     ITScope it_scope(this, &cond);
6871     veor(cond, dt, rd, rn, rm);
6872   }
Veor(DataType dt,DRegister rd,DRegister rn,DRegister rm)6873   void Veor(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6874     Veor(al, dt, rd, rn, rm);
6875   }
Veor(Condition cond,DRegister rd,DRegister rn,DRegister rm)6876   void Veor(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
6877     Veor(cond, kDataTypeValueNone, rd, rn, rm);
6878   }
Veor(DRegister rd,DRegister rn,DRegister rm)6879   void Veor(DRegister rd, DRegister rn, DRegister rm) {
6880     Veor(al, kDataTypeValueNone, rd, rn, rm);
6881   }
6882 
Veor(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6883   void Veor(
6884       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6885     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6886     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6887     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6888     VIXL_ASSERT(allow_macro_instructions_);
6889     VIXL_ASSERT(OutsideITBlock());
6890     MacroEmissionCheckScope guard(this);
6891     ITScope it_scope(this, &cond);
6892     veor(cond, dt, rd, rn, rm);
6893   }
Veor(DataType dt,QRegister rd,QRegister rn,QRegister rm)6894   void Veor(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6895     Veor(al, dt, rd, rn, rm);
6896   }
Veor(Condition cond,QRegister rd,QRegister rn,QRegister rm)6897   void Veor(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
6898     Veor(cond, kDataTypeValueNone, rd, rn, rm);
6899   }
Veor(QRegister rd,QRegister rn,QRegister rm)6900   void Veor(QRegister rd, QRegister rn, QRegister rm) {
6901     Veor(al, kDataTypeValueNone, rd, rn, rm);
6902   }
6903 
Vext(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm,const DOperand & operand)6904   void Vext(Condition cond,
6905             DataType dt,
6906             DRegister rd,
6907             DRegister rn,
6908             DRegister rm,
6909             const DOperand& operand) {
6910     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6911     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6912     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6913     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6914     VIXL_ASSERT(allow_macro_instructions_);
6915     VIXL_ASSERT(OutsideITBlock());
6916     MacroEmissionCheckScope guard(this);
6917     ITScope it_scope(this, &cond);
6918     vext(cond, dt, rd, rn, rm, operand);
6919   }
Vext(DataType dt,DRegister rd,DRegister rn,DRegister rm,const DOperand & operand)6920   void Vext(DataType dt,
6921             DRegister rd,
6922             DRegister rn,
6923             DRegister rm,
6924             const DOperand& operand) {
6925     Vext(al, dt, rd, rn, rm, operand);
6926   }
6927 
Vext(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm,const QOperand & operand)6928   void Vext(Condition cond,
6929             DataType dt,
6930             QRegister rd,
6931             QRegister rn,
6932             QRegister rm,
6933             const QOperand& operand) {
6934     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6935     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6936     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6937     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6938     VIXL_ASSERT(allow_macro_instructions_);
6939     VIXL_ASSERT(OutsideITBlock());
6940     MacroEmissionCheckScope guard(this);
6941     ITScope it_scope(this, &cond);
6942     vext(cond, dt, rd, rn, rm, operand);
6943   }
Vext(DataType dt,QRegister rd,QRegister rn,QRegister rm,const QOperand & operand)6944   void Vext(DataType dt,
6945             QRegister rd,
6946             QRegister rn,
6947             QRegister rm,
6948             const QOperand& operand) {
6949     Vext(al, dt, rd, rn, rm, operand);
6950   }
6951 
Vfma(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6952   void Vfma(
6953       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6954     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6955     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6956     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6957     VIXL_ASSERT(allow_macro_instructions_);
6958     VIXL_ASSERT(OutsideITBlock());
6959     MacroEmissionCheckScope guard(this);
6960     ITScope it_scope(this, &cond);
6961     vfma(cond, dt, rd, rn, rm);
6962   }
Vfma(DataType dt,DRegister rd,DRegister rn,DRegister rm)6963   void Vfma(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6964     Vfma(al, dt, rd, rn, rm);
6965   }
6966 
Vfma(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6967   void Vfma(
6968       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6969     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6970     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6971     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6972     VIXL_ASSERT(allow_macro_instructions_);
6973     VIXL_ASSERT(OutsideITBlock());
6974     MacroEmissionCheckScope guard(this);
6975     ITScope it_scope(this, &cond);
6976     vfma(cond, dt, rd, rn, rm);
6977   }
Vfma(DataType dt,QRegister rd,QRegister rn,QRegister rm)6978   void Vfma(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6979     Vfma(al, dt, rd, rn, rm);
6980   }
6981 
Vfma(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6982   void Vfma(
6983       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6984     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6985     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6986     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6987     VIXL_ASSERT(allow_macro_instructions_);
6988     VIXL_ASSERT(OutsideITBlock());
6989     MacroEmissionCheckScope guard(this);
6990     ITScope it_scope(this, &cond);
6991     vfma(cond, dt, rd, rn, rm);
6992   }
Vfma(DataType dt,SRegister rd,SRegister rn,SRegister rm)6993   void Vfma(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6994     Vfma(al, dt, rd, rn, rm);
6995   }
6996 
Vfms(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6997   void Vfms(
6998       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6999     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7000     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7001     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7002     VIXL_ASSERT(allow_macro_instructions_);
7003     VIXL_ASSERT(OutsideITBlock());
7004     MacroEmissionCheckScope guard(this);
7005     ITScope it_scope(this, &cond);
7006     vfms(cond, dt, rd, rn, rm);
7007   }
Vfms(DataType dt,DRegister rd,DRegister rn,DRegister rm)7008   void Vfms(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7009     Vfms(al, dt, rd, rn, rm);
7010   }
7011 
Vfms(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7012   void Vfms(
7013       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7014     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7015     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7016     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7017     VIXL_ASSERT(allow_macro_instructions_);
7018     VIXL_ASSERT(OutsideITBlock());
7019     MacroEmissionCheckScope guard(this);
7020     ITScope it_scope(this, &cond);
7021     vfms(cond, dt, rd, rn, rm);
7022   }
Vfms(DataType dt,QRegister rd,QRegister rn,QRegister rm)7023   void Vfms(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7024     Vfms(al, dt, rd, rn, rm);
7025   }
7026 
Vfms(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)7027   void Vfms(
7028       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7029     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7030     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7031     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7032     VIXL_ASSERT(allow_macro_instructions_);
7033     VIXL_ASSERT(OutsideITBlock());
7034     MacroEmissionCheckScope guard(this);
7035     ITScope it_scope(this, &cond);
7036     vfms(cond, dt, rd, rn, rm);
7037   }
Vfms(DataType dt,SRegister rd,SRegister rn,SRegister rm)7038   void Vfms(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7039     Vfms(al, dt, rd, rn, rm);
7040   }
7041 
Vfnma(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)7042   void Vfnma(
7043       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7044     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7045     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7046     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7047     VIXL_ASSERT(allow_macro_instructions_);
7048     VIXL_ASSERT(OutsideITBlock());
7049     MacroEmissionCheckScope guard(this);
7050     ITScope it_scope(this, &cond);
7051     vfnma(cond, dt, rd, rn, rm);
7052   }
Vfnma(DataType dt,SRegister rd,SRegister rn,SRegister rm)7053   void Vfnma(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7054     Vfnma(al, dt, rd, rn, rm);
7055   }
7056 
Vfnma(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7057   void Vfnma(
7058       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7059     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7060     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7061     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7062     VIXL_ASSERT(allow_macro_instructions_);
7063     VIXL_ASSERT(OutsideITBlock());
7064     MacroEmissionCheckScope guard(this);
7065     ITScope it_scope(this, &cond);
7066     vfnma(cond, dt, rd, rn, rm);
7067   }
Vfnma(DataType dt,DRegister rd,DRegister rn,DRegister rm)7068   void Vfnma(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7069     Vfnma(al, dt, rd, rn, rm);
7070   }
7071 
Vfnms(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)7072   void Vfnms(
7073       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7074     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7075     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7076     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7077     VIXL_ASSERT(allow_macro_instructions_);
7078     VIXL_ASSERT(OutsideITBlock());
7079     MacroEmissionCheckScope guard(this);
7080     ITScope it_scope(this, &cond);
7081     vfnms(cond, dt, rd, rn, rm);
7082   }
Vfnms(DataType dt,SRegister rd,SRegister rn,SRegister rm)7083   void Vfnms(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7084     Vfnms(al, dt, rd, rn, rm);
7085   }
7086 
Vfnms(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7087   void Vfnms(
7088       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7089     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7090     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7091     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7092     VIXL_ASSERT(allow_macro_instructions_);
7093     VIXL_ASSERT(OutsideITBlock());
7094     MacroEmissionCheckScope guard(this);
7095     ITScope it_scope(this, &cond);
7096     vfnms(cond, dt, rd, rn, rm);
7097   }
Vfnms(DataType dt,DRegister rd,DRegister rn,DRegister rm)7098   void Vfnms(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7099     Vfnms(al, dt, rd, rn, rm);
7100   }
7101 
Vhadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7102   void Vhadd(
7103       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7104     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7105     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7106     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7107     VIXL_ASSERT(allow_macro_instructions_);
7108     VIXL_ASSERT(OutsideITBlock());
7109     MacroEmissionCheckScope guard(this);
7110     ITScope it_scope(this, &cond);
7111     vhadd(cond, dt, rd, rn, rm);
7112   }
Vhadd(DataType dt,DRegister rd,DRegister rn,DRegister rm)7113   void Vhadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7114     Vhadd(al, dt, rd, rn, rm);
7115   }
7116 
Vhadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7117   void Vhadd(
7118       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7119     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7120     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7121     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7122     VIXL_ASSERT(allow_macro_instructions_);
7123     VIXL_ASSERT(OutsideITBlock());
7124     MacroEmissionCheckScope guard(this);
7125     ITScope it_scope(this, &cond);
7126     vhadd(cond, dt, rd, rn, rm);
7127   }
Vhadd(DataType dt,QRegister rd,QRegister rn,QRegister rm)7128   void Vhadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7129     Vhadd(al, dt, rd, rn, rm);
7130   }
7131 
Vhsub(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7132   void Vhsub(
7133       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7134     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7135     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7136     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7137     VIXL_ASSERT(allow_macro_instructions_);
7138     VIXL_ASSERT(OutsideITBlock());
7139     MacroEmissionCheckScope guard(this);
7140     ITScope it_scope(this, &cond);
7141     vhsub(cond, dt, rd, rn, rm);
7142   }
Vhsub(DataType dt,DRegister rd,DRegister rn,DRegister rm)7143   void Vhsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7144     Vhsub(al, dt, rd, rn, rm);
7145   }
7146 
Vhsub(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7147   void Vhsub(
7148       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7149     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7150     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7151     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7152     VIXL_ASSERT(allow_macro_instructions_);
7153     VIXL_ASSERT(OutsideITBlock());
7154     MacroEmissionCheckScope guard(this);
7155     ITScope it_scope(this, &cond);
7156     vhsub(cond, dt, rd, rn, rm);
7157   }
Vhsub(DataType dt,QRegister rd,QRegister rn,QRegister rm)7158   void Vhsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7159     Vhsub(al, dt, rd, rn, rm);
7160   }
7161 
Vld1(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7162   void Vld1(Condition cond,
7163             DataType dt,
7164             const NeonRegisterList& nreglist,
7165             const AlignedMemOperand& operand) {
7166     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7167     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7168     VIXL_ASSERT(allow_macro_instructions_);
7169     VIXL_ASSERT(OutsideITBlock());
7170     MacroEmissionCheckScope guard(this);
7171     ITScope it_scope(this, &cond);
7172     vld1(cond, dt, nreglist, operand);
7173   }
Vld1(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7174   void Vld1(DataType dt,
7175             const NeonRegisterList& nreglist,
7176             const AlignedMemOperand& operand) {
7177     Vld1(al, dt, nreglist, operand);
7178   }
7179 
Vld2(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7180   void Vld2(Condition cond,
7181             DataType dt,
7182             const NeonRegisterList& nreglist,
7183             const AlignedMemOperand& operand) {
7184     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7185     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7186     VIXL_ASSERT(allow_macro_instructions_);
7187     VIXL_ASSERT(OutsideITBlock());
7188     MacroEmissionCheckScope guard(this);
7189     ITScope it_scope(this, &cond);
7190     vld2(cond, dt, nreglist, operand);
7191   }
Vld2(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7192   void Vld2(DataType dt,
7193             const NeonRegisterList& nreglist,
7194             const AlignedMemOperand& operand) {
7195     Vld2(al, dt, nreglist, operand);
7196   }
7197 
Vld3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7198   void Vld3(Condition cond,
7199             DataType dt,
7200             const NeonRegisterList& nreglist,
7201             const AlignedMemOperand& operand) {
7202     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7203     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7204     VIXL_ASSERT(allow_macro_instructions_);
7205     VIXL_ASSERT(OutsideITBlock());
7206     MacroEmissionCheckScope guard(this);
7207     ITScope it_scope(this, &cond);
7208     vld3(cond, dt, nreglist, operand);
7209   }
Vld3(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7210   void Vld3(DataType dt,
7211             const NeonRegisterList& nreglist,
7212             const AlignedMemOperand& operand) {
7213     Vld3(al, dt, nreglist, operand);
7214   }
7215 
Vld3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)7216   void Vld3(Condition cond,
7217             DataType dt,
7218             const NeonRegisterList& nreglist,
7219             const MemOperand& operand) {
7220     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7221     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7222     VIXL_ASSERT(allow_macro_instructions_);
7223     VIXL_ASSERT(OutsideITBlock());
7224     MacroEmissionCheckScope guard(this);
7225     ITScope it_scope(this, &cond);
7226     vld3(cond, dt, nreglist, operand);
7227   }
Vld3(DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)7228   void Vld3(DataType dt,
7229             const NeonRegisterList& nreglist,
7230             const MemOperand& operand) {
7231     Vld3(al, dt, nreglist, operand);
7232   }
7233 
Vld4(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7234   void Vld4(Condition cond,
7235             DataType dt,
7236             const NeonRegisterList& nreglist,
7237             const AlignedMemOperand& operand) {
7238     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7239     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7240     VIXL_ASSERT(allow_macro_instructions_);
7241     VIXL_ASSERT(OutsideITBlock());
7242     MacroEmissionCheckScope guard(this);
7243     ITScope it_scope(this, &cond);
7244     vld4(cond, dt, nreglist, operand);
7245   }
Vld4(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7246   void Vld4(DataType dt,
7247             const NeonRegisterList& nreglist,
7248             const AlignedMemOperand& operand) {
7249     Vld4(al, dt, nreglist, operand);
7250   }
7251 
Vldm(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7252   void Vldm(Condition cond,
7253             DataType dt,
7254             Register rn,
7255             WriteBack write_back,
7256             DRegisterList dreglist) {
7257     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7258     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
7259     VIXL_ASSERT(allow_macro_instructions_);
7260     VIXL_ASSERT(OutsideITBlock());
7261     MacroEmissionCheckScope guard(this);
7262     ITScope it_scope(this, &cond);
7263     vldm(cond, dt, rn, write_back, dreglist);
7264   }
Vldm(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7265   void Vldm(DataType dt,
7266             Register rn,
7267             WriteBack write_back,
7268             DRegisterList dreglist) {
7269     Vldm(al, dt, rn, write_back, dreglist);
7270   }
Vldm(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)7271   void Vldm(Condition cond,
7272             Register rn,
7273             WriteBack write_back,
7274             DRegisterList dreglist) {
7275     Vldm(cond, kDataTypeValueNone, rn, write_back, dreglist);
7276   }
Vldm(Register rn,WriteBack write_back,DRegisterList dreglist)7277   void Vldm(Register rn, WriteBack write_back, DRegisterList dreglist) {
7278     Vldm(al, kDataTypeValueNone, rn, write_back, dreglist);
7279   }
7280 
Vldm(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7281   void Vldm(Condition cond,
7282             DataType dt,
7283             Register rn,
7284             WriteBack write_back,
7285             SRegisterList sreglist) {
7286     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7287     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
7288     VIXL_ASSERT(allow_macro_instructions_);
7289     VIXL_ASSERT(OutsideITBlock());
7290     MacroEmissionCheckScope guard(this);
7291     ITScope it_scope(this, &cond);
7292     vldm(cond, dt, rn, write_back, sreglist);
7293   }
Vldm(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7294   void Vldm(DataType dt,
7295             Register rn,
7296             WriteBack write_back,
7297             SRegisterList sreglist) {
7298     Vldm(al, dt, rn, write_back, sreglist);
7299   }
Vldm(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)7300   void Vldm(Condition cond,
7301             Register rn,
7302             WriteBack write_back,
7303             SRegisterList sreglist) {
7304     Vldm(cond, kDataTypeValueNone, rn, write_back, sreglist);
7305   }
Vldm(Register rn,WriteBack write_back,SRegisterList sreglist)7306   void Vldm(Register rn, WriteBack write_back, SRegisterList sreglist) {
7307     Vldm(al, kDataTypeValueNone, rn, write_back, sreglist);
7308   }
7309 
Vldmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7310   void Vldmdb(Condition cond,
7311               DataType dt,
7312               Register rn,
7313               WriteBack write_back,
7314               DRegisterList dreglist) {
7315     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7316     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
7317     VIXL_ASSERT(allow_macro_instructions_);
7318     VIXL_ASSERT(OutsideITBlock());
7319     MacroEmissionCheckScope guard(this);
7320     ITScope it_scope(this, &cond);
7321     vldmdb(cond, dt, rn, write_back, dreglist);
7322   }
Vldmdb(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7323   void Vldmdb(DataType dt,
7324               Register rn,
7325               WriteBack write_back,
7326               DRegisterList dreglist) {
7327     Vldmdb(al, dt, rn, write_back, dreglist);
7328   }
Vldmdb(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)7329   void Vldmdb(Condition cond,
7330               Register rn,
7331               WriteBack write_back,
7332               DRegisterList dreglist) {
7333     Vldmdb(cond, kDataTypeValueNone, rn, write_back, dreglist);
7334   }
Vldmdb(Register rn,WriteBack write_back,DRegisterList dreglist)7335   void Vldmdb(Register rn, WriteBack write_back, DRegisterList dreglist) {
7336     Vldmdb(al, kDataTypeValueNone, rn, write_back, dreglist);
7337   }
7338 
Vldmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7339   void Vldmdb(Condition cond,
7340               DataType dt,
7341               Register rn,
7342               WriteBack write_back,
7343               SRegisterList sreglist) {
7344     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7345     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
7346     VIXL_ASSERT(allow_macro_instructions_);
7347     VIXL_ASSERT(OutsideITBlock());
7348     MacroEmissionCheckScope guard(this);
7349     ITScope it_scope(this, &cond);
7350     vldmdb(cond, dt, rn, write_back, sreglist);
7351   }
Vldmdb(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7352   void Vldmdb(DataType dt,
7353               Register rn,
7354               WriteBack write_back,
7355               SRegisterList sreglist) {
7356     Vldmdb(al, dt, rn, write_back, sreglist);
7357   }
Vldmdb(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)7358   void Vldmdb(Condition cond,
7359               Register rn,
7360               WriteBack write_back,
7361               SRegisterList sreglist) {
7362     Vldmdb(cond, kDataTypeValueNone, rn, write_back, sreglist);
7363   }
Vldmdb(Register rn,WriteBack write_back,SRegisterList sreglist)7364   void Vldmdb(Register rn, WriteBack write_back, SRegisterList sreglist) {
7365     Vldmdb(al, kDataTypeValueNone, rn, write_back, sreglist);
7366   }
7367 
Vldmia(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7368   void Vldmia(Condition cond,
7369               DataType dt,
7370               Register rn,
7371               WriteBack write_back,
7372               DRegisterList dreglist) {
7373     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7374     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
7375     VIXL_ASSERT(allow_macro_instructions_);
7376     VIXL_ASSERT(OutsideITBlock());
7377     MacroEmissionCheckScope guard(this);
7378     ITScope it_scope(this, &cond);
7379     vldmia(cond, dt, rn, write_back, dreglist);
7380   }
Vldmia(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7381   void Vldmia(DataType dt,
7382               Register rn,
7383               WriteBack write_back,
7384               DRegisterList dreglist) {
7385     Vldmia(al, dt, rn, write_back, dreglist);
7386   }
Vldmia(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)7387   void Vldmia(Condition cond,
7388               Register rn,
7389               WriteBack write_back,
7390               DRegisterList dreglist) {
7391     Vldmia(cond, kDataTypeValueNone, rn, write_back, dreglist);
7392   }
Vldmia(Register rn,WriteBack write_back,DRegisterList dreglist)7393   void Vldmia(Register rn, WriteBack write_back, DRegisterList dreglist) {
7394     Vldmia(al, kDataTypeValueNone, rn, write_back, dreglist);
7395   }
7396 
Vldmia(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7397   void Vldmia(Condition cond,
7398               DataType dt,
7399               Register rn,
7400               WriteBack write_back,
7401               SRegisterList sreglist) {
7402     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7403     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
7404     VIXL_ASSERT(allow_macro_instructions_);
7405     VIXL_ASSERT(OutsideITBlock());
7406     MacroEmissionCheckScope guard(this);
7407     ITScope it_scope(this, &cond);
7408     vldmia(cond, dt, rn, write_back, sreglist);
7409   }
Vldmia(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7410   void Vldmia(DataType dt,
7411               Register rn,
7412               WriteBack write_back,
7413               SRegisterList sreglist) {
7414     Vldmia(al, dt, rn, write_back, sreglist);
7415   }
Vldmia(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)7416   void Vldmia(Condition cond,
7417               Register rn,
7418               WriteBack write_back,
7419               SRegisterList sreglist) {
7420     Vldmia(cond, kDataTypeValueNone, rn, write_back, sreglist);
7421   }
Vldmia(Register rn,WriteBack write_back,SRegisterList sreglist)7422   void Vldmia(Register rn, WriteBack write_back, SRegisterList sreglist) {
7423     Vldmia(al, kDataTypeValueNone, rn, write_back, sreglist);
7424   }
7425 
7426 
Vldr(Condition cond,DataType dt,DRegister rd,const MemOperand & operand)7427   void Vldr(Condition cond,
7428             DataType dt,
7429             DRegister rd,
7430             const MemOperand& operand) {
7431     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7432     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7433     VIXL_ASSERT(allow_macro_instructions_);
7434     VIXL_ASSERT(OutsideITBlock());
7435     MacroEmissionCheckScope guard(this);
7436     ITScope it_scope(this, &cond);
7437     vldr(cond, dt, rd, operand);
7438   }
Vldr(DataType dt,DRegister rd,const MemOperand & operand)7439   void Vldr(DataType dt, DRegister rd, const MemOperand& operand) {
7440     Vldr(al, dt, rd, operand);
7441   }
Vldr(Condition cond,DRegister rd,const MemOperand & operand)7442   void Vldr(Condition cond, DRegister rd, const MemOperand& operand) {
7443     Vldr(cond, Untyped64, rd, operand);
7444   }
Vldr(DRegister rd,const MemOperand & operand)7445   void Vldr(DRegister rd, const MemOperand& operand) {
7446     Vldr(al, Untyped64, rd, operand);
7447   }
7448 
7449 
Vldr(Condition cond,DataType dt,SRegister rd,const MemOperand & operand)7450   void Vldr(Condition cond,
7451             DataType dt,
7452             SRegister rd,
7453             const MemOperand& operand) {
7454     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7455     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7456     VIXL_ASSERT(allow_macro_instructions_);
7457     VIXL_ASSERT(OutsideITBlock());
7458     MacroEmissionCheckScope guard(this);
7459     ITScope it_scope(this, &cond);
7460     vldr(cond, dt, rd, operand);
7461   }
Vldr(DataType dt,SRegister rd,const MemOperand & operand)7462   void Vldr(DataType dt, SRegister rd, const MemOperand& operand) {
7463     Vldr(al, dt, rd, operand);
7464   }
Vldr(Condition cond,SRegister rd,const MemOperand & operand)7465   void Vldr(Condition cond, SRegister rd, const MemOperand& operand) {
7466     Vldr(cond, Untyped32, rd, operand);
7467   }
Vldr(SRegister rd,const MemOperand & operand)7468   void Vldr(SRegister rd, const MemOperand& operand) {
7469     Vldr(al, Untyped32, rd, operand);
7470   }
7471 
Vmax(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7472   void Vmax(
7473       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7474     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7475     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7476     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7477     VIXL_ASSERT(allow_macro_instructions_);
7478     VIXL_ASSERT(OutsideITBlock());
7479     MacroEmissionCheckScope guard(this);
7480     ITScope it_scope(this, &cond);
7481     vmax(cond, dt, rd, rn, rm);
7482   }
Vmax(DataType dt,DRegister rd,DRegister rn,DRegister rm)7483   void Vmax(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7484     Vmax(al, dt, rd, rn, rm);
7485   }
7486 
Vmax(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7487   void Vmax(
7488       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7489     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7490     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7491     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7492     VIXL_ASSERT(allow_macro_instructions_);
7493     VIXL_ASSERT(OutsideITBlock());
7494     MacroEmissionCheckScope guard(this);
7495     ITScope it_scope(this, &cond);
7496     vmax(cond, dt, rd, rn, rm);
7497   }
Vmax(DataType dt,QRegister rd,QRegister rn,QRegister rm)7498   void Vmax(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7499     Vmax(al, dt, rd, rn, rm);
7500   }
7501 
Vmaxnm(DataType dt,DRegister rd,DRegister rn,DRegister rm)7502   void Vmaxnm(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7503     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7504     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7505     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7506     VIXL_ASSERT(allow_macro_instructions_);
7507     VIXL_ASSERT(OutsideITBlock());
7508     MacroEmissionCheckScope guard(this);
7509     vmaxnm(dt, rd, rn, rm);
7510   }
7511 
Vmaxnm(DataType dt,QRegister rd,QRegister rn,QRegister rm)7512   void Vmaxnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7513     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7514     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7515     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7516     VIXL_ASSERT(allow_macro_instructions_);
7517     VIXL_ASSERT(OutsideITBlock());
7518     MacroEmissionCheckScope guard(this);
7519     vmaxnm(dt, rd, rn, rm);
7520   }
7521 
Vmaxnm(DataType dt,SRegister rd,SRegister rn,SRegister rm)7522   void Vmaxnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7523     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7524     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7525     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7526     VIXL_ASSERT(allow_macro_instructions_);
7527     VIXL_ASSERT(OutsideITBlock());
7528     MacroEmissionCheckScope guard(this);
7529     vmaxnm(dt, rd, rn, rm);
7530   }
7531 
Vmin(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7532   void Vmin(
7533       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7534     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7535     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7536     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7537     VIXL_ASSERT(allow_macro_instructions_);
7538     VIXL_ASSERT(OutsideITBlock());
7539     MacroEmissionCheckScope guard(this);
7540     ITScope it_scope(this, &cond);
7541     vmin(cond, dt, rd, rn, rm);
7542   }
Vmin(DataType dt,DRegister rd,DRegister rn,DRegister rm)7543   void Vmin(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7544     Vmin(al, dt, rd, rn, rm);
7545   }
7546 
Vmin(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7547   void Vmin(
7548       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7549     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7550     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7551     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7552     VIXL_ASSERT(allow_macro_instructions_);
7553     VIXL_ASSERT(OutsideITBlock());
7554     MacroEmissionCheckScope guard(this);
7555     ITScope it_scope(this, &cond);
7556     vmin(cond, dt, rd, rn, rm);
7557   }
Vmin(DataType dt,QRegister rd,QRegister rn,QRegister rm)7558   void Vmin(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7559     Vmin(al, dt, rd, rn, rm);
7560   }
7561 
Vminnm(DataType dt,DRegister rd,DRegister rn,DRegister rm)7562   void Vminnm(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7563     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7564     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7565     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7566     VIXL_ASSERT(allow_macro_instructions_);
7567     VIXL_ASSERT(OutsideITBlock());
7568     MacroEmissionCheckScope guard(this);
7569     vminnm(dt, rd, rn, rm);
7570   }
7571 
Vminnm(DataType dt,QRegister rd,QRegister rn,QRegister rm)7572   void Vminnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7573     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7574     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7575     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7576     VIXL_ASSERT(allow_macro_instructions_);
7577     VIXL_ASSERT(OutsideITBlock());
7578     MacroEmissionCheckScope guard(this);
7579     vminnm(dt, rd, rn, rm);
7580   }
7581 
Vminnm(DataType dt,SRegister rd,SRegister rn,SRegister rm)7582   void Vminnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7583     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7584     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7585     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7586     VIXL_ASSERT(allow_macro_instructions_);
7587     VIXL_ASSERT(OutsideITBlock());
7588     MacroEmissionCheckScope guard(this);
7589     vminnm(dt, rd, rn, rm);
7590   }
7591 
Vmla(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)7592   void Vmla(Condition cond,
7593             DataType dt,
7594             DRegister rd,
7595             DRegister rn,
7596             DRegisterLane rm) {
7597     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7598     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7599     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7600     VIXL_ASSERT(allow_macro_instructions_);
7601     VIXL_ASSERT(OutsideITBlock());
7602     MacroEmissionCheckScope guard(this);
7603     ITScope it_scope(this, &cond);
7604     vmla(cond, dt, rd, rn, rm);
7605   }
Vmla(DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)7606   void Vmla(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
7607     Vmla(al, dt, rd, rn, rm);
7608   }
7609 
Vmla(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)7610   void Vmla(Condition cond,
7611             DataType dt,
7612             QRegister rd,
7613             QRegister rn,
7614             DRegisterLane rm) {
7615     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7616     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7617     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7618     VIXL_ASSERT(allow_macro_instructions_);
7619     VIXL_ASSERT(OutsideITBlock());
7620     MacroEmissionCheckScope guard(this);
7621     ITScope it_scope(this, &cond);
7622     vmla(cond, dt, rd, rn, rm);
7623   }
Vmla(DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)7624   void Vmla(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
7625     Vmla(al, dt, rd, rn, rm);
7626   }
7627 
Vmla(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7628   void Vmla(
7629       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7630     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7631     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7632     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7633     VIXL_ASSERT(allow_macro_instructions_);
7634     VIXL_ASSERT(OutsideITBlock());
7635     MacroEmissionCheckScope guard(this);
7636     ITScope it_scope(this, &cond);
7637     vmla(cond, dt, rd, rn, rm);
7638   }
Vmla(DataType dt,DRegister rd,DRegister rn,DRegister rm)7639   void Vmla(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7640     Vmla(al, dt, rd, rn, rm);
7641   }
7642 
Vmla(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7643   void Vmla(
7644       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7645     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7646     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7647     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7648     VIXL_ASSERT(allow_macro_instructions_);
7649     VIXL_ASSERT(OutsideITBlock());
7650     MacroEmissionCheckScope guard(this);
7651     ITScope it_scope(this, &cond);
7652     vmla(cond, dt, rd, rn, rm);
7653   }
Vmla(DataType dt,QRegister rd,QRegister rn,QRegister rm)7654   void Vmla(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7655     Vmla(al, dt, rd, rn, rm);
7656   }
7657 
Vmla(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)7658   void Vmla(
7659       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7660     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7661     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7662     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7663     VIXL_ASSERT(allow_macro_instructions_);
7664     VIXL_ASSERT(OutsideITBlock());
7665     MacroEmissionCheckScope guard(this);
7666     ITScope it_scope(this, &cond);
7667     vmla(cond, dt, rd, rn, rm);
7668   }
Vmla(DataType dt,SRegister rd,SRegister rn,SRegister rm)7669   void Vmla(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7670     Vmla(al, dt, rd, rn, rm);
7671   }
7672 
Vmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)7673   void Vmlal(Condition cond,
7674              DataType dt,
7675              QRegister rd,
7676              DRegister rn,
7677              DRegisterLane rm) {
7678     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7679     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7680     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7681     VIXL_ASSERT(allow_macro_instructions_);
7682     VIXL_ASSERT(OutsideITBlock());
7683     MacroEmissionCheckScope guard(this);
7684     ITScope it_scope(this, &cond);
7685     vmlal(cond, dt, rd, rn, rm);
7686   }
Vmlal(DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)7687   void Vmlal(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
7688     Vmlal(al, dt, rd, rn, rm);
7689   }
7690 
Vmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)7691   void Vmlal(
7692       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7693     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7694     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7695     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7696     VIXL_ASSERT(allow_macro_instructions_);
7697     VIXL_ASSERT(OutsideITBlock());
7698     MacroEmissionCheckScope guard(this);
7699     ITScope it_scope(this, &cond);
7700     vmlal(cond, dt, rd, rn, rm);
7701   }
Vmlal(DataType dt,QRegister rd,DRegister rn,DRegister rm)7702   void Vmlal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7703     Vmlal(al, dt, rd, rn, rm);
7704   }
7705 
Vmls(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)7706   void Vmls(Condition cond,
7707             DataType dt,
7708             DRegister rd,
7709             DRegister rn,
7710             DRegisterLane rm) {
7711     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7712     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7713     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7714     VIXL_ASSERT(allow_macro_instructions_);
7715     VIXL_ASSERT(OutsideITBlock());
7716     MacroEmissionCheckScope guard(this);
7717     ITScope it_scope(this, &cond);
7718     vmls(cond, dt, rd, rn, rm);
7719   }
Vmls(DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)7720   void Vmls(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
7721     Vmls(al, dt, rd, rn, rm);
7722   }
7723 
Vmls(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)7724   void Vmls(Condition cond,
7725             DataType dt,
7726             QRegister rd,
7727             QRegister rn,
7728             DRegisterLane rm) {
7729     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7730     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7731     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7732     VIXL_ASSERT(allow_macro_instructions_);
7733     VIXL_ASSERT(OutsideITBlock());
7734     MacroEmissionCheckScope guard(this);
7735     ITScope it_scope(this, &cond);
7736     vmls(cond, dt, rd, rn, rm);
7737   }
Vmls(DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)7738   void Vmls(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
7739     Vmls(al, dt, rd, rn, rm);
7740   }
7741 
Vmls(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7742   void Vmls(
7743       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7744     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7745     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7746     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7747     VIXL_ASSERT(allow_macro_instructions_);
7748     VIXL_ASSERT(OutsideITBlock());
7749     MacroEmissionCheckScope guard(this);
7750     ITScope it_scope(this, &cond);
7751     vmls(cond, dt, rd, rn, rm);
7752   }
Vmls(DataType dt,DRegister rd,DRegister rn,DRegister rm)7753   void Vmls(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7754     Vmls(al, dt, rd, rn, rm);
7755   }
7756 
Vmls(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7757   void Vmls(
7758       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7759     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7760     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7761     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7762     VIXL_ASSERT(allow_macro_instructions_);
7763     VIXL_ASSERT(OutsideITBlock());
7764     MacroEmissionCheckScope guard(this);
7765     ITScope it_scope(this, &cond);
7766     vmls(cond, dt, rd, rn, rm);
7767   }
Vmls(DataType dt,QRegister rd,QRegister rn,QRegister rm)7768   void Vmls(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7769     Vmls(al, dt, rd, rn, rm);
7770   }
7771 
Vmls(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)7772   void Vmls(
7773       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7774     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7775     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7776     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7777     VIXL_ASSERT(allow_macro_instructions_);
7778     VIXL_ASSERT(OutsideITBlock());
7779     MacroEmissionCheckScope guard(this);
7780     ITScope it_scope(this, &cond);
7781     vmls(cond, dt, rd, rn, rm);
7782   }
Vmls(DataType dt,SRegister rd,SRegister rn,SRegister rm)7783   void Vmls(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7784     Vmls(al, dt, rd, rn, rm);
7785   }
7786 
Vmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)7787   void Vmlsl(Condition cond,
7788              DataType dt,
7789              QRegister rd,
7790              DRegister rn,
7791              DRegisterLane rm) {
7792     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7793     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7794     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7795     VIXL_ASSERT(allow_macro_instructions_);
7796     VIXL_ASSERT(OutsideITBlock());
7797     MacroEmissionCheckScope guard(this);
7798     ITScope it_scope(this, &cond);
7799     vmlsl(cond, dt, rd, rn, rm);
7800   }
Vmlsl(DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)7801   void Vmlsl(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
7802     Vmlsl(al, dt, rd, rn, rm);
7803   }
7804 
Vmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)7805   void Vmlsl(
7806       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7807     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7808     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7809     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7810     VIXL_ASSERT(allow_macro_instructions_);
7811     VIXL_ASSERT(OutsideITBlock());
7812     MacroEmissionCheckScope guard(this);
7813     ITScope it_scope(this, &cond);
7814     vmlsl(cond, dt, rd, rn, rm);
7815   }
Vmlsl(DataType dt,QRegister rd,DRegister rn,DRegister rm)7816   void Vmlsl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7817     Vmlsl(al, dt, rd, rn, rm);
7818   }
7819 
Vmov(Condition cond,Register rt,SRegister rn)7820   void Vmov(Condition cond, Register rt, SRegister rn) {
7821     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7822     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7823     VIXL_ASSERT(allow_macro_instructions_);
7824     VIXL_ASSERT(OutsideITBlock());
7825     MacroEmissionCheckScope guard(this);
7826     ITScope it_scope(this, &cond);
7827     vmov(cond, rt, rn);
7828   }
Vmov(Register rt,SRegister rn)7829   void Vmov(Register rt, SRegister rn) { Vmov(al, rt, rn); }
7830 
Vmov(Condition cond,SRegister rn,Register rt)7831   void Vmov(Condition cond, SRegister rn, Register rt) {
7832     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7833     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7834     VIXL_ASSERT(allow_macro_instructions_);
7835     VIXL_ASSERT(OutsideITBlock());
7836     MacroEmissionCheckScope guard(this);
7837     ITScope it_scope(this, &cond);
7838     vmov(cond, rn, rt);
7839   }
Vmov(SRegister rn,Register rt)7840   void Vmov(SRegister rn, Register rt) { Vmov(al, rn, rt); }
7841 
Vmov(Condition cond,Register rt,Register rt2,DRegister rm)7842   void Vmov(Condition cond, Register rt, Register rt2, DRegister rm) {
7843     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7844     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7845     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7846     VIXL_ASSERT(allow_macro_instructions_);
7847     VIXL_ASSERT(OutsideITBlock());
7848     MacroEmissionCheckScope guard(this);
7849     ITScope it_scope(this, &cond);
7850     vmov(cond, rt, rt2, rm);
7851   }
Vmov(Register rt,Register rt2,DRegister rm)7852   void Vmov(Register rt, Register rt2, DRegister rm) { Vmov(al, rt, rt2, rm); }
7853 
Vmov(Condition cond,DRegister rm,Register rt,Register rt2)7854   void Vmov(Condition cond, DRegister rm, Register rt, Register rt2) {
7855     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7856     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7857     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7858     VIXL_ASSERT(allow_macro_instructions_);
7859     VIXL_ASSERT(OutsideITBlock());
7860     MacroEmissionCheckScope guard(this);
7861     ITScope it_scope(this, &cond);
7862     vmov(cond, rm, rt, rt2);
7863   }
Vmov(DRegister rm,Register rt,Register rt2)7864   void Vmov(DRegister rm, Register rt, Register rt2) { Vmov(al, rm, rt, rt2); }
7865 
Vmov(Condition cond,Register rt,Register rt2,SRegister rm,SRegister rm1)7866   void Vmov(
7867       Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) {
7868     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7869     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7870     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7871     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm1));
7872     VIXL_ASSERT(allow_macro_instructions_);
7873     VIXL_ASSERT(OutsideITBlock());
7874     MacroEmissionCheckScope guard(this);
7875     ITScope it_scope(this, &cond);
7876     vmov(cond, rt, rt2, rm, rm1);
7877   }
Vmov(Register rt,Register rt2,SRegister rm,SRegister rm1)7878   void Vmov(Register rt, Register rt2, SRegister rm, SRegister rm1) {
7879     Vmov(al, rt, rt2, rm, rm1);
7880   }
7881 
Vmov(Condition cond,SRegister rm,SRegister rm1,Register rt,Register rt2)7882   void Vmov(
7883       Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) {
7884     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7885     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm1));
7886     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7887     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7888     VIXL_ASSERT(allow_macro_instructions_);
7889     VIXL_ASSERT(OutsideITBlock());
7890     MacroEmissionCheckScope guard(this);
7891     ITScope it_scope(this, &cond);
7892     vmov(cond, rm, rm1, rt, rt2);
7893   }
Vmov(SRegister rm,SRegister rm1,Register rt,Register rt2)7894   void Vmov(SRegister rm, SRegister rm1, Register rt, Register rt2) {
7895     Vmov(al, rm, rm1, rt, rt2);
7896   }
7897 
Vmov(Condition cond,DataType dt,DRegisterLane rd,Register rt)7898   void Vmov(Condition cond, DataType dt, DRegisterLane rd, Register rt) {
7899     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7900     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7901     VIXL_ASSERT(allow_macro_instructions_);
7902     VIXL_ASSERT(OutsideITBlock());
7903     MacroEmissionCheckScope guard(this);
7904     ITScope it_scope(this, &cond);
7905     vmov(cond, dt, rd, rt);
7906   }
Vmov(DataType dt,DRegisterLane rd,Register rt)7907   void Vmov(DataType dt, DRegisterLane rd, Register rt) {
7908     Vmov(al, dt, rd, rt);
7909   }
Vmov(Condition cond,DRegisterLane rd,Register rt)7910   void Vmov(Condition cond, DRegisterLane rd, Register rt) {
7911     Vmov(cond, kDataTypeValueNone, rd, rt);
7912   }
Vmov(DRegisterLane rd,Register rt)7913   void Vmov(DRegisterLane rd, Register rt) {
7914     Vmov(al, kDataTypeValueNone, rd, rt);
7915   }
7916 
Vmov(Condition cond,DataType dt,DRegister rd,const DOperand & operand)7917   void Vmov(Condition cond,
7918             DataType dt,
7919             DRegister rd,
7920             const DOperand& operand) {
7921     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7922     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7923     VIXL_ASSERT(allow_macro_instructions_);
7924     VIXL_ASSERT(OutsideITBlock());
7925     MacroEmissionCheckScope guard(this);
7926     ITScope it_scope(this, &cond);
7927     vmov(cond, dt, rd, operand);
7928   }
Vmov(DataType dt,DRegister rd,const DOperand & operand)7929   void Vmov(DataType dt, DRegister rd, const DOperand& operand) {
7930     Vmov(al, dt, rd, operand);
7931   }
7932 
Vmov(Condition cond,DataType dt,QRegister rd,const QOperand & operand)7933   void Vmov(Condition cond,
7934             DataType dt,
7935             QRegister rd,
7936             const QOperand& operand) {
7937     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7938     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7939     VIXL_ASSERT(allow_macro_instructions_);
7940     VIXL_ASSERT(OutsideITBlock());
7941     MacroEmissionCheckScope guard(this);
7942     ITScope it_scope(this, &cond);
7943     vmov(cond, dt, rd, operand);
7944   }
Vmov(DataType dt,QRegister rd,const QOperand & operand)7945   void Vmov(DataType dt, QRegister rd, const QOperand& operand) {
7946     Vmov(al, dt, rd, operand);
7947   }
7948 
Vmov(Condition cond,DataType dt,SRegister rd,const SOperand & operand)7949   void Vmov(Condition cond,
7950             DataType dt,
7951             SRegister rd,
7952             const SOperand& operand) {
7953     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7954     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7955     VIXL_ASSERT(allow_macro_instructions_);
7956     VIXL_ASSERT(OutsideITBlock());
7957     MacroEmissionCheckScope guard(this);
7958     ITScope it_scope(this, &cond);
7959     vmov(cond, dt, rd, operand);
7960   }
Vmov(DataType dt,SRegister rd,const SOperand & operand)7961   void Vmov(DataType dt, SRegister rd, const SOperand& operand) {
7962     Vmov(al, dt, rd, operand);
7963   }
7964 
Vmov(Condition cond,DataType dt,Register rt,DRegisterLane rn)7965   void Vmov(Condition cond, DataType dt, Register rt, DRegisterLane rn) {
7966     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7967     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7968     VIXL_ASSERT(allow_macro_instructions_);
7969     VIXL_ASSERT(OutsideITBlock());
7970     MacroEmissionCheckScope guard(this);
7971     ITScope it_scope(this, &cond);
7972     vmov(cond, dt, rt, rn);
7973   }
Vmov(DataType dt,Register rt,DRegisterLane rn)7974   void Vmov(DataType dt, Register rt, DRegisterLane rn) {
7975     Vmov(al, dt, rt, rn);
7976   }
Vmov(Condition cond,Register rt,DRegisterLane rn)7977   void Vmov(Condition cond, Register rt, DRegisterLane rn) {
7978     Vmov(cond, kDataTypeValueNone, rt, rn);
7979   }
Vmov(Register rt,DRegisterLane rn)7980   void Vmov(Register rt, DRegisterLane rn) {
7981     Vmov(al, kDataTypeValueNone, rt, rn);
7982   }
7983 
Vmovl(Condition cond,DataType dt,QRegister rd,DRegister rm)7984   void Vmovl(Condition cond, DataType dt, QRegister rd, DRegister rm) {
7985     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7986     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7987     VIXL_ASSERT(allow_macro_instructions_);
7988     VIXL_ASSERT(OutsideITBlock());
7989     MacroEmissionCheckScope guard(this);
7990     ITScope it_scope(this, &cond);
7991     vmovl(cond, dt, rd, rm);
7992   }
Vmovl(DataType dt,QRegister rd,DRegister rm)7993   void Vmovl(DataType dt, QRegister rd, DRegister rm) { Vmovl(al, dt, rd, rm); }
7994 
Vmovn(Condition cond,DataType dt,DRegister rd,QRegister rm)7995   void Vmovn(Condition cond, DataType dt, DRegister rd, QRegister rm) {
7996     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7997     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7998     VIXL_ASSERT(allow_macro_instructions_);
7999     VIXL_ASSERT(OutsideITBlock());
8000     MacroEmissionCheckScope guard(this);
8001     ITScope it_scope(this, &cond);
8002     vmovn(cond, dt, rd, rm);
8003   }
Vmovn(DataType dt,DRegister rd,QRegister rm)8004   void Vmovn(DataType dt, DRegister rd, QRegister rm) { Vmovn(al, dt, rd, rm); }
8005 
Vmrs(Condition cond,RegisterOrAPSR_nzcv rt,SpecialFPRegister spec_reg)8006   void Vmrs(Condition cond,
8007             RegisterOrAPSR_nzcv rt,
8008             SpecialFPRegister spec_reg) {
8009     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
8010     VIXL_ASSERT(allow_macro_instructions_);
8011     VIXL_ASSERT(OutsideITBlock());
8012     MacroEmissionCheckScope guard(this);
8013     ITScope it_scope(this, &cond);
8014     vmrs(cond, rt, spec_reg);
8015   }
Vmrs(RegisterOrAPSR_nzcv rt,SpecialFPRegister spec_reg)8016   void Vmrs(RegisterOrAPSR_nzcv rt, SpecialFPRegister spec_reg) {
8017     Vmrs(al, rt, spec_reg);
8018   }
8019 
Vmsr(Condition cond,SpecialFPRegister spec_reg,Register rt)8020   void Vmsr(Condition cond, SpecialFPRegister spec_reg, Register rt) {
8021     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
8022     VIXL_ASSERT(allow_macro_instructions_);
8023     VIXL_ASSERT(OutsideITBlock());
8024     MacroEmissionCheckScope guard(this);
8025     ITScope it_scope(this, &cond);
8026     vmsr(cond, spec_reg, rt);
8027   }
Vmsr(SpecialFPRegister spec_reg,Register rt)8028   void Vmsr(SpecialFPRegister spec_reg, Register rt) { Vmsr(al, spec_reg, rt); }
8029 
Vmul(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister dm,unsigned index)8030   void Vmul(Condition cond,
8031             DataType dt,
8032             DRegister rd,
8033             DRegister rn,
8034             DRegister dm,
8035             unsigned index) {
8036     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8037     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8038     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8039     VIXL_ASSERT(allow_macro_instructions_);
8040     VIXL_ASSERT(OutsideITBlock());
8041     MacroEmissionCheckScope guard(this);
8042     ITScope it_scope(this, &cond);
8043     vmul(cond, dt, rd, rn, dm, index);
8044   }
Vmul(DataType dt,DRegister rd,DRegister rn,DRegister dm,unsigned index)8045   void Vmul(
8046       DataType dt, DRegister rd, DRegister rn, DRegister dm, unsigned index) {
8047     Vmul(al, dt, rd, rn, dm, index);
8048   }
8049 
Vmul(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegister dm,unsigned index)8050   void Vmul(Condition cond,
8051             DataType dt,
8052             QRegister rd,
8053             QRegister rn,
8054             DRegister dm,
8055             unsigned index) {
8056     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8057     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8058     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8059     VIXL_ASSERT(allow_macro_instructions_);
8060     VIXL_ASSERT(OutsideITBlock());
8061     MacroEmissionCheckScope guard(this);
8062     ITScope it_scope(this, &cond);
8063     vmul(cond, dt, rd, rn, dm, index);
8064   }
Vmul(DataType dt,QRegister rd,QRegister rn,DRegister dm,unsigned index)8065   void Vmul(
8066       DataType dt, QRegister rd, QRegister rn, DRegister dm, unsigned index) {
8067     Vmul(al, dt, rd, rn, dm, index);
8068   }
8069 
Vmul(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8070   void Vmul(
8071       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8072     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8073     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8074     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8075     VIXL_ASSERT(allow_macro_instructions_);
8076     VIXL_ASSERT(OutsideITBlock());
8077     MacroEmissionCheckScope guard(this);
8078     ITScope it_scope(this, &cond);
8079     vmul(cond, dt, rd, rn, rm);
8080   }
Vmul(DataType dt,DRegister rd,DRegister rn,DRegister rm)8081   void Vmul(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8082     Vmul(al, dt, rd, rn, rm);
8083   }
8084 
Vmul(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)8085   void Vmul(
8086       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8087     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8088     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8089     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8090     VIXL_ASSERT(allow_macro_instructions_);
8091     VIXL_ASSERT(OutsideITBlock());
8092     MacroEmissionCheckScope guard(this);
8093     ITScope it_scope(this, &cond);
8094     vmul(cond, dt, rd, rn, rm);
8095   }
Vmul(DataType dt,QRegister rd,QRegister rn,QRegister rm)8096   void Vmul(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8097     Vmul(al, dt, rd, rn, rm);
8098   }
8099 
Vmul(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)8100   void Vmul(
8101       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8102     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8103     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8104     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8105     VIXL_ASSERT(allow_macro_instructions_);
8106     VIXL_ASSERT(OutsideITBlock());
8107     MacroEmissionCheckScope guard(this);
8108     ITScope it_scope(this, &cond);
8109     vmul(cond, dt, rd, rn, rm);
8110   }
Vmul(DataType dt,SRegister rd,SRegister rn,SRegister rm)8111   void Vmul(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8112     Vmul(al, dt, rd, rn, rm);
8113   }
8114 
Vmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8115   void Vmull(Condition cond,
8116              DataType dt,
8117              QRegister rd,
8118              DRegister rn,
8119              DRegister dm,
8120              unsigned index) {
8121     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8122     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8123     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8124     VIXL_ASSERT(allow_macro_instructions_);
8125     VIXL_ASSERT(OutsideITBlock());
8126     MacroEmissionCheckScope guard(this);
8127     ITScope it_scope(this, &cond);
8128     vmull(cond, dt, rd, rn, dm, index);
8129   }
Vmull(DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8130   void Vmull(
8131       DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
8132     Vmull(al, dt, rd, rn, dm, index);
8133   }
8134 
Vmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)8135   void Vmull(
8136       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8137     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8138     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8139     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8140     VIXL_ASSERT(allow_macro_instructions_);
8141     VIXL_ASSERT(OutsideITBlock());
8142     MacroEmissionCheckScope guard(this);
8143     ITScope it_scope(this, &cond);
8144     vmull(cond, dt, rd, rn, rm);
8145   }
Vmull(DataType dt,QRegister rd,DRegister rn,DRegister rm)8146   void Vmull(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8147     Vmull(al, dt, rd, rn, rm);
8148   }
8149 
Vmvn(Condition cond,DataType dt,DRegister rd,const DOperand & operand)8150   void Vmvn(Condition cond,
8151             DataType dt,
8152             DRegister rd,
8153             const DOperand& operand) {
8154     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8155     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8156     VIXL_ASSERT(allow_macro_instructions_);
8157     VIXL_ASSERT(OutsideITBlock());
8158     MacroEmissionCheckScope guard(this);
8159     ITScope it_scope(this, &cond);
8160     vmvn(cond, dt, rd, operand);
8161   }
Vmvn(DataType dt,DRegister rd,const DOperand & operand)8162   void Vmvn(DataType dt, DRegister rd, const DOperand& operand) {
8163     Vmvn(al, dt, rd, operand);
8164   }
8165 
Vmvn(Condition cond,DataType dt,QRegister rd,const QOperand & operand)8166   void Vmvn(Condition cond,
8167             DataType dt,
8168             QRegister rd,
8169             const QOperand& operand) {
8170     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8171     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8172     VIXL_ASSERT(allow_macro_instructions_);
8173     VIXL_ASSERT(OutsideITBlock());
8174     MacroEmissionCheckScope guard(this);
8175     ITScope it_scope(this, &cond);
8176     vmvn(cond, dt, rd, operand);
8177   }
Vmvn(DataType dt,QRegister rd,const QOperand & operand)8178   void Vmvn(DataType dt, QRegister rd, const QOperand& operand) {
8179     Vmvn(al, dt, rd, operand);
8180   }
8181 
Vneg(Condition cond,DataType dt,DRegister rd,DRegister rm)8182   void Vneg(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8183     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8184     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8185     VIXL_ASSERT(allow_macro_instructions_);
8186     VIXL_ASSERT(OutsideITBlock());
8187     MacroEmissionCheckScope guard(this);
8188     ITScope it_scope(this, &cond);
8189     vneg(cond, dt, rd, rm);
8190   }
Vneg(DataType dt,DRegister rd,DRegister rm)8191   void Vneg(DataType dt, DRegister rd, DRegister rm) { Vneg(al, dt, rd, rm); }
8192 
Vneg(Condition cond,DataType dt,QRegister rd,QRegister rm)8193   void Vneg(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8194     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8195     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8196     VIXL_ASSERT(allow_macro_instructions_);
8197     VIXL_ASSERT(OutsideITBlock());
8198     MacroEmissionCheckScope guard(this);
8199     ITScope it_scope(this, &cond);
8200     vneg(cond, dt, rd, rm);
8201   }
Vneg(DataType dt,QRegister rd,QRegister rm)8202   void Vneg(DataType dt, QRegister rd, QRegister rm) { Vneg(al, dt, rd, rm); }
8203 
Vneg(Condition cond,DataType dt,SRegister rd,SRegister rm)8204   void Vneg(Condition cond, DataType dt, SRegister rd, SRegister rm) {
8205     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8206     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8207     VIXL_ASSERT(allow_macro_instructions_);
8208     VIXL_ASSERT(OutsideITBlock());
8209     MacroEmissionCheckScope guard(this);
8210     ITScope it_scope(this, &cond);
8211     vneg(cond, dt, rd, rm);
8212   }
Vneg(DataType dt,SRegister rd,SRegister rm)8213   void Vneg(DataType dt, SRegister rd, SRegister rm) { Vneg(al, dt, rd, rm); }
8214 
Vnmla(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)8215   void Vnmla(
8216       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8217     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8218     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8219     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8220     VIXL_ASSERT(allow_macro_instructions_);
8221     VIXL_ASSERT(OutsideITBlock());
8222     MacroEmissionCheckScope guard(this);
8223     ITScope it_scope(this, &cond);
8224     vnmla(cond, dt, rd, rn, rm);
8225   }
Vnmla(DataType dt,SRegister rd,SRegister rn,SRegister rm)8226   void Vnmla(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8227     Vnmla(al, dt, rd, rn, rm);
8228   }
8229 
Vnmla(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8230   void Vnmla(
8231       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8232     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8233     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8234     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8235     VIXL_ASSERT(allow_macro_instructions_);
8236     VIXL_ASSERT(OutsideITBlock());
8237     MacroEmissionCheckScope guard(this);
8238     ITScope it_scope(this, &cond);
8239     vnmla(cond, dt, rd, rn, rm);
8240   }
Vnmla(DataType dt,DRegister rd,DRegister rn,DRegister rm)8241   void Vnmla(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8242     Vnmla(al, dt, rd, rn, rm);
8243   }
8244 
Vnmls(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)8245   void Vnmls(
8246       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8247     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8248     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8249     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8250     VIXL_ASSERT(allow_macro_instructions_);
8251     VIXL_ASSERT(OutsideITBlock());
8252     MacroEmissionCheckScope guard(this);
8253     ITScope it_scope(this, &cond);
8254     vnmls(cond, dt, rd, rn, rm);
8255   }
Vnmls(DataType dt,SRegister rd,SRegister rn,SRegister rm)8256   void Vnmls(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8257     Vnmls(al, dt, rd, rn, rm);
8258   }
8259 
Vnmls(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8260   void Vnmls(
8261       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8262     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8263     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8264     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8265     VIXL_ASSERT(allow_macro_instructions_);
8266     VIXL_ASSERT(OutsideITBlock());
8267     MacroEmissionCheckScope guard(this);
8268     ITScope it_scope(this, &cond);
8269     vnmls(cond, dt, rd, rn, rm);
8270   }
Vnmls(DataType dt,DRegister rd,DRegister rn,DRegister rm)8271   void Vnmls(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8272     Vnmls(al, dt, rd, rn, rm);
8273   }
8274 
Vnmul(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)8275   void Vnmul(
8276       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8277     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8278     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8279     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8280     VIXL_ASSERT(allow_macro_instructions_);
8281     VIXL_ASSERT(OutsideITBlock());
8282     MacroEmissionCheckScope guard(this);
8283     ITScope it_scope(this, &cond);
8284     vnmul(cond, dt, rd, rn, rm);
8285   }
Vnmul(DataType dt,SRegister rd,SRegister rn,SRegister rm)8286   void Vnmul(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8287     Vnmul(al, dt, rd, rn, rm);
8288   }
8289 
Vnmul(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8290   void Vnmul(
8291       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8292     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8293     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8294     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8295     VIXL_ASSERT(allow_macro_instructions_);
8296     VIXL_ASSERT(OutsideITBlock());
8297     MacroEmissionCheckScope guard(this);
8298     ITScope it_scope(this, &cond);
8299     vnmul(cond, dt, rd, rn, rm);
8300   }
Vnmul(DataType dt,DRegister rd,DRegister rn,DRegister rm)8301   void Vnmul(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8302     Vnmul(al, dt, rd, rn, rm);
8303   }
8304 
Vorn(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)8305   void Vorn(Condition cond,
8306             DataType dt,
8307             DRegister rd,
8308             DRegister rn,
8309             const DOperand& operand) {
8310     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8311     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8312     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8313     VIXL_ASSERT(allow_macro_instructions_);
8314     VIXL_ASSERT(OutsideITBlock());
8315     MacroEmissionCheckScope guard(this);
8316     ITScope it_scope(this, &cond);
8317     vorn(cond, dt, rd, rn, operand);
8318   }
Vorn(DataType dt,DRegister rd,DRegister rn,const DOperand & operand)8319   void Vorn(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
8320     Vorn(al, dt, rd, rn, operand);
8321   }
8322 
Vorn(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)8323   void Vorn(Condition cond,
8324             DataType dt,
8325             QRegister rd,
8326             QRegister rn,
8327             const QOperand& operand) {
8328     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8329     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8330     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8331     VIXL_ASSERT(allow_macro_instructions_);
8332     VIXL_ASSERT(OutsideITBlock());
8333     MacroEmissionCheckScope guard(this);
8334     ITScope it_scope(this, &cond);
8335     vorn(cond, dt, rd, rn, operand);
8336   }
Vorn(DataType dt,QRegister rd,QRegister rn,const QOperand & operand)8337   void Vorn(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
8338     Vorn(al, dt, rd, rn, operand);
8339   }
8340 
Vorr(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)8341   void Vorr(Condition cond,
8342             DataType dt,
8343             DRegister rd,
8344             DRegister rn,
8345             const DOperand& operand) {
8346     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8347     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8348     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8349     VIXL_ASSERT(allow_macro_instructions_);
8350     VIXL_ASSERT(OutsideITBlock());
8351     MacroEmissionCheckScope guard(this);
8352     ITScope it_scope(this, &cond);
8353     vorr(cond, dt, rd, rn, operand);
8354   }
Vorr(DataType dt,DRegister rd,DRegister rn,const DOperand & operand)8355   void Vorr(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
8356     Vorr(al, dt, rd, rn, operand);
8357   }
Vorr(Condition cond,DRegister rd,DRegister rn,const DOperand & operand)8358   void Vorr(Condition cond,
8359             DRegister rd,
8360             DRegister rn,
8361             const DOperand& operand) {
8362     Vorr(cond, kDataTypeValueNone, rd, rn, operand);
8363   }
Vorr(DRegister rd,DRegister rn,const DOperand & operand)8364   void Vorr(DRegister rd, DRegister rn, const DOperand& operand) {
8365     Vorr(al, kDataTypeValueNone, rd, rn, operand);
8366   }
8367 
Vorr(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)8368   void Vorr(Condition cond,
8369             DataType dt,
8370             QRegister rd,
8371             QRegister rn,
8372             const QOperand& operand) {
8373     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8374     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8375     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8376     VIXL_ASSERT(allow_macro_instructions_);
8377     VIXL_ASSERT(OutsideITBlock());
8378     MacroEmissionCheckScope guard(this);
8379     ITScope it_scope(this, &cond);
8380     vorr(cond, dt, rd, rn, operand);
8381   }
Vorr(DataType dt,QRegister rd,QRegister rn,const QOperand & operand)8382   void Vorr(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
8383     Vorr(al, dt, rd, rn, operand);
8384   }
Vorr(Condition cond,QRegister rd,QRegister rn,const QOperand & operand)8385   void Vorr(Condition cond,
8386             QRegister rd,
8387             QRegister rn,
8388             const QOperand& operand) {
8389     Vorr(cond, kDataTypeValueNone, rd, rn, operand);
8390   }
Vorr(QRegister rd,QRegister rn,const QOperand & operand)8391   void Vorr(QRegister rd, QRegister rn, const QOperand& operand) {
8392     Vorr(al, kDataTypeValueNone, rd, rn, operand);
8393   }
8394 
Vpadal(Condition cond,DataType dt,DRegister rd,DRegister rm)8395   void Vpadal(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8396     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8397     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8398     VIXL_ASSERT(allow_macro_instructions_);
8399     VIXL_ASSERT(OutsideITBlock());
8400     MacroEmissionCheckScope guard(this);
8401     ITScope it_scope(this, &cond);
8402     vpadal(cond, dt, rd, rm);
8403   }
Vpadal(DataType dt,DRegister rd,DRegister rm)8404   void Vpadal(DataType dt, DRegister rd, DRegister rm) {
8405     Vpadal(al, dt, rd, rm);
8406   }
8407 
Vpadal(Condition cond,DataType dt,QRegister rd,QRegister rm)8408   void Vpadal(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8409     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8410     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8411     VIXL_ASSERT(allow_macro_instructions_);
8412     VIXL_ASSERT(OutsideITBlock());
8413     MacroEmissionCheckScope guard(this);
8414     ITScope it_scope(this, &cond);
8415     vpadal(cond, dt, rd, rm);
8416   }
Vpadal(DataType dt,QRegister rd,QRegister rm)8417   void Vpadal(DataType dt, QRegister rd, QRegister rm) {
8418     Vpadal(al, dt, rd, rm);
8419   }
8420 
Vpadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8421   void Vpadd(
8422       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8423     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8424     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8425     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8426     VIXL_ASSERT(allow_macro_instructions_);
8427     VIXL_ASSERT(OutsideITBlock());
8428     MacroEmissionCheckScope guard(this);
8429     ITScope it_scope(this, &cond);
8430     vpadd(cond, dt, rd, rn, rm);
8431   }
Vpadd(DataType dt,DRegister rd,DRegister rn,DRegister rm)8432   void Vpadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8433     Vpadd(al, dt, rd, rn, rm);
8434   }
8435 
Vpaddl(Condition cond,DataType dt,DRegister rd,DRegister rm)8436   void Vpaddl(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8437     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8438     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8439     VIXL_ASSERT(allow_macro_instructions_);
8440     VIXL_ASSERT(OutsideITBlock());
8441     MacroEmissionCheckScope guard(this);
8442     ITScope it_scope(this, &cond);
8443     vpaddl(cond, dt, rd, rm);
8444   }
Vpaddl(DataType dt,DRegister rd,DRegister rm)8445   void Vpaddl(DataType dt, DRegister rd, DRegister rm) {
8446     Vpaddl(al, dt, rd, rm);
8447   }
8448 
Vpaddl(Condition cond,DataType dt,QRegister rd,QRegister rm)8449   void Vpaddl(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8450     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8451     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8452     VIXL_ASSERT(allow_macro_instructions_);
8453     VIXL_ASSERT(OutsideITBlock());
8454     MacroEmissionCheckScope guard(this);
8455     ITScope it_scope(this, &cond);
8456     vpaddl(cond, dt, rd, rm);
8457   }
Vpaddl(DataType dt,QRegister rd,QRegister rm)8458   void Vpaddl(DataType dt, QRegister rd, QRegister rm) {
8459     Vpaddl(al, dt, rd, rm);
8460   }
8461 
Vpmax(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8462   void Vpmax(
8463       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8464     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8465     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8466     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8467     VIXL_ASSERT(allow_macro_instructions_);
8468     VIXL_ASSERT(OutsideITBlock());
8469     MacroEmissionCheckScope guard(this);
8470     ITScope it_scope(this, &cond);
8471     vpmax(cond, dt, rd, rn, rm);
8472   }
Vpmax(DataType dt,DRegister rd,DRegister rn,DRegister rm)8473   void Vpmax(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8474     Vpmax(al, dt, rd, rn, rm);
8475   }
8476 
Vpmin(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8477   void Vpmin(
8478       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8479     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8480     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8481     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8482     VIXL_ASSERT(allow_macro_instructions_);
8483     VIXL_ASSERT(OutsideITBlock());
8484     MacroEmissionCheckScope guard(this);
8485     ITScope it_scope(this, &cond);
8486     vpmin(cond, dt, rd, rn, rm);
8487   }
Vpmin(DataType dt,DRegister rd,DRegister rn,DRegister rm)8488   void Vpmin(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8489     Vpmin(al, dt, rd, rn, rm);
8490   }
8491 
Vpop(Condition cond,DataType dt,DRegisterList dreglist)8492   void Vpop(Condition cond, DataType dt, DRegisterList dreglist) {
8493     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
8494     VIXL_ASSERT(allow_macro_instructions_);
8495     VIXL_ASSERT(OutsideITBlock());
8496     MacroEmissionCheckScope guard(this);
8497     ITScope it_scope(this, &cond);
8498     vpop(cond, dt, dreglist);
8499   }
Vpop(DataType dt,DRegisterList dreglist)8500   void Vpop(DataType dt, DRegisterList dreglist) { Vpop(al, dt, dreglist); }
Vpop(Condition cond,DRegisterList dreglist)8501   void Vpop(Condition cond, DRegisterList dreglist) {
8502     Vpop(cond, kDataTypeValueNone, dreglist);
8503   }
Vpop(DRegisterList dreglist)8504   void Vpop(DRegisterList dreglist) { Vpop(al, kDataTypeValueNone, dreglist); }
8505 
Vpop(Condition cond,DataType dt,SRegisterList sreglist)8506   void Vpop(Condition cond, DataType dt, SRegisterList sreglist) {
8507     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
8508     VIXL_ASSERT(allow_macro_instructions_);
8509     VIXL_ASSERT(OutsideITBlock());
8510     MacroEmissionCheckScope guard(this);
8511     ITScope it_scope(this, &cond);
8512     vpop(cond, dt, sreglist);
8513   }
Vpop(DataType dt,SRegisterList sreglist)8514   void Vpop(DataType dt, SRegisterList sreglist) { Vpop(al, dt, sreglist); }
Vpop(Condition cond,SRegisterList sreglist)8515   void Vpop(Condition cond, SRegisterList sreglist) {
8516     Vpop(cond, kDataTypeValueNone, sreglist);
8517   }
Vpop(SRegisterList sreglist)8518   void Vpop(SRegisterList sreglist) { Vpop(al, kDataTypeValueNone, sreglist); }
8519 
Vpush(Condition cond,DataType dt,DRegisterList dreglist)8520   void Vpush(Condition cond, DataType dt, DRegisterList dreglist) {
8521     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
8522     VIXL_ASSERT(allow_macro_instructions_);
8523     VIXL_ASSERT(OutsideITBlock());
8524     MacroEmissionCheckScope guard(this);
8525     ITScope it_scope(this, &cond);
8526     vpush(cond, dt, dreglist);
8527   }
Vpush(DataType dt,DRegisterList dreglist)8528   void Vpush(DataType dt, DRegisterList dreglist) { Vpush(al, dt, dreglist); }
Vpush(Condition cond,DRegisterList dreglist)8529   void Vpush(Condition cond, DRegisterList dreglist) {
8530     Vpush(cond, kDataTypeValueNone, dreglist);
8531   }
Vpush(DRegisterList dreglist)8532   void Vpush(DRegisterList dreglist) {
8533     Vpush(al, kDataTypeValueNone, dreglist);
8534   }
8535 
Vpush(Condition cond,DataType dt,SRegisterList sreglist)8536   void Vpush(Condition cond, DataType dt, SRegisterList sreglist) {
8537     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
8538     VIXL_ASSERT(allow_macro_instructions_);
8539     VIXL_ASSERT(OutsideITBlock());
8540     MacroEmissionCheckScope guard(this);
8541     ITScope it_scope(this, &cond);
8542     vpush(cond, dt, sreglist);
8543   }
Vpush(DataType dt,SRegisterList sreglist)8544   void Vpush(DataType dt, SRegisterList sreglist) { Vpush(al, dt, sreglist); }
Vpush(Condition cond,SRegisterList sreglist)8545   void Vpush(Condition cond, SRegisterList sreglist) {
8546     Vpush(cond, kDataTypeValueNone, sreglist);
8547   }
Vpush(SRegisterList sreglist)8548   void Vpush(SRegisterList sreglist) {
8549     Vpush(al, kDataTypeValueNone, sreglist);
8550   }
8551 
Vqabs(Condition cond,DataType dt,DRegister rd,DRegister rm)8552   void Vqabs(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8553     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8554     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8555     VIXL_ASSERT(allow_macro_instructions_);
8556     VIXL_ASSERT(OutsideITBlock());
8557     MacroEmissionCheckScope guard(this);
8558     ITScope it_scope(this, &cond);
8559     vqabs(cond, dt, rd, rm);
8560   }
Vqabs(DataType dt,DRegister rd,DRegister rm)8561   void Vqabs(DataType dt, DRegister rd, DRegister rm) { Vqabs(al, dt, rd, rm); }
8562 
Vqabs(Condition cond,DataType dt,QRegister rd,QRegister rm)8563   void Vqabs(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8564     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8565     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8566     VIXL_ASSERT(allow_macro_instructions_);
8567     VIXL_ASSERT(OutsideITBlock());
8568     MacroEmissionCheckScope guard(this);
8569     ITScope it_scope(this, &cond);
8570     vqabs(cond, dt, rd, rm);
8571   }
Vqabs(DataType dt,QRegister rd,QRegister rm)8572   void Vqabs(DataType dt, QRegister rd, QRegister rm) { Vqabs(al, dt, rd, rm); }
8573 
Vqadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8574   void Vqadd(
8575       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8576     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8577     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8578     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8579     VIXL_ASSERT(allow_macro_instructions_);
8580     VIXL_ASSERT(OutsideITBlock());
8581     MacroEmissionCheckScope guard(this);
8582     ITScope it_scope(this, &cond);
8583     vqadd(cond, dt, rd, rn, rm);
8584   }
Vqadd(DataType dt,DRegister rd,DRegister rn,DRegister rm)8585   void Vqadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8586     Vqadd(al, dt, rd, rn, rm);
8587   }
8588 
Vqadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)8589   void Vqadd(
8590       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8591     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8592     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8593     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8594     VIXL_ASSERT(allow_macro_instructions_);
8595     VIXL_ASSERT(OutsideITBlock());
8596     MacroEmissionCheckScope guard(this);
8597     ITScope it_scope(this, &cond);
8598     vqadd(cond, dt, rd, rn, rm);
8599   }
Vqadd(DataType dt,QRegister rd,QRegister rn,QRegister rm)8600   void Vqadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8601     Vqadd(al, dt, rd, rn, rm);
8602   }
8603 
Vqdmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)8604   void Vqdmlal(
8605       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8606     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8607     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8608     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8609     VIXL_ASSERT(allow_macro_instructions_);
8610     VIXL_ASSERT(OutsideITBlock());
8611     MacroEmissionCheckScope guard(this);
8612     ITScope it_scope(this, &cond);
8613     vqdmlal(cond, dt, rd, rn, rm);
8614   }
Vqdmlal(DataType dt,QRegister rd,DRegister rn,DRegister rm)8615   void Vqdmlal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8616     Vqdmlal(al, dt, rd, rn, rm);
8617   }
8618 
Vqdmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8619   void Vqdmlal(Condition cond,
8620                DataType dt,
8621                QRegister rd,
8622                DRegister rn,
8623                DRegister dm,
8624                unsigned index) {
8625     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8626     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8627     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8628     VIXL_ASSERT(allow_macro_instructions_);
8629     VIXL_ASSERT(OutsideITBlock());
8630     MacroEmissionCheckScope guard(this);
8631     ITScope it_scope(this, &cond);
8632     vqdmlal(cond, dt, rd, rn, dm, index);
8633   }
Vqdmlal(DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8634   void Vqdmlal(
8635       DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
8636     Vqdmlal(al, dt, rd, rn, dm, index);
8637   }
8638 
Vqdmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)8639   void Vqdmlsl(
8640       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8641     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8642     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8643     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8644     VIXL_ASSERT(allow_macro_instructions_);
8645     VIXL_ASSERT(OutsideITBlock());
8646     MacroEmissionCheckScope guard(this);
8647     ITScope it_scope(this, &cond);
8648     vqdmlsl(cond, dt, rd, rn, rm);
8649   }
Vqdmlsl(DataType dt,QRegister rd,DRegister rn,DRegister rm)8650   void Vqdmlsl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8651     Vqdmlsl(al, dt, rd, rn, rm);
8652   }
8653 
Vqdmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8654   void Vqdmlsl(Condition cond,
8655                DataType dt,
8656                QRegister rd,
8657                DRegister rn,
8658                DRegister dm,
8659                unsigned index) {
8660     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8661     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8662     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8663     VIXL_ASSERT(allow_macro_instructions_);
8664     VIXL_ASSERT(OutsideITBlock());
8665     MacroEmissionCheckScope guard(this);
8666     ITScope it_scope(this, &cond);
8667     vqdmlsl(cond, dt, rd, rn, dm, index);
8668   }
Vqdmlsl(DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8669   void Vqdmlsl(
8670       DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
8671     Vqdmlsl(al, dt, rd, rn, dm, index);
8672   }
8673 
Vqdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8674   void Vqdmulh(
8675       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8676     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8677     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8678     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8679     VIXL_ASSERT(allow_macro_instructions_);
8680     VIXL_ASSERT(OutsideITBlock());
8681     MacroEmissionCheckScope guard(this);
8682     ITScope it_scope(this, &cond);
8683     vqdmulh(cond, dt, rd, rn, rm);
8684   }
Vqdmulh(DataType dt,DRegister rd,DRegister rn,DRegister rm)8685   void Vqdmulh(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8686     Vqdmulh(al, dt, rd, rn, rm);
8687   }
8688 
Vqdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)8689   void Vqdmulh(
8690       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8691     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8692     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8693     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8694     VIXL_ASSERT(allow_macro_instructions_);
8695     VIXL_ASSERT(OutsideITBlock());
8696     MacroEmissionCheckScope guard(this);
8697     ITScope it_scope(this, &cond);
8698     vqdmulh(cond, dt, rd, rn, rm);
8699   }
Vqdmulh(DataType dt,QRegister rd,QRegister rn,QRegister rm)8700   void Vqdmulh(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8701     Vqdmulh(al, dt, rd, rn, rm);
8702   }
8703 
Vqdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)8704   void Vqdmulh(Condition cond,
8705                DataType dt,
8706                DRegister rd,
8707                DRegister rn,
8708                DRegisterLane rm) {
8709     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8710     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8711     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8712     VIXL_ASSERT(allow_macro_instructions_);
8713     VIXL_ASSERT(OutsideITBlock());
8714     MacroEmissionCheckScope guard(this);
8715     ITScope it_scope(this, &cond);
8716     vqdmulh(cond, dt, rd, rn, rm);
8717   }
Vqdmulh(DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)8718   void Vqdmulh(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
8719     Vqdmulh(al, dt, rd, rn, rm);
8720   }
8721 
Vqdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)8722   void Vqdmulh(Condition cond,
8723                DataType dt,
8724                QRegister rd,
8725                QRegister rn,
8726                DRegisterLane rm) {
8727     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8728     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8729     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8730     VIXL_ASSERT(allow_macro_instructions_);
8731     VIXL_ASSERT(OutsideITBlock());
8732     MacroEmissionCheckScope guard(this);
8733     ITScope it_scope(this, &cond);
8734     vqdmulh(cond, dt, rd, rn, rm);
8735   }
Vqdmulh(DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)8736   void Vqdmulh(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
8737     Vqdmulh(al, dt, rd, rn, rm);
8738   }
8739 
Vqdmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)8740   void Vqdmull(
8741       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8742     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8743     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8744     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8745     VIXL_ASSERT(allow_macro_instructions_);
8746     VIXL_ASSERT(OutsideITBlock());
8747     MacroEmissionCheckScope guard(this);
8748     ITScope it_scope(this, &cond);
8749     vqdmull(cond, dt, rd, rn, rm);
8750   }
Vqdmull(DataType dt,QRegister rd,DRegister rn,DRegister rm)8751   void Vqdmull(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8752     Vqdmull(al, dt, rd, rn, rm);
8753   }
8754 
Vqdmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)8755   void Vqdmull(Condition cond,
8756                DataType dt,
8757                QRegister rd,
8758                DRegister rn,
8759                DRegisterLane rm) {
8760     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8761     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8762     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8763     VIXL_ASSERT(allow_macro_instructions_);
8764     VIXL_ASSERT(OutsideITBlock());
8765     MacroEmissionCheckScope guard(this);
8766     ITScope it_scope(this, &cond);
8767     vqdmull(cond, dt, rd, rn, rm);
8768   }
Vqdmull(DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)8769   void Vqdmull(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
8770     Vqdmull(al, dt, rd, rn, rm);
8771   }
8772 
Vqmovn(Condition cond,DataType dt,DRegister rd,QRegister rm)8773   void Vqmovn(Condition cond, DataType dt, DRegister rd, QRegister rm) {
8774     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8775     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8776     VIXL_ASSERT(allow_macro_instructions_);
8777     VIXL_ASSERT(OutsideITBlock());
8778     MacroEmissionCheckScope guard(this);
8779     ITScope it_scope(this, &cond);
8780     vqmovn(cond, dt, rd, rm);
8781   }
Vqmovn(DataType dt,DRegister rd,QRegister rm)8782   void Vqmovn(DataType dt, DRegister rd, QRegister rm) {
8783     Vqmovn(al, dt, rd, rm);
8784   }
8785 
Vqmovun(Condition cond,DataType dt,DRegister rd,QRegister rm)8786   void Vqmovun(Condition cond, DataType dt, DRegister rd, QRegister rm) {
8787     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8788     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8789     VIXL_ASSERT(allow_macro_instructions_);
8790     VIXL_ASSERT(OutsideITBlock());
8791     MacroEmissionCheckScope guard(this);
8792     ITScope it_scope(this, &cond);
8793     vqmovun(cond, dt, rd, rm);
8794   }
Vqmovun(DataType dt,DRegister rd,QRegister rm)8795   void Vqmovun(DataType dt, DRegister rd, QRegister rm) {
8796     Vqmovun(al, dt, rd, rm);
8797   }
8798 
Vqneg(Condition cond,DataType dt,DRegister rd,DRegister rm)8799   void Vqneg(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8800     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8801     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8802     VIXL_ASSERT(allow_macro_instructions_);
8803     VIXL_ASSERT(OutsideITBlock());
8804     MacroEmissionCheckScope guard(this);
8805     ITScope it_scope(this, &cond);
8806     vqneg(cond, dt, rd, rm);
8807   }
Vqneg(DataType dt,DRegister rd,DRegister rm)8808   void Vqneg(DataType dt, DRegister rd, DRegister rm) { Vqneg(al, dt, rd, rm); }
8809 
Vqneg(Condition cond,DataType dt,QRegister rd,QRegister rm)8810   void Vqneg(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8811     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8812     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8813     VIXL_ASSERT(allow_macro_instructions_);
8814     VIXL_ASSERT(OutsideITBlock());
8815     MacroEmissionCheckScope guard(this);
8816     ITScope it_scope(this, &cond);
8817     vqneg(cond, dt, rd, rm);
8818   }
Vqneg(DataType dt,QRegister rd,QRegister rm)8819   void Vqneg(DataType dt, QRegister rd, QRegister rm) { Vqneg(al, dt, rd, rm); }
8820 
Vqrdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8821   void Vqrdmulh(
8822       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8823     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8824     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8825     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8826     VIXL_ASSERT(allow_macro_instructions_);
8827     VIXL_ASSERT(OutsideITBlock());
8828     MacroEmissionCheckScope guard(this);
8829     ITScope it_scope(this, &cond);
8830     vqrdmulh(cond, dt, rd, rn, rm);
8831   }
Vqrdmulh(DataType dt,DRegister rd,DRegister rn,DRegister rm)8832   void Vqrdmulh(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8833     Vqrdmulh(al, dt, rd, rn, rm);
8834   }
8835 
Vqrdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)8836   void Vqrdmulh(
8837       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8838     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8839     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8840     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8841     VIXL_ASSERT(allow_macro_instructions_);
8842     VIXL_ASSERT(OutsideITBlock());
8843     MacroEmissionCheckScope guard(this);
8844     ITScope it_scope(this, &cond);
8845     vqrdmulh(cond, dt, rd, rn, rm);
8846   }
Vqrdmulh(DataType dt,QRegister rd,QRegister rn,QRegister rm)8847   void Vqrdmulh(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8848     Vqrdmulh(al, dt, rd, rn, rm);
8849   }
8850 
Vqrdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)8851   void Vqrdmulh(Condition cond,
8852                 DataType dt,
8853                 DRegister rd,
8854                 DRegister rn,
8855                 DRegisterLane rm) {
8856     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8857     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8858     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8859     VIXL_ASSERT(allow_macro_instructions_);
8860     VIXL_ASSERT(OutsideITBlock());
8861     MacroEmissionCheckScope guard(this);
8862     ITScope it_scope(this, &cond);
8863     vqrdmulh(cond, dt, rd, rn, rm);
8864   }
Vqrdmulh(DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)8865   void Vqrdmulh(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
8866     Vqrdmulh(al, dt, rd, rn, rm);
8867   }
8868 
Vqrdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)8869   void Vqrdmulh(Condition cond,
8870                 DataType dt,
8871                 QRegister rd,
8872                 QRegister rn,
8873                 DRegisterLane rm) {
8874     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8875     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8876     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8877     VIXL_ASSERT(allow_macro_instructions_);
8878     VIXL_ASSERT(OutsideITBlock());
8879     MacroEmissionCheckScope guard(this);
8880     ITScope it_scope(this, &cond);
8881     vqrdmulh(cond, dt, rd, rn, rm);
8882   }
Vqrdmulh(DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)8883   void Vqrdmulh(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
8884     Vqrdmulh(al, dt, rd, rn, rm);
8885   }
8886 
Vqrshl(Condition cond,DataType dt,DRegister rd,DRegister rm,DRegister rn)8887   void Vqrshl(
8888       Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
8889     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8890     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8891     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8892     VIXL_ASSERT(allow_macro_instructions_);
8893     VIXL_ASSERT(OutsideITBlock());
8894     MacroEmissionCheckScope guard(this);
8895     ITScope it_scope(this, &cond);
8896     vqrshl(cond, dt, rd, rm, rn);
8897   }
Vqrshl(DataType dt,DRegister rd,DRegister rm,DRegister rn)8898   void Vqrshl(DataType dt, DRegister rd, DRegister rm, DRegister rn) {
8899     Vqrshl(al, dt, rd, rm, rn);
8900   }
8901 
Vqrshl(Condition cond,DataType dt,QRegister rd,QRegister rm,QRegister rn)8902   void Vqrshl(
8903       Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
8904     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8905     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8906     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8907     VIXL_ASSERT(allow_macro_instructions_);
8908     VIXL_ASSERT(OutsideITBlock());
8909     MacroEmissionCheckScope guard(this);
8910     ITScope it_scope(this, &cond);
8911     vqrshl(cond, dt, rd, rm, rn);
8912   }
Vqrshl(DataType dt,QRegister rd,QRegister rm,QRegister rn)8913   void Vqrshl(DataType dt, QRegister rd, QRegister rm, QRegister rn) {
8914     Vqrshl(al, dt, rd, rm, rn);
8915   }
8916 
Vqrshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8917   void Vqrshrn(Condition cond,
8918                DataType dt,
8919                DRegister rd,
8920                QRegister rm,
8921                const QOperand& operand) {
8922     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8923     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8924     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8925     VIXL_ASSERT(allow_macro_instructions_);
8926     VIXL_ASSERT(OutsideITBlock());
8927     MacroEmissionCheckScope guard(this);
8928     ITScope it_scope(this, &cond);
8929     vqrshrn(cond, dt, rd, rm, operand);
8930   }
Vqrshrn(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8931   void Vqrshrn(DataType dt,
8932                DRegister rd,
8933                QRegister rm,
8934                const QOperand& operand) {
8935     Vqrshrn(al, dt, rd, rm, operand);
8936   }
8937 
Vqrshrun(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8938   void Vqrshrun(Condition cond,
8939                 DataType dt,
8940                 DRegister rd,
8941                 QRegister rm,
8942                 const QOperand& operand) {
8943     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8944     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8945     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8946     VIXL_ASSERT(allow_macro_instructions_);
8947     VIXL_ASSERT(OutsideITBlock());
8948     MacroEmissionCheckScope guard(this);
8949     ITScope it_scope(this, &cond);
8950     vqrshrun(cond, dt, rd, rm, operand);
8951   }
Vqrshrun(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8952   void Vqrshrun(DataType dt,
8953                 DRegister rd,
8954                 QRegister rm,
8955                 const QOperand& operand) {
8956     Vqrshrun(al, dt, rd, rm, operand);
8957   }
8958 
Vqshl(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)8959   void Vqshl(Condition cond,
8960              DataType dt,
8961              DRegister rd,
8962              DRegister rm,
8963              const DOperand& operand) {
8964     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8965     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8966     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8967     VIXL_ASSERT(allow_macro_instructions_);
8968     VIXL_ASSERT(OutsideITBlock());
8969     MacroEmissionCheckScope guard(this);
8970     ITScope it_scope(this, &cond);
8971     vqshl(cond, dt, rd, rm, operand);
8972   }
Vqshl(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)8973   void Vqshl(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
8974     Vqshl(al, dt, rd, rm, operand);
8975   }
8976 
Vqshl(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)8977   void Vqshl(Condition cond,
8978              DataType dt,
8979              QRegister rd,
8980              QRegister rm,
8981              const QOperand& operand) {
8982     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8983     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8984     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8985     VIXL_ASSERT(allow_macro_instructions_);
8986     VIXL_ASSERT(OutsideITBlock());
8987     MacroEmissionCheckScope guard(this);
8988     ITScope it_scope(this, &cond);
8989     vqshl(cond, dt, rd, rm, operand);
8990   }
Vqshl(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)8991   void Vqshl(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
8992     Vqshl(al, dt, rd, rm, operand);
8993   }
8994 
Vqshlu(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)8995   void Vqshlu(Condition cond,
8996               DataType dt,
8997               DRegister rd,
8998               DRegister rm,
8999               const DOperand& operand) {
9000     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9001     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9002     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9003     VIXL_ASSERT(allow_macro_instructions_);
9004     VIXL_ASSERT(OutsideITBlock());
9005     MacroEmissionCheckScope guard(this);
9006     ITScope it_scope(this, &cond);
9007     vqshlu(cond, dt, rd, rm, operand);
9008   }
Vqshlu(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9009   void Vqshlu(DataType dt,
9010               DRegister rd,
9011               DRegister rm,
9012               const DOperand& operand) {
9013     Vqshlu(al, dt, rd, rm, operand);
9014   }
9015 
Vqshlu(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9016   void Vqshlu(Condition cond,
9017               DataType dt,
9018               QRegister rd,
9019               QRegister rm,
9020               const QOperand& operand) {
9021     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9022     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9023     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9024     VIXL_ASSERT(allow_macro_instructions_);
9025     VIXL_ASSERT(OutsideITBlock());
9026     MacroEmissionCheckScope guard(this);
9027     ITScope it_scope(this, &cond);
9028     vqshlu(cond, dt, rd, rm, operand);
9029   }
Vqshlu(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9030   void Vqshlu(DataType dt,
9031               QRegister rd,
9032               QRegister rm,
9033               const QOperand& operand) {
9034     Vqshlu(al, dt, rd, rm, operand);
9035   }
9036 
Vqshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9037   void Vqshrn(Condition cond,
9038               DataType dt,
9039               DRegister rd,
9040               QRegister rm,
9041               const QOperand& operand) {
9042     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9043     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9044     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9045     VIXL_ASSERT(allow_macro_instructions_);
9046     VIXL_ASSERT(OutsideITBlock());
9047     MacroEmissionCheckScope guard(this);
9048     ITScope it_scope(this, &cond);
9049     vqshrn(cond, dt, rd, rm, operand);
9050   }
Vqshrn(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9051   void Vqshrn(DataType dt,
9052               DRegister rd,
9053               QRegister rm,
9054               const QOperand& operand) {
9055     Vqshrn(al, dt, rd, rm, operand);
9056   }
9057 
Vqshrun(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9058   void Vqshrun(Condition cond,
9059                DataType dt,
9060                DRegister rd,
9061                QRegister rm,
9062                const QOperand& operand) {
9063     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9064     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9065     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9066     VIXL_ASSERT(allow_macro_instructions_);
9067     VIXL_ASSERT(OutsideITBlock());
9068     MacroEmissionCheckScope guard(this);
9069     ITScope it_scope(this, &cond);
9070     vqshrun(cond, dt, rd, rm, operand);
9071   }
Vqshrun(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9072   void Vqshrun(DataType dt,
9073                DRegister rd,
9074                QRegister rm,
9075                const QOperand& operand) {
9076     Vqshrun(al, dt, rd, rm, operand);
9077   }
9078 
Vqsub(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)9079   void Vqsub(
9080       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9081     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9082     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9083     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9084     VIXL_ASSERT(allow_macro_instructions_);
9085     VIXL_ASSERT(OutsideITBlock());
9086     MacroEmissionCheckScope guard(this);
9087     ITScope it_scope(this, &cond);
9088     vqsub(cond, dt, rd, rn, rm);
9089   }
Vqsub(DataType dt,DRegister rd,DRegister rn,DRegister rm)9090   void Vqsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9091     Vqsub(al, dt, rd, rn, rm);
9092   }
9093 
Vqsub(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)9094   void Vqsub(
9095       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9096     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9097     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9098     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9099     VIXL_ASSERT(allow_macro_instructions_);
9100     VIXL_ASSERT(OutsideITBlock());
9101     MacroEmissionCheckScope guard(this);
9102     ITScope it_scope(this, &cond);
9103     vqsub(cond, dt, rd, rn, rm);
9104   }
Vqsub(DataType dt,QRegister rd,QRegister rn,QRegister rm)9105   void Vqsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9106     Vqsub(al, dt, rd, rn, rm);
9107   }
9108 
Vraddhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)9109   void Vraddhn(
9110       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9111     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9112     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9113     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9114     VIXL_ASSERT(allow_macro_instructions_);
9115     VIXL_ASSERT(OutsideITBlock());
9116     MacroEmissionCheckScope guard(this);
9117     ITScope it_scope(this, &cond);
9118     vraddhn(cond, dt, rd, rn, rm);
9119   }
Vraddhn(DataType dt,DRegister rd,QRegister rn,QRegister rm)9120   void Vraddhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9121     Vraddhn(al, dt, rd, rn, rm);
9122   }
9123 
Vrecpe(Condition cond,DataType dt,DRegister rd,DRegister rm)9124   void Vrecpe(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9125     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9126     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9127     VIXL_ASSERT(allow_macro_instructions_);
9128     VIXL_ASSERT(OutsideITBlock());
9129     MacroEmissionCheckScope guard(this);
9130     ITScope it_scope(this, &cond);
9131     vrecpe(cond, dt, rd, rm);
9132   }
Vrecpe(DataType dt,DRegister rd,DRegister rm)9133   void Vrecpe(DataType dt, DRegister rd, DRegister rm) {
9134     Vrecpe(al, dt, rd, rm);
9135   }
9136 
Vrecpe(Condition cond,DataType dt,QRegister rd,QRegister rm)9137   void Vrecpe(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9138     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9139     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9140     VIXL_ASSERT(allow_macro_instructions_);
9141     VIXL_ASSERT(OutsideITBlock());
9142     MacroEmissionCheckScope guard(this);
9143     ITScope it_scope(this, &cond);
9144     vrecpe(cond, dt, rd, rm);
9145   }
Vrecpe(DataType dt,QRegister rd,QRegister rm)9146   void Vrecpe(DataType dt, QRegister rd, QRegister rm) {
9147     Vrecpe(al, dt, rd, rm);
9148   }
9149 
Vrecps(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)9150   void Vrecps(
9151       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9152     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9153     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9154     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9155     VIXL_ASSERT(allow_macro_instructions_);
9156     VIXL_ASSERT(OutsideITBlock());
9157     MacroEmissionCheckScope guard(this);
9158     ITScope it_scope(this, &cond);
9159     vrecps(cond, dt, rd, rn, rm);
9160   }
Vrecps(DataType dt,DRegister rd,DRegister rn,DRegister rm)9161   void Vrecps(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9162     Vrecps(al, dt, rd, rn, rm);
9163   }
9164 
Vrecps(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)9165   void Vrecps(
9166       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9167     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9168     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9169     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9170     VIXL_ASSERT(allow_macro_instructions_);
9171     VIXL_ASSERT(OutsideITBlock());
9172     MacroEmissionCheckScope guard(this);
9173     ITScope it_scope(this, &cond);
9174     vrecps(cond, dt, rd, rn, rm);
9175   }
Vrecps(DataType dt,QRegister rd,QRegister rn,QRegister rm)9176   void Vrecps(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9177     Vrecps(al, dt, rd, rn, rm);
9178   }
9179 
Vrev16(Condition cond,DataType dt,DRegister rd,DRegister rm)9180   void Vrev16(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9181     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9182     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9183     VIXL_ASSERT(allow_macro_instructions_);
9184     VIXL_ASSERT(OutsideITBlock());
9185     MacroEmissionCheckScope guard(this);
9186     ITScope it_scope(this, &cond);
9187     vrev16(cond, dt, rd, rm);
9188   }
Vrev16(DataType dt,DRegister rd,DRegister rm)9189   void Vrev16(DataType dt, DRegister rd, DRegister rm) {
9190     Vrev16(al, dt, rd, rm);
9191   }
9192 
Vrev16(Condition cond,DataType dt,QRegister rd,QRegister rm)9193   void Vrev16(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9194     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9195     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9196     VIXL_ASSERT(allow_macro_instructions_);
9197     VIXL_ASSERT(OutsideITBlock());
9198     MacroEmissionCheckScope guard(this);
9199     ITScope it_scope(this, &cond);
9200     vrev16(cond, dt, rd, rm);
9201   }
Vrev16(DataType dt,QRegister rd,QRegister rm)9202   void Vrev16(DataType dt, QRegister rd, QRegister rm) {
9203     Vrev16(al, dt, rd, rm);
9204   }
9205 
Vrev32(Condition cond,DataType dt,DRegister rd,DRegister rm)9206   void Vrev32(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9207     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9208     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9209     VIXL_ASSERT(allow_macro_instructions_);
9210     VIXL_ASSERT(OutsideITBlock());
9211     MacroEmissionCheckScope guard(this);
9212     ITScope it_scope(this, &cond);
9213     vrev32(cond, dt, rd, rm);
9214   }
Vrev32(DataType dt,DRegister rd,DRegister rm)9215   void Vrev32(DataType dt, DRegister rd, DRegister rm) {
9216     Vrev32(al, dt, rd, rm);
9217   }
9218 
Vrev32(Condition cond,DataType dt,QRegister rd,QRegister rm)9219   void Vrev32(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9220     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9221     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9222     VIXL_ASSERT(allow_macro_instructions_);
9223     VIXL_ASSERT(OutsideITBlock());
9224     MacroEmissionCheckScope guard(this);
9225     ITScope it_scope(this, &cond);
9226     vrev32(cond, dt, rd, rm);
9227   }
Vrev32(DataType dt,QRegister rd,QRegister rm)9228   void Vrev32(DataType dt, QRegister rd, QRegister rm) {
9229     Vrev32(al, dt, rd, rm);
9230   }
9231 
Vrev64(Condition cond,DataType dt,DRegister rd,DRegister rm)9232   void Vrev64(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9233     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9234     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9235     VIXL_ASSERT(allow_macro_instructions_);
9236     VIXL_ASSERT(OutsideITBlock());
9237     MacroEmissionCheckScope guard(this);
9238     ITScope it_scope(this, &cond);
9239     vrev64(cond, dt, rd, rm);
9240   }
Vrev64(DataType dt,DRegister rd,DRegister rm)9241   void Vrev64(DataType dt, DRegister rd, DRegister rm) {
9242     Vrev64(al, dt, rd, rm);
9243   }
9244 
Vrev64(Condition cond,DataType dt,QRegister rd,QRegister rm)9245   void Vrev64(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9246     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9247     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9248     VIXL_ASSERT(allow_macro_instructions_);
9249     VIXL_ASSERT(OutsideITBlock());
9250     MacroEmissionCheckScope guard(this);
9251     ITScope it_scope(this, &cond);
9252     vrev64(cond, dt, rd, rm);
9253   }
Vrev64(DataType dt,QRegister rd,QRegister rm)9254   void Vrev64(DataType dt, QRegister rd, QRegister rm) {
9255     Vrev64(al, dt, rd, rm);
9256   }
9257 
Vrhadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)9258   void Vrhadd(
9259       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9260     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9261     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9262     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9263     VIXL_ASSERT(allow_macro_instructions_);
9264     VIXL_ASSERT(OutsideITBlock());
9265     MacroEmissionCheckScope guard(this);
9266     ITScope it_scope(this, &cond);
9267     vrhadd(cond, dt, rd, rn, rm);
9268   }
Vrhadd(DataType dt,DRegister rd,DRegister rn,DRegister rm)9269   void Vrhadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9270     Vrhadd(al, dt, rd, rn, rm);
9271   }
9272 
Vrhadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)9273   void Vrhadd(
9274       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9275     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9276     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9277     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9278     VIXL_ASSERT(allow_macro_instructions_);
9279     VIXL_ASSERT(OutsideITBlock());
9280     MacroEmissionCheckScope guard(this);
9281     ITScope it_scope(this, &cond);
9282     vrhadd(cond, dt, rd, rn, rm);
9283   }
Vrhadd(DataType dt,QRegister rd,QRegister rn,QRegister rm)9284   void Vrhadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9285     Vrhadd(al, dt, rd, rn, rm);
9286   }
9287 
Vrinta(DataType dt1,DataType dt2,DRegister rd,DRegister rm)9288   void Vrinta(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9289     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9290     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9291     VIXL_ASSERT(allow_macro_instructions_);
9292     VIXL_ASSERT(OutsideITBlock());
9293     MacroEmissionCheckScope guard(this);
9294     vrinta(dt1, dt2, rd, rm);
9295   }
9296 
Vrinta(DataType dt1,DataType dt2,QRegister rd,QRegister rm)9297   void Vrinta(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
9298     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9299     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9300     VIXL_ASSERT(allow_macro_instructions_);
9301     VIXL_ASSERT(OutsideITBlock());
9302     MacroEmissionCheckScope guard(this);
9303     vrinta(dt1, dt2, rd, rm);
9304   }
9305 
Vrinta(DataType dt1,DataType dt2,SRegister rd,SRegister rm)9306   void Vrinta(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9307     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9308     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9309     VIXL_ASSERT(allow_macro_instructions_);
9310     VIXL_ASSERT(OutsideITBlock());
9311     MacroEmissionCheckScope guard(this);
9312     vrinta(dt1, dt2, rd, rm);
9313   }
9314 
Vrintm(DataType dt1,DataType dt2,DRegister rd,DRegister rm)9315   void Vrintm(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9316     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9317     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9318     VIXL_ASSERT(allow_macro_instructions_);
9319     VIXL_ASSERT(OutsideITBlock());
9320     MacroEmissionCheckScope guard(this);
9321     vrintm(dt1, dt2, rd, rm);
9322   }
9323 
Vrintm(DataType dt1,DataType dt2,QRegister rd,QRegister rm)9324   void Vrintm(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
9325     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9326     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9327     VIXL_ASSERT(allow_macro_instructions_);
9328     VIXL_ASSERT(OutsideITBlock());
9329     MacroEmissionCheckScope guard(this);
9330     vrintm(dt1, dt2, rd, rm);
9331   }
9332 
Vrintm(DataType dt1,DataType dt2,SRegister rd,SRegister rm)9333   void Vrintm(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9334     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9335     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9336     VIXL_ASSERT(allow_macro_instructions_);
9337     VIXL_ASSERT(OutsideITBlock());
9338     MacroEmissionCheckScope guard(this);
9339     vrintm(dt1, dt2, rd, rm);
9340   }
9341 
Vrintn(DataType dt1,DataType dt2,DRegister rd,DRegister rm)9342   void Vrintn(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9343     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9344     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9345     VIXL_ASSERT(allow_macro_instructions_);
9346     VIXL_ASSERT(OutsideITBlock());
9347     MacroEmissionCheckScope guard(this);
9348     vrintn(dt1, dt2, rd, rm);
9349   }
9350 
Vrintn(DataType dt1,DataType dt2,QRegister rd,QRegister rm)9351   void Vrintn(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
9352     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9353     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9354     VIXL_ASSERT(allow_macro_instructions_);
9355     VIXL_ASSERT(OutsideITBlock());
9356     MacroEmissionCheckScope guard(this);
9357     vrintn(dt1, dt2, rd, rm);
9358   }
9359 
Vrintn(DataType dt1,DataType dt2,SRegister rd,SRegister rm)9360   void Vrintn(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9361     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9362     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9363     VIXL_ASSERT(allow_macro_instructions_);
9364     VIXL_ASSERT(OutsideITBlock());
9365     MacroEmissionCheckScope guard(this);
9366     vrintn(dt1, dt2, rd, rm);
9367   }
9368 
Vrintp(DataType dt1,DataType dt2,DRegister rd,DRegister rm)9369   void Vrintp(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9370     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9371     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9372     VIXL_ASSERT(allow_macro_instructions_);
9373     VIXL_ASSERT(OutsideITBlock());
9374     MacroEmissionCheckScope guard(this);
9375     vrintp(dt1, dt2, rd, rm);
9376   }
9377 
Vrintp(DataType dt1,DataType dt2,QRegister rd,QRegister rm)9378   void Vrintp(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
9379     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9380     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9381     VIXL_ASSERT(allow_macro_instructions_);
9382     VIXL_ASSERT(OutsideITBlock());
9383     MacroEmissionCheckScope guard(this);
9384     vrintp(dt1, dt2, rd, rm);
9385   }
9386 
Vrintp(DataType dt1,DataType dt2,SRegister rd,SRegister rm)9387   void Vrintp(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9388     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9389     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9390     VIXL_ASSERT(allow_macro_instructions_);
9391     VIXL_ASSERT(OutsideITBlock());
9392     MacroEmissionCheckScope guard(this);
9393     vrintp(dt1, dt2, rd, rm);
9394   }
9395 
Vrintr(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)9396   void Vrintr(
9397       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9398     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9399     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9400     VIXL_ASSERT(allow_macro_instructions_);
9401     VIXL_ASSERT(OutsideITBlock());
9402     MacroEmissionCheckScope guard(this);
9403     ITScope it_scope(this, &cond);
9404     vrintr(cond, dt1, dt2, rd, rm);
9405   }
Vrintr(DataType dt1,DataType dt2,SRegister rd,SRegister rm)9406   void Vrintr(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9407     Vrintr(al, dt1, dt2, rd, rm);
9408   }
9409 
Vrintr(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)9410   void Vrintr(
9411       Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9412     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9413     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9414     VIXL_ASSERT(allow_macro_instructions_);
9415     VIXL_ASSERT(OutsideITBlock());
9416     MacroEmissionCheckScope guard(this);
9417     ITScope it_scope(this, &cond);
9418     vrintr(cond, dt1, dt2, rd, rm);
9419   }
Vrintr(DataType dt1,DataType dt2,DRegister rd,DRegister rm)9420   void Vrintr(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9421     Vrintr(al, dt1, dt2, rd, rm);
9422   }
9423 
Vrintx(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)9424   void Vrintx(
9425       Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9426     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9427     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9428     VIXL_ASSERT(allow_macro_instructions_);
9429     VIXL_ASSERT(OutsideITBlock());
9430     MacroEmissionCheckScope guard(this);
9431     ITScope it_scope(this, &cond);
9432     vrintx(cond, dt1, dt2, rd, rm);
9433   }
Vrintx(DataType dt1,DataType dt2,DRegister rd,DRegister rm)9434   void Vrintx(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9435     Vrintx(al, dt1, dt2, rd, rm);
9436   }
9437 
Vrintx(DataType dt1,DataType dt2,QRegister rd,QRegister rm)9438   void Vrintx(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
9439     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9440     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9441     VIXL_ASSERT(allow_macro_instructions_);
9442     VIXL_ASSERT(OutsideITBlock());
9443     MacroEmissionCheckScope guard(this);
9444     vrintx(dt1, dt2, rd, rm);
9445   }
9446 
Vrintx(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)9447   void Vrintx(
9448       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9449     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9450     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9451     VIXL_ASSERT(allow_macro_instructions_);
9452     VIXL_ASSERT(OutsideITBlock());
9453     MacroEmissionCheckScope guard(this);
9454     ITScope it_scope(this, &cond);
9455     vrintx(cond, dt1, dt2, rd, rm);
9456   }
Vrintx(DataType dt1,DataType dt2,SRegister rd,SRegister rm)9457   void Vrintx(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9458     Vrintx(al, dt1, dt2, rd, rm);
9459   }
9460 
Vrintz(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)9461   void Vrintz(
9462       Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9463     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9464     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9465     VIXL_ASSERT(allow_macro_instructions_);
9466     VIXL_ASSERT(OutsideITBlock());
9467     MacroEmissionCheckScope guard(this);
9468     ITScope it_scope(this, &cond);
9469     vrintz(cond, dt1, dt2, rd, rm);
9470   }
Vrintz(DataType dt1,DataType dt2,DRegister rd,DRegister rm)9471   void Vrintz(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9472     Vrintz(al, dt1, dt2, rd, rm);
9473   }
9474 
Vrintz(DataType dt1,DataType dt2,QRegister rd,QRegister rm)9475   void Vrintz(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
9476     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9477     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9478     VIXL_ASSERT(allow_macro_instructions_);
9479     VIXL_ASSERT(OutsideITBlock());
9480     MacroEmissionCheckScope guard(this);
9481     vrintz(dt1, dt2, rd, rm);
9482   }
9483 
Vrintz(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)9484   void Vrintz(
9485       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9486     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9487     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9488     VIXL_ASSERT(allow_macro_instructions_);
9489     VIXL_ASSERT(OutsideITBlock());
9490     MacroEmissionCheckScope guard(this);
9491     ITScope it_scope(this, &cond);
9492     vrintz(cond, dt1, dt2, rd, rm);
9493   }
Vrintz(DataType dt1,DataType dt2,SRegister rd,SRegister rm)9494   void Vrintz(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9495     Vrintz(al, dt1, dt2, rd, rm);
9496   }
9497 
Vrshl(Condition cond,DataType dt,DRegister rd,DRegister rm,DRegister rn)9498   void Vrshl(
9499       Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
9500     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9501     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9502     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9503     VIXL_ASSERT(allow_macro_instructions_);
9504     VIXL_ASSERT(OutsideITBlock());
9505     MacroEmissionCheckScope guard(this);
9506     ITScope it_scope(this, &cond);
9507     vrshl(cond, dt, rd, rm, rn);
9508   }
Vrshl(DataType dt,DRegister rd,DRegister rm,DRegister rn)9509   void Vrshl(DataType dt, DRegister rd, DRegister rm, DRegister rn) {
9510     Vrshl(al, dt, rd, rm, rn);
9511   }
9512 
Vrshl(Condition cond,DataType dt,QRegister rd,QRegister rm,QRegister rn)9513   void Vrshl(
9514       Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
9515     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9516     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9517     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9518     VIXL_ASSERT(allow_macro_instructions_);
9519     VIXL_ASSERT(OutsideITBlock());
9520     MacroEmissionCheckScope guard(this);
9521     ITScope it_scope(this, &cond);
9522     vrshl(cond, dt, rd, rm, rn);
9523   }
Vrshl(DataType dt,QRegister rd,QRegister rm,QRegister rn)9524   void Vrshl(DataType dt, QRegister rd, QRegister rm, QRegister rn) {
9525     Vrshl(al, dt, rd, rm, rn);
9526   }
9527 
Vrshr(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9528   void Vrshr(Condition cond,
9529              DataType dt,
9530              DRegister rd,
9531              DRegister rm,
9532              const DOperand& operand) {
9533     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9534     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9535     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9536     VIXL_ASSERT(allow_macro_instructions_);
9537     VIXL_ASSERT(OutsideITBlock());
9538     MacroEmissionCheckScope guard(this);
9539     ITScope it_scope(this, &cond);
9540     vrshr(cond, dt, rd, rm, operand);
9541   }
Vrshr(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9542   void Vrshr(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9543     Vrshr(al, dt, rd, rm, operand);
9544   }
9545 
Vrshr(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9546   void Vrshr(Condition cond,
9547              DataType dt,
9548              QRegister rd,
9549              QRegister rm,
9550              const QOperand& operand) {
9551     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9552     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9553     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9554     VIXL_ASSERT(allow_macro_instructions_);
9555     VIXL_ASSERT(OutsideITBlock());
9556     MacroEmissionCheckScope guard(this);
9557     ITScope it_scope(this, &cond);
9558     vrshr(cond, dt, rd, rm, operand);
9559   }
Vrshr(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9560   void Vrshr(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9561     Vrshr(al, dt, rd, rm, operand);
9562   }
9563 
Vrshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9564   void Vrshrn(Condition cond,
9565               DataType dt,
9566               DRegister rd,
9567               QRegister rm,
9568               const QOperand& operand) {
9569     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9570     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9571     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9572     VIXL_ASSERT(allow_macro_instructions_);
9573     VIXL_ASSERT(OutsideITBlock());
9574     MacroEmissionCheckScope guard(this);
9575     ITScope it_scope(this, &cond);
9576     vrshrn(cond, dt, rd, rm, operand);
9577   }
Vrshrn(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9578   void Vrshrn(DataType dt,
9579               DRegister rd,
9580               QRegister rm,
9581               const QOperand& operand) {
9582     Vrshrn(al, dt, rd, rm, operand);
9583   }
9584 
Vrsqrte(Condition cond,DataType dt,DRegister rd,DRegister rm)9585   void Vrsqrte(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9586     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9587     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9588     VIXL_ASSERT(allow_macro_instructions_);
9589     VIXL_ASSERT(OutsideITBlock());
9590     MacroEmissionCheckScope guard(this);
9591     ITScope it_scope(this, &cond);
9592     vrsqrte(cond, dt, rd, rm);
9593   }
Vrsqrte(DataType dt,DRegister rd,DRegister rm)9594   void Vrsqrte(DataType dt, DRegister rd, DRegister rm) {
9595     Vrsqrte(al, dt, rd, rm);
9596   }
9597 
Vrsqrte(Condition cond,DataType dt,QRegister rd,QRegister rm)9598   void Vrsqrte(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9599     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9600     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9601     VIXL_ASSERT(allow_macro_instructions_);
9602     VIXL_ASSERT(OutsideITBlock());
9603     MacroEmissionCheckScope guard(this);
9604     ITScope it_scope(this, &cond);
9605     vrsqrte(cond, dt, rd, rm);
9606   }
Vrsqrte(DataType dt,QRegister rd,QRegister rm)9607   void Vrsqrte(DataType dt, QRegister rd, QRegister rm) {
9608     Vrsqrte(al, dt, rd, rm);
9609   }
9610 
Vrsqrts(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)9611   void Vrsqrts(
9612       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9613     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9614     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9615     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9616     VIXL_ASSERT(allow_macro_instructions_);
9617     VIXL_ASSERT(OutsideITBlock());
9618     MacroEmissionCheckScope guard(this);
9619     ITScope it_scope(this, &cond);
9620     vrsqrts(cond, dt, rd, rn, rm);
9621   }
Vrsqrts(DataType dt,DRegister rd,DRegister rn,DRegister rm)9622   void Vrsqrts(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9623     Vrsqrts(al, dt, rd, rn, rm);
9624   }
9625 
Vrsqrts(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)9626   void Vrsqrts(
9627       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9628     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9629     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9630     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9631     VIXL_ASSERT(allow_macro_instructions_);
9632     VIXL_ASSERT(OutsideITBlock());
9633     MacroEmissionCheckScope guard(this);
9634     ITScope it_scope(this, &cond);
9635     vrsqrts(cond, dt, rd, rn, rm);
9636   }
Vrsqrts(DataType dt,QRegister rd,QRegister rn,QRegister rm)9637   void Vrsqrts(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9638     Vrsqrts(al, dt, rd, rn, rm);
9639   }
9640 
Vrsra(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9641   void Vrsra(Condition cond,
9642              DataType dt,
9643              DRegister rd,
9644              DRegister rm,
9645              const DOperand& operand) {
9646     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9647     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9648     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9649     VIXL_ASSERT(allow_macro_instructions_);
9650     VIXL_ASSERT(OutsideITBlock());
9651     MacroEmissionCheckScope guard(this);
9652     ITScope it_scope(this, &cond);
9653     vrsra(cond, dt, rd, rm, operand);
9654   }
Vrsra(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9655   void Vrsra(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9656     Vrsra(al, dt, rd, rm, operand);
9657   }
9658 
Vrsra(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9659   void Vrsra(Condition cond,
9660              DataType dt,
9661              QRegister rd,
9662              QRegister rm,
9663              const QOperand& operand) {
9664     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9665     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9666     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9667     VIXL_ASSERT(allow_macro_instructions_);
9668     VIXL_ASSERT(OutsideITBlock());
9669     MacroEmissionCheckScope guard(this);
9670     ITScope it_scope(this, &cond);
9671     vrsra(cond, dt, rd, rm, operand);
9672   }
Vrsra(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9673   void Vrsra(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9674     Vrsra(al, dt, rd, rm, operand);
9675   }
9676 
Vrsubhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)9677   void Vrsubhn(
9678       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9679     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9680     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9681     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9682     VIXL_ASSERT(allow_macro_instructions_);
9683     VIXL_ASSERT(OutsideITBlock());
9684     MacroEmissionCheckScope guard(this);
9685     ITScope it_scope(this, &cond);
9686     vrsubhn(cond, dt, rd, rn, rm);
9687   }
Vrsubhn(DataType dt,DRegister rd,QRegister rn,QRegister rm)9688   void Vrsubhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9689     Vrsubhn(al, dt, rd, rn, rm);
9690   }
9691 
Vseleq(DataType dt,DRegister rd,DRegister rn,DRegister rm)9692   void Vseleq(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9693     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9694     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9695     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9696     VIXL_ASSERT(allow_macro_instructions_);
9697     VIXL_ASSERT(OutsideITBlock());
9698     MacroEmissionCheckScope guard(this);
9699     vseleq(dt, rd, rn, rm);
9700   }
9701 
Vseleq(DataType dt,SRegister rd,SRegister rn,SRegister rm)9702   void Vseleq(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9703     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9704     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9705     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9706     VIXL_ASSERT(allow_macro_instructions_);
9707     VIXL_ASSERT(OutsideITBlock());
9708     MacroEmissionCheckScope guard(this);
9709     vseleq(dt, rd, rn, rm);
9710   }
9711 
Vselge(DataType dt,DRegister rd,DRegister rn,DRegister rm)9712   void Vselge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9713     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9714     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9715     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9716     VIXL_ASSERT(allow_macro_instructions_);
9717     VIXL_ASSERT(OutsideITBlock());
9718     MacroEmissionCheckScope guard(this);
9719     vselge(dt, rd, rn, rm);
9720   }
9721 
Vselge(DataType dt,SRegister rd,SRegister rn,SRegister rm)9722   void Vselge(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9723     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9724     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9725     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9726     VIXL_ASSERT(allow_macro_instructions_);
9727     VIXL_ASSERT(OutsideITBlock());
9728     MacroEmissionCheckScope guard(this);
9729     vselge(dt, rd, rn, rm);
9730   }
9731 
Vselgt(DataType dt,DRegister rd,DRegister rn,DRegister rm)9732   void Vselgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9733     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9734     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9735     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9736     VIXL_ASSERT(allow_macro_instructions_);
9737     VIXL_ASSERT(OutsideITBlock());
9738     MacroEmissionCheckScope guard(this);
9739     vselgt(dt, rd, rn, rm);
9740   }
9741 
Vselgt(DataType dt,SRegister rd,SRegister rn,SRegister rm)9742   void Vselgt(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9743     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9744     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9745     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9746     VIXL_ASSERT(allow_macro_instructions_);
9747     VIXL_ASSERT(OutsideITBlock());
9748     MacroEmissionCheckScope guard(this);
9749     vselgt(dt, rd, rn, rm);
9750   }
9751 
Vselvs(DataType dt,DRegister rd,DRegister rn,DRegister rm)9752   void Vselvs(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9753     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9754     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9755     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9756     VIXL_ASSERT(allow_macro_instructions_);
9757     VIXL_ASSERT(OutsideITBlock());
9758     MacroEmissionCheckScope guard(this);
9759     vselvs(dt, rd, rn, rm);
9760   }
9761 
Vselvs(DataType dt,SRegister rd,SRegister rn,SRegister rm)9762   void Vselvs(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9763     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9764     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9765     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9766     VIXL_ASSERT(allow_macro_instructions_);
9767     VIXL_ASSERT(OutsideITBlock());
9768     MacroEmissionCheckScope guard(this);
9769     vselvs(dt, rd, rn, rm);
9770   }
9771 
Vshl(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9772   void Vshl(Condition cond,
9773             DataType dt,
9774             DRegister rd,
9775             DRegister rm,
9776             const DOperand& operand) {
9777     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9778     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9779     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9780     VIXL_ASSERT(allow_macro_instructions_);
9781     VIXL_ASSERT(OutsideITBlock());
9782     MacroEmissionCheckScope guard(this);
9783     ITScope it_scope(this, &cond);
9784     vshl(cond, dt, rd, rm, operand);
9785   }
Vshl(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9786   void Vshl(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9787     Vshl(al, dt, rd, rm, operand);
9788   }
9789 
Vshl(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9790   void Vshl(Condition cond,
9791             DataType dt,
9792             QRegister rd,
9793             QRegister rm,
9794             const QOperand& operand) {
9795     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9796     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9797     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9798     VIXL_ASSERT(allow_macro_instructions_);
9799     VIXL_ASSERT(OutsideITBlock());
9800     MacroEmissionCheckScope guard(this);
9801     ITScope it_scope(this, &cond);
9802     vshl(cond, dt, rd, rm, operand);
9803   }
Vshl(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9804   void Vshl(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9805     Vshl(al, dt, rd, rm, operand);
9806   }
9807 
Vshll(Condition cond,DataType dt,QRegister rd,DRegister rm,const DOperand & operand)9808   void Vshll(Condition cond,
9809              DataType dt,
9810              QRegister rd,
9811              DRegister rm,
9812              const DOperand& operand) {
9813     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9814     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9815     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9816     VIXL_ASSERT(allow_macro_instructions_);
9817     VIXL_ASSERT(OutsideITBlock());
9818     MacroEmissionCheckScope guard(this);
9819     ITScope it_scope(this, &cond);
9820     vshll(cond, dt, rd, rm, operand);
9821   }
Vshll(DataType dt,QRegister rd,DRegister rm,const DOperand & operand)9822   void Vshll(DataType dt, QRegister rd, DRegister rm, const DOperand& operand) {
9823     Vshll(al, dt, rd, rm, operand);
9824   }
9825 
Vshr(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9826   void Vshr(Condition cond,
9827             DataType dt,
9828             DRegister rd,
9829             DRegister rm,
9830             const DOperand& operand) {
9831     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9832     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9833     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9834     VIXL_ASSERT(allow_macro_instructions_);
9835     VIXL_ASSERT(OutsideITBlock());
9836     MacroEmissionCheckScope guard(this);
9837     ITScope it_scope(this, &cond);
9838     vshr(cond, dt, rd, rm, operand);
9839   }
Vshr(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9840   void Vshr(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9841     Vshr(al, dt, rd, rm, operand);
9842   }
9843 
Vshr(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9844   void Vshr(Condition cond,
9845             DataType dt,
9846             QRegister rd,
9847             QRegister rm,
9848             const QOperand& operand) {
9849     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9850     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9851     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9852     VIXL_ASSERT(allow_macro_instructions_);
9853     VIXL_ASSERT(OutsideITBlock());
9854     MacroEmissionCheckScope guard(this);
9855     ITScope it_scope(this, &cond);
9856     vshr(cond, dt, rd, rm, operand);
9857   }
Vshr(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9858   void Vshr(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9859     Vshr(al, dt, rd, rm, operand);
9860   }
9861 
Vshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9862   void Vshrn(Condition cond,
9863              DataType dt,
9864              DRegister rd,
9865              QRegister rm,
9866              const QOperand& operand) {
9867     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9868     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9869     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9870     VIXL_ASSERT(allow_macro_instructions_);
9871     VIXL_ASSERT(OutsideITBlock());
9872     MacroEmissionCheckScope guard(this);
9873     ITScope it_scope(this, &cond);
9874     vshrn(cond, dt, rd, rm, operand);
9875   }
Vshrn(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9876   void Vshrn(DataType dt, DRegister rd, QRegister rm, const QOperand& operand) {
9877     Vshrn(al, dt, rd, rm, operand);
9878   }
9879 
Vsli(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9880   void Vsli(Condition cond,
9881             DataType dt,
9882             DRegister rd,
9883             DRegister rm,
9884             const DOperand& operand) {
9885     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9886     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9887     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9888     VIXL_ASSERT(allow_macro_instructions_);
9889     VIXL_ASSERT(OutsideITBlock());
9890     MacroEmissionCheckScope guard(this);
9891     ITScope it_scope(this, &cond);
9892     vsli(cond, dt, rd, rm, operand);
9893   }
Vsli(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9894   void Vsli(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9895     Vsli(al, dt, rd, rm, operand);
9896   }
9897 
Vsli(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9898   void Vsli(Condition cond,
9899             DataType dt,
9900             QRegister rd,
9901             QRegister rm,
9902             const QOperand& operand) {
9903     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9904     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9905     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9906     VIXL_ASSERT(allow_macro_instructions_);
9907     VIXL_ASSERT(OutsideITBlock());
9908     MacroEmissionCheckScope guard(this);
9909     ITScope it_scope(this, &cond);
9910     vsli(cond, dt, rd, rm, operand);
9911   }
Vsli(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9912   void Vsli(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9913     Vsli(al, dt, rd, rm, operand);
9914   }
9915 
Vsqrt(Condition cond,DataType dt,SRegister rd,SRegister rm)9916   void Vsqrt(Condition cond, DataType dt, SRegister rd, SRegister rm) {
9917     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9918     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9919     VIXL_ASSERT(allow_macro_instructions_);
9920     VIXL_ASSERT(OutsideITBlock());
9921     MacroEmissionCheckScope guard(this);
9922     ITScope it_scope(this, &cond);
9923     vsqrt(cond, dt, rd, rm);
9924   }
Vsqrt(DataType dt,SRegister rd,SRegister rm)9925   void Vsqrt(DataType dt, SRegister rd, SRegister rm) { Vsqrt(al, dt, rd, rm); }
9926 
Vsqrt(Condition cond,DataType dt,DRegister rd,DRegister rm)9927   void Vsqrt(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9928     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9929     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9930     VIXL_ASSERT(allow_macro_instructions_);
9931     VIXL_ASSERT(OutsideITBlock());
9932     MacroEmissionCheckScope guard(this);
9933     ITScope it_scope(this, &cond);
9934     vsqrt(cond, dt, rd, rm);
9935   }
Vsqrt(DataType dt,DRegister rd,DRegister rm)9936   void Vsqrt(DataType dt, DRegister rd, DRegister rm) { Vsqrt(al, dt, rd, rm); }
9937 
Vsra(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9938   void Vsra(Condition cond,
9939             DataType dt,
9940             DRegister rd,
9941             DRegister rm,
9942             const DOperand& operand) {
9943     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9944     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9945     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9946     VIXL_ASSERT(allow_macro_instructions_);
9947     VIXL_ASSERT(OutsideITBlock());
9948     MacroEmissionCheckScope guard(this);
9949     ITScope it_scope(this, &cond);
9950     vsra(cond, dt, rd, rm, operand);
9951   }
Vsra(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9952   void Vsra(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9953     Vsra(al, dt, rd, rm, operand);
9954   }
9955 
Vsra(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9956   void Vsra(Condition cond,
9957             DataType dt,
9958             QRegister rd,
9959             QRegister rm,
9960             const QOperand& operand) {
9961     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9962     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9963     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9964     VIXL_ASSERT(allow_macro_instructions_);
9965     VIXL_ASSERT(OutsideITBlock());
9966     MacroEmissionCheckScope guard(this);
9967     ITScope it_scope(this, &cond);
9968     vsra(cond, dt, rd, rm, operand);
9969   }
Vsra(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9970   void Vsra(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9971     Vsra(al, dt, rd, rm, operand);
9972   }
9973 
Vsri(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9974   void Vsri(Condition cond,
9975             DataType dt,
9976             DRegister rd,
9977             DRegister rm,
9978             const DOperand& operand) {
9979     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9980     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9981     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9982     VIXL_ASSERT(allow_macro_instructions_);
9983     VIXL_ASSERT(OutsideITBlock());
9984     MacroEmissionCheckScope guard(this);
9985     ITScope it_scope(this, &cond);
9986     vsri(cond, dt, rd, rm, operand);
9987   }
Vsri(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9988   void Vsri(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9989     Vsri(al, dt, rd, rm, operand);
9990   }
9991 
Vsri(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9992   void Vsri(Condition cond,
9993             DataType dt,
9994             QRegister rd,
9995             QRegister rm,
9996             const QOperand& operand) {
9997     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9998     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9999     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10000     VIXL_ASSERT(allow_macro_instructions_);
10001     VIXL_ASSERT(OutsideITBlock());
10002     MacroEmissionCheckScope guard(this);
10003     ITScope it_scope(this, &cond);
10004     vsri(cond, dt, rd, rm, operand);
10005   }
Vsri(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)10006   void Vsri(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
10007     Vsri(al, dt, rd, rm, operand);
10008   }
10009 
Vst1(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)10010   void Vst1(Condition cond,
10011             DataType dt,
10012             const NeonRegisterList& nreglist,
10013             const AlignedMemOperand& operand) {
10014     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10015     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10016     VIXL_ASSERT(allow_macro_instructions_);
10017     VIXL_ASSERT(OutsideITBlock());
10018     MacroEmissionCheckScope guard(this);
10019     ITScope it_scope(this, &cond);
10020     vst1(cond, dt, nreglist, operand);
10021   }
Vst1(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)10022   void Vst1(DataType dt,
10023             const NeonRegisterList& nreglist,
10024             const AlignedMemOperand& operand) {
10025     Vst1(al, dt, nreglist, operand);
10026   }
10027 
Vst2(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)10028   void Vst2(Condition cond,
10029             DataType dt,
10030             const NeonRegisterList& nreglist,
10031             const AlignedMemOperand& operand) {
10032     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10033     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10034     VIXL_ASSERT(allow_macro_instructions_);
10035     VIXL_ASSERT(OutsideITBlock());
10036     MacroEmissionCheckScope guard(this);
10037     ITScope it_scope(this, &cond);
10038     vst2(cond, dt, nreglist, operand);
10039   }
Vst2(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)10040   void Vst2(DataType dt,
10041             const NeonRegisterList& nreglist,
10042             const AlignedMemOperand& operand) {
10043     Vst2(al, dt, nreglist, operand);
10044   }
10045 
Vst3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)10046   void Vst3(Condition cond,
10047             DataType dt,
10048             const NeonRegisterList& nreglist,
10049             const AlignedMemOperand& operand) {
10050     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10051     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10052     VIXL_ASSERT(allow_macro_instructions_);
10053     VIXL_ASSERT(OutsideITBlock());
10054     MacroEmissionCheckScope guard(this);
10055     ITScope it_scope(this, &cond);
10056     vst3(cond, dt, nreglist, operand);
10057   }
Vst3(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)10058   void Vst3(DataType dt,
10059             const NeonRegisterList& nreglist,
10060             const AlignedMemOperand& operand) {
10061     Vst3(al, dt, nreglist, operand);
10062   }
10063 
Vst3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)10064   void Vst3(Condition cond,
10065             DataType dt,
10066             const NeonRegisterList& nreglist,
10067             const MemOperand& operand) {
10068     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10069     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10070     VIXL_ASSERT(allow_macro_instructions_);
10071     VIXL_ASSERT(OutsideITBlock());
10072     MacroEmissionCheckScope guard(this);
10073     ITScope it_scope(this, &cond);
10074     vst3(cond, dt, nreglist, operand);
10075   }
Vst3(DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)10076   void Vst3(DataType dt,
10077             const NeonRegisterList& nreglist,
10078             const MemOperand& operand) {
10079     Vst3(al, dt, nreglist, operand);
10080   }
10081 
Vst4(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)10082   void Vst4(Condition cond,
10083             DataType dt,
10084             const NeonRegisterList& nreglist,
10085             const AlignedMemOperand& operand) {
10086     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10087     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10088     VIXL_ASSERT(allow_macro_instructions_);
10089     VIXL_ASSERT(OutsideITBlock());
10090     MacroEmissionCheckScope guard(this);
10091     ITScope it_scope(this, &cond);
10092     vst4(cond, dt, nreglist, operand);
10093   }
Vst4(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)10094   void Vst4(DataType dt,
10095             const NeonRegisterList& nreglist,
10096             const AlignedMemOperand& operand) {
10097     Vst4(al, dt, nreglist, operand);
10098   }
10099 
Vstm(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10100   void Vstm(Condition cond,
10101             DataType dt,
10102             Register rn,
10103             WriteBack write_back,
10104             DRegisterList dreglist) {
10105     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10106     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
10107     VIXL_ASSERT(allow_macro_instructions_);
10108     VIXL_ASSERT(OutsideITBlock());
10109     MacroEmissionCheckScope guard(this);
10110     ITScope it_scope(this, &cond);
10111     vstm(cond, dt, rn, write_back, dreglist);
10112   }
Vstm(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10113   void Vstm(DataType dt,
10114             Register rn,
10115             WriteBack write_back,
10116             DRegisterList dreglist) {
10117     Vstm(al, dt, rn, write_back, dreglist);
10118   }
Vstm(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)10119   void Vstm(Condition cond,
10120             Register rn,
10121             WriteBack write_back,
10122             DRegisterList dreglist) {
10123     Vstm(cond, kDataTypeValueNone, rn, write_back, dreglist);
10124   }
Vstm(Register rn,WriteBack write_back,DRegisterList dreglist)10125   void Vstm(Register rn, WriteBack write_back, DRegisterList dreglist) {
10126     Vstm(al, kDataTypeValueNone, rn, write_back, dreglist);
10127   }
10128 
Vstm(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10129   void Vstm(Condition cond,
10130             DataType dt,
10131             Register rn,
10132             WriteBack write_back,
10133             SRegisterList sreglist) {
10134     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10135     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
10136     VIXL_ASSERT(allow_macro_instructions_);
10137     VIXL_ASSERT(OutsideITBlock());
10138     MacroEmissionCheckScope guard(this);
10139     ITScope it_scope(this, &cond);
10140     vstm(cond, dt, rn, write_back, sreglist);
10141   }
Vstm(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10142   void Vstm(DataType dt,
10143             Register rn,
10144             WriteBack write_back,
10145             SRegisterList sreglist) {
10146     Vstm(al, dt, rn, write_back, sreglist);
10147   }
Vstm(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)10148   void Vstm(Condition cond,
10149             Register rn,
10150             WriteBack write_back,
10151             SRegisterList sreglist) {
10152     Vstm(cond, kDataTypeValueNone, rn, write_back, sreglist);
10153   }
Vstm(Register rn,WriteBack write_back,SRegisterList sreglist)10154   void Vstm(Register rn, WriteBack write_back, SRegisterList sreglist) {
10155     Vstm(al, kDataTypeValueNone, rn, write_back, sreglist);
10156   }
10157 
Vstmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10158   void Vstmdb(Condition cond,
10159               DataType dt,
10160               Register rn,
10161               WriteBack write_back,
10162               DRegisterList dreglist) {
10163     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10164     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
10165     VIXL_ASSERT(allow_macro_instructions_);
10166     VIXL_ASSERT(OutsideITBlock());
10167     MacroEmissionCheckScope guard(this);
10168     ITScope it_scope(this, &cond);
10169     vstmdb(cond, dt, rn, write_back, dreglist);
10170   }
Vstmdb(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10171   void Vstmdb(DataType dt,
10172               Register rn,
10173               WriteBack write_back,
10174               DRegisterList dreglist) {
10175     Vstmdb(al, dt, rn, write_back, dreglist);
10176   }
Vstmdb(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)10177   void Vstmdb(Condition cond,
10178               Register rn,
10179               WriteBack write_back,
10180               DRegisterList dreglist) {
10181     Vstmdb(cond, kDataTypeValueNone, rn, write_back, dreglist);
10182   }
Vstmdb(Register rn,WriteBack write_back,DRegisterList dreglist)10183   void Vstmdb(Register rn, WriteBack write_back, DRegisterList dreglist) {
10184     Vstmdb(al, kDataTypeValueNone, rn, write_back, dreglist);
10185   }
10186 
Vstmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10187   void Vstmdb(Condition cond,
10188               DataType dt,
10189               Register rn,
10190               WriteBack write_back,
10191               SRegisterList sreglist) {
10192     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10193     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
10194     VIXL_ASSERT(allow_macro_instructions_);
10195     VIXL_ASSERT(OutsideITBlock());
10196     MacroEmissionCheckScope guard(this);
10197     ITScope it_scope(this, &cond);
10198     vstmdb(cond, dt, rn, write_back, sreglist);
10199   }
Vstmdb(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10200   void Vstmdb(DataType dt,
10201               Register rn,
10202               WriteBack write_back,
10203               SRegisterList sreglist) {
10204     Vstmdb(al, dt, rn, write_back, sreglist);
10205   }
Vstmdb(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)10206   void Vstmdb(Condition cond,
10207               Register rn,
10208               WriteBack write_back,
10209               SRegisterList sreglist) {
10210     Vstmdb(cond, kDataTypeValueNone, rn, write_back, sreglist);
10211   }
Vstmdb(Register rn,WriteBack write_back,SRegisterList sreglist)10212   void Vstmdb(Register rn, WriteBack write_back, SRegisterList sreglist) {
10213     Vstmdb(al, kDataTypeValueNone, rn, write_back, sreglist);
10214   }
10215 
Vstmia(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10216   void Vstmia(Condition cond,
10217               DataType dt,
10218               Register rn,
10219               WriteBack write_back,
10220               DRegisterList dreglist) {
10221     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10222     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
10223     VIXL_ASSERT(allow_macro_instructions_);
10224     VIXL_ASSERT(OutsideITBlock());
10225     MacroEmissionCheckScope guard(this);
10226     ITScope it_scope(this, &cond);
10227     vstmia(cond, dt, rn, write_back, dreglist);
10228   }
Vstmia(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10229   void Vstmia(DataType dt,
10230               Register rn,
10231               WriteBack write_back,
10232               DRegisterList dreglist) {
10233     Vstmia(al, dt, rn, write_back, dreglist);
10234   }
Vstmia(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)10235   void Vstmia(Condition cond,
10236               Register rn,
10237               WriteBack write_back,
10238               DRegisterList dreglist) {
10239     Vstmia(cond, kDataTypeValueNone, rn, write_back, dreglist);
10240   }
Vstmia(Register rn,WriteBack write_back,DRegisterList dreglist)10241   void Vstmia(Register rn, WriteBack write_back, DRegisterList dreglist) {
10242     Vstmia(al, kDataTypeValueNone, rn, write_back, dreglist);
10243   }
10244 
Vstmia(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10245   void Vstmia(Condition cond,
10246               DataType dt,
10247               Register rn,
10248               WriteBack write_back,
10249               SRegisterList sreglist) {
10250     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10251     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
10252     VIXL_ASSERT(allow_macro_instructions_);
10253     VIXL_ASSERT(OutsideITBlock());
10254     MacroEmissionCheckScope guard(this);
10255     ITScope it_scope(this, &cond);
10256     vstmia(cond, dt, rn, write_back, sreglist);
10257   }
Vstmia(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10258   void Vstmia(DataType dt,
10259               Register rn,
10260               WriteBack write_back,
10261               SRegisterList sreglist) {
10262     Vstmia(al, dt, rn, write_back, sreglist);
10263   }
Vstmia(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)10264   void Vstmia(Condition cond,
10265               Register rn,
10266               WriteBack write_back,
10267               SRegisterList sreglist) {
10268     Vstmia(cond, kDataTypeValueNone, rn, write_back, sreglist);
10269   }
Vstmia(Register rn,WriteBack write_back,SRegisterList sreglist)10270   void Vstmia(Register rn, WriteBack write_back, SRegisterList sreglist) {
10271     Vstmia(al, kDataTypeValueNone, rn, write_back, sreglist);
10272   }
10273 
Vstr(Condition cond,DataType dt,DRegister rd,const MemOperand & operand)10274   void Vstr(Condition cond,
10275             DataType dt,
10276             DRegister rd,
10277             const MemOperand& operand) {
10278     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10279     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10280     VIXL_ASSERT(allow_macro_instructions_);
10281     VIXL_ASSERT(OutsideITBlock());
10282     MacroEmissionCheckScope guard(this);
10283     ITScope it_scope(this, &cond);
10284     vstr(cond, dt, rd, operand);
10285   }
Vstr(DataType dt,DRegister rd,const MemOperand & operand)10286   void Vstr(DataType dt, DRegister rd, const MemOperand& operand) {
10287     Vstr(al, dt, rd, operand);
10288   }
Vstr(Condition cond,DRegister rd,const MemOperand & operand)10289   void Vstr(Condition cond, DRegister rd, const MemOperand& operand) {
10290     Vstr(cond, Untyped64, rd, operand);
10291   }
Vstr(DRegister rd,const MemOperand & operand)10292   void Vstr(DRegister rd, const MemOperand& operand) {
10293     Vstr(al, Untyped64, rd, operand);
10294   }
10295 
Vstr(Condition cond,DataType dt,SRegister rd,const MemOperand & operand)10296   void Vstr(Condition cond,
10297             DataType dt,
10298             SRegister rd,
10299             const MemOperand& operand) {
10300     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10301     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10302     VIXL_ASSERT(allow_macro_instructions_);
10303     VIXL_ASSERT(OutsideITBlock());
10304     MacroEmissionCheckScope guard(this);
10305     ITScope it_scope(this, &cond);
10306     vstr(cond, dt, rd, operand);
10307   }
Vstr(DataType dt,SRegister rd,const MemOperand & operand)10308   void Vstr(DataType dt, SRegister rd, const MemOperand& operand) {
10309     Vstr(al, dt, rd, operand);
10310   }
Vstr(Condition cond,SRegister rd,const MemOperand & operand)10311   void Vstr(Condition cond, SRegister rd, const MemOperand& operand) {
10312     Vstr(cond, Untyped32, rd, operand);
10313   }
Vstr(SRegister rd,const MemOperand & operand)10314   void Vstr(SRegister rd, const MemOperand& operand) {
10315     Vstr(al, Untyped32, rd, operand);
10316   }
10317 
Vsub(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)10318   void Vsub(
10319       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10320     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10321     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10322     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10323     VIXL_ASSERT(allow_macro_instructions_);
10324     VIXL_ASSERT(OutsideITBlock());
10325     MacroEmissionCheckScope guard(this);
10326     ITScope it_scope(this, &cond);
10327     vsub(cond, dt, rd, rn, rm);
10328   }
Vsub(DataType dt,DRegister rd,DRegister rn,DRegister rm)10329   void Vsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10330     Vsub(al, dt, rd, rn, rm);
10331   }
10332 
Vsub(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)10333   void Vsub(
10334       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10335     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10336     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10337     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10338     VIXL_ASSERT(allow_macro_instructions_);
10339     VIXL_ASSERT(OutsideITBlock());
10340     MacroEmissionCheckScope guard(this);
10341     ITScope it_scope(this, &cond);
10342     vsub(cond, dt, rd, rn, rm);
10343   }
Vsub(DataType dt,QRegister rd,QRegister rn,QRegister rm)10344   void Vsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10345     Vsub(al, dt, rd, rn, rm);
10346   }
10347 
Vsub(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)10348   void Vsub(
10349       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
10350     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10351     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10352     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10353     VIXL_ASSERT(allow_macro_instructions_);
10354     VIXL_ASSERT(OutsideITBlock());
10355     MacroEmissionCheckScope guard(this);
10356     ITScope it_scope(this, &cond);
10357     vsub(cond, dt, rd, rn, rm);
10358   }
Vsub(DataType dt,SRegister rd,SRegister rn,SRegister rm)10359   void Vsub(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
10360     Vsub(al, dt, rd, rn, rm);
10361   }
10362 
Vsubhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)10363   void Vsubhn(
10364       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
10365     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10366     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10367     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10368     VIXL_ASSERT(allow_macro_instructions_);
10369     VIXL_ASSERT(OutsideITBlock());
10370     MacroEmissionCheckScope guard(this);
10371     ITScope it_scope(this, &cond);
10372     vsubhn(cond, dt, rd, rn, rm);
10373   }
Vsubhn(DataType dt,DRegister rd,QRegister rn,QRegister rm)10374   void Vsubhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
10375     Vsubhn(al, dt, rd, rn, rm);
10376   }
10377 
Vsubl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)10378   void Vsubl(
10379       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
10380     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10381     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10382     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10383     VIXL_ASSERT(allow_macro_instructions_);
10384     VIXL_ASSERT(OutsideITBlock());
10385     MacroEmissionCheckScope guard(this);
10386     ITScope it_scope(this, &cond);
10387     vsubl(cond, dt, rd, rn, rm);
10388   }
Vsubl(DataType dt,QRegister rd,DRegister rn,DRegister rm)10389   void Vsubl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
10390     Vsubl(al, dt, rd, rn, rm);
10391   }
10392 
Vsubw(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegister rm)10393   void Vsubw(
10394       Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
10395     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10396     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10397     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10398     VIXL_ASSERT(allow_macro_instructions_);
10399     VIXL_ASSERT(OutsideITBlock());
10400     MacroEmissionCheckScope guard(this);
10401     ITScope it_scope(this, &cond);
10402     vsubw(cond, dt, rd, rn, rm);
10403   }
Vsubw(DataType dt,QRegister rd,QRegister rn,DRegister rm)10404   void Vsubw(DataType dt, QRegister rd, QRegister rn, DRegister rm) {
10405     Vsubw(al, dt, rd, rn, rm);
10406   }
10407 
Vswp(Condition cond,DataType dt,DRegister rd,DRegister rm)10408   void Vswp(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10409     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10410     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10411     VIXL_ASSERT(allow_macro_instructions_);
10412     VIXL_ASSERT(OutsideITBlock());
10413     MacroEmissionCheckScope guard(this);
10414     ITScope it_scope(this, &cond);
10415     vswp(cond, dt, rd, rm);
10416   }
Vswp(DataType dt,DRegister rd,DRegister rm)10417   void Vswp(DataType dt, DRegister rd, DRegister rm) { Vswp(al, dt, rd, rm); }
Vswp(Condition cond,DRegister rd,DRegister rm)10418   void Vswp(Condition cond, DRegister rd, DRegister rm) {
10419     Vswp(cond, kDataTypeValueNone, rd, rm);
10420   }
Vswp(DRegister rd,DRegister rm)10421   void Vswp(DRegister rd, DRegister rm) {
10422     Vswp(al, kDataTypeValueNone, rd, rm);
10423   }
10424 
Vswp(Condition cond,DataType dt,QRegister rd,QRegister rm)10425   void Vswp(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10426     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10427     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10428     VIXL_ASSERT(allow_macro_instructions_);
10429     VIXL_ASSERT(OutsideITBlock());
10430     MacroEmissionCheckScope guard(this);
10431     ITScope it_scope(this, &cond);
10432     vswp(cond, dt, rd, rm);
10433   }
Vswp(DataType dt,QRegister rd,QRegister rm)10434   void Vswp(DataType dt, QRegister rd, QRegister rm) { Vswp(al, dt, rd, rm); }
Vswp(Condition cond,QRegister rd,QRegister rm)10435   void Vswp(Condition cond, QRegister rd, QRegister rm) {
10436     Vswp(cond, kDataTypeValueNone, rd, rm);
10437   }
Vswp(QRegister rd,QRegister rm)10438   void Vswp(QRegister rd, QRegister rm) {
10439     Vswp(al, kDataTypeValueNone, rd, rm);
10440   }
10441 
Vtbl(Condition cond,DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)10442   void Vtbl(Condition cond,
10443             DataType dt,
10444             DRegister rd,
10445             const NeonRegisterList& nreglist,
10446             DRegister rm) {
10447     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10448     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10449     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10450     VIXL_ASSERT(allow_macro_instructions_);
10451     VIXL_ASSERT(OutsideITBlock());
10452     MacroEmissionCheckScope guard(this);
10453     ITScope it_scope(this, &cond);
10454     vtbl(cond, dt, rd, nreglist, rm);
10455   }
Vtbl(DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)10456   void Vtbl(DataType dt,
10457             DRegister rd,
10458             const NeonRegisterList& nreglist,
10459             DRegister rm) {
10460     Vtbl(al, dt, rd, nreglist, rm);
10461   }
10462 
Vtbx(Condition cond,DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)10463   void Vtbx(Condition cond,
10464             DataType dt,
10465             DRegister rd,
10466             const NeonRegisterList& nreglist,
10467             DRegister rm) {
10468     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10469     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10470     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10471     VIXL_ASSERT(allow_macro_instructions_);
10472     VIXL_ASSERT(OutsideITBlock());
10473     MacroEmissionCheckScope guard(this);
10474     ITScope it_scope(this, &cond);
10475     vtbx(cond, dt, rd, nreglist, rm);
10476   }
Vtbx(DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)10477   void Vtbx(DataType dt,
10478             DRegister rd,
10479             const NeonRegisterList& nreglist,
10480             DRegister rm) {
10481     Vtbx(al, dt, rd, nreglist, rm);
10482   }
10483 
Vtrn(Condition cond,DataType dt,DRegister rd,DRegister rm)10484   void Vtrn(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10485     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10486     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10487     VIXL_ASSERT(allow_macro_instructions_);
10488     VIXL_ASSERT(OutsideITBlock());
10489     MacroEmissionCheckScope guard(this);
10490     ITScope it_scope(this, &cond);
10491     vtrn(cond, dt, rd, rm);
10492   }
Vtrn(DataType dt,DRegister rd,DRegister rm)10493   void Vtrn(DataType dt, DRegister rd, DRegister rm) { Vtrn(al, dt, rd, rm); }
10494 
Vtrn(Condition cond,DataType dt,QRegister rd,QRegister rm)10495   void Vtrn(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10496     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10497     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10498     VIXL_ASSERT(allow_macro_instructions_);
10499     VIXL_ASSERT(OutsideITBlock());
10500     MacroEmissionCheckScope guard(this);
10501     ITScope it_scope(this, &cond);
10502     vtrn(cond, dt, rd, rm);
10503   }
Vtrn(DataType dt,QRegister rd,QRegister rm)10504   void Vtrn(DataType dt, QRegister rd, QRegister rm) { Vtrn(al, dt, rd, rm); }
10505 
Vtst(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)10506   void Vtst(
10507       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10508     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10509     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10510     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10511     VIXL_ASSERT(allow_macro_instructions_);
10512     VIXL_ASSERT(OutsideITBlock());
10513     MacroEmissionCheckScope guard(this);
10514     ITScope it_scope(this, &cond);
10515     vtst(cond, dt, rd, rn, rm);
10516   }
Vtst(DataType dt,DRegister rd,DRegister rn,DRegister rm)10517   void Vtst(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10518     Vtst(al, dt, rd, rn, rm);
10519   }
10520 
Vtst(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)10521   void Vtst(
10522       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10523     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10524     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10525     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10526     VIXL_ASSERT(allow_macro_instructions_);
10527     VIXL_ASSERT(OutsideITBlock());
10528     MacroEmissionCheckScope guard(this);
10529     ITScope it_scope(this, &cond);
10530     vtst(cond, dt, rd, rn, rm);
10531   }
Vtst(DataType dt,QRegister rd,QRegister rn,QRegister rm)10532   void Vtst(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10533     Vtst(al, dt, rd, rn, rm);
10534   }
10535 
Vuzp(Condition cond,DataType dt,DRegister rd,DRegister rm)10536   void Vuzp(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10537     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10538     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10539     VIXL_ASSERT(allow_macro_instructions_);
10540     VIXL_ASSERT(OutsideITBlock());
10541     MacroEmissionCheckScope guard(this);
10542     ITScope it_scope(this, &cond);
10543     vuzp(cond, dt, rd, rm);
10544   }
Vuzp(DataType dt,DRegister rd,DRegister rm)10545   void Vuzp(DataType dt, DRegister rd, DRegister rm) { Vuzp(al, dt, rd, rm); }
10546 
Vuzp(Condition cond,DataType dt,QRegister rd,QRegister rm)10547   void Vuzp(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10548     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10549     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10550     VIXL_ASSERT(allow_macro_instructions_);
10551     VIXL_ASSERT(OutsideITBlock());
10552     MacroEmissionCheckScope guard(this);
10553     ITScope it_scope(this, &cond);
10554     vuzp(cond, dt, rd, rm);
10555   }
Vuzp(DataType dt,QRegister rd,QRegister rm)10556   void Vuzp(DataType dt, QRegister rd, QRegister rm) { Vuzp(al, dt, rd, rm); }
10557 
Vzip(Condition cond,DataType dt,DRegister rd,DRegister rm)10558   void Vzip(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10559     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10560     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10561     VIXL_ASSERT(allow_macro_instructions_);
10562     VIXL_ASSERT(OutsideITBlock());
10563     MacroEmissionCheckScope guard(this);
10564     ITScope it_scope(this, &cond);
10565     vzip(cond, dt, rd, rm);
10566   }
Vzip(DataType dt,DRegister rd,DRegister rm)10567   void Vzip(DataType dt, DRegister rd, DRegister rm) { Vzip(al, dt, rd, rm); }
10568 
Vzip(Condition cond,DataType dt,QRegister rd,QRegister rm)10569   void Vzip(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10570     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10571     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10572     VIXL_ASSERT(allow_macro_instructions_);
10573     VIXL_ASSERT(OutsideITBlock());
10574     MacroEmissionCheckScope guard(this);
10575     ITScope it_scope(this, &cond);
10576     vzip(cond, dt, rd, rm);
10577   }
Vzip(DataType dt,QRegister rd,QRegister rm)10578   void Vzip(DataType dt, QRegister rd, QRegister rm) { Vzip(al, dt, rd, rm); }
10579 
Yield(Condition cond)10580   void Yield(Condition cond) {
10581     VIXL_ASSERT(allow_macro_instructions_);
10582     VIXL_ASSERT(OutsideITBlock());
10583     MacroEmissionCheckScope guard(this);
10584     ITScope it_scope(this, &cond);
10585     yield(cond);
10586   }
Yield()10587   void Yield() { Yield(al); }
Vabs(Condition cond,VRegister rd,VRegister rm)10588   void Vabs(Condition cond, VRegister rd, VRegister rm) {
10589     VIXL_ASSERT(rd.IsS() || rd.IsD());
10590     VIXL_ASSERT(rd.GetType() == rm.GetType());
10591     if (rd.IsS()) {
10592       Vabs(cond, F32, rd.S(), rm.S());
10593     } else {
10594       Vabs(cond, F64, rd.D(), rm.D());
10595     }
10596   }
Vabs(VRegister rd,VRegister rm)10597   void Vabs(VRegister rd, VRegister rm) { Vabs(al, rd, rm); }
Vadd(Condition cond,VRegister rd,VRegister rn,VRegister rm)10598   void Vadd(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10599     VIXL_ASSERT(rd.IsS() || rd.IsD());
10600     VIXL_ASSERT(rd.GetType() == rn.GetType());
10601     VIXL_ASSERT(rd.GetType() == rm.GetType());
10602     if (rd.IsS()) {
10603       Vadd(cond, F32, rd.S(), rn.S(), rm.S());
10604     } else {
10605       Vadd(cond, F64, rd.D(), rn.D(), rm.D());
10606     }
10607   }
Vadd(VRegister rd,VRegister rn,VRegister rm)10608   void Vadd(VRegister rd, VRegister rn, VRegister rm) { Vadd(al, rd, rn, rm); }
Vcmp(Condition cond,VRegister rd,VRegister rm)10609   void Vcmp(Condition cond, VRegister rd, VRegister rm) {
10610     VIXL_ASSERT(rd.IsS() || rd.IsD());
10611     VIXL_ASSERT(rd.GetType() == rm.GetType());
10612     if (rd.IsS()) {
10613       Vcmp(cond, F32, rd.S(), rm.S());
10614     } else {
10615       Vcmp(cond, F64, rd.D(), rm.D());
10616     }
10617   }
Vcmp(VRegister rd,VRegister rm)10618   void Vcmp(VRegister rd, VRegister rm) { Vcmp(al, rd, rm); }
Vcmpe(Condition cond,VRegister rd,VRegister rm)10619   void Vcmpe(Condition cond, VRegister rd, VRegister rm) {
10620     VIXL_ASSERT(rd.IsS() || rd.IsD());
10621     VIXL_ASSERT(rd.GetType() == rm.GetType());
10622     if (rd.IsS()) {
10623       Vcmpe(cond, F32, rd.S(), rm.S());
10624     } else {
10625       Vcmpe(cond, F64, rd.D(), rm.D());
10626     }
10627   }
Vcmpe(VRegister rd,VRegister rm)10628   void Vcmpe(VRegister rd, VRegister rm) { Vcmpe(al, rd, rm); }
Vdiv(Condition cond,VRegister rd,VRegister rn,VRegister rm)10629   void Vdiv(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10630     VIXL_ASSERT(rd.IsS() || rd.IsD());
10631     VIXL_ASSERT(rd.GetType() == rn.GetType());
10632     VIXL_ASSERT(rd.GetType() == rm.GetType());
10633     if (rd.IsS()) {
10634       Vdiv(cond, F32, rd.S(), rn.S(), rm.S());
10635     } else {
10636       Vdiv(cond, F64, rd.D(), rn.D(), rm.D());
10637     }
10638   }
Vdiv(VRegister rd,VRegister rn,VRegister rm)10639   void Vdiv(VRegister rd, VRegister rn, VRegister rm) { Vdiv(al, rd, rn, rm); }
Vfma(Condition cond,VRegister rd,VRegister rn,VRegister rm)10640   void Vfma(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10641     VIXL_ASSERT(rd.IsS() || rd.IsD());
10642     VIXL_ASSERT(rd.GetType() == rn.GetType());
10643     VIXL_ASSERT(rd.GetType() == rm.GetType());
10644     if (rd.IsS()) {
10645       Vfma(cond, F32, rd.S(), rn.S(), rm.S());
10646     } else {
10647       Vfma(cond, F64, rd.D(), rn.D(), rm.D());
10648     }
10649   }
Vfma(VRegister rd,VRegister rn,VRegister rm)10650   void Vfma(VRegister rd, VRegister rn, VRegister rm) { Vfma(al, rd, rn, rm); }
Vfms(Condition cond,VRegister rd,VRegister rn,VRegister rm)10651   void Vfms(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10652     VIXL_ASSERT(rd.IsS() || rd.IsD());
10653     VIXL_ASSERT(rd.GetType() == rn.GetType());
10654     VIXL_ASSERT(rd.GetType() == rm.GetType());
10655     if (rd.IsS()) {
10656       Vfms(cond, F32, rd.S(), rn.S(), rm.S());
10657     } else {
10658       Vfms(cond, F64, rd.D(), rn.D(), rm.D());
10659     }
10660   }
Vfms(VRegister rd,VRegister rn,VRegister rm)10661   void Vfms(VRegister rd, VRegister rn, VRegister rm) { Vfms(al, rd, rn, rm); }
Vfnma(Condition cond,VRegister rd,VRegister rn,VRegister rm)10662   void Vfnma(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10663     VIXL_ASSERT(rd.IsS() || rd.IsD());
10664     VIXL_ASSERT(rd.GetType() == rn.GetType());
10665     VIXL_ASSERT(rd.GetType() == rm.GetType());
10666     if (rd.IsS()) {
10667       Vfnma(cond, F32, rd.S(), rn.S(), rm.S());
10668     } else {
10669       Vfnma(cond, F64, rd.D(), rn.D(), rm.D());
10670     }
10671   }
Vfnma(VRegister rd,VRegister rn,VRegister rm)10672   void Vfnma(VRegister rd, VRegister rn, VRegister rm) {
10673     Vfnma(al, rd, rn, rm);
10674   }
Vfnms(Condition cond,VRegister rd,VRegister rn,VRegister rm)10675   void Vfnms(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10676     VIXL_ASSERT(rd.IsS() || rd.IsD());
10677     VIXL_ASSERT(rd.GetType() == rn.GetType());
10678     VIXL_ASSERT(rd.GetType() == rm.GetType());
10679     if (rd.IsS()) {
10680       Vfnms(cond, F32, rd.S(), rn.S(), rm.S());
10681     } else {
10682       Vfnms(cond, F64, rd.D(), rn.D(), rm.D());
10683     }
10684   }
Vfnms(VRegister rd,VRegister rn,VRegister rm)10685   void Vfnms(VRegister rd, VRegister rn, VRegister rm) {
10686     Vfnms(al, rd, rn, rm);
10687   }
Vmaxnm(VRegister rd,VRegister rn,VRegister rm)10688   void Vmaxnm(VRegister rd, VRegister rn, VRegister rm) {
10689     VIXL_ASSERT(rd.IsS() || rd.IsD());
10690     VIXL_ASSERT(rd.GetType() == rn.GetType());
10691     VIXL_ASSERT(rd.GetType() == rm.GetType());
10692     if (rd.IsS()) {
10693       Vmaxnm(F32, rd.S(), rn.S(), rm.S());
10694     } else {
10695       Vmaxnm(F64, rd.D(), rn.D(), rm.D());
10696     }
10697   }
Vminnm(VRegister rd,VRegister rn,VRegister rm)10698   void Vminnm(VRegister rd, VRegister rn, VRegister rm) {
10699     VIXL_ASSERT(rd.IsS() || rd.IsD());
10700     VIXL_ASSERT(rd.GetType() == rn.GetType());
10701     VIXL_ASSERT(rd.GetType() == rm.GetType());
10702     if (rd.IsS()) {
10703       Vminnm(F32, rd.S(), rn.S(), rm.S());
10704     } else {
10705       Vminnm(F64, rd.D(), rn.D(), rm.D());
10706     }
10707   }
Vmla(Condition cond,VRegister rd,VRegister rn,VRegister rm)10708   void Vmla(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10709     VIXL_ASSERT(rd.IsS() || rd.IsD());
10710     VIXL_ASSERT(rd.GetType() == rn.GetType());
10711     VIXL_ASSERT(rd.GetType() == rm.GetType());
10712     if (rd.IsS()) {
10713       Vmla(cond, F32, rd.S(), rn.S(), rm.S());
10714     } else {
10715       Vmla(cond, F64, rd.D(), rn.D(), rm.D());
10716     }
10717   }
Vmla(VRegister rd,VRegister rn,VRegister rm)10718   void Vmla(VRegister rd, VRegister rn, VRegister rm) { Vmla(al, rd, rn, rm); }
Vmls(Condition cond,VRegister rd,VRegister rn,VRegister rm)10719   void Vmls(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10720     VIXL_ASSERT(rd.IsS() || rd.IsD());
10721     VIXL_ASSERT(rd.GetType() == rn.GetType());
10722     VIXL_ASSERT(rd.GetType() == rm.GetType());
10723     if (rd.IsS()) {
10724       Vmls(cond, F32, rd.S(), rn.S(), rm.S());
10725     } else {
10726       Vmls(cond, F64, rd.D(), rn.D(), rm.D());
10727     }
10728   }
Vmls(VRegister rd,VRegister rn,VRegister rm)10729   void Vmls(VRegister rd, VRegister rn, VRegister rm) { Vmls(al, rd, rn, rm); }
Vmov(Condition cond,VRegister rd,VRegister rm)10730   void Vmov(Condition cond, VRegister rd, VRegister rm) {
10731     VIXL_ASSERT(rd.IsS() || rd.IsD());
10732     VIXL_ASSERT(rd.GetType() == rm.GetType());
10733     if (rd.IsS()) {
10734       Vmov(cond, F32, rd.S(), rm.S());
10735     } else {
10736       Vmov(cond, F64, rd.D(), rm.D());
10737     }
10738   }
Vmov(VRegister rd,VRegister rm)10739   void Vmov(VRegister rd, VRegister rm) { Vmov(al, rd, rm); }
Vmul(Condition cond,VRegister rd,VRegister rn,VRegister rm)10740   void Vmul(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10741     VIXL_ASSERT(rd.IsS() || rd.IsD());
10742     VIXL_ASSERT(rd.GetType() == rn.GetType());
10743     VIXL_ASSERT(rd.GetType() == rm.GetType());
10744     if (rd.IsS()) {
10745       Vmul(cond, F32, rd.S(), rn.S(), rm.S());
10746     } else {
10747       Vmul(cond, F64, rd.D(), rn.D(), rm.D());
10748     }
10749   }
Vmul(VRegister rd,VRegister rn,VRegister rm)10750   void Vmul(VRegister rd, VRegister rn, VRegister rm) { Vmul(al, rd, rn, rm); }
Vneg(Condition cond,VRegister rd,VRegister rm)10751   void Vneg(Condition cond, VRegister rd, VRegister rm) {
10752     VIXL_ASSERT(rd.IsS() || rd.IsD());
10753     VIXL_ASSERT(rd.GetType() == rm.GetType());
10754     if (rd.IsS()) {
10755       Vneg(cond, F32, rd.S(), rm.S());
10756     } else {
10757       Vneg(cond, F64, rd.D(), rm.D());
10758     }
10759   }
Vneg(VRegister rd,VRegister rm)10760   void Vneg(VRegister rd, VRegister rm) { Vneg(al, rd, rm); }
Vnmla(Condition cond,VRegister rd,VRegister rn,VRegister rm)10761   void Vnmla(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10762     VIXL_ASSERT(rd.IsS() || rd.IsD());
10763     VIXL_ASSERT(rd.GetType() == rn.GetType());
10764     VIXL_ASSERT(rd.GetType() == rm.GetType());
10765     if (rd.IsS()) {
10766       Vnmla(cond, F32, rd.S(), rn.S(), rm.S());
10767     } else {
10768       Vnmla(cond, F64, rd.D(), rn.D(), rm.D());
10769     }
10770   }
Vnmla(VRegister rd,VRegister rn,VRegister rm)10771   void Vnmla(VRegister rd, VRegister rn, VRegister rm) {
10772     Vnmla(al, rd, rn, rm);
10773   }
Vnmls(Condition cond,VRegister rd,VRegister rn,VRegister rm)10774   void Vnmls(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10775     VIXL_ASSERT(rd.IsS() || rd.IsD());
10776     VIXL_ASSERT(rd.GetType() == rn.GetType());
10777     VIXL_ASSERT(rd.GetType() == rm.GetType());
10778     if (rd.IsS()) {
10779       Vnmls(cond, F32, rd.S(), rn.S(), rm.S());
10780     } else {
10781       Vnmls(cond, F64, rd.D(), rn.D(), rm.D());
10782     }
10783   }
Vnmls(VRegister rd,VRegister rn,VRegister rm)10784   void Vnmls(VRegister rd, VRegister rn, VRegister rm) {
10785     Vnmls(al, rd, rn, rm);
10786   }
Vnmul(Condition cond,VRegister rd,VRegister rn,VRegister rm)10787   void Vnmul(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10788     VIXL_ASSERT(rd.IsS() || rd.IsD());
10789     VIXL_ASSERT(rd.GetType() == rn.GetType());
10790     VIXL_ASSERT(rd.GetType() == rm.GetType());
10791     if (rd.IsS()) {
10792       Vnmul(cond, F32, rd.S(), rn.S(), rm.S());
10793     } else {
10794       Vnmul(cond, F64, rd.D(), rn.D(), rm.D());
10795     }
10796   }
Vnmul(VRegister rd,VRegister rn,VRegister rm)10797   void Vnmul(VRegister rd, VRegister rn, VRegister rm) {
10798     Vnmul(al, rd, rn, rm);
10799   }
Vseleq(VRegister rd,VRegister rn,VRegister rm)10800   void Vseleq(VRegister rd, VRegister rn, VRegister rm) {
10801     VIXL_ASSERT(rd.IsS() || rd.IsD());
10802     VIXL_ASSERT(rd.GetType() == rn.GetType());
10803     VIXL_ASSERT(rd.GetType() == rm.GetType());
10804     if (rd.IsS()) {
10805       Vseleq(F32, rd.S(), rn.S(), rm.S());
10806     } else {
10807       Vseleq(F64, rd.D(), rn.D(), rm.D());
10808     }
10809   }
Vselge(VRegister rd,VRegister rn,VRegister rm)10810   void Vselge(VRegister rd, VRegister rn, VRegister rm) {
10811     VIXL_ASSERT(rd.IsS() || rd.IsD());
10812     VIXL_ASSERT(rd.GetType() == rn.GetType());
10813     VIXL_ASSERT(rd.GetType() == rm.GetType());
10814     if (rd.IsS()) {
10815       Vselge(F32, rd.S(), rn.S(), rm.S());
10816     } else {
10817       Vselge(F64, rd.D(), rn.D(), rm.D());
10818     }
10819   }
Vselgt(VRegister rd,VRegister rn,VRegister rm)10820   void Vselgt(VRegister rd, VRegister rn, VRegister rm) {
10821     VIXL_ASSERT(rd.IsS() || rd.IsD());
10822     VIXL_ASSERT(rd.GetType() == rn.GetType());
10823     VIXL_ASSERT(rd.GetType() == rm.GetType());
10824     if (rd.IsS()) {
10825       Vselgt(F32, rd.S(), rn.S(), rm.S());
10826     } else {
10827       Vselgt(F64, rd.D(), rn.D(), rm.D());
10828     }
10829   }
Vselvs(VRegister rd,VRegister rn,VRegister rm)10830   void Vselvs(VRegister rd, VRegister rn, VRegister rm) {
10831     VIXL_ASSERT(rd.IsS() || rd.IsD());
10832     VIXL_ASSERT(rd.GetType() == rn.GetType());
10833     VIXL_ASSERT(rd.GetType() == rm.GetType());
10834     if (rd.IsS()) {
10835       Vselvs(F32, rd.S(), rn.S(), rm.S());
10836     } else {
10837       Vselvs(F64, rd.D(), rn.D(), rm.D());
10838     }
10839   }
Vsqrt(Condition cond,VRegister rd,VRegister rm)10840   void Vsqrt(Condition cond, VRegister rd, VRegister rm) {
10841     VIXL_ASSERT(rd.IsS() || rd.IsD());
10842     VIXL_ASSERT(rd.GetType() == rm.GetType());
10843     if (rd.IsS()) {
10844       Vsqrt(cond, F32, rd.S(), rm.S());
10845     } else {
10846       Vsqrt(cond, F64, rd.D(), rm.D());
10847     }
10848   }
Vsqrt(VRegister rd,VRegister rm)10849   void Vsqrt(VRegister rd, VRegister rm) { Vsqrt(al, rd, rm); }
Vsub(Condition cond,VRegister rd,VRegister rn,VRegister rm)10850   void Vsub(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10851     VIXL_ASSERT(rd.IsS() || rd.IsD());
10852     VIXL_ASSERT(rd.GetType() == rn.GetType());
10853     VIXL_ASSERT(rd.GetType() == rm.GetType());
10854     if (rd.IsS()) {
10855       Vsub(cond, F32, rd.S(), rn.S(), rm.S());
10856     } else {
10857       Vsub(cond, F64, rd.D(), rn.D(), rm.D());
10858     }
10859   }
Vsub(VRegister rd,VRegister rn,VRegister rm)10860   void Vsub(VRegister rd, VRegister rn, VRegister rm) { Vsub(al, rd, rn, rm); }
10861   // End of generated code.
10862 
AllowUnpredictable()10863   virtual bool AllowUnpredictable() VIXL_OVERRIDE {
10864     VIXL_ABORT_WITH_MSG("Unpredictable instruction.\n");
10865     return false;
10866   }
AllowStronglyDiscouraged()10867   virtual bool AllowStronglyDiscouraged() VIXL_OVERRIDE {
10868     VIXL_ABORT_WITH_MSG(
10869         "ARM strongly recommends to not use this instruction.\n");
10870     return false;
10871   }
10872 
10873  private:
10874   RegisterList available_;
10875   VRegisterList available_vfp_;
10876   UseScratchRegisterScope* current_scratch_scope_;
10877   MacroAssemblerContext context_;
10878   Label::Offset checkpoint_;
10879   LiteralPoolManager literal_pool_manager_;
10880   VeneerPoolManager veneer_pool_manager_;
10881   bool generate_simulator_code_;
10882   bool allow_macro_instructions_;
10883 };
10884 
10885 // This scope utility allows scratch registers to be managed safely. The
10886 // MacroAssembler's GetScratchRegisterList() is used as a pool of scratch
10887 // registers. These registers can be allocated on demand, and will be returned
10888 // at the end of the scope.
10889 //
10890 // When the scope ends, the MacroAssembler's lists will be restored to their
10891 // original state, even if the lists were modified by some other means.
10892 //
10893 // Scopes must nest perfectly. That is, they must be destructed in reverse
10894 // construction order. Otherwise, it is not clear how to handle cases where one
10895 // scope acquires a register that was included in a now-closing scope. With
10896 // perfect nesting, this cannot occur.
10897 class UseScratchRegisterScope {
10898  public:
10899   // This constructor implicitly calls the `Open` function to initialise the
10900   // scope, so it is ready to use immediately after it has been constructed.
UseScratchRegisterScope(MacroAssembler * masm)10901   explicit UseScratchRegisterScope(MacroAssembler* masm)
10902       : masm_(NULL), parent_(NULL), old_available_(0), old_available_vfp_(0) {
10903     Open(masm);
10904   }
10905   // This constructor allows deferred and optional initialisation of the scope.
10906   // The user is required to explicitly call the `Open` function before using
10907   // the scope.
UseScratchRegisterScope()10908   UseScratchRegisterScope()
10909       : masm_(NULL), parent_(NULL), old_available_(0), old_available_vfp_(0) {}
10910 
10911   // This function performs the actual initialisation work.
10912   void Open(MacroAssembler* masm);
10913 
10914   // The destructor always implicitly calls the `Close` function.
~UseScratchRegisterScope()10915   ~UseScratchRegisterScope() { Close(); }
10916 
10917   // This function performs the cleaning-up work. It must succeed even if the
10918   // scope has not been opened. It is safe to call multiple times.
10919   void Close();
10920 
10921   bool IsAvailable(const Register& reg) const;
10922   bool IsAvailable(const VRegister& reg) const;
10923 
10924   // Take a register from the temp list. It will be returned automatically when
10925   // the scope ends.
10926   Register Acquire();
10927   VRegister AcquireV(unsigned size_in_bits);
10928   QRegister AcquireQ();
10929   DRegister AcquireD();
10930   SRegister AcquireS();
10931 
10932   // Explicitly release an acquired (or excluded) register, putting it back in
10933   // the temp list.
10934   void Release(const Register& reg);
10935   void Release(const VRegister& reg);
10936 
10937   // Make the specified registers available as scratch registers for the
10938   // duration of this scope.
10939   void Include(const RegisterList& list);
10940   void Include(const Register& reg1,
10941                const Register& reg2 = NoReg,
10942                const Register& reg3 = NoReg,
10943                const Register& reg4 = NoReg) {
10944     Include(RegisterList(reg1, reg2, reg3, reg4));
10945   }
10946   void Include(const VRegisterList& list);
10947   void Include(const VRegister& reg1,
10948                const VRegister& reg2 = NoVReg,
10949                const VRegister& reg3 = NoVReg,
10950                const VRegister& reg4 = NoVReg) {
10951     Include(VRegisterList(reg1, reg2, reg3, reg4));
10952   }
10953 
10954   // Make sure that the specified registers are not available in this scope.
10955   // This can be used to prevent helper functions from using sensitive
10956   // registers, for example.
10957   void Exclude(const RegisterList& list);
10958   void Exclude(const Register& reg1,
10959                const Register& reg2 = NoReg,
10960                const Register& reg3 = NoReg,
10961                const Register& reg4 = NoReg) {
10962     Exclude(RegisterList(reg1, reg2, reg3, reg4));
10963   }
10964   void Exclude(const VRegisterList& list);
10965   void Exclude(const VRegister& reg1,
10966                const VRegister& reg2 = NoVReg,
10967                const VRegister& reg3 = NoVReg,
10968                const VRegister& reg4 = NoVReg) {
10969     Exclude(VRegisterList(reg1, reg2, reg3, reg4));
10970   }
10971 
10972   // A convenience helper to exclude any registers used by the operand.
10973   void Exclude(const Operand& operand);
10974 
10975   // Prevent any scratch registers from being used in this scope.
10976   void ExcludeAll();
10977 
10978  private:
10979   // The MacroAssembler maintains a list of available scratch registers, and
10980   // also keeps track of the most recently-opened scope so that on destruction
10981   // we can check that scopes do not outlive their parents.
10982   MacroAssembler* masm_;
10983   UseScratchRegisterScope* parent_;
10984 
10985   // The state of the available lists at the start of this scope.
10986   uint32_t old_available_;      // kRRegister
10987   uint64_t old_available_vfp_;  // kVRegister
10988 
UseScratchRegisterScope(const UseScratchRegisterScope &)10989   VIXL_DEBUG_NO_RETURN UseScratchRegisterScope(const UseScratchRegisterScope&) {
10990     VIXL_UNREACHABLE();
10991   }
10992   VIXL_DEBUG_NO_RETURN void operator=(const UseScratchRegisterScope&) {
10993     VIXL_UNREACHABLE();
10994   }
10995 };
10996 
10997 
10998 }  // namespace aarch32
10999 }  // namespace vixl
11000 
11001 #endif  // VIXL_AARCH32_MACRO_ASSEMBLER_AARCH32_H_
11002