• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2017, VIXL authors
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are met:
6 //
7 //   * Redistributions of source code must retain the above copyright notice,
8 //     this list of conditions and the following disclaimer.
9 //   * Redistributions in binary form must reproduce the above copyright
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 "pool-manager-impl.h"
34 #include "pool-manager.h"
35 #include "utils-vixl.h"
36 
37 #include "aarch32/assembler-aarch32.h"
38 #include "aarch32/instructions-aarch32.h"
39 #include "aarch32/operands-aarch32.h"
40 
41 namespace vixl {
42 
43 namespace aarch32 {
44 
45 class UseScratchRegisterScope;
46 
47 enum FlagsUpdate { LeaveFlags = 0, SetFlags = 1, DontCare = 2 };
48 
49 // We use a subclass to access the protected `ExactAssemblyScope` constructor
50 // giving us control over the pools, and make the constructor private to limit
51 // usage to code paths emitting pools.
52 class ExactAssemblyScopeWithoutPoolsCheck : public ExactAssemblyScope {
53  private:
54   ExactAssemblyScopeWithoutPoolsCheck(MacroAssembler* masm,
55                                       size_t size,
56                                       SizePolicy size_policy = kExactSize);
57 
58   friend class MacroAssembler;
59   friend class Label;
60 };
61 // Macro assembler for aarch32 instruction set.
62 class MacroAssembler : public Assembler, public MacroAssemblerInterface {
63  public:
64   enum FinalizeOption {
65     kFallThrough,  // There may be more code to execute after calling Finalize.
66     kUnreachable   // Anything generated after calling Finalize is unreachable.
67   };
68 
AsAssemblerBase()69   virtual internal::AssemblerBase* AsAssemblerBase() VIXL_OVERRIDE {
70     return this;
71   }
72 
ArePoolsBlocked()73   virtual bool ArePoolsBlocked() const VIXL_OVERRIDE {
74     return pool_manager_.IsBlocked();
75   }
76 
EmitPoolHeader()77   virtual void EmitPoolHeader() VIXL_OVERRIDE {
78     // Check that we have the correct alignment.
79     if (IsUsingT32()) {
80       VIXL_ASSERT(GetBuffer()->Is16bitAligned());
81     } else {
82       VIXL_ASSERT(GetBuffer()->Is32bitAligned());
83     }
84     VIXL_ASSERT(pool_end_ == NULL);
85     pool_end_ = new Label();
86     ExactAssemblyScopeWithoutPoolsCheck guard(this,
87                                               kMaxInstructionSizeInBytes,
88                                               ExactAssemblyScope::kMaximumSize);
89     b(pool_end_);
90   }
EmitPoolFooter()91   virtual void EmitPoolFooter() VIXL_OVERRIDE {
92     // Align buffer to 4 bytes.
93     GetBuffer()->Align();
94     if (pool_end_ != NULL) {
95       Bind(pool_end_);
96       delete pool_end_;
97       pool_end_ = NULL;
98     }
99   }
EmitPaddingBytes(int n)100   virtual void EmitPaddingBytes(int n) VIXL_OVERRIDE {
101     GetBuffer()->EmitZeroedBytes(n);
102   }
EmitNopBytes(int n)103   virtual void EmitNopBytes(int n) VIXL_OVERRIDE {
104     int nops = 0;
105     int nop_size = IsUsingT32() ? k16BitT32InstructionSizeInBytes
106                                 : kA32InstructionSizeInBytes;
107     VIXL_ASSERT(n % nop_size == 0);
108     nops = n / nop_size;
109     ExactAssemblyScopeWithoutPoolsCheck guard(this,
110                                               n,
111                                               ExactAssemblyScope::kExactSize);
112     for (int i = 0; i < nops; ++i) {
113       nop();
114     }
115   }
116 
117 
118  private:
119   class MacroEmissionCheckScope : public EmissionCheckScope {
120    public:
121     explicit MacroEmissionCheckScope(MacroAssemblerInterface* masm,
122                                      PoolPolicy pool_policy = kBlockPools)
EmissionCheckScope(masm,kTypicalMacroInstructionMaxSize,kMaximumSize,pool_policy)123         : EmissionCheckScope(masm,
124                              kTypicalMacroInstructionMaxSize,
125                              kMaximumSize,
126                              pool_policy) {}
127 
128    private:
129     static const size_t kTypicalMacroInstructionMaxSize =
130         8 * kMaxInstructionSizeInBytes;
131   };
132 
133   class MacroAssemblerContext {
134    public:
MacroAssemblerContext()135     MacroAssemblerContext() : count_(0) {}
~MacroAssemblerContext()136     ~MacroAssemblerContext() {}
GetRecursiveCount()137     unsigned GetRecursiveCount() const { return count_; }
Up(const char * loc)138     void Up(const char* loc) {
139       location_stack_[count_] = loc;
140       count_++;
141       if (count_ >= kMaxRecursion) {
142         printf(
143             "Recursion limit reached; unable to resolve macro assembler "
144             "call.\n");
145         printf("Macro assembler context stack:\n");
146         for (unsigned i = 0; i < kMaxRecursion; i++) {
147           printf("%10s %s\n", (i == 0) ? "oldest -> " : "", location_stack_[i]);
148         }
149         VIXL_ABORT();
150       }
151     }
Down()152     void Down() {
153       VIXL_ASSERT((count_ > 0) && (count_ < kMaxRecursion));
154       count_--;
155     }
156 
157    private:
158     unsigned count_;
159     static const uint32_t kMaxRecursion = 6;
160     const char* location_stack_[kMaxRecursion];
161   };
162 
163   // This scope is used at each Delegate entry to avoid infinite recursion of
164   // Delegate calls. The limit is defined by
165   // MacroAssemblerContext::kMaxRecursion.
166   class ContextScope {
167    public:
ContextScope(MacroAssembler * const masm,const char * loc)168     explicit ContextScope(MacroAssembler* const masm, const char* loc)
169         : masm_(masm) {
170       VIXL_ASSERT(masm_->AllowMacroInstructions());
171       masm_->GetContext()->Up(loc);
172     }
~ContextScope()173     ~ContextScope() { masm_->GetContext()->Down(); }
174 
175    private:
176     MacroAssembler* const masm_;
177   };
178 
GetContext()179   MacroAssemblerContext* GetContext() { return &context_; }
180 
181   class ITScope {
182    public:
183     ITScope(MacroAssembler* masm,
184             Condition* cond,
185             const MacroEmissionCheckScope& scope,
186             bool can_use_it = false)
masm_(masm)187         : masm_(masm), cond_(*cond), can_use_it_(can_use_it) {
188       // The 'scope' argument is used to remind us to only use this scope inside
189       // a MacroEmissionCheckScope. This way, we do not need to check whether
190       // we need to emit the pools or grow the code buffer when emitting the
191       // IT or B instructions.
192       USE(scope);
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           // Generate the branch.
202           masm_->b(cond_.Negate(), Narrow, &label_);
203           // Tell the macro-assembler to generate unconditional instructions.
204           *cond = al;
205         }
206       }
207 #ifdef VIXL_DEBUG
208       initial_cursor_offset_ = masm->GetCursorOffset();
209 #else
210       USE(initial_cursor_offset_);
211 #endif
212     }
~ITScope()213     ~ITScope() {
214       if (label_.IsReferenced()) {
215         // We only use the label for conditional T32 instructions for which we
216         // cannot use IT.
217         VIXL_ASSERT(!cond_.Is(al));
218         VIXL_ASSERT(masm_->IsUsingT32());
219         VIXL_ASSERT(!can_use_it_);
220         VIXL_ASSERT(masm_->GetCursorOffset() - initial_cursor_offset_ <=
221                     kMaxT32MacroInstructionSizeInBytes);
222         masm_->BindHelper(&label_);
223       } else if (masm_->IsUsingT32() && !cond_.Is(al)) {
224         // If we've generated a conditional T32 instruction but haven't used the
225         // label, we must have used IT. Check that we did not generate a
226         // deprecated sequence.
227         VIXL_ASSERT(can_use_it_);
228         VIXL_ASSERT(masm_->GetCursorOffset() - initial_cursor_offset_ <=
229                     k16BitT32InstructionSizeInBytes);
230       }
231     }
232 
233    private:
234     MacroAssembler* masm_;
235     Condition cond_;
236     Label label_;
237     bool can_use_it_;
238     uint32_t initial_cursor_offset_;
239   };
240 
241  protected:
BlockPools()242   virtual void BlockPools() VIXL_OVERRIDE { pool_manager_.Block(); }
ReleasePools()243   virtual void ReleasePools() VIXL_OVERRIDE {
244     pool_manager_.Release(GetCursorOffset());
245   }
246   virtual void EnsureEmitPoolsFor(size_t size) VIXL_OVERRIDE;
247 
248   // Tell whether any of the macro instruction can be used. When false the
249   // MacroAssembler will assert if a method which can emit a variable number
250   // of instructions is called.
SetAllowMacroInstructions(bool value)251   virtual void SetAllowMacroInstructions(bool value) VIXL_OVERRIDE {
252     allow_macro_instructions_ = value;
253   }
254 
255   void HandleOutOfBoundsImmediate(Condition cond, Register tmp, uint32_t imm);
256 
257  public:
258   // TODO: If we change the MacroAssembler to disallow setting a different ISA,
259   // we can change the alignment of the pool in the pool manager constructor to
260   // be 2 bytes for T32.
261   explicit MacroAssembler(InstructionSet isa = kDefaultISA)
Assembler(isa)262       : Assembler(isa),
263         available_(r12),
264         current_scratch_scope_(NULL),
265         pool_manager_(4 /*header_size*/,
266                       4 /*alignment*/,
267                       4 /*buffer_alignment*/),
268         generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE),
269         pool_end_(NULL) {
270 #ifdef VIXL_DEBUG
271     SetAllowMacroInstructions(true);
272 #else
273     USE(allow_macro_instructions_);
274 #endif
275   }
276   explicit MacroAssembler(size_t size, InstructionSet isa = kDefaultISA)
Assembler(size,isa)277       : Assembler(size, isa),
278         available_(r12),
279         current_scratch_scope_(NULL),
280         pool_manager_(4 /*header_size*/,
281                       4 /*alignment*/,
282                       4 /*buffer_alignment*/),
283         generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE),
284         pool_end_(NULL) {
285 #ifdef VIXL_DEBUG
286     SetAllowMacroInstructions(true);
287 #endif
288   }
289   MacroAssembler(byte* buffer, size_t size, InstructionSet isa = kDefaultISA)
Assembler(buffer,size,isa)290       : Assembler(buffer, size, isa),
291         available_(r12),
292         current_scratch_scope_(NULL),
293         pool_manager_(4 /*header_size*/,
294                       4 /*alignment*/,
295                       4 /*buffer_alignment*/),
296         generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE),
297         pool_end_(NULL) {
298 #ifdef VIXL_DEBUG
299     SetAllowMacroInstructions(true);
300 #endif
301   }
302 
GenerateSimulatorCode()303   bool GenerateSimulatorCode() const { return generate_simulator_code_; }
304 
AllowMacroInstructions()305   virtual bool AllowMacroInstructions() const VIXL_OVERRIDE {
306     return allow_macro_instructions_;
307   }
308 
309   void FinalizeCode(FinalizeOption option = kUnreachable) {
310     EmitLiteralPool(option == kUnreachable
311                         ? PoolManager<int32_t>::kNoBranchRequired
312                         : PoolManager<int32_t>::kBranchRequired);
313     Assembler::FinalizeCode();
314   }
315 
GetScratchRegisterList()316   RegisterList* GetScratchRegisterList() { return &available_; }
GetScratchVRegisterList()317   VRegisterList* GetScratchVRegisterList() { return &available_vfp_; }
318 
319   // Get or set the current (most-deeply-nested) UseScratchRegisterScope.
SetCurrentScratchRegisterScope(UseScratchRegisterScope * scope)320   void SetCurrentScratchRegisterScope(UseScratchRegisterScope* scope) {
321     current_scratch_scope_ = scope;
322   }
GetCurrentScratchRegisterScope()323   UseScratchRegisterScope* GetCurrentScratchRegisterScope() {
324     return current_scratch_scope_;
325   }
326 
327   // Given an address calculation (Register + immediate), generate code to
328   // partially compute the address. The returned MemOperand will perform any
329   // remaining computation in a subsequent load or store instruction.
330   //
331   // The offset provided should be the offset that would be used in a load or
332   // store instruction (if it had sufficient range). This only matters where
333   // base.Is(pc), since load and store instructions align the pc before
334   // dereferencing it.
335   //
336   // TODO: Improve the handling of negative offsets. They are not implemented
337   // precisely for now because they only have a marginal benefit for the
338   // existing uses (in delegates).
339   MemOperand MemOperandComputationHelper(Condition cond,
340                                          Register scratch,
341                                          Register base,
342                                          uint32_t offset,
343                                          uint32_t extra_offset_mask = 0);
344 
345   MemOperand MemOperandComputationHelper(Register scratch,
346                                          Register base,
347                                          uint32_t offset,
348                                          uint32_t extra_offset_mask = 0) {
349     return MemOperandComputationHelper(al,
350                                        scratch,
351                                        base,
352                                        offset,
353                                        extra_offset_mask);
354   }
355   MemOperand MemOperandComputationHelper(Condition cond,
356                                          Register scratch,
357                                          Location* location,
358                                          uint32_t extra_offset_mask = 0) {
359     // Check for buffer space _before_ calculating the offset, in case we
360     // generate a pool that affects the offset calculation.
361     CodeBufferCheckScope scope(this, 4 * kMaxInstructionSizeInBytes);
362     Label::Offset offset =
363         location->GetLocation() -
364         AlignDown(GetCursorOffset() + GetArchitectureStatePCOffset(), 4);
365     return MemOperandComputationHelper(cond,
366                                        scratch,
367                                        pc,
368                                        offset,
369                                        extra_offset_mask);
370   }
371   MemOperand MemOperandComputationHelper(Register scratch,
372                                          Location* location,
373                                          uint32_t extra_offset_mask = 0) {
374     return MemOperandComputationHelper(al,
375                                        scratch,
376                                        location,
377                                        extra_offset_mask);
378   }
379 
380   // Determine the appropriate mask to pass into MemOperandComputationHelper.
381   uint32_t GetOffsetMask(InstructionType type, AddrMode addrmode);
382 
383   // State and type helpers.
IsModifiedImmediate(uint32_t imm)384   bool IsModifiedImmediate(uint32_t imm) {
385     return IsUsingT32() ? ImmediateT32::IsImmediateT32(imm)
386                         : ImmediateA32::IsImmediateA32(imm);
387   }
388 
Bind(Label * label)389   void Bind(Label* label) {
390     VIXL_ASSERT(allow_macro_instructions_);
391     BindHelper(label);
392   }
393 
BindHelper(Label * label)394   virtual void BindHelper(Label* label) VIXL_OVERRIDE {
395     // Assert that we have the correct buffer alignment.
396     if (IsUsingT32()) {
397       VIXL_ASSERT(GetBuffer()->Is16bitAligned());
398     } else {
399       VIXL_ASSERT(GetBuffer()->Is32bitAligned());
400     }
401     // If we need to add padding, check if we have to emit the pool.
402     const int32_t pc = GetCursorOffset();
403     if (label->Needs16BitPadding(pc)) {
404       const int kPaddingBytes = 2;
405       if (pool_manager_.MustEmit(pc, kPaddingBytes)) {
406         int32_t new_pc = pool_manager_.Emit(this, pc, kPaddingBytes);
407         USE(new_pc);
408         VIXL_ASSERT(new_pc == GetCursorOffset());
409       }
410     }
411     pool_manager_.Bind(this, label, GetCursorOffset());
412   }
413 
RegisterLiteralReference(RawLiteral * literal)414   void RegisterLiteralReference(RawLiteral* literal) {
415     if (literal->IsManuallyPlaced()) return;
416     RegisterForwardReference(literal);
417   }
418 
RegisterForwardReference(Location * location)419   void RegisterForwardReference(Location* location) {
420     if (location->IsBound()) return;
421     VIXL_ASSERT(location->HasForwardReferences());
422     const Location::ForwardRef& reference = location->GetLastForwardReference();
423     pool_manager_.AddObjectReference(&reference, location);
424   }
425 
426   void CheckEmitPoolForInstruction(const ReferenceInfo* info,
427                                    Location* location,
428                                    Condition* cond = NULL) {
429     int size = info->size;
430     int32_t pc = GetCursorOffset();
431     // If we need to emit a branch over the instruction, take this into account.
432     if ((cond != NULL) && NeedBranch(cond)) {
433       size += kBranchSize;
434       pc += kBranchSize;
435     }
436     int32_t from = pc;
437     from += IsUsingT32() ? kT32PcDelta : kA32PcDelta;
438     if (info->pc_needs_aligning) from = AlignDown(from, 4);
439     int32_t min = from + info->min_offset;
440     int32_t max = from + info->max_offset;
441     ForwardReference<int32_t> temp_ref(pc,
442                                        info->size,
443                                        min,
444                                        max,
445                                        info->alignment);
446     if (pool_manager_.MustEmit(GetCursorOffset(), size, &temp_ref, location)) {
447       int32_t new_pc = pool_manager_.Emit(this,
448                                           GetCursorOffset(),
449                                           info->size,
450                                           &temp_ref,
451                                           location);
452       USE(new_pc);
453       VIXL_ASSERT(new_pc == GetCursorOffset());
454     }
455   }
456 
Place(RawLiteral * literal)457   void Place(RawLiteral* literal) {
458     VIXL_ASSERT(allow_macro_instructions_);
459     VIXL_ASSERT(literal->IsManuallyPlaced());
460     // Check if we need to emit the pools. Take the alignment of the literal
461     // into account, as well as potential 16-bit padding needed to reach the
462     // minimum accessible location.
463     int alignment = literal->GetMaxAlignment();
464     int32_t pc = GetCursorOffset();
465     int total_size = AlignUp(pc, alignment) - pc + literal->GetSize();
466     if (literal->Needs16BitPadding(pc)) total_size += 2;
467     if (pool_manager_.MustEmit(pc, total_size)) {
468       int32_t new_pc = pool_manager_.Emit(this, pc, total_size);
469       USE(new_pc);
470       VIXL_ASSERT(new_pc == GetCursorOffset());
471     }
472     pool_manager_.Bind(this, literal, GetCursorOffset());
473     literal->EmitPoolObject(this);
474     // Align the buffer, to be ready to generate instructions right after
475     // this.
476     GetBuffer()->Align();
477   }
478 
479   void EmitLiteralPool(PoolManager<int32_t>::EmitOption option =
480                            PoolManager<int32_t>::kBranchRequired) {
481     VIXL_ASSERT(!ArePoolsBlocked());
482     int32_t new_pc =
483         pool_manager_.Emit(this, GetCursorOffset(), 0, NULL, NULL, option);
484     VIXL_ASSERT(new_pc == GetCursorOffset());
485     USE(new_pc);
486   }
487 
EnsureEmitFor(uint32_t size)488   void EnsureEmitFor(uint32_t size) {
489     EnsureEmitPoolsFor(size);
490     VIXL_ASSERT(GetBuffer()->HasSpaceFor(size) || GetBuffer()->IsManaged());
491     GetBuffer()->EnsureSpaceFor(size);
492   }
493 
AliasesAvailableScratchRegister(Register reg)494   bool AliasesAvailableScratchRegister(Register reg) {
495     return GetScratchRegisterList()->Includes(reg);
496   }
497 
AliasesAvailableScratchRegister(RegisterOrAPSR_nzcv reg)498   bool AliasesAvailableScratchRegister(RegisterOrAPSR_nzcv reg) {
499     if (reg.IsAPSR_nzcv()) return false;
500     return GetScratchRegisterList()->Includes(reg.AsRegister());
501   }
502 
AliasesAvailableScratchRegister(VRegister reg)503   bool AliasesAvailableScratchRegister(VRegister reg) {
504     return GetScratchVRegisterList()->IncludesAliasOf(reg);
505   }
506 
AliasesAvailableScratchRegister(const Operand & operand)507   bool AliasesAvailableScratchRegister(const Operand& operand) {
508     if (operand.IsImmediate()) return false;
509     return AliasesAvailableScratchRegister(operand.GetBaseRegister()) ||
510            (operand.IsRegisterShiftedRegister() &&
511             AliasesAvailableScratchRegister(operand.GetShiftRegister()));
512   }
513 
AliasesAvailableScratchRegister(const NeonOperand & operand)514   bool AliasesAvailableScratchRegister(const NeonOperand& operand) {
515     if (operand.IsImmediate()) return false;
516     return AliasesAvailableScratchRegister(operand.GetRegister());
517   }
518 
AliasesAvailableScratchRegister(SRegisterList list)519   bool AliasesAvailableScratchRegister(SRegisterList list) {
520     for (int n = 0; n < list.GetLength(); n++) {
521       if (AliasesAvailableScratchRegister(list.GetSRegister(n))) return true;
522     }
523     return false;
524   }
525 
AliasesAvailableScratchRegister(DRegisterList list)526   bool AliasesAvailableScratchRegister(DRegisterList list) {
527     for (int n = 0; n < list.GetLength(); n++) {
528       if (AliasesAvailableScratchRegister(list.GetDRegister(n))) return true;
529     }
530     return false;
531   }
532 
AliasesAvailableScratchRegister(NeonRegisterList list)533   bool AliasesAvailableScratchRegister(NeonRegisterList list) {
534     for (int n = 0; n < list.GetLength(); n++) {
535       if (AliasesAvailableScratchRegister(list.GetDRegister(n))) return true;
536     }
537     return false;
538   }
539 
AliasesAvailableScratchRegister(RegisterList list)540   bool AliasesAvailableScratchRegister(RegisterList list) {
541     return GetScratchRegisterList()->Overlaps(list);
542   }
543 
AliasesAvailableScratchRegister(const MemOperand & operand)544   bool AliasesAvailableScratchRegister(const MemOperand& operand) {
545     return AliasesAvailableScratchRegister(operand.GetBaseRegister()) ||
546            (operand.IsShiftedRegister() &&
547             AliasesAvailableScratchRegister(operand.GetOffsetRegister()));
548   }
549 
550   // Adr with a literal already constructed. Add the literal to the pool if it
551   // is not already done.
Adr(Condition cond,Register rd,RawLiteral * literal)552   void Adr(Condition cond, Register rd, RawLiteral* literal) {
553     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
554     VIXL_ASSERT(allow_macro_instructions_);
555     VIXL_ASSERT(OutsideITBlock());
556     MacroEmissionCheckScope::PoolPolicy pool_policy =
557         MacroEmissionCheckScope::kBlockPools;
558     if (!literal->IsBound()) {
559       const ReferenceInfo* info;
560       bool can_encode = adr_info(cond, Best, rd, literal, &info);
561       VIXL_CHECK(can_encode);
562       CheckEmitPoolForInstruction(info, literal, &cond);
563       // We have already checked for pool emission.
564       pool_policy = MacroEmissionCheckScope::kIgnorePools;
565     }
566     MacroEmissionCheckScope guard(this, pool_policy);
567     ITScope it_scope(this, &cond, guard);
568     adr(cond, Best, rd, literal);
569     RegisterLiteralReference(literal);
570   }
Adr(Register rd,RawLiteral * literal)571   void Adr(Register rd, RawLiteral* literal) { Adr(al, rd, literal); }
572 
573   // Loads with literals already constructed. Add the literal to the pool
574   // if it is not already done.
Ldr(Condition cond,Register rt,RawLiteral * literal)575   void Ldr(Condition cond, Register rt, RawLiteral* literal) {
576     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
577     VIXL_ASSERT(allow_macro_instructions_);
578     VIXL_ASSERT(OutsideITBlock());
579     MacroEmissionCheckScope::PoolPolicy pool_policy =
580         MacroEmissionCheckScope::kBlockPools;
581     if (!literal->IsBound()) {
582       const ReferenceInfo* info;
583       bool can_encode = ldr_info(cond, Best, rt, literal, &info);
584       VIXL_CHECK(can_encode);
585       CheckEmitPoolForInstruction(info, literal, &cond);
586       // We have already checked for pool emission.
587       pool_policy = MacroEmissionCheckScope::kIgnorePools;
588     }
589     MacroEmissionCheckScope guard(this, pool_policy);
590     ITScope it_scope(this, &cond, guard);
591     ldr(cond, rt, literal);
592     RegisterLiteralReference(literal);
593   }
Ldr(Register rt,RawLiteral * literal)594   void Ldr(Register rt, RawLiteral* literal) { Ldr(al, rt, literal); }
595 
Ldrb(Condition cond,Register rt,RawLiteral * literal)596   void Ldrb(Condition cond, Register rt, RawLiteral* literal) {
597     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
598     VIXL_ASSERT(allow_macro_instructions_);
599     VIXL_ASSERT(OutsideITBlock());
600     MacroEmissionCheckScope::PoolPolicy pool_policy =
601         MacroEmissionCheckScope::kBlockPools;
602     if (!literal->IsBound()) {
603       const ReferenceInfo* info;
604       bool can_encode = ldrb_info(cond, rt, literal, &info);
605       VIXL_CHECK(can_encode);
606       CheckEmitPoolForInstruction(info, literal, &cond);
607       // We have already checked for pool emission.
608       pool_policy = MacroEmissionCheckScope::kIgnorePools;
609     }
610     MacroEmissionCheckScope guard(this, pool_policy);
611     ITScope it_scope(this, &cond, guard);
612     ldrb(cond, rt, literal);
613     RegisterLiteralReference(literal);
614   }
Ldrb(Register rt,RawLiteral * literal)615   void Ldrb(Register rt, RawLiteral* literal) { Ldrb(al, rt, literal); }
616 
Ldrd(Condition cond,Register rt,Register rt2,RawLiteral * literal)617   void Ldrd(Condition cond, Register rt, Register rt2, RawLiteral* literal) {
618     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
619     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
620     VIXL_ASSERT(allow_macro_instructions_);
621     VIXL_ASSERT(OutsideITBlock());
622     MacroEmissionCheckScope::PoolPolicy pool_policy =
623         MacroEmissionCheckScope::kBlockPools;
624     if (!literal->IsBound()) {
625       const ReferenceInfo* info;
626       bool can_encode = ldrd_info(cond, rt, rt2, literal, &info);
627       VIXL_CHECK(can_encode);
628       CheckEmitPoolForInstruction(info, literal, &cond);
629       // We have already checked for pool emission.
630       pool_policy = MacroEmissionCheckScope::kIgnorePools;
631     }
632     MacroEmissionCheckScope guard(this, pool_policy);
633     ITScope it_scope(this, &cond, guard);
634     ldrd(cond, rt, rt2, literal);
635     RegisterLiteralReference(literal);
636   }
Ldrd(Register rt,Register rt2,RawLiteral * literal)637   void Ldrd(Register rt, Register rt2, RawLiteral* literal) {
638     Ldrd(al, rt, rt2, literal);
639   }
640 
Ldrh(Condition cond,Register rt,RawLiteral * literal)641   void Ldrh(Condition cond, Register rt, RawLiteral* literal) {
642     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
643     VIXL_ASSERT(allow_macro_instructions_);
644     VIXL_ASSERT(OutsideITBlock());
645     MacroEmissionCheckScope::PoolPolicy pool_policy =
646         MacroEmissionCheckScope::kBlockPools;
647     if (!literal->IsBound()) {
648       const ReferenceInfo* info;
649       bool can_encode = ldrh_info(cond, rt, literal, &info);
650       VIXL_CHECK(can_encode);
651       CheckEmitPoolForInstruction(info, literal, &cond);
652       // We have already checked for pool emission.
653       pool_policy = MacroEmissionCheckScope::kIgnorePools;
654     }
655     MacroEmissionCheckScope guard(this, pool_policy);
656     ITScope it_scope(this, &cond, guard);
657     ldrh(cond, rt, literal);
658     RegisterLiteralReference(literal);
659   }
Ldrh(Register rt,RawLiteral * literal)660   void Ldrh(Register rt, RawLiteral* literal) { Ldrh(al, rt, literal); }
661 
Ldrsb(Condition cond,Register rt,RawLiteral * literal)662   void Ldrsb(Condition cond, Register rt, RawLiteral* literal) {
663     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
664     VIXL_ASSERT(allow_macro_instructions_);
665     VIXL_ASSERT(OutsideITBlock());
666     MacroEmissionCheckScope::PoolPolicy pool_policy =
667         MacroEmissionCheckScope::kBlockPools;
668     if (!literal->IsBound()) {
669       const ReferenceInfo* info;
670       bool can_encode = ldrsb_info(cond, rt, literal, &info);
671       VIXL_CHECK(can_encode);
672       CheckEmitPoolForInstruction(info, literal, &cond);
673       // We have already checked for pool emission.
674       pool_policy = MacroEmissionCheckScope::kIgnorePools;
675     }
676     MacroEmissionCheckScope guard(this, pool_policy);
677     ITScope it_scope(this, &cond, guard);
678     ldrsb(cond, rt, literal);
679     RegisterLiteralReference(literal);
680   }
Ldrsb(Register rt,RawLiteral * literal)681   void Ldrsb(Register rt, RawLiteral* literal) { Ldrsb(al, rt, literal); }
682 
Ldrsh(Condition cond,Register rt,RawLiteral * literal)683   void Ldrsh(Condition cond, Register rt, RawLiteral* literal) {
684     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
685     VIXL_ASSERT(allow_macro_instructions_);
686     VIXL_ASSERT(OutsideITBlock());
687     MacroEmissionCheckScope::PoolPolicy pool_policy =
688         MacroEmissionCheckScope::kBlockPools;
689     if (!literal->IsBound()) {
690       const ReferenceInfo* info;
691       bool can_encode = ldrsh_info(cond, rt, literal, &info);
692       VIXL_CHECK(can_encode);
693       CheckEmitPoolForInstruction(info, literal, &cond);
694       // We have already checked for pool emission.
695       pool_policy = MacroEmissionCheckScope::kIgnorePools;
696     }
697     MacroEmissionCheckScope guard(this, pool_policy);
698     ITScope it_scope(this, &cond, guard);
699     ldrsh(cond, rt, literal);
700     RegisterLiteralReference(literal);
701   }
Ldrsh(Register rt,RawLiteral * literal)702   void Ldrsh(Register rt, RawLiteral* literal) { Ldrsh(al, rt, literal); }
703 
Vldr(Condition cond,DataType dt,DRegister rd,RawLiteral * literal)704   void Vldr(Condition cond, DataType dt, DRegister rd, RawLiteral* literal) {
705     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
706     VIXL_ASSERT(allow_macro_instructions_);
707     VIXL_ASSERT(OutsideITBlock());
708     MacroEmissionCheckScope::PoolPolicy pool_policy =
709         MacroEmissionCheckScope::kBlockPools;
710     if (!literal->IsBound()) {
711       const ReferenceInfo* info;
712       bool can_encode = vldr_info(cond, dt, rd, literal, &info);
713       VIXL_CHECK(can_encode);
714       CheckEmitPoolForInstruction(info, literal, &cond);
715       // We have already checked for pool emission.
716       pool_policy = MacroEmissionCheckScope::kIgnorePools;
717     }
718     MacroEmissionCheckScope guard(this, pool_policy);
719     ITScope it_scope(this, &cond, guard);
720     vldr(cond, dt, rd, literal);
721     RegisterLiteralReference(literal);
722   }
Vldr(DataType dt,DRegister rd,RawLiteral * literal)723   void Vldr(DataType dt, DRegister rd, RawLiteral* literal) {
724     Vldr(al, dt, rd, literal);
725   }
Vldr(Condition cond,DRegister rd,RawLiteral * literal)726   void Vldr(Condition cond, DRegister rd, RawLiteral* literal) {
727     Vldr(cond, Untyped64, rd, literal);
728   }
Vldr(DRegister rd,RawLiteral * literal)729   void Vldr(DRegister rd, RawLiteral* literal) {
730     Vldr(al, Untyped64, rd, literal);
731   }
732 
Vldr(Condition cond,DataType dt,SRegister rd,RawLiteral * literal)733   void Vldr(Condition cond, DataType dt, SRegister rd, RawLiteral* literal) {
734     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
735     VIXL_ASSERT(allow_macro_instructions_);
736     VIXL_ASSERT(OutsideITBlock());
737     MacroEmissionCheckScope::PoolPolicy pool_policy =
738         MacroEmissionCheckScope::kBlockPools;
739     if (!literal->IsBound()) {
740       const ReferenceInfo* info;
741       bool can_encode = vldr_info(cond, dt, rd, literal, &info);
742       VIXL_CHECK(can_encode);
743       CheckEmitPoolForInstruction(info, literal, &cond);
744       // We have already checked for pool emission.
745       pool_policy = MacroEmissionCheckScope::kIgnorePools;
746     }
747     MacroEmissionCheckScope guard(this, pool_policy);
748     ITScope it_scope(this, &cond, guard);
749     vldr(cond, dt, rd, literal);
750     RegisterLiteralReference(literal);
751   }
Vldr(DataType dt,SRegister rd,RawLiteral * literal)752   void Vldr(DataType dt, SRegister rd, RawLiteral* literal) {
753     Vldr(al, dt, rd, literal);
754   }
Vldr(Condition cond,SRegister rd,RawLiteral * literal)755   void Vldr(Condition cond, SRegister rd, RawLiteral* literal) {
756     Vldr(cond, Untyped32, rd, literal);
757   }
Vldr(SRegister rd,RawLiteral * literal)758   void Vldr(SRegister rd, RawLiteral* literal) {
759     Vldr(al, Untyped32, rd, literal);
760   }
761 
762   // Generic Ldr(register, data)
Ldr(Condition cond,Register rt,uint32_t v)763   void Ldr(Condition cond, Register rt, uint32_t v) {
764     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
765     VIXL_ASSERT(allow_macro_instructions_);
766     VIXL_ASSERT(OutsideITBlock());
767     RawLiteral* literal =
768         new Literal<uint32_t>(v, RawLiteral::kDeletedOnPlacementByPool);
769     Ldr(cond, rt, literal);
770   }
771   template <typename T>
Ldr(Register rt,T v)772   void Ldr(Register rt, T v) {
773     Ldr(al, rt, v);
774   }
775 
776   // Generic Ldrd(rt, rt2, data)
Ldrd(Condition cond,Register rt,Register rt2,uint64_t v)777   void Ldrd(Condition cond, Register rt, Register rt2, uint64_t v) {
778     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
779     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
780     VIXL_ASSERT(allow_macro_instructions_);
781     VIXL_ASSERT(OutsideITBlock());
782     RawLiteral* literal =
783         new Literal<uint64_t>(v, RawLiteral::kDeletedOnPlacementByPool);
784     Ldrd(cond, rt, rt2, literal);
785   }
786   template <typename T>
Ldrd(Register rt,Register rt2,T v)787   void Ldrd(Register rt, Register rt2, T v) {
788     Ldrd(al, rt, rt2, v);
789   }
790 
Vldr(Condition cond,SRegister rd,float v)791   void Vldr(Condition cond, SRegister rd, float v) {
792     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
793     VIXL_ASSERT(allow_macro_instructions_);
794     VIXL_ASSERT(OutsideITBlock());
795     RawLiteral* literal =
796         new Literal<float>(v, RawLiteral::kDeletedOnPlacementByPool);
797     Vldr(cond, rd, literal);
798   }
Vldr(SRegister rd,float v)799   void Vldr(SRegister rd, float v) { Vldr(al, rd, v); }
800 
Vldr(Condition cond,DRegister rd,double v)801   void Vldr(Condition cond, DRegister rd, double v) {
802     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
803     VIXL_ASSERT(allow_macro_instructions_);
804     VIXL_ASSERT(OutsideITBlock());
805     RawLiteral* literal =
806         new Literal<double>(v, RawLiteral::kDeletedOnPlacementByPool);
807     Vldr(cond, rd, literal);
808   }
Vldr(DRegister rd,double v)809   void Vldr(DRegister rd, double v) { Vldr(al, rd, v); }
810 
Vmov(Condition cond,DRegister rt,double v)811   void Vmov(Condition cond, DRegister rt, double v) { Vmov(cond, F64, rt, v); }
Vmov(DRegister rt,double v)812   void Vmov(DRegister rt, double v) { Vmov(al, F64, rt, v); }
Vmov(Condition cond,SRegister rt,float v)813   void Vmov(Condition cond, SRegister rt, float v) { Vmov(cond, F32, rt, v); }
Vmov(SRegister rt,float v)814   void Vmov(SRegister rt, float v) { Vmov(al, F32, rt, v); }
815 
816   // Claim memory on the stack.
817   // Note that the Claim, Drop, and Peek helpers below ensure that offsets used
818   // are multiples of 32 bits to help maintain 32-bit SP alignment.
819   // We could `Align{Up,Down}(size, 4)`, but that's potentially problematic:
820   //     Claim(3)
821   //     Claim(1)
822   //     Drop(4)
823   // would seem correct, when in fact:
824   //    Claim(3) -> sp = sp - 4
825   //    Claim(1) -> sp = sp - 4
826   //    Drop(4)  -> sp = sp + 4
827   //
Claim(int32_t size)828   void Claim(int32_t size) {
829     if (size == 0) return;
830     // The stack must be kept 32bit aligned.
831     VIXL_ASSERT((size > 0) && ((size % 4) == 0));
832     Sub(sp, sp, size);
833   }
834   // Release memory on the stack
Drop(int32_t size)835   void Drop(int32_t size) {
836     if (size == 0) return;
837     // The stack must be kept 32bit aligned.
838     VIXL_ASSERT((size > 0) && ((size % 4) == 0));
839     Add(sp, sp, size);
840   }
Peek(Register dst,int32_t offset)841   void Peek(Register dst, int32_t offset) {
842     VIXL_ASSERT((offset >= 0) && ((offset % 4) == 0));
843     Ldr(dst, MemOperand(sp, offset));
844   }
Poke(Register src,int32_t offset)845   void Poke(Register src, int32_t offset) {
846     VIXL_ASSERT((offset >= 0) && ((offset % 4) == 0));
847     Str(src, MemOperand(sp, offset));
848   }
849   void Printf(const char* format,
850               CPURegister reg1 = NoReg,
851               CPURegister reg2 = NoReg,
852               CPURegister reg3 = NoReg,
853               CPURegister reg4 = NoReg);
854   // Functions used by Printf for generation.
855   void PushRegister(CPURegister reg);
856   void PreparePrintfArgument(CPURegister reg,
857                              int* core_count,
858                              int* vfp_count,
859                              uint32_t* printf_type);
860   // Handlers for cases not handled by the assembler.
861   // ADD, MOVT, MOVW, SUB, SXTB16, TEQ, UXTB16
862   virtual void Delegate(InstructionType type,
863                         InstructionCondROp instruction,
864                         Condition cond,
865                         Register rn,
866                         const Operand& operand) VIXL_OVERRIDE;
867   // CMN, CMP, MOV, MOVS, MVN, MVNS, SXTB, SXTH, TST, UXTB, UXTH
868   virtual void Delegate(InstructionType type,
869                         InstructionCondSizeROp instruction,
870                         Condition cond,
871                         EncodingSize size,
872                         Register rn,
873                         const Operand& operand) VIXL_OVERRIDE;
874   // ADDW, ORN, ORNS, PKHBT, PKHTB, RSC, RSCS, SUBW, SXTAB, SXTAB16, SXTAH,
875   // UXTAB, UXTAB16, UXTAH
876   virtual void Delegate(InstructionType type,
877                         InstructionCondRROp instruction,
878                         Condition cond,
879                         Register rd,
880                         Register rn,
881                         const Operand& operand) VIXL_OVERRIDE;
882   // ADC, ADCS, ADD, ADDS, AND, ANDS, ASR, ASRS, BIC, BICS, EOR, EORS, LSL,
883   // LSLS, LSR, LSRS, ORR, ORRS, ROR, RORS, RSB, RSBS, SBC, SBCS, SUB, SUBS
884   virtual void Delegate(InstructionType type,
885                         InstructionCondSizeRL instruction,
886                         Condition cond,
887                         EncodingSize size,
888                         Register rd,
889                         Location* location) VIXL_OVERRIDE;
890   bool GenerateSplitInstruction(InstructionCondSizeRROp instruction,
891                                 Condition cond,
892                                 Register rd,
893                                 Register rn,
894                                 uint32_t imm,
895                                 uint32_t mask);
896   virtual void Delegate(InstructionType type,
897                         InstructionCondSizeRROp instruction,
898                         Condition cond,
899                         EncodingSize size,
900                         Register rd,
901                         Register rn,
902                         const Operand& operand) VIXL_OVERRIDE;
903   // CBNZ, CBZ
904   virtual void Delegate(InstructionType type,
905                         InstructionRL instruction,
906                         Register rn,
907                         Location* location) VIXL_OVERRIDE;
908   // VMOV
909   virtual void Delegate(InstructionType type,
910                         InstructionCondDtSSop instruction,
911                         Condition cond,
912                         DataType dt,
913                         SRegister rd,
914                         const SOperand& operand) VIXL_OVERRIDE;
915   // VMOV, VMVN
916   virtual void Delegate(InstructionType type,
917                         InstructionCondDtDDop instruction,
918                         Condition cond,
919                         DataType dt,
920                         DRegister rd,
921                         const DOperand& operand) VIXL_OVERRIDE;
922   // VMOV, VMVN
923   virtual void Delegate(InstructionType type,
924                         InstructionCondDtQQop instruction,
925                         Condition cond,
926                         DataType dt,
927                         QRegister rd,
928                         const QOperand& operand) VIXL_OVERRIDE;
929   // LDR, LDRB, LDRH, LDRSB, LDRSH, STR, STRB, STRH
930   virtual void Delegate(InstructionType type,
931                         InstructionCondSizeRMop instruction,
932                         Condition cond,
933                         EncodingSize size,
934                         Register rd,
935                         const MemOperand& operand) VIXL_OVERRIDE;
936   // LDAEXD, LDRD, LDREXD, STLEX, STLEXB, STLEXH, STRD, STREX, STREXB, STREXH
937   virtual void Delegate(InstructionType type,
938                         InstructionCondRL instruction,
939                         Condition cond,
940                         Register rt,
941                         Location* location) VIXL_OVERRIDE;
942   virtual void Delegate(InstructionType type,
943                         InstructionCondRRL instruction,
944                         Condition cond,
945                         Register rt,
946                         Register rt2,
947                         Location* location) VIXL_OVERRIDE;
948   virtual void Delegate(InstructionType type,
949                         InstructionCondRRMop instruction,
950                         Condition cond,
951                         Register rt,
952                         Register rt2,
953                         const MemOperand& operand) VIXL_OVERRIDE;
954   // VLDR, VSTR
955   virtual void Delegate(InstructionType type,
956                         InstructionCondDtSMop instruction,
957                         Condition cond,
958                         DataType dt,
959                         SRegister rd,
960                         const MemOperand& operand) VIXL_OVERRIDE;
961   // VLDR, VSTR
962   virtual void Delegate(InstructionType type,
963                         InstructionCondDtDMop instruction,
964                         Condition cond,
965                         DataType dt,
966                         DRegister rd,
967                         const MemOperand& operand) VIXL_OVERRIDE;
968   // MSR
969   virtual void Delegate(InstructionType type,
970                         InstructionCondMsrOp instruction,
971                         Condition cond,
972                         MaskedSpecialRegister spec_reg,
973                         const Operand& operand) VIXL_OVERRIDE;
974   virtual void Delegate(InstructionType type,
975                         InstructionCondDtDL instruction,
976                         Condition cond,
977                         DataType dt,
978                         DRegister rd,
979                         Location* location) VIXL_OVERRIDE;
980   virtual void Delegate(InstructionType type,
981                         InstructionCondDtSL instruction,
982                         Condition cond,
983                         DataType dt,
984                         SRegister rd,
985                         Location* location) VIXL_OVERRIDE;
986 
987   // Start of generated code.
988 
Adc(Condition cond,Register rd,Register rn,const Operand & operand)989   void Adc(Condition cond, Register rd, Register rn, const Operand& operand) {
990     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
991     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
992     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
993     VIXL_ASSERT(allow_macro_instructions_);
994     VIXL_ASSERT(OutsideITBlock());
995     MacroEmissionCheckScope guard(this);
996     bool can_use_it =
997         // ADC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
998         operand.IsPlainRegister() && rn.IsLow() && rd.Is(rn) &&
999         operand.GetBaseRegister().IsLow();
1000     ITScope it_scope(this, &cond, guard, can_use_it);
1001     adc(cond, rd, rn, operand);
1002   }
Adc(Register rd,Register rn,const Operand & operand)1003   void Adc(Register rd, Register rn, const Operand& operand) {
1004     Adc(al, rd, rn, operand);
1005   }
Adc(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1006   void Adc(FlagsUpdate flags,
1007            Condition cond,
1008            Register rd,
1009            Register rn,
1010            const Operand& operand) {
1011     switch (flags) {
1012       case LeaveFlags:
1013         Adc(cond, rd, rn, operand);
1014         break;
1015       case SetFlags:
1016         Adcs(cond, rd, rn, operand);
1017         break;
1018       case DontCare:
1019         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1020                                    rn.Is(rd) && operand.IsPlainRegister() &&
1021                                    operand.GetBaseRegister().IsLow();
1022         if (setflags_is_smaller) {
1023           Adcs(cond, rd, rn, operand);
1024         } else {
1025           Adc(cond, rd, rn, operand);
1026         }
1027         break;
1028     }
1029   }
Adc(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1030   void Adc(FlagsUpdate flags,
1031            Register rd,
1032            Register rn,
1033            const Operand& operand) {
1034     Adc(flags, al, rd, rn, operand);
1035   }
1036 
Adcs(Condition cond,Register rd,Register rn,const Operand & operand)1037   void Adcs(Condition cond, Register rd, Register rn, const Operand& operand) {
1038     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1039     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1040     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1041     VIXL_ASSERT(allow_macro_instructions_);
1042     VIXL_ASSERT(OutsideITBlock());
1043     MacroEmissionCheckScope guard(this);
1044     ITScope it_scope(this, &cond, guard);
1045     adcs(cond, rd, rn, operand);
1046   }
Adcs(Register rd,Register rn,const Operand & operand)1047   void Adcs(Register rd, Register rn, const Operand& operand) {
1048     Adcs(al, rd, rn, operand);
1049   }
1050 
Add(Condition cond,Register rd,Register rn,const Operand & operand)1051   void Add(Condition cond, Register rd, Register rn, const Operand& operand) {
1052     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1053     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1054     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1055     VIXL_ASSERT(allow_macro_instructions_);
1056     VIXL_ASSERT(OutsideITBlock());
1057     MacroEmissionCheckScope guard(this);
1058     if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) {
1059       uint32_t immediate = operand.GetImmediate();
1060       if (immediate == 0) {
1061         return;
1062       }
1063     }
1064     bool can_use_it =
1065         // ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
1066         (operand.IsImmediate() && (operand.GetImmediate() <= 7) && rn.IsLow() &&
1067          rd.IsLow()) ||
1068         // ADD<c>{<q>} {<Rdn>,} <Rdn>, #<imm8> ; T2
1069         (operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
1070          rd.IsLow() && rn.Is(rd)) ||
1071         // ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1
1072         (operand.IsImmediate() && (operand.GetImmediate() <= 1020) &&
1073          ((operand.GetImmediate() & 0x3) == 0) && rd.IsLow() && rn.IsSP()) ||
1074         // ADD<c>{<q>} <Rd>, <Rn>, <Rm>
1075         (operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
1076          operand.GetBaseRegister().IsLow()) ||
1077         // ADD<c>{<q>} <Rdn>, <Rm> ; T2
1078         (operand.IsPlainRegister() && !rd.IsPC() && rn.Is(rd) &&
1079          !operand.GetBaseRegister().IsSP() &&
1080          !operand.GetBaseRegister().IsPC()) ||
1081         // ADD{<c>}{<q>} {<Rdm>,} SP, <Rdm> ; T1
1082         (operand.IsPlainRegister() && !rd.IsPC() && rn.IsSP() &&
1083          operand.GetBaseRegister().Is(rd));
1084     ITScope it_scope(this, &cond, guard, can_use_it);
1085     add(cond, rd, rn, operand);
1086   }
Add(Register rd,Register rn,const Operand & operand)1087   void Add(Register rd, Register rn, const Operand& operand) {
1088     Add(al, rd, rn, operand);
1089   }
Add(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1090   void Add(FlagsUpdate flags,
1091            Condition cond,
1092            Register rd,
1093            Register rn,
1094            const Operand& operand) {
1095     switch (flags) {
1096       case LeaveFlags:
1097         Add(cond, rd, rn, operand);
1098         break;
1099       case SetFlags:
1100         Adds(cond, rd, rn, operand);
1101         break;
1102       case DontCare:
1103         bool setflags_is_smaller =
1104             IsUsingT32() && cond.Is(al) &&
1105             ((operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
1106               !rd.Is(rn) && operand.GetBaseRegister().IsLow()) ||
1107              (operand.IsImmediate() &&
1108               ((rd.IsLow() && rn.IsLow() && (operand.GetImmediate() < 8)) ||
1109                (rd.IsLow() && rn.Is(rd) && (operand.GetImmediate() < 256)))));
1110         if (setflags_is_smaller) {
1111           Adds(cond, rd, rn, operand);
1112         } else {
1113           bool changed_op_is_smaller =
1114               operand.IsImmediate() && (operand.GetSignedImmediate() < 0) &&
1115               ((rd.IsLow() && rn.IsLow() &&
1116                 (operand.GetSignedImmediate() >= -7)) ||
1117                (rd.IsLow() && rn.Is(rd) &&
1118                 (operand.GetSignedImmediate() >= -255)));
1119           if (changed_op_is_smaller) {
1120             Subs(cond, rd, rn, -operand.GetSignedImmediate());
1121           } else {
1122             Add(cond, rd, rn, operand);
1123           }
1124         }
1125         break;
1126     }
1127   }
Add(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1128   void Add(FlagsUpdate flags,
1129            Register rd,
1130            Register rn,
1131            const Operand& operand) {
1132     Add(flags, al, rd, rn, operand);
1133   }
1134 
Adds(Condition cond,Register rd,Register rn,const Operand & operand)1135   void Adds(Condition cond, Register rd, Register rn, const Operand& operand) {
1136     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1137     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1138     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1139     VIXL_ASSERT(allow_macro_instructions_);
1140     VIXL_ASSERT(OutsideITBlock());
1141     MacroEmissionCheckScope guard(this);
1142     ITScope it_scope(this, &cond, guard);
1143     adds(cond, rd, rn, operand);
1144   }
Adds(Register rd,Register rn,const Operand & operand)1145   void Adds(Register rd, Register rn, const Operand& operand) {
1146     Adds(al, rd, rn, operand);
1147   }
1148 
And(Condition cond,Register rd,Register rn,const Operand & operand)1149   void And(Condition cond, Register rd, Register rn, const Operand& operand) {
1150     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1151     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1152     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1153     VIXL_ASSERT(allow_macro_instructions_);
1154     VIXL_ASSERT(OutsideITBlock());
1155     MacroEmissionCheckScope guard(this);
1156     if (rd.Is(rn) && operand.IsPlainRegister() &&
1157         rd.Is(operand.GetBaseRegister())) {
1158       return;
1159     }
1160     if (cond.Is(al) && operand.IsImmediate()) {
1161       uint32_t immediate = operand.GetImmediate();
1162       if (immediate == 0) {
1163         mov(rd, 0);
1164         return;
1165       }
1166       if ((immediate == 0xffffffff) && rd.Is(rn)) {
1167         return;
1168       }
1169     }
1170     bool can_use_it =
1171         // AND<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1172         operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
1173         operand.GetBaseRegister().IsLow();
1174     ITScope it_scope(this, &cond, guard, can_use_it);
1175     and_(cond, rd, rn, operand);
1176   }
And(Register rd,Register rn,const Operand & operand)1177   void And(Register rd, Register rn, const Operand& operand) {
1178     And(al, rd, rn, operand);
1179   }
And(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1180   void And(FlagsUpdate flags,
1181            Condition cond,
1182            Register rd,
1183            Register rn,
1184            const Operand& operand) {
1185     switch (flags) {
1186       case LeaveFlags:
1187         And(cond, rd, rn, operand);
1188         break;
1189       case SetFlags:
1190         Ands(cond, rd, rn, operand);
1191         break;
1192       case DontCare:
1193         if (operand.IsPlainRegister() && rd.Is(rn) &&
1194             rd.Is(operand.GetBaseRegister())) {
1195           return;
1196         }
1197         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1198                                    rn.Is(rd) && operand.IsPlainRegister() &&
1199                                    operand.GetBaseRegister().IsLow();
1200         if (setflags_is_smaller) {
1201           Ands(cond, rd, rn, operand);
1202         } else {
1203           And(cond, rd, rn, operand);
1204         }
1205         break;
1206     }
1207   }
And(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1208   void And(FlagsUpdate flags,
1209            Register rd,
1210            Register rn,
1211            const Operand& operand) {
1212     And(flags, al, rd, rn, operand);
1213   }
1214 
Ands(Condition cond,Register rd,Register rn,const Operand & operand)1215   void Ands(Condition cond, Register rd, Register rn, const Operand& operand) {
1216     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1217     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1218     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1219     VIXL_ASSERT(allow_macro_instructions_);
1220     VIXL_ASSERT(OutsideITBlock());
1221     MacroEmissionCheckScope guard(this);
1222     ITScope it_scope(this, &cond, guard);
1223     ands(cond, rd, rn, operand);
1224   }
Ands(Register rd,Register rn,const Operand & operand)1225   void Ands(Register rd, Register rn, const Operand& operand) {
1226     Ands(al, rd, rn, operand);
1227   }
1228 
Asr(Condition cond,Register rd,Register rm,const Operand & operand)1229   void Asr(Condition cond, Register rd, Register rm, const Operand& operand) {
1230     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1231     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1232     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1233     VIXL_ASSERT(allow_macro_instructions_);
1234     VIXL_ASSERT(OutsideITBlock());
1235     MacroEmissionCheckScope guard(this);
1236     bool can_use_it =
1237         // ASR<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
1238         (operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
1239          (operand.GetImmediate() <= 32) && rd.IsLow() && rm.IsLow()) ||
1240         // ASR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
1241         (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
1242          operand.GetBaseRegister().IsLow());
1243     ITScope it_scope(this, &cond, guard, can_use_it);
1244     asr(cond, rd, rm, operand);
1245   }
Asr(Register rd,Register rm,const Operand & operand)1246   void Asr(Register rd, Register rm, const Operand& operand) {
1247     Asr(al, rd, rm, operand);
1248   }
Asr(FlagsUpdate flags,Condition cond,Register rd,Register rm,const Operand & operand)1249   void Asr(FlagsUpdate flags,
1250            Condition cond,
1251            Register rd,
1252            Register rm,
1253            const Operand& operand) {
1254     switch (flags) {
1255       case LeaveFlags:
1256         Asr(cond, rd, rm, operand);
1257         break;
1258       case SetFlags:
1259         Asrs(cond, rd, rm, operand);
1260         break;
1261       case DontCare:
1262         bool setflags_is_smaller =
1263             IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() &&
1264             ((operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
1265               (operand.GetImmediate() <= 32)) ||
1266              (operand.IsPlainRegister() && rd.Is(rm)));
1267         if (setflags_is_smaller) {
1268           Asrs(cond, rd, rm, operand);
1269         } else {
1270           Asr(cond, rd, rm, operand);
1271         }
1272         break;
1273     }
1274   }
Asr(FlagsUpdate flags,Register rd,Register rm,const Operand & operand)1275   void Asr(FlagsUpdate flags,
1276            Register rd,
1277            Register rm,
1278            const Operand& operand) {
1279     Asr(flags, al, rd, rm, operand);
1280   }
1281 
Asrs(Condition cond,Register rd,Register rm,const Operand & operand)1282   void Asrs(Condition cond, Register rd, Register rm, const Operand& operand) {
1283     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1284     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1285     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1286     VIXL_ASSERT(allow_macro_instructions_);
1287     VIXL_ASSERT(OutsideITBlock());
1288     MacroEmissionCheckScope guard(this);
1289     ITScope it_scope(this, &cond, guard);
1290     asrs(cond, rd, rm, operand);
1291   }
Asrs(Register rd,Register rm,const Operand & operand)1292   void Asrs(Register rd, Register rm, const Operand& operand) {
1293     Asrs(al, rd, rm, operand);
1294   }
1295 
1296   void B(Condition cond, Label* label, BranchHint hint = kBranchWithoutHint) {
1297     VIXL_ASSERT(allow_macro_instructions_);
1298     VIXL_ASSERT(OutsideITBlock());
1299     EncodingSize size = Best;
1300     MacroEmissionCheckScope::PoolPolicy pool_policy =
1301         MacroEmissionCheckScope::kBlockPools;
1302     if (!label->IsBound()) {
1303       if (hint == kNear) size = Narrow;
1304       const ReferenceInfo* info;
1305       bool can_encode = b_info(cond, size, label, &info);
1306       VIXL_CHECK(can_encode);
1307       CheckEmitPoolForInstruction(info, label, &cond);
1308       // We have already checked for pool emission.
1309       pool_policy = MacroEmissionCheckScope::kIgnorePools;
1310     }
1311     MacroEmissionCheckScope guard(this, pool_policy);
1312     b(cond, size, label);
1313     RegisterForwardReference(label);
1314   }
1315   void B(Label* label, BranchHint hint = kBranchWithoutHint) {
1316     B(al, label, hint);
1317   }
BPreferNear(Condition cond,Label * label)1318   void BPreferNear(Condition cond, Label* label) { B(cond, label, kNear); }
BPreferNear(Label * label)1319   void BPreferNear(Label* label) { B(al, label, kNear); }
1320 
Bfc(Condition cond,Register rd,uint32_t lsb,uint32_t width)1321   void Bfc(Condition cond, Register rd, uint32_t lsb, uint32_t width) {
1322     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1323     VIXL_ASSERT(allow_macro_instructions_);
1324     VIXL_ASSERT(OutsideITBlock());
1325     MacroEmissionCheckScope guard(this);
1326     ITScope it_scope(this, &cond, guard);
1327     bfc(cond, rd, lsb, width);
1328   }
Bfc(Register rd,uint32_t lsb,uint32_t width)1329   void Bfc(Register rd, uint32_t lsb, uint32_t width) {
1330     Bfc(al, rd, lsb, width);
1331   }
1332 
Bfi(Condition cond,Register rd,Register rn,uint32_t lsb,uint32_t width)1333   void Bfi(
1334       Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
1335     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1336     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1337     VIXL_ASSERT(allow_macro_instructions_);
1338     VIXL_ASSERT(OutsideITBlock());
1339     MacroEmissionCheckScope guard(this);
1340     ITScope it_scope(this, &cond, guard);
1341     bfi(cond, rd, rn, lsb, width);
1342   }
Bfi(Register rd,Register rn,uint32_t lsb,uint32_t width)1343   void Bfi(Register rd, Register rn, uint32_t lsb, uint32_t width) {
1344     Bfi(al, rd, rn, lsb, width);
1345   }
1346 
Bic(Condition cond,Register rd,Register rn,const Operand & operand)1347   void Bic(Condition cond, Register rd, Register rn, const Operand& operand) {
1348     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1349     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1350     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1351     VIXL_ASSERT(allow_macro_instructions_);
1352     VIXL_ASSERT(OutsideITBlock());
1353     MacroEmissionCheckScope guard(this);
1354     if (cond.Is(al) && operand.IsImmediate()) {
1355       uint32_t immediate = operand.GetImmediate();
1356       if ((immediate == 0) && rd.Is(rn)) {
1357         return;
1358       }
1359       if (immediate == 0xffffffff) {
1360         mov(rd, 0);
1361         return;
1362       }
1363     }
1364     bool can_use_it =
1365         // BIC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1366         operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
1367         operand.GetBaseRegister().IsLow();
1368     ITScope it_scope(this, &cond, guard, can_use_it);
1369     bic(cond, rd, rn, operand);
1370   }
Bic(Register rd,Register rn,const Operand & operand)1371   void Bic(Register rd, Register rn, const Operand& operand) {
1372     Bic(al, rd, rn, operand);
1373   }
Bic(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1374   void Bic(FlagsUpdate flags,
1375            Condition cond,
1376            Register rd,
1377            Register rn,
1378            const Operand& operand) {
1379     switch (flags) {
1380       case LeaveFlags:
1381         Bic(cond, rd, rn, operand);
1382         break;
1383       case SetFlags:
1384         Bics(cond, rd, rn, operand);
1385         break;
1386       case DontCare:
1387         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1388                                    rn.Is(rd) && operand.IsPlainRegister() &&
1389                                    operand.GetBaseRegister().IsLow();
1390         if (setflags_is_smaller) {
1391           Bics(cond, rd, rn, operand);
1392         } else {
1393           Bic(cond, rd, rn, operand);
1394         }
1395         break;
1396     }
1397   }
Bic(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1398   void Bic(FlagsUpdate flags,
1399            Register rd,
1400            Register rn,
1401            const Operand& operand) {
1402     Bic(flags, al, rd, rn, operand);
1403   }
1404 
Bics(Condition cond,Register rd,Register rn,const Operand & operand)1405   void Bics(Condition cond, Register rd, Register rn, const Operand& operand) {
1406     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1407     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1408     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1409     VIXL_ASSERT(allow_macro_instructions_);
1410     VIXL_ASSERT(OutsideITBlock());
1411     MacroEmissionCheckScope guard(this);
1412     ITScope it_scope(this, &cond, guard);
1413     bics(cond, rd, rn, operand);
1414   }
Bics(Register rd,Register rn,const Operand & operand)1415   void Bics(Register rd, Register rn, const Operand& operand) {
1416     Bics(al, rd, rn, operand);
1417   }
1418 
Bkpt(Condition cond,uint32_t imm)1419   void Bkpt(Condition cond, uint32_t imm) {
1420     VIXL_ASSERT(allow_macro_instructions_);
1421     VIXL_ASSERT(OutsideITBlock());
1422     MacroEmissionCheckScope guard(this);
1423     ITScope it_scope(this, &cond, guard);
1424     bkpt(cond, imm);
1425   }
Bkpt(uint32_t imm)1426   void Bkpt(uint32_t imm) { Bkpt(al, imm); }
1427 
Bl(Condition cond,Label * label)1428   void Bl(Condition cond, Label* label) {
1429     VIXL_ASSERT(allow_macro_instructions_);
1430     VIXL_ASSERT(OutsideITBlock());
1431     MacroEmissionCheckScope::PoolPolicy pool_policy =
1432         MacroEmissionCheckScope::kBlockPools;
1433     if (!label->IsBound()) {
1434       const ReferenceInfo* info;
1435       bool can_encode = bl_info(cond, label, &info);
1436       VIXL_CHECK(can_encode);
1437       CheckEmitPoolForInstruction(info, label, &cond);
1438       // We have already checked for pool emission.
1439       pool_policy = MacroEmissionCheckScope::kIgnorePools;
1440     }
1441     MacroEmissionCheckScope guard(this, pool_policy);
1442     ITScope it_scope(this, &cond, guard);
1443     bl(cond, label);
1444     RegisterForwardReference(label);
1445   }
Bl(Label * label)1446   void Bl(Label* label) { Bl(al, label); }
1447 
Blx(Condition cond,Label * label)1448   void Blx(Condition cond, Label* label) {
1449     VIXL_ASSERT(allow_macro_instructions_);
1450     VIXL_ASSERT(OutsideITBlock());
1451     MacroEmissionCheckScope::PoolPolicy pool_policy =
1452         MacroEmissionCheckScope::kBlockPools;
1453     if (!label->IsBound()) {
1454       const ReferenceInfo* info;
1455       bool can_encode = blx_info(cond, label, &info);
1456       VIXL_CHECK(can_encode);
1457       CheckEmitPoolForInstruction(info, label, &cond);
1458       // We have already checked for pool emission.
1459       pool_policy = MacroEmissionCheckScope::kIgnorePools;
1460     }
1461     MacroEmissionCheckScope guard(this, pool_policy);
1462     ITScope it_scope(this, &cond, guard);
1463     blx(cond, label);
1464     RegisterForwardReference(label);
1465   }
Blx(Label * label)1466   void Blx(Label* label) { Blx(al, label); }
1467 
Blx(Condition cond,Register rm)1468   void Blx(Condition cond, Register rm) {
1469     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1470     VIXL_ASSERT(allow_macro_instructions_);
1471     VIXL_ASSERT(OutsideITBlock());
1472     MacroEmissionCheckScope guard(this);
1473     bool can_use_it =
1474         // BLX{<c>}{<q>} <Rm> ; T1
1475         !rm.IsPC();
1476     ITScope it_scope(this, &cond, guard, can_use_it);
1477     blx(cond, rm);
1478   }
Blx(Register rm)1479   void Blx(Register rm) { Blx(al, rm); }
1480 
Bx(Condition cond,Register rm)1481   void Bx(Condition cond, Register rm) {
1482     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1483     VIXL_ASSERT(allow_macro_instructions_);
1484     VIXL_ASSERT(OutsideITBlock());
1485     MacroEmissionCheckScope guard(this);
1486     bool can_use_it =
1487         // BX{<c>}{<q>} <Rm> ; T1
1488         !rm.IsPC();
1489     ITScope it_scope(this, &cond, guard, can_use_it);
1490     bx(cond, rm);
1491   }
Bx(Register rm)1492   void Bx(Register rm) { Bx(al, rm); }
1493 
Bxj(Condition cond,Register rm)1494   void Bxj(Condition cond, Register rm) {
1495     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1496     VIXL_ASSERT(allow_macro_instructions_);
1497     VIXL_ASSERT(OutsideITBlock());
1498     MacroEmissionCheckScope guard(this);
1499     ITScope it_scope(this, &cond, guard);
1500     bxj(cond, rm);
1501   }
Bxj(Register rm)1502   void Bxj(Register rm) { Bxj(al, rm); }
1503 
Cbnz(Register rn,Label * label)1504   void Cbnz(Register rn, Label* label) {
1505     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1506     VIXL_ASSERT(allow_macro_instructions_);
1507     VIXL_ASSERT(OutsideITBlock());
1508     MacroEmissionCheckScope::PoolPolicy pool_policy =
1509         MacroEmissionCheckScope::kBlockPools;
1510     if (!label->IsBound()) {
1511       const ReferenceInfo* info;
1512       bool can_encode = cbnz_info(rn, label, &info);
1513       VIXL_CHECK(can_encode);
1514       CheckEmitPoolForInstruction(info, label);
1515       // We have already checked for pool emission.
1516       pool_policy = MacroEmissionCheckScope::kIgnorePools;
1517     }
1518     MacroEmissionCheckScope guard(this, pool_policy);
1519     cbnz(rn, label);
1520     RegisterForwardReference(label);
1521   }
1522 
Cbz(Register rn,Label * label)1523   void Cbz(Register rn, Label* label) {
1524     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1525     VIXL_ASSERT(allow_macro_instructions_);
1526     VIXL_ASSERT(OutsideITBlock());
1527     MacroEmissionCheckScope::PoolPolicy pool_policy =
1528         MacroEmissionCheckScope::kBlockPools;
1529     if (!label->IsBound()) {
1530       const ReferenceInfo* info;
1531       bool can_encode = cbz_info(rn, label, &info);
1532       VIXL_CHECK(can_encode);
1533       CheckEmitPoolForInstruction(info, label);
1534       // We have already checked for pool emission.
1535       pool_policy = MacroEmissionCheckScope::kIgnorePools;
1536     }
1537     MacroEmissionCheckScope guard(this, pool_policy);
1538     cbz(rn, label);
1539     RegisterForwardReference(label);
1540   }
1541 
Clrex(Condition cond)1542   void Clrex(Condition cond) {
1543     VIXL_ASSERT(allow_macro_instructions_);
1544     VIXL_ASSERT(OutsideITBlock());
1545     MacroEmissionCheckScope guard(this);
1546     ITScope it_scope(this, &cond, guard);
1547     clrex(cond);
1548   }
Clrex()1549   void Clrex() { Clrex(al); }
1550 
Clz(Condition cond,Register rd,Register rm)1551   void Clz(Condition cond, Register rd, Register rm) {
1552     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1553     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1554     VIXL_ASSERT(allow_macro_instructions_);
1555     VIXL_ASSERT(OutsideITBlock());
1556     MacroEmissionCheckScope guard(this);
1557     ITScope it_scope(this, &cond, guard);
1558     clz(cond, rd, rm);
1559   }
Clz(Register rd,Register rm)1560   void Clz(Register rd, Register rm) { Clz(al, rd, rm); }
1561 
Cmn(Condition cond,Register rn,const Operand & operand)1562   void Cmn(Condition cond, Register rn, const Operand& operand) {
1563     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1564     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1565     VIXL_ASSERT(allow_macro_instructions_);
1566     VIXL_ASSERT(OutsideITBlock());
1567     MacroEmissionCheckScope guard(this);
1568     bool can_use_it =
1569         // CMN{<c>}{<q>} <Rn>, <Rm> ; T1
1570         operand.IsPlainRegister() && rn.IsLow() &&
1571         operand.GetBaseRegister().IsLow();
1572     ITScope it_scope(this, &cond, guard, can_use_it);
1573     cmn(cond, rn, operand);
1574   }
Cmn(Register rn,const Operand & operand)1575   void Cmn(Register rn, const Operand& operand) { Cmn(al, rn, operand); }
1576 
Cmp(Condition cond,Register rn,const Operand & operand)1577   void Cmp(Condition cond, Register rn, const Operand& operand) {
1578     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1579     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1580     VIXL_ASSERT(allow_macro_instructions_);
1581     VIXL_ASSERT(OutsideITBlock());
1582     MacroEmissionCheckScope guard(this);
1583     bool can_use_it =
1584         // CMP{<c>}{<q>} <Rn>, #<imm8> ; T1
1585         (operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
1586          rn.IsLow()) ||
1587         // CMP{<c>}{<q>} <Rn>, <Rm> ; T1 T2
1588         (operand.IsPlainRegister() && !rn.IsPC() &&
1589          !operand.GetBaseRegister().IsPC());
1590     ITScope it_scope(this, &cond, guard, can_use_it);
1591     cmp(cond, rn, operand);
1592   }
Cmp(Register rn,const Operand & operand)1593   void Cmp(Register rn, const Operand& operand) { Cmp(al, rn, operand); }
1594 
Crc32b(Condition cond,Register rd,Register rn,Register rm)1595   void Crc32b(Condition cond, Register rd, Register rn, Register rm) {
1596     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1597     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1598     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1599     VIXL_ASSERT(allow_macro_instructions_);
1600     VIXL_ASSERT(OutsideITBlock());
1601     MacroEmissionCheckScope guard(this);
1602     ITScope it_scope(this, &cond, guard);
1603     crc32b(cond, rd, rn, rm);
1604   }
Crc32b(Register rd,Register rn,Register rm)1605   void Crc32b(Register rd, Register rn, Register rm) { Crc32b(al, rd, rn, rm); }
1606 
Crc32cb(Condition cond,Register rd,Register rn,Register rm)1607   void Crc32cb(Condition cond, Register rd, Register rn, Register rm) {
1608     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1609     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1610     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1611     VIXL_ASSERT(allow_macro_instructions_);
1612     VIXL_ASSERT(OutsideITBlock());
1613     MacroEmissionCheckScope guard(this);
1614     ITScope it_scope(this, &cond, guard);
1615     crc32cb(cond, rd, rn, rm);
1616   }
Crc32cb(Register rd,Register rn,Register rm)1617   void Crc32cb(Register rd, Register rn, Register rm) {
1618     Crc32cb(al, rd, rn, rm);
1619   }
1620 
Crc32ch(Condition cond,Register rd,Register rn,Register rm)1621   void Crc32ch(Condition cond, Register rd, Register rn, Register rm) {
1622     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1623     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1624     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1625     VIXL_ASSERT(allow_macro_instructions_);
1626     VIXL_ASSERT(OutsideITBlock());
1627     MacroEmissionCheckScope guard(this);
1628     ITScope it_scope(this, &cond, guard);
1629     crc32ch(cond, rd, rn, rm);
1630   }
Crc32ch(Register rd,Register rn,Register rm)1631   void Crc32ch(Register rd, Register rn, Register rm) {
1632     Crc32ch(al, rd, rn, rm);
1633   }
1634 
Crc32cw(Condition cond,Register rd,Register rn,Register rm)1635   void Crc32cw(Condition cond, Register rd, Register rn, Register rm) {
1636     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1637     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1638     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1639     VIXL_ASSERT(allow_macro_instructions_);
1640     VIXL_ASSERT(OutsideITBlock());
1641     MacroEmissionCheckScope guard(this);
1642     ITScope it_scope(this, &cond, guard);
1643     crc32cw(cond, rd, rn, rm);
1644   }
Crc32cw(Register rd,Register rn,Register rm)1645   void Crc32cw(Register rd, Register rn, Register rm) {
1646     Crc32cw(al, rd, rn, rm);
1647   }
1648 
Crc32h(Condition cond,Register rd,Register rn,Register rm)1649   void Crc32h(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, guard);
1657     crc32h(cond, rd, rn, rm);
1658   }
Crc32h(Register rd,Register rn,Register rm)1659   void Crc32h(Register rd, Register rn, Register rm) { Crc32h(al, rd, rn, rm); }
1660 
Crc32w(Condition cond,Register rd,Register rn,Register rm)1661   void Crc32w(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, guard);
1669     crc32w(cond, rd, rn, rm);
1670   }
Crc32w(Register rd,Register rn,Register rm)1671   void Crc32w(Register rd, Register rn, Register rm) { Crc32w(al, rd, rn, rm); }
1672 
Dmb(Condition cond,MemoryBarrier option)1673   void Dmb(Condition cond, MemoryBarrier option) {
1674     VIXL_ASSERT(allow_macro_instructions_);
1675     VIXL_ASSERT(OutsideITBlock());
1676     MacroEmissionCheckScope guard(this);
1677     ITScope it_scope(this, &cond, guard);
1678     dmb(cond, option);
1679   }
Dmb(MemoryBarrier option)1680   void Dmb(MemoryBarrier option) { Dmb(al, option); }
1681 
Dsb(Condition cond,MemoryBarrier option)1682   void Dsb(Condition cond, MemoryBarrier option) {
1683     VIXL_ASSERT(allow_macro_instructions_);
1684     VIXL_ASSERT(OutsideITBlock());
1685     MacroEmissionCheckScope guard(this);
1686     ITScope it_scope(this, &cond, guard);
1687     dsb(cond, option);
1688   }
Dsb(MemoryBarrier option)1689   void Dsb(MemoryBarrier option) { Dsb(al, option); }
1690 
Eor(Condition cond,Register rd,Register rn,const Operand & operand)1691   void Eor(Condition cond, Register rd, Register rn, const Operand& operand) {
1692     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1693     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1694     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1695     VIXL_ASSERT(allow_macro_instructions_);
1696     VIXL_ASSERT(OutsideITBlock());
1697     MacroEmissionCheckScope guard(this);
1698     if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) {
1699       uint32_t immediate = operand.GetImmediate();
1700       if (immediate == 0) {
1701         return;
1702       }
1703       if (immediate == 0xffffffff) {
1704         mvn(rd, rn);
1705         return;
1706       }
1707     }
1708     bool can_use_it =
1709         // EOR<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1710         operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
1711         operand.GetBaseRegister().IsLow();
1712     ITScope it_scope(this, &cond, guard, can_use_it);
1713     eor(cond, rd, rn, operand);
1714   }
Eor(Register rd,Register rn,const Operand & operand)1715   void Eor(Register rd, Register rn, const Operand& operand) {
1716     Eor(al, rd, rn, operand);
1717   }
Eor(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1718   void Eor(FlagsUpdate flags,
1719            Condition cond,
1720            Register rd,
1721            Register rn,
1722            const Operand& operand) {
1723     switch (flags) {
1724       case LeaveFlags:
1725         Eor(cond, rd, rn, operand);
1726         break;
1727       case SetFlags:
1728         Eors(cond, rd, rn, operand);
1729         break;
1730       case DontCare:
1731         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1732                                    rn.Is(rd) && operand.IsPlainRegister() &&
1733                                    operand.GetBaseRegister().IsLow();
1734         if (setflags_is_smaller) {
1735           Eors(cond, rd, rn, operand);
1736         } else {
1737           Eor(cond, rd, rn, operand);
1738         }
1739         break;
1740     }
1741   }
Eor(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1742   void Eor(FlagsUpdate flags,
1743            Register rd,
1744            Register rn,
1745            const Operand& operand) {
1746     Eor(flags, al, rd, rn, operand);
1747   }
1748 
Eors(Condition cond,Register rd,Register rn,const Operand & operand)1749   void Eors(Condition cond, Register rd, Register rn, const Operand& operand) {
1750     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1751     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1752     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1753     VIXL_ASSERT(allow_macro_instructions_);
1754     VIXL_ASSERT(OutsideITBlock());
1755     MacroEmissionCheckScope guard(this);
1756     ITScope it_scope(this, &cond, guard);
1757     eors(cond, rd, rn, operand);
1758   }
Eors(Register rd,Register rn,const Operand & operand)1759   void Eors(Register rd, Register rn, const Operand& operand) {
1760     Eors(al, rd, rn, operand);
1761   }
1762 
Fldmdbx(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1763   void Fldmdbx(Condition cond,
1764                Register rn,
1765                WriteBack write_back,
1766                DRegisterList dreglist) {
1767     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1768     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
1769     VIXL_ASSERT(allow_macro_instructions_);
1770     VIXL_ASSERT(OutsideITBlock());
1771     MacroEmissionCheckScope guard(this);
1772     ITScope it_scope(this, &cond, guard);
1773     fldmdbx(cond, rn, write_back, dreglist);
1774   }
Fldmdbx(Register rn,WriteBack write_back,DRegisterList dreglist)1775   void Fldmdbx(Register rn, WriteBack write_back, DRegisterList dreglist) {
1776     Fldmdbx(al, rn, write_back, dreglist);
1777   }
1778 
Fldmiax(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1779   void Fldmiax(Condition cond,
1780                Register rn,
1781                WriteBack write_back,
1782                DRegisterList dreglist) {
1783     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1784     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
1785     VIXL_ASSERT(allow_macro_instructions_);
1786     VIXL_ASSERT(OutsideITBlock());
1787     MacroEmissionCheckScope guard(this);
1788     ITScope it_scope(this, &cond, guard);
1789     fldmiax(cond, rn, write_back, dreglist);
1790   }
Fldmiax(Register rn,WriteBack write_back,DRegisterList dreglist)1791   void Fldmiax(Register rn, WriteBack write_back, DRegisterList dreglist) {
1792     Fldmiax(al, rn, write_back, dreglist);
1793   }
1794 
Fstmdbx(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1795   void Fstmdbx(Condition cond,
1796                Register rn,
1797                WriteBack write_back,
1798                DRegisterList dreglist) {
1799     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1800     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
1801     VIXL_ASSERT(allow_macro_instructions_);
1802     VIXL_ASSERT(OutsideITBlock());
1803     MacroEmissionCheckScope guard(this);
1804     ITScope it_scope(this, &cond, guard);
1805     fstmdbx(cond, rn, write_back, dreglist);
1806   }
Fstmdbx(Register rn,WriteBack write_back,DRegisterList dreglist)1807   void Fstmdbx(Register rn, WriteBack write_back, DRegisterList dreglist) {
1808     Fstmdbx(al, rn, write_back, dreglist);
1809   }
1810 
Fstmiax(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1811   void Fstmiax(Condition cond,
1812                Register rn,
1813                WriteBack write_back,
1814                DRegisterList dreglist) {
1815     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1816     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
1817     VIXL_ASSERT(allow_macro_instructions_);
1818     VIXL_ASSERT(OutsideITBlock());
1819     MacroEmissionCheckScope guard(this);
1820     ITScope it_scope(this, &cond, guard);
1821     fstmiax(cond, rn, write_back, dreglist);
1822   }
Fstmiax(Register rn,WriteBack write_back,DRegisterList dreglist)1823   void Fstmiax(Register rn, WriteBack write_back, DRegisterList dreglist) {
1824     Fstmiax(al, rn, write_back, dreglist);
1825   }
1826 
Hlt(Condition cond,uint32_t imm)1827   void Hlt(Condition cond, uint32_t imm) {
1828     VIXL_ASSERT(allow_macro_instructions_);
1829     VIXL_ASSERT(OutsideITBlock());
1830     MacroEmissionCheckScope guard(this);
1831     ITScope it_scope(this, &cond, guard);
1832     hlt(cond, imm);
1833   }
Hlt(uint32_t imm)1834   void Hlt(uint32_t imm) { Hlt(al, imm); }
1835 
Hvc(Condition cond,uint32_t imm)1836   void Hvc(Condition cond, uint32_t imm) {
1837     VIXL_ASSERT(allow_macro_instructions_);
1838     VIXL_ASSERT(OutsideITBlock());
1839     MacroEmissionCheckScope guard(this);
1840     ITScope it_scope(this, &cond, guard);
1841     hvc(cond, imm);
1842   }
Hvc(uint32_t imm)1843   void Hvc(uint32_t imm) { Hvc(al, imm); }
1844 
Isb(Condition cond,MemoryBarrier option)1845   void Isb(Condition cond, MemoryBarrier option) {
1846     VIXL_ASSERT(allow_macro_instructions_);
1847     VIXL_ASSERT(OutsideITBlock());
1848     MacroEmissionCheckScope guard(this);
1849     ITScope it_scope(this, &cond, guard);
1850     isb(cond, option);
1851   }
Isb(MemoryBarrier option)1852   void Isb(MemoryBarrier option) { Isb(al, option); }
1853 
Lda(Condition cond,Register rt,const MemOperand & operand)1854   void Lda(Condition cond, Register rt, const MemOperand& operand) {
1855     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1856     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1857     VIXL_ASSERT(allow_macro_instructions_);
1858     VIXL_ASSERT(OutsideITBlock());
1859     MacroEmissionCheckScope guard(this);
1860     ITScope it_scope(this, &cond, guard);
1861     lda(cond, rt, operand);
1862   }
Lda(Register rt,const MemOperand & operand)1863   void Lda(Register rt, const MemOperand& operand) { Lda(al, rt, operand); }
1864 
Ldab(Condition cond,Register rt,const MemOperand & operand)1865   void Ldab(Condition cond, Register rt, const MemOperand& operand) {
1866     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1867     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1868     VIXL_ASSERT(allow_macro_instructions_);
1869     VIXL_ASSERT(OutsideITBlock());
1870     MacroEmissionCheckScope guard(this);
1871     ITScope it_scope(this, &cond, guard);
1872     ldab(cond, rt, operand);
1873   }
Ldab(Register rt,const MemOperand & operand)1874   void Ldab(Register rt, const MemOperand& operand) { Ldab(al, rt, operand); }
1875 
Ldaex(Condition cond,Register rt,const MemOperand & operand)1876   void Ldaex(Condition cond, Register rt, const MemOperand& operand) {
1877     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1878     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1879     VIXL_ASSERT(allow_macro_instructions_);
1880     VIXL_ASSERT(OutsideITBlock());
1881     MacroEmissionCheckScope guard(this);
1882     ITScope it_scope(this, &cond, guard);
1883     ldaex(cond, rt, operand);
1884   }
Ldaex(Register rt,const MemOperand & operand)1885   void Ldaex(Register rt, const MemOperand& operand) { Ldaex(al, rt, operand); }
1886 
Ldaexb(Condition cond,Register rt,const MemOperand & operand)1887   void Ldaexb(Condition cond, Register rt, const MemOperand& operand) {
1888     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1889     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1890     VIXL_ASSERT(allow_macro_instructions_);
1891     VIXL_ASSERT(OutsideITBlock());
1892     MacroEmissionCheckScope guard(this);
1893     ITScope it_scope(this, &cond, guard);
1894     ldaexb(cond, rt, operand);
1895   }
Ldaexb(Register rt,const MemOperand & operand)1896   void Ldaexb(Register rt, const MemOperand& operand) {
1897     Ldaexb(al, rt, operand);
1898   }
1899 
Ldaexd(Condition cond,Register rt,Register rt2,const MemOperand & operand)1900   void Ldaexd(Condition cond,
1901               Register rt,
1902               Register rt2,
1903               const MemOperand& operand) {
1904     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1905     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
1906     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1907     VIXL_ASSERT(allow_macro_instructions_);
1908     VIXL_ASSERT(OutsideITBlock());
1909     MacroEmissionCheckScope guard(this);
1910     ITScope it_scope(this, &cond, guard);
1911     ldaexd(cond, rt, rt2, operand);
1912   }
Ldaexd(Register rt,Register rt2,const MemOperand & operand)1913   void Ldaexd(Register rt, Register rt2, const MemOperand& operand) {
1914     Ldaexd(al, rt, rt2, operand);
1915   }
1916 
Ldaexh(Condition cond,Register rt,const MemOperand & operand)1917   void Ldaexh(Condition cond, Register rt, const MemOperand& operand) {
1918     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1919     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1920     VIXL_ASSERT(allow_macro_instructions_);
1921     VIXL_ASSERT(OutsideITBlock());
1922     MacroEmissionCheckScope guard(this);
1923     ITScope it_scope(this, &cond, guard);
1924     ldaexh(cond, rt, operand);
1925   }
Ldaexh(Register rt,const MemOperand & operand)1926   void Ldaexh(Register rt, const MemOperand& operand) {
1927     Ldaexh(al, rt, operand);
1928   }
1929 
Ldah(Condition cond,Register rt,const MemOperand & operand)1930   void Ldah(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, guard);
1937     ldah(cond, rt, operand);
1938   }
Ldah(Register rt,const MemOperand & operand)1939   void Ldah(Register rt, const MemOperand& operand) { Ldah(al, rt, operand); }
1940 
Ldm(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1941   void Ldm(Condition cond,
1942            Register rn,
1943            WriteBack write_back,
1944            RegisterList registers) {
1945     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1946     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
1947     VIXL_ASSERT(allow_macro_instructions_);
1948     VIXL_ASSERT(OutsideITBlock());
1949     MacroEmissionCheckScope guard(this);
1950     ITScope it_scope(this, &cond, guard);
1951     ldm(cond, rn, write_back, registers);
1952   }
Ldm(Register rn,WriteBack write_back,RegisterList registers)1953   void Ldm(Register rn, WriteBack write_back, RegisterList registers) {
1954     Ldm(al, rn, write_back, registers);
1955   }
1956 
Ldmda(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1957   void Ldmda(Condition cond,
1958              Register rn,
1959              WriteBack write_back,
1960              RegisterList registers) {
1961     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1962     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
1963     VIXL_ASSERT(allow_macro_instructions_);
1964     VIXL_ASSERT(OutsideITBlock());
1965     MacroEmissionCheckScope guard(this);
1966     ITScope it_scope(this, &cond, guard);
1967     ldmda(cond, rn, write_back, registers);
1968   }
Ldmda(Register rn,WriteBack write_back,RegisterList registers)1969   void Ldmda(Register rn, WriteBack write_back, RegisterList registers) {
1970     Ldmda(al, rn, write_back, registers);
1971   }
1972 
Ldmdb(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1973   void Ldmdb(Condition cond,
1974              Register rn,
1975              WriteBack write_back,
1976              RegisterList registers) {
1977     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1978     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
1979     VIXL_ASSERT(allow_macro_instructions_);
1980     VIXL_ASSERT(OutsideITBlock());
1981     MacroEmissionCheckScope guard(this);
1982     ITScope it_scope(this, &cond, guard);
1983     ldmdb(cond, rn, write_back, registers);
1984   }
Ldmdb(Register rn,WriteBack write_back,RegisterList registers)1985   void Ldmdb(Register rn, WriteBack write_back, RegisterList registers) {
1986     Ldmdb(al, rn, write_back, registers);
1987   }
1988 
Ldmea(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1989   void Ldmea(Condition cond,
1990              Register rn,
1991              WriteBack write_back,
1992              RegisterList registers) {
1993     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1994     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
1995     VIXL_ASSERT(allow_macro_instructions_);
1996     VIXL_ASSERT(OutsideITBlock());
1997     MacroEmissionCheckScope guard(this);
1998     ITScope it_scope(this, &cond, guard);
1999     ldmea(cond, rn, write_back, registers);
2000   }
Ldmea(Register rn,WriteBack write_back,RegisterList registers)2001   void Ldmea(Register rn, WriteBack write_back, RegisterList registers) {
2002     Ldmea(al, rn, write_back, registers);
2003   }
2004 
Ldmed(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2005   void Ldmed(Condition cond,
2006              Register rn,
2007              WriteBack write_back,
2008              RegisterList registers) {
2009     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2010     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2011     VIXL_ASSERT(allow_macro_instructions_);
2012     VIXL_ASSERT(OutsideITBlock());
2013     MacroEmissionCheckScope guard(this);
2014     ITScope it_scope(this, &cond, guard);
2015     ldmed(cond, rn, write_back, registers);
2016   }
Ldmed(Register rn,WriteBack write_back,RegisterList registers)2017   void Ldmed(Register rn, WriteBack write_back, RegisterList registers) {
2018     Ldmed(al, rn, write_back, registers);
2019   }
2020 
Ldmfa(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2021   void Ldmfa(Condition cond,
2022              Register rn,
2023              WriteBack write_back,
2024              RegisterList registers) {
2025     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2026     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2027     VIXL_ASSERT(allow_macro_instructions_);
2028     VIXL_ASSERT(OutsideITBlock());
2029     MacroEmissionCheckScope guard(this);
2030     ITScope it_scope(this, &cond, guard);
2031     ldmfa(cond, rn, write_back, registers);
2032   }
Ldmfa(Register rn,WriteBack write_back,RegisterList registers)2033   void Ldmfa(Register rn, WriteBack write_back, RegisterList registers) {
2034     Ldmfa(al, rn, write_back, registers);
2035   }
2036 
Ldmfd(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2037   void Ldmfd(Condition cond,
2038              Register rn,
2039              WriteBack write_back,
2040              RegisterList registers) {
2041     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2042     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2043     VIXL_ASSERT(allow_macro_instructions_);
2044     VIXL_ASSERT(OutsideITBlock());
2045     MacroEmissionCheckScope guard(this);
2046     ITScope it_scope(this, &cond, guard);
2047     ldmfd(cond, rn, write_back, registers);
2048   }
Ldmfd(Register rn,WriteBack write_back,RegisterList registers)2049   void Ldmfd(Register rn, WriteBack write_back, RegisterList registers) {
2050     Ldmfd(al, rn, write_back, registers);
2051   }
2052 
Ldmib(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2053   void Ldmib(Condition cond,
2054              Register rn,
2055              WriteBack write_back,
2056              RegisterList registers) {
2057     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2058     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2059     VIXL_ASSERT(allow_macro_instructions_);
2060     VIXL_ASSERT(OutsideITBlock());
2061     MacroEmissionCheckScope guard(this);
2062     ITScope it_scope(this, &cond, guard);
2063     ldmib(cond, rn, write_back, registers);
2064   }
Ldmib(Register rn,WriteBack write_back,RegisterList registers)2065   void Ldmib(Register rn, WriteBack write_back, RegisterList registers) {
2066     Ldmib(al, rn, write_back, registers);
2067   }
2068 
Ldr(Condition cond,Register rt,const MemOperand & operand)2069   void Ldr(Condition cond, Register rt, const MemOperand& operand) {
2070     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2071     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2072     VIXL_ASSERT(allow_macro_instructions_);
2073     VIXL_ASSERT(OutsideITBlock());
2074     MacroEmissionCheckScope guard(this);
2075     bool can_use_it =
2076         // LDR{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
2077         (operand.IsImmediate() && rt.IsLow() &&
2078          operand.GetBaseRegister().IsLow() &&
2079          operand.IsOffsetImmediateWithinRange(0, 124, 4) &&
2080          (operand.GetAddrMode() == Offset)) ||
2081         // LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
2082         (operand.IsImmediate() && rt.IsLow() &&
2083          operand.GetBaseRegister().IsSP() &&
2084          operand.IsOffsetImmediateWithinRange(0, 1020, 4) &&
2085          (operand.GetAddrMode() == Offset)) ||
2086         // LDR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2087         (operand.IsPlainRegister() && rt.IsLow() &&
2088          operand.GetBaseRegister().IsLow() &&
2089          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2090          (operand.GetAddrMode() == Offset));
2091     ITScope it_scope(this, &cond, guard, can_use_it);
2092     ldr(cond, rt, operand);
2093   }
Ldr(Register rt,const MemOperand & operand)2094   void Ldr(Register rt, const MemOperand& operand) { Ldr(al, rt, operand); }
2095 
2096 
Ldrb(Condition cond,Register rt,const MemOperand & operand)2097   void Ldrb(Condition cond, Register rt, const MemOperand& operand) {
2098     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2099     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2100     VIXL_ASSERT(allow_macro_instructions_);
2101     VIXL_ASSERT(OutsideITBlock());
2102     MacroEmissionCheckScope guard(this);
2103     bool can_use_it =
2104         // LDRB{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
2105         (operand.IsImmediate() && rt.IsLow() &&
2106          operand.GetBaseRegister().IsLow() &&
2107          operand.IsOffsetImmediateWithinRange(0, 31) &&
2108          (operand.GetAddrMode() == Offset)) ||
2109         // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2110         (operand.IsPlainRegister() && rt.IsLow() &&
2111          operand.GetBaseRegister().IsLow() &&
2112          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2113          (operand.GetAddrMode() == Offset));
2114     ITScope it_scope(this, &cond, guard, can_use_it);
2115     ldrb(cond, rt, operand);
2116   }
Ldrb(Register rt,const MemOperand & operand)2117   void Ldrb(Register rt, const MemOperand& operand) { Ldrb(al, rt, operand); }
2118 
2119 
Ldrd(Condition cond,Register rt,Register rt2,const MemOperand & operand)2120   void Ldrd(Condition cond,
2121             Register rt,
2122             Register rt2,
2123             const MemOperand& operand) {
2124     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2125     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
2126     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2127     VIXL_ASSERT(allow_macro_instructions_);
2128     VIXL_ASSERT(OutsideITBlock());
2129     MacroEmissionCheckScope guard(this);
2130     ITScope it_scope(this, &cond, guard);
2131     ldrd(cond, rt, rt2, operand);
2132   }
Ldrd(Register rt,Register rt2,const MemOperand & operand)2133   void Ldrd(Register rt, Register rt2, const MemOperand& operand) {
2134     Ldrd(al, rt, rt2, operand);
2135   }
2136 
2137 
Ldrex(Condition cond,Register rt,const MemOperand & operand)2138   void Ldrex(Condition cond, Register rt, const MemOperand& operand) {
2139     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2140     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2141     VIXL_ASSERT(allow_macro_instructions_);
2142     VIXL_ASSERT(OutsideITBlock());
2143     MacroEmissionCheckScope guard(this);
2144     ITScope it_scope(this, &cond, guard);
2145     ldrex(cond, rt, operand);
2146   }
Ldrex(Register rt,const MemOperand & operand)2147   void Ldrex(Register rt, const MemOperand& operand) { Ldrex(al, rt, operand); }
2148 
Ldrexb(Condition cond,Register rt,const MemOperand & operand)2149   void Ldrexb(Condition cond, Register rt, const MemOperand& operand) {
2150     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2151     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2152     VIXL_ASSERT(allow_macro_instructions_);
2153     VIXL_ASSERT(OutsideITBlock());
2154     MacroEmissionCheckScope guard(this);
2155     ITScope it_scope(this, &cond, guard);
2156     ldrexb(cond, rt, operand);
2157   }
Ldrexb(Register rt,const MemOperand & operand)2158   void Ldrexb(Register rt, const MemOperand& operand) {
2159     Ldrexb(al, rt, operand);
2160   }
2161 
Ldrexd(Condition cond,Register rt,Register rt2,const MemOperand & operand)2162   void Ldrexd(Condition cond,
2163               Register rt,
2164               Register rt2,
2165               const MemOperand& operand) {
2166     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2167     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
2168     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2169     VIXL_ASSERT(allow_macro_instructions_);
2170     VIXL_ASSERT(OutsideITBlock());
2171     MacroEmissionCheckScope guard(this);
2172     ITScope it_scope(this, &cond, guard);
2173     ldrexd(cond, rt, rt2, operand);
2174   }
Ldrexd(Register rt,Register rt2,const MemOperand & operand)2175   void Ldrexd(Register rt, Register rt2, const MemOperand& operand) {
2176     Ldrexd(al, rt, rt2, operand);
2177   }
2178 
Ldrexh(Condition cond,Register rt,const MemOperand & operand)2179   void Ldrexh(Condition cond, Register rt, const MemOperand& operand) {
2180     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2181     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2182     VIXL_ASSERT(allow_macro_instructions_);
2183     VIXL_ASSERT(OutsideITBlock());
2184     MacroEmissionCheckScope guard(this);
2185     ITScope it_scope(this, &cond, guard);
2186     ldrexh(cond, rt, operand);
2187   }
Ldrexh(Register rt,const MemOperand & operand)2188   void Ldrexh(Register rt, const MemOperand& operand) {
2189     Ldrexh(al, rt, operand);
2190   }
2191 
Ldrh(Condition cond,Register rt,const MemOperand & operand)2192   void Ldrh(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     bool can_use_it =
2199         // LDRH{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
2200         (operand.IsImmediate() && rt.IsLow() &&
2201          operand.GetBaseRegister().IsLow() &&
2202          operand.IsOffsetImmediateWithinRange(0, 62, 2) &&
2203          (operand.GetAddrMode() == Offset)) ||
2204         // LDRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2205         (operand.IsPlainRegister() && rt.IsLow() &&
2206          operand.GetBaseRegister().IsLow() &&
2207          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2208          (operand.GetAddrMode() == Offset));
2209     ITScope it_scope(this, &cond, guard, can_use_it);
2210     ldrh(cond, rt, operand);
2211   }
Ldrh(Register rt,const MemOperand & operand)2212   void Ldrh(Register rt, const MemOperand& operand) { Ldrh(al, rt, operand); }
2213 
2214 
Ldrsb(Condition cond,Register rt,const MemOperand & operand)2215   void Ldrsb(Condition cond, Register rt, const MemOperand& operand) {
2216     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2217     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2218     VIXL_ASSERT(allow_macro_instructions_);
2219     VIXL_ASSERT(OutsideITBlock());
2220     MacroEmissionCheckScope guard(this);
2221     bool can_use_it =
2222         // LDRSB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2223         operand.IsPlainRegister() && rt.IsLow() &&
2224         operand.GetBaseRegister().IsLow() &&
2225         operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2226         (operand.GetAddrMode() == Offset);
2227     ITScope it_scope(this, &cond, guard, can_use_it);
2228     ldrsb(cond, rt, operand);
2229   }
Ldrsb(Register rt,const MemOperand & operand)2230   void Ldrsb(Register rt, const MemOperand& operand) { Ldrsb(al, rt, operand); }
2231 
2232 
Ldrsh(Condition cond,Register rt,const MemOperand & operand)2233   void Ldrsh(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     bool can_use_it =
2240         // LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2241         operand.IsPlainRegister() && rt.IsLow() &&
2242         operand.GetBaseRegister().IsLow() &&
2243         operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2244         (operand.GetAddrMode() == Offset);
2245     ITScope it_scope(this, &cond, guard, can_use_it);
2246     ldrsh(cond, rt, operand);
2247   }
Ldrsh(Register rt,const MemOperand & operand)2248   void Ldrsh(Register rt, const MemOperand& operand) { Ldrsh(al, rt, operand); }
2249 
2250 
Lsl(Condition cond,Register rd,Register rm,const Operand & operand)2251   void Lsl(Condition cond, Register rd, Register rm, const Operand& operand) {
2252     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2253     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2254     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2255     VIXL_ASSERT(allow_macro_instructions_);
2256     VIXL_ASSERT(OutsideITBlock());
2257     MacroEmissionCheckScope guard(this);
2258     bool can_use_it =
2259         // LSL<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
2260         (operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2261          (operand.GetImmediate() <= 31) && rd.IsLow() && rm.IsLow()) ||
2262         // LSL<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
2263         (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
2264          operand.GetBaseRegister().IsLow());
2265     ITScope it_scope(this, &cond, guard, can_use_it);
2266     lsl(cond, rd, rm, operand);
2267   }
Lsl(Register rd,Register rm,const Operand & operand)2268   void Lsl(Register rd, Register rm, const Operand& operand) {
2269     Lsl(al, rd, rm, operand);
2270   }
Lsl(FlagsUpdate flags,Condition cond,Register rd,Register rm,const Operand & operand)2271   void Lsl(FlagsUpdate flags,
2272            Condition cond,
2273            Register rd,
2274            Register rm,
2275            const Operand& operand) {
2276     switch (flags) {
2277       case LeaveFlags:
2278         Lsl(cond, rd, rm, operand);
2279         break;
2280       case SetFlags:
2281         Lsls(cond, rd, rm, operand);
2282         break;
2283       case DontCare:
2284         bool setflags_is_smaller =
2285             IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() &&
2286             ((operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2287               (operand.GetImmediate() < 32)) ||
2288              (operand.IsPlainRegister() && rd.Is(rm)));
2289         if (setflags_is_smaller) {
2290           Lsls(cond, rd, rm, operand);
2291         } else {
2292           Lsl(cond, rd, rm, operand);
2293         }
2294         break;
2295     }
2296   }
Lsl(FlagsUpdate flags,Register rd,Register rm,const Operand & operand)2297   void Lsl(FlagsUpdate flags,
2298            Register rd,
2299            Register rm,
2300            const Operand& operand) {
2301     Lsl(flags, al, rd, rm, operand);
2302   }
2303 
Lsls(Condition cond,Register rd,Register rm,const Operand & operand)2304   void Lsls(Condition cond, Register rd, Register rm, const Operand& operand) {
2305     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2306     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2307     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2308     VIXL_ASSERT(allow_macro_instructions_);
2309     VIXL_ASSERT(OutsideITBlock());
2310     MacroEmissionCheckScope guard(this);
2311     ITScope it_scope(this, &cond, guard);
2312     lsls(cond, rd, rm, operand);
2313   }
Lsls(Register rd,Register rm,const Operand & operand)2314   void Lsls(Register rd, Register rm, const Operand& operand) {
2315     Lsls(al, rd, rm, operand);
2316   }
2317 
Lsr(Condition cond,Register rd,Register rm,const Operand & operand)2318   void Lsr(Condition cond, Register rd, Register rm, const Operand& operand) {
2319     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2320     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2321     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2322     VIXL_ASSERT(allow_macro_instructions_);
2323     VIXL_ASSERT(OutsideITBlock());
2324     MacroEmissionCheckScope guard(this);
2325     bool can_use_it =
2326         // LSR<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
2327         (operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2328          (operand.GetImmediate() <= 32) && rd.IsLow() && rm.IsLow()) ||
2329         // LSR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
2330         (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
2331          operand.GetBaseRegister().IsLow());
2332     ITScope it_scope(this, &cond, guard, can_use_it);
2333     lsr(cond, rd, rm, operand);
2334   }
Lsr(Register rd,Register rm,const Operand & operand)2335   void Lsr(Register rd, Register rm, const Operand& operand) {
2336     Lsr(al, rd, rm, operand);
2337   }
Lsr(FlagsUpdate flags,Condition cond,Register rd,Register rm,const Operand & operand)2338   void Lsr(FlagsUpdate flags,
2339            Condition cond,
2340            Register rd,
2341            Register rm,
2342            const Operand& operand) {
2343     switch (flags) {
2344       case LeaveFlags:
2345         Lsr(cond, rd, rm, operand);
2346         break;
2347       case SetFlags:
2348         Lsrs(cond, rd, rm, operand);
2349         break;
2350       case DontCare:
2351         bool setflags_is_smaller =
2352             IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() &&
2353             ((operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2354               (operand.GetImmediate() <= 32)) ||
2355              (operand.IsPlainRegister() && rd.Is(rm)));
2356         if (setflags_is_smaller) {
2357           Lsrs(cond, rd, rm, operand);
2358         } else {
2359           Lsr(cond, rd, rm, operand);
2360         }
2361         break;
2362     }
2363   }
Lsr(FlagsUpdate flags,Register rd,Register rm,const Operand & operand)2364   void Lsr(FlagsUpdate flags,
2365            Register rd,
2366            Register rm,
2367            const Operand& operand) {
2368     Lsr(flags, al, rd, rm, operand);
2369   }
2370 
Lsrs(Condition cond,Register rd,Register rm,const Operand & operand)2371   void Lsrs(Condition cond, Register rd, Register rm, const Operand& operand) {
2372     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2373     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2374     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2375     VIXL_ASSERT(allow_macro_instructions_);
2376     VIXL_ASSERT(OutsideITBlock());
2377     MacroEmissionCheckScope guard(this);
2378     ITScope it_scope(this, &cond, guard);
2379     lsrs(cond, rd, rm, operand);
2380   }
Lsrs(Register rd,Register rm,const Operand & operand)2381   void Lsrs(Register rd, Register rm, const Operand& operand) {
2382     Lsrs(al, rd, rm, operand);
2383   }
2384 
Mla(Condition cond,Register rd,Register rn,Register rm,Register ra)2385   void Mla(Condition cond, Register rd, Register rn, Register rm, Register ra) {
2386     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2387     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2388     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2389     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
2390     VIXL_ASSERT(allow_macro_instructions_);
2391     VIXL_ASSERT(OutsideITBlock());
2392     MacroEmissionCheckScope guard(this);
2393     ITScope it_scope(this, &cond, guard);
2394     mla(cond, rd, rn, rm, ra);
2395   }
Mla(Register rd,Register rn,Register rm,Register ra)2396   void Mla(Register rd, Register rn, Register rm, Register ra) {
2397     Mla(al, rd, rn, rm, ra);
2398   }
Mla(FlagsUpdate flags,Condition cond,Register rd,Register rn,Register rm,Register ra)2399   void Mla(FlagsUpdate flags,
2400            Condition cond,
2401            Register rd,
2402            Register rn,
2403            Register rm,
2404            Register ra) {
2405     switch (flags) {
2406       case LeaveFlags:
2407         Mla(cond, rd, rn, rm, ra);
2408         break;
2409       case SetFlags:
2410         Mlas(cond, rd, rn, rm, ra);
2411         break;
2412       case DontCare:
2413         Mla(cond, rd, rn, rm, ra);
2414         break;
2415     }
2416   }
Mla(FlagsUpdate flags,Register rd,Register rn,Register rm,Register ra)2417   void Mla(
2418       FlagsUpdate flags, Register rd, Register rn, Register rm, Register ra) {
2419     Mla(flags, al, rd, rn, rm, ra);
2420   }
2421 
Mlas(Condition cond,Register rd,Register rn,Register rm,Register ra)2422   void Mlas(
2423       Condition cond, Register rd, Register rn, Register rm, Register ra) {
2424     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2425     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2426     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2427     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
2428     VIXL_ASSERT(allow_macro_instructions_);
2429     VIXL_ASSERT(OutsideITBlock());
2430     MacroEmissionCheckScope guard(this);
2431     ITScope it_scope(this, &cond, guard);
2432     mlas(cond, rd, rn, rm, ra);
2433   }
Mlas(Register rd,Register rn,Register rm,Register ra)2434   void Mlas(Register rd, Register rn, Register rm, Register ra) {
2435     Mlas(al, rd, rn, rm, ra);
2436   }
2437 
Mls(Condition cond,Register rd,Register rn,Register rm,Register ra)2438   void Mls(Condition cond, Register rd, Register rn, Register rm, Register ra) {
2439     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2440     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2441     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2442     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
2443     VIXL_ASSERT(allow_macro_instructions_);
2444     VIXL_ASSERT(OutsideITBlock());
2445     MacroEmissionCheckScope guard(this);
2446     ITScope it_scope(this, &cond, guard);
2447     mls(cond, rd, rn, rm, ra);
2448   }
Mls(Register rd,Register rn,Register rm,Register ra)2449   void Mls(Register rd, Register rn, Register rm, Register ra) {
2450     Mls(al, rd, rn, rm, ra);
2451   }
2452 
Mov(Condition cond,Register rd,const Operand & operand)2453   void Mov(Condition cond, Register rd, const Operand& operand) {
2454     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2455     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2456     VIXL_ASSERT(allow_macro_instructions_);
2457     VIXL_ASSERT(OutsideITBlock());
2458     MacroEmissionCheckScope guard(this);
2459     if (operand.IsPlainRegister() && rd.Is(operand.GetBaseRegister())) {
2460       return;
2461     }
2462     bool can_use_it =
2463         // MOV<c>{<q>} <Rd>, #<imm8> ; T1
2464         (operand.IsImmediate() && rd.IsLow() &&
2465          (operand.GetImmediate() <= 255)) ||
2466         // MOV{<c>}{<q>} <Rd>, <Rm> ; T1
2467         (operand.IsPlainRegister() && !rd.IsPC() &&
2468          !operand.GetBaseRegister().IsPC()) ||
2469         // MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount>} ; T2
2470         (operand.IsImmediateShiftedRegister() && rd.IsLow() &&
2471          operand.GetBaseRegister().IsLow() &&
2472          (operand.GetShift().Is(LSL) || operand.GetShift().Is(LSR) ||
2473           operand.GetShift().Is(ASR))) ||
2474         // MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
2475         // MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
2476         // MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
2477         // MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
2478         (operand.IsRegisterShiftedRegister() &&
2479          rd.Is(operand.GetBaseRegister()) && rd.IsLow() &&
2480          (operand.GetShift().Is(LSL) || operand.GetShift().Is(LSR) ||
2481           operand.GetShift().Is(ASR) || operand.GetShift().Is(ROR)) &&
2482          operand.GetShiftRegister().IsLow());
2483     ITScope it_scope(this, &cond, guard, can_use_it);
2484     mov(cond, rd, operand);
2485   }
Mov(Register rd,const Operand & operand)2486   void Mov(Register rd, const Operand& operand) { Mov(al, rd, operand); }
Mov(FlagsUpdate flags,Condition cond,Register rd,const Operand & operand)2487   void Mov(FlagsUpdate flags,
2488            Condition cond,
2489            Register rd,
2490            const Operand& operand) {
2491     switch (flags) {
2492       case LeaveFlags:
2493         Mov(cond, rd, operand);
2494         break;
2495       case SetFlags:
2496         Movs(cond, rd, operand);
2497         break;
2498       case DontCare:
2499         if (operand.IsPlainRegister() && rd.Is(operand.GetBaseRegister())) {
2500           return;
2501         }
2502         bool setflags_is_smaller =
2503             IsUsingT32() && cond.Is(al) &&
2504             ((operand.IsImmediateShiftedRegister() && rd.IsLow() &&
2505               operand.GetBaseRegister().IsLow() &&
2506               (operand.GetShiftAmount() >= 1) &&
2507               (((operand.GetShiftAmount() <= 32) &&
2508                 ((operand.GetShift().IsLSR() || operand.GetShift().IsASR()))) ||
2509                ((operand.GetShiftAmount() < 32) &&
2510                 operand.GetShift().IsLSL()))) ||
2511              (operand.IsRegisterShiftedRegister() && rd.IsLow() &&
2512               operand.GetBaseRegister().Is(rd) &&
2513               operand.GetShiftRegister().IsLow() &&
2514               (operand.GetShift().IsLSL() || operand.GetShift().IsLSR() ||
2515                operand.GetShift().IsASR() || operand.GetShift().IsROR())) ||
2516              (operand.IsImmediate() && rd.IsLow() &&
2517               (operand.GetImmediate() < 256)));
2518         if (setflags_is_smaller) {
2519           Movs(cond, rd, operand);
2520         } else {
2521           Mov(cond, rd, operand);
2522         }
2523         break;
2524     }
2525   }
Mov(FlagsUpdate flags,Register rd,const Operand & operand)2526   void Mov(FlagsUpdate flags, Register rd, const Operand& operand) {
2527     Mov(flags, al, rd, operand);
2528   }
2529 
Movs(Condition cond,Register rd,const Operand & operand)2530   void Movs(Condition cond, Register rd, const Operand& operand) {
2531     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2532     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2533     VIXL_ASSERT(allow_macro_instructions_);
2534     VIXL_ASSERT(OutsideITBlock());
2535     MacroEmissionCheckScope guard(this);
2536     ITScope it_scope(this, &cond, guard);
2537     movs(cond, rd, operand);
2538   }
Movs(Register rd,const Operand & operand)2539   void Movs(Register rd, const Operand& operand) { Movs(al, rd, operand); }
2540 
Movt(Condition cond,Register rd,const Operand & operand)2541   void Movt(Condition cond, Register rd, const Operand& operand) {
2542     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2543     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2544     VIXL_ASSERT(allow_macro_instructions_);
2545     VIXL_ASSERT(OutsideITBlock());
2546     MacroEmissionCheckScope guard(this);
2547     ITScope it_scope(this, &cond, guard);
2548     movt(cond, rd, operand);
2549   }
Movt(Register rd,const Operand & operand)2550   void Movt(Register rd, const Operand& operand) { Movt(al, rd, operand); }
2551 
Mrs(Condition cond,Register rd,SpecialRegister spec_reg)2552   void Mrs(Condition cond, Register rd, SpecialRegister spec_reg) {
2553     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2554     VIXL_ASSERT(allow_macro_instructions_);
2555     VIXL_ASSERT(OutsideITBlock());
2556     MacroEmissionCheckScope guard(this);
2557     ITScope it_scope(this, &cond, guard);
2558     mrs(cond, rd, spec_reg);
2559   }
Mrs(Register rd,SpecialRegister spec_reg)2560   void Mrs(Register rd, SpecialRegister spec_reg) { Mrs(al, rd, spec_reg); }
2561 
Msr(Condition cond,MaskedSpecialRegister spec_reg,const Operand & operand)2562   void Msr(Condition cond,
2563            MaskedSpecialRegister spec_reg,
2564            const Operand& operand) {
2565     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2566     VIXL_ASSERT(allow_macro_instructions_);
2567     VIXL_ASSERT(OutsideITBlock());
2568     MacroEmissionCheckScope guard(this);
2569     ITScope it_scope(this, &cond, guard);
2570     msr(cond, spec_reg, operand);
2571   }
Msr(MaskedSpecialRegister spec_reg,const Operand & operand)2572   void Msr(MaskedSpecialRegister spec_reg, const Operand& operand) {
2573     Msr(al, spec_reg, operand);
2574   }
2575 
Mul(Condition cond,Register rd,Register rn,Register rm)2576   void Mul(Condition cond, Register rd, Register rn, Register rm) {
2577     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2578     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2579     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2580     VIXL_ASSERT(allow_macro_instructions_);
2581     VIXL_ASSERT(OutsideITBlock());
2582     MacroEmissionCheckScope guard(this);
2583     bool can_use_it =
2584         // MUL<c>{<q>} <Rdm>, <Rn>{, <Rdm>} ; T1
2585         rd.Is(rm) && rn.IsLow() && rm.IsLow();
2586     ITScope it_scope(this, &cond, guard, can_use_it);
2587     mul(cond, rd, rn, rm);
2588   }
Mul(Register rd,Register rn,Register rm)2589   void Mul(Register rd, Register rn, Register rm) { Mul(al, rd, rn, rm); }
Mul(FlagsUpdate flags,Condition cond,Register rd,Register rn,Register rm)2590   void Mul(FlagsUpdate flags,
2591            Condition cond,
2592            Register rd,
2593            Register rn,
2594            Register rm) {
2595     switch (flags) {
2596       case LeaveFlags:
2597         Mul(cond, rd, rn, rm);
2598         break;
2599       case SetFlags:
2600         Muls(cond, rd, rn, rm);
2601         break;
2602       case DontCare:
2603         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
2604                                    rn.IsLow() && rm.Is(rd);
2605         if (setflags_is_smaller) {
2606           Muls(cond, rd, rn, rm);
2607         } else {
2608           Mul(cond, rd, rn, rm);
2609         }
2610         break;
2611     }
2612   }
Mul(FlagsUpdate flags,Register rd,Register rn,Register rm)2613   void Mul(FlagsUpdate flags, Register rd, Register rn, Register rm) {
2614     Mul(flags, al, rd, rn, rm);
2615   }
2616 
Muls(Condition cond,Register rd,Register rn,Register rm)2617   void Muls(Condition cond, Register rd, Register rn, Register rm) {
2618     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2619     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2620     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2621     VIXL_ASSERT(allow_macro_instructions_);
2622     VIXL_ASSERT(OutsideITBlock());
2623     MacroEmissionCheckScope guard(this);
2624     ITScope it_scope(this, &cond, guard);
2625     muls(cond, rd, rn, rm);
2626   }
Muls(Register rd,Register rn,Register rm)2627   void Muls(Register rd, Register rn, Register rm) { Muls(al, rd, rn, rm); }
2628 
Mvn(Condition cond,Register rd,const Operand & operand)2629   void Mvn(Condition cond, Register rd, const Operand& operand) {
2630     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2631     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2632     VIXL_ASSERT(allow_macro_instructions_);
2633     VIXL_ASSERT(OutsideITBlock());
2634     MacroEmissionCheckScope guard(this);
2635     bool can_use_it =
2636         // MVN<c>{<q>} <Rd>, <Rm> ; T1
2637         operand.IsPlainRegister() && rd.IsLow() &&
2638         operand.GetBaseRegister().IsLow();
2639     ITScope it_scope(this, &cond, guard, can_use_it);
2640     mvn(cond, rd, operand);
2641   }
Mvn(Register rd,const Operand & operand)2642   void Mvn(Register rd, const Operand& operand) { Mvn(al, rd, operand); }
Mvn(FlagsUpdate flags,Condition cond,Register rd,const Operand & operand)2643   void Mvn(FlagsUpdate flags,
2644            Condition cond,
2645            Register rd,
2646            const Operand& operand) {
2647     switch (flags) {
2648       case LeaveFlags:
2649         Mvn(cond, rd, operand);
2650         break;
2651       case SetFlags:
2652         Mvns(cond, rd, operand);
2653         break;
2654       case DontCare:
2655         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
2656                                    operand.IsPlainRegister() &&
2657                                    operand.GetBaseRegister().IsLow();
2658         if (setflags_is_smaller) {
2659           Mvns(cond, rd, operand);
2660         } else {
2661           Mvn(cond, rd, operand);
2662         }
2663         break;
2664     }
2665   }
Mvn(FlagsUpdate flags,Register rd,const Operand & operand)2666   void Mvn(FlagsUpdate flags, Register rd, const Operand& operand) {
2667     Mvn(flags, al, rd, operand);
2668   }
2669 
Mvns(Condition cond,Register rd,const Operand & operand)2670   void Mvns(Condition cond, Register rd, const Operand& operand) {
2671     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2672     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2673     VIXL_ASSERT(allow_macro_instructions_);
2674     VIXL_ASSERT(OutsideITBlock());
2675     MacroEmissionCheckScope guard(this);
2676     ITScope it_scope(this, &cond, guard);
2677     mvns(cond, rd, operand);
2678   }
Mvns(Register rd,const Operand & operand)2679   void Mvns(Register rd, const Operand& operand) { Mvns(al, rd, operand); }
2680 
Nop(Condition cond)2681   void Nop(Condition cond) {
2682     VIXL_ASSERT(allow_macro_instructions_);
2683     VIXL_ASSERT(OutsideITBlock());
2684     MacroEmissionCheckScope guard(this);
2685     ITScope it_scope(this, &cond, guard);
2686     nop(cond);
2687   }
Nop()2688   void Nop() { Nop(al); }
2689 
Orn(Condition cond,Register rd,Register rn,const Operand & operand)2690   void Orn(Condition cond, Register rd, Register rn, const Operand& operand) {
2691     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2692     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2693     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2694     VIXL_ASSERT(allow_macro_instructions_);
2695     VIXL_ASSERT(OutsideITBlock());
2696     MacroEmissionCheckScope guard(this);
2697     if (cond.Is(al) && operand.IsImmediate()) {
2698       uint32_t immediate = operand.GetImmediate();
2699       if (immediate == 0) {
2700         mvn(rd, 0);
2701         return;
2702       }
2703       if ((immediate == 0xffffffff) && rd.Is(rn)) {
2704         return;
2705       }
2706     }
2707     ITScope it_scope(this, &cond, guard);
2708     orn(cond, rd, rn, operand);
2709   }
Orn(Register rd,Register rn,const Operand & operand)2710   void Orn(Register rd, Register rn, const Operand& operand) {
2711     Orn(al, rd, rn, operand);
2712   }
Orn(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)2713   void Orn(FlagsUpdate flags,
2714            Condition cond,
2715            Register rd,
2716            Register rn,
2717            const Operand& operand) {
2718     switch (flags) {
2719       case LeaveFlags:
2720         Orn(cond, rd, rn, operand);
2721         break;
2722       case SetFlags:
2723         Orns(cond, rd, rn, operand);
2724         break;
2725       case DontCare:
2726         Orn(cond, rd, rn, operand);
2727         break;
2728     }
2729   }
Orn(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)2730   void Orn(FlagsUpdate flags,
2731            Register rd,
2732            Register rn,
2733            const Operand& operand) {
2734     Orn(flags, al, rd, rn, operand);
2735   }
2736 
Orns(Condition cond,Register rd,Register rn,const Operand & operand)2737   void Orns(Condition cond, Register rd, Register rn, const Operand& operand) {
2738     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2739     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2740     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2741     VIXL_ASSERT(allow_macro_instructions_);
2742     VIXL_ASSERT(OutsideITBlock());
2743     MacroEmissionCheckScope guard(this);
2744     ITScope it_scope(this, &cond, guard);
2745     orns(cond, rd, rn, operand);
2746   }
Orns(Register rd,Register rn,const Operand & operand)2747   void Orns(Register rd, Register rn, const Operand& operand) {
2748     Orns(al, rd, rn, operand);
2749   }
2750 
Orr(Condition cond,Register rd,Register rn,const Operand & operand)2751   void Orr(Condition cond, Register rd, Register rn, const Operand& operand) {
2752     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2753     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2754     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2755     VIXL_ASSERT(allow_macro_instructions_);
2756     VIXL_ASSERT(OutsideITBlock());
2757     MacroEmissionCheckScope guard(this);
2758     if (rd.Is(rn) && operand.IsPlainRegister() &&
2759         rd.Is(operand.GetBaseRegister())) {
2760       return;
2761     }
2762     if (cond.Is(al) && operand.IsImmediate()) {
2763       uint32_t immediate = operand.GetImmediate();
2764       if ((immediate == 0) && rd.Is(rn)) {
2765         return;
2766       }
2767       if (immediate == 0xffffffff) {
2768         mvn(rd, 0);
2769         return;
2770       }
2771     }
2772     bool can_use_it =
2773         // ORR<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
2774         operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
2775         operand.GetBaseRegister().IsLow();
2776     ITScope it_scope(this, &cond, guard, can_use_it);
2777     orr(cond, rd, rn, operand);
2778   }
Orr(Register rd,Register rn,const Operand & operand)2779   void Orr(Register rd, Register rn, const Operand& operand) {
2780     Orr(al, rd, rn, operand);
2781   }
Orr(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)2782   void Orr(FlagsUpdate flags,
2783            Condition cond,
2784            Register rd,
2785            Register rn,
2786            const Operand& operand) {
2787     switch (flags) {
2788       case LeaveFlags:
2789         Orr(cond, rd, rn, operand);
2790         break;
2791       case SetFlags:
2792         Orrs(cond, rd, rn, operand);
2793         break;
2794       case DontCare:
2795         if (operand.IsPlainRegister() && rd.Is(rn) &&
2796             rd.Is(operand.GetBaseRegister())) {
2797           return;
2798         }
2799         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
2800                                    rn.Is(rd) && operand.IsPlainRegister() &&
2801                                    operand.GetBaseRegister().IsLow();
2802         if (setflags_is_smaller) {
2803           Orrs(cond, rd, rn, operand);
2804         } else {
2805           Orr(cond, rd, rn, operand);
2806         }
2807         break;
2808     }
2809   }
Orr(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)2810   void Orr(FlagsUpdate flags,
2811            Register rd,
2812            Register rn,
2813            const Operand& operand) {
2814     Orr(flags, al, rd, rn, operand);
2815   }
2816 
Orrs(Condition cond,Register rd,Register rn,const Operand & operand)2817   void Orrs(Condition cond, Register rd, Register rn, const Operand& operand) {
2818     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2819     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2820     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2821     VIXL_ASSERT(allow_macro_instructions_);
2822     VIXL_ASSERT(OutsideITBlock());
2823     MacroEmissionCheckScope guard(this);
2824     ITScope it_scope(this, &cond, guard);
2825     orrs(cond, rd, rn, operand);
2826   }
Orrs(Register rd,Register rn,const Operand & operand)2827   void Orrs(Register rd, Register rn, const Operand& operand) {
2828     Orrs(al, rd, rn, operand);
2829   }
2830 
Pkhbt(Condition cond,Register rd,Register rn,const Operand & operand)2831   void Pkhbt(Condition cond, Register rd, Register rn, const Operand& operand) {
2832     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2833     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2834     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2835     VIXL_ASSERT(allow_macro_instructions_);
2836     VIXL_ASSERT(OutsideITBlock());
2837     MacroEmissionCheckScope guard(this);
2838     ITScope it_scope(this, &cond, guard);
2839     pkhbt(cond, rd, rn, operand);
2840   }
Pkhbt(Register rd,Register rn,const Operand & operand)2841   void Pkhbt(Register rd, Register rn, const Operand& operand) {
2842     Pkhbt(al, rd, rn, operand);
2843   }
2844 
Pkhtb(Condition cond,Register rd,Register rn,const Operand & operand)2845   void Pkhtb(Condition cond, Register rd, Register rn, const Operand& operand) {
2846     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2847     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2848     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2849     VIXL_ASSERT(allow_macro_instructions_);
2850     VIXL_ASSERT(OutsideITBlock());
2851     MacroEmissionCheckScope guard(this);
2852     ITScope it_scope(this, &cond, guard);
2853     pkhtb(cond, rd, rn, operand);
2854   }
Pkhtb(Register rd,Register rn,const Operand & operand)2855   void Pkhtb(Register rd, Register rn, const Operand& operand) {
2856     Pkhtb(al, rd, rn, operand);
2857   }
2858 
2859 
Pld(Condition cond,const MemOperand & operand)2860   void Pld(Condition cond, const MemOperand& operand) {
2861     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2862     VIXL_ASSERT(allow_macro_instructions_);
2863     VIXL_ASSERT(OutsideITBlock());
2864     MacroEmissionCheckScope guard(this);
2865     ITScope it_scope(this, &cond, guard);
2866     pld(cond, operand);
2867   }
Pld(const MemOperand & operand)2868   void Pld(const MemOperand& operand) { Pld(al, operand); }
2869 
Pldw(Condition cond,const MemOperand & operand)2870   void Pldw(Condition cond, const MemOperand& operand) {
2871     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2872     VIXL_ASSERT(allow_macro_instructions_);
2873     VIXL_ASSERT(OutsideITBlock());
2874     MacroEmissionCheckScope guard(this);
2875     ITScope it_scope(this, &cond, guard);
2876     pldw(cond, operand);
2877   }
Pldw(const MemOperand & operand)2878   void Pldw(const MemOperand& operand) { Pldw(al, operand); }
2879 
Pli(Condition cond,const MemOperand & operand)2880   void Pli(Condition cond, const MemOperand& operand) {
2881     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2882     VIXL_ASSERT(allow_macro_instructions_);
2883     VIXL_ASSERT(OutsideITBlock());
2884     MacroEmissionCheckScope guard(this);
2885     ITScope it_scope(this, &cond, guard);
2886     pli(cond, operand);
2887   }
Pli(const MemOperand & operand)2888   void Pli(const MemOperand& operand) { Pli(al, operand); }
2889 
2890 
Pop(Condition cond,RegisterList registers)2891   void Pop(Condition cond, RegisterList registers) {
2892     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2893     VIXL_ASSERT(allow_macro_instructions_);
2894     VIXL_ASSERT(OutsideITBlock());
2895     MacroEmissionCheckScope guard(this);
2896     ITScope it_scope(this, &cond, guard);
2897     pop(cond, registers);
2898   }
Pop(RegisterList registers)2899   void Pop(RegisterList registers) { Pop(al, registers); }
2900 
Pop(Condition cond,Register rt)2901   void Pop(Condition cond, Register rt) {
2902     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2903     VIXL_ASSERT(allow_macro_instructions_);
2904     VIXL_ASSERT(OutsideITBlock());
2905     MacroEmissionCheckScope guard(this);
2906     ITScope it_scope(this, &cond, guard);
2907     pop(cond, rt);
2908   }
Pop(Register rt)2909   void Pop(Register rt) { Pop(al, rt); }
2910 
Push(Condition cond,RegisterList registers)2911   void Push(Condition cond, RegisterList registers) {
2912     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2913     VIXL_ASSERT(allow_macro_instructions_);
2914     VIXL_ASSERT(OutsideITBlock());
2915     MacroEmissionCheckScope guard(this);
2916     ITScope it_scope(this, &cond, guard);
2917     push(cond, registers);
2918   }
Push(RegisterList registers)2919   void Push(RegisterList registers) { Push(al, registers); }
2920 
Push(Condition cond,Register rt)2921   void Push(Condition cond, Register rt) {
2922     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2923     VIXL_ASSERT(allow_macro_instructions_);
2924     VIXL_ASSERT(OutsideITBlock());
2925     MacroEmissionCheckScope guard(this);
2926     ITScope it_scope(this, &cond, guard);
2927     push(cond, rt);
2928   }
Push(Register rt)2929   void Push(Register rt) { Push(al, rt); }
2930 
Qadd(Condition cond,Register rd,Register rm,Register rn)2931   void Qadd(Condition cond, Register rd, Register rm, Register rn) {
2932     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2933     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2934     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2935     VIXL_ASSERT(allow_macro_instructions_);
2936     VIXL_ASSERT(OutsideITBlock());
2937     MacroEmissionCheckScope guard(this);
2938     ITScope it_scope(this, &cond, guard);
2939     qadd(cond, rd, rm, rn);
2940   }
Qadd(Register rd,Register rm,Register rn)2941   void Qadd(Register rd, Register rm, Register rn) { Qadd(al, rd, rm, rn); }
2942 
Qadd16(Condition cond,Register rd,Register rn,Register rm)2943   void Qadd16(Condition cond, Register rd, Register rn, Register rm) {
2944     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2945     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2946     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2947     VIXL_ASSERT(allow_macro_instructions_);
2948     VIXL_ASSERT(OutsideITBlock());
2949     MacroEmissionCheckScope guard(this);
2950     ITScope it_scope(this, &cond, guard);
2951     qadd16(cond, rd, rn, rm);
2952   }
Qadd16(Register rd,Register rn,Register rm)2953   void Qadd16(Register rd, Register rn, Register rm) { Qadd16(al, rd, rn, rm); }
2954 
Qadd8(Condition cond,Register rd,Register rn,Register rm)2955   void Qadd8(Condition cond, Register rd, Register rn, Register rm) {
2956     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2957     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2958     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2959     VIXL_ASSERT(allow_macro_instructions_);
2960     VIXL_ASSERT(OutsideITBlock());
2961     MacroEmissionCheckScope guard(this);
2962     ITScope it_scope(this, &cond, guard);
2963     qadd8(cond, rd, rn, rm);
2964   }
Qadd8(Register rd,Register rn,Register rm)2965   void Qadd8(Register rd, Register rn, Register rm) { Qadd8(al, rd, rn, rm); }
2966 
Qasx(Condition cond,Register rd,Register rn,Register rm)2967   void Qasx(Condition cond, Register rd, Register rn, Register rm) {
2968     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2969     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2970     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2971     VIXL_ASSERT(allow_macro_instructions_);
2972     VIXL_ASSERT(OutsideITBlock());
2973     MacroEmissionCheckScope guard(this);
2974     ITScope it_scope(this, &cond, guard);
2975     qasx(cond, rd, rn, rm);
2976   }
Qasx(Register rd,Register rn,Register rm)2977   void Qasx(Register rd, Register rn, Register rm) { Qasx(al, rd, rn, rm); }
2978 
Qdadd(Condition cond,Register rd,Register rm,Register rn)2979   void Qdadd(Condition cond, Register rd, Register rm, Register rn) {
2980     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2981     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2982     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2983     VIXL_ASSERT(allow_macro_instructions_);
2984     VIXL_ASSERT(OutsideITBlock());
2985     MacroEmissionCheckScope guard(this);
2986     ITScope it_scope(this, &cond, guard);
2987     qdadd(cond, rd, rm, rn);
2988   }
Qdadd(Register rd,Register rm,Register rn)2989   void Qdadd(Register rd, Register rm, Register rn) { Qdadd(al, rd, rm, rn); }
2990 
Qdsub(Condition cond,Register rd,Register rm,Register rn)2991   void Qdsub(Condition cond, Register rd, Register rm, Register rn) {
2992     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2993     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2994     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2995     VIXL_ASSERT(allow_macro_instructions_);
2996     VIXL_ASSERT(OutsideITBlock());
2997     MacroEmissionCheckScope guard(this);
2998     ITScope it_scope(this, &cond, guard);
2999     qdsub(cond, rd, rm, rn);
3000   }
Qdsub(Register rd,Register rm,Register rn)3001   void Qdsub(Register rd, Register rm, Register rn) { Qdsub(al, rd, rm, rn); }
3002 
Qsax(Condition cond,Register rd,Register rn,Register rm)3003   void Qsax(Condition cond, Register rd, Register rn, Register rm) {
3004     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3005     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3006     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3007     VIXL_ASSERT(allow_macro_instructions_);
3008     VIXL_ASSERT(OutsideITBlock());
3009     MacroEmissionCheckScope guard(this);
3010     ITScope it_scope(this, &cond, guard);
3011     qsax(cond, rd, rn, rm);
3012   }
Qsax(Register rd,Register rn,Register rm)3013   void Qsax(Register rd, Register rn, Register rm) { Qsax(al, rd, rn, rm); }
3014 
Qsub(Condition cond,Register rd,Register rm,Register rn)3015   void Qsub(Condition cond, Register rd, Register rm, Register rn) {
3016     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3017     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3018     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3019     VIXL_ASSERT(allow_macro_instructions_);
3020     VIXL_ASSERT(OutsideITBlock());
3021     MacroEmissionCheckScope guard(this);
3022     ITScope it_scope(this, &cond, guard);
3023     qsub(cond, rd, rm, rn);
3024   }
Qsub(Register rd,Register rm,Register rn)3025   void Qsub(Register rd, Register rm, Register rn) { Qsub(al, rd, rm, rn); }
3026 
Qsub16(Condition cond,Register rd,Register rn,Register rm)3027   void Qsub16(Condition cond, Register rd, Register rn, Register rm) {
3028     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3029     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3030     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3031     VIXL_ASSERT(allow_macro_instructions_);
3032     VIXL_ASSERT(OutsideITBlock());
3033     MacroEmissionCheckScope guard(this);
3034     ITScope it_scope(this, &cond, guard);
3035     qsub16(cond, rd, rn, rm);
3036   }
Qsub16(Register rd,Register rn,Register rm)3037   void Qsub16(Register rd, Register rn, Register rm) { Qsub16(al, rd, rn, rm); }
3038 
Qsub8(Condition cond,Register rd,Register rn,Register rm)3039   void Qsub8(Condition cond, Register rd, Register rn, Register rm) {
3040     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3041     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3042     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3043     VIXL_ASSERT(allow_macro_instructions_);
3044     VIXL_ASSERT(OutsideITBlock());
3045     MacroEmissionCheckScope guard(this);
3046     ITScope it_scope(this, &cond, guard);
3047     qsub8(cond, rd, rn, rm);
3048   }
Qsub8(Register rd,Register rn,Register rm)3049   void Qsub8(Register rd, Register rn, Register rm) { Qsub8(al, rd, rn, rm); }
3050 
Rbit(Condition cond,Register rd,Register rm)3051   void Rbit(Condition cond, Register rd, Register rm) {
3052     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3053     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3054     VIXL_ASSERT(allow_macro_instructions_);
3055     VIXL_ASSERT(OutsideITBlock());
3056     MacroEmissionCheckScope guard(this);
3057     ITScope it_scope(this, &cond, guard);
3058     rbit(cond, rd, rm);
3059   }
Rbit(Register rd,Register rm)3060   void Rbit(Register rd, Register rm) { Rbit(al, rd, rm); }
3061 
Rev(Condition cond,Register rd,Register rm)3062   void Rev(Condition cond, Register rd, Register rm) {
3063     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3064     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3065     VIXL_ASSERT(allow_macro_instructions_);
3066     VIXL_ASSERT(OutsideITBlock());
3067     MacroEmissionCheckScope guard(this);
3068     ITScope it_scope(this, &cond, guard);
3069     rev(cond, rd, rm);
3070   }
Rev(Register rd,Register rm)3071   void Rev(Register rd, Register rm) { Rev(al, rd, rm); }
3072 
Rev16(Condition cond,Register rd,Register rm)3073   void Rev16(Condition cond, Register rd, Register rm) {
3074     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3075     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3076     VIXL_ASSERT(allow_macro_instructions_);
3077     VIXL_ASSERT(OutsideITBlock());
3078     MacroEmissionCheckScope guard(this);
3079     ITScope it_scope(this, &cond, guard);
3080     rev16(cond, rd, rm);
3081   }
Rev16(Register rd,Register rm)3082   void Rev16(Register rd, Register rm) { Rev16(al, rd, rm); }
3083 
Revsh(Condition cond,Register rd,Register rm)3084   void Revsh(Condition cond, Register rd, Register rm) {
3085     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3086     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3087     VIXL_ASSERT(allow_macro_instructions_);
3088     VIXL_ASSERT(OutsideITBlock());
3089     MacroEmissionCheckScope guard(this);
3090     ITScope it_scope(this, &cond, guard);
3091     revsh(cond, rd, rm);
3092   }
Revsh(Register rd,Register rm)3093   void Revsh(Register rd, Register rm) { Revsh(al, rd, rm); }
3094 
Ror(Condition cond,Register rd,Register rm,const Operand & operand)3095   void Ror(Condition cond, Register rd, Register rm, const Operand& operand) {
3096     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3097     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3098     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3099     VIXL_ASSERT(allow_macro_instructions_);
3100     VIXL_ASSERT(OutsideITBlock());
3101     MacroEmissionCheckScope guard(this);
3102     bool can_use_it =
3103         // ROR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
3104         operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
3105         operand.GetBaseRegister().IsLow();
3106     ITScope it_scope(this, &cond, guard, can_use_it);
3107     ror(cond, rd, rm, operand);
3108   }
Ror(Register rd,Register rm,const Operand & operand)3109   void Ror(Register rd, Register rm, const Operand& operand) {
3110     Ror(al, rd, rm, operand);
3111   }
Ror(FlagsUpdate flags,Condition cond,Register rd,Register rm,const Operand & operand)3112   void Ror(FlagsUpdate flags,
3113            Condition cond,
3114            Register rd,
3115            Register rm,
3116            const Operand& operand) {
3117     switch (flags) {
3118       case LeaveFlags:
3119         Ror(cond, rd, rm, operand);
3120         break;
3121       case SetFlags:
3122         Rors(cond, rd, rm, operand);
3123         break;
3124       case DontCare:
3125         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3126                                    rm.IsLow() && operand.IsPlainRegister() &&
3127                                    rd.Is(rm);
3128         if (setflags_is_smaller) {
3129           Rors(cond, rd, rm, operand);
3130         } else {
3131           Ror(cond, rd, rm, operand);
3132         }
3133         break;
3134     }
3135   }
Ror(FlagsUpdate flags,Register rd,Register rm,const Operand & operand)3136   void Ror(FlagsUpdate flags,
3137            Register rd,
3138            Register rm,
3139            const Operand& operand) {
3140     Ror(flags, al, rd, rm, operand);
3141   }
3142 
Rors(Condition cond,Register rd,Register rm,const Operand & operand)3143   void Rors(Condition cond, Register rd, Register rm, const Operand& operand) {
3144     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3145     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3146     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3147     VIXL_ASSERT(allow_macro_instructions_);
3148     VIXL_ASSERT(OutsideITBlock());
3149     MacroEmissionCheckScope guard(this);
3150     ITScope it_scope(this, &cond, guard);
3151     rors(cond, rd, rm, operand);
3152   }
Rors(Register rd,Register rm,const Operand & operand)3153   void Rors(Register rd, Register rm, const Operand& operand) {
3154     Rors(al, rd, rm, operand);
3155   }
3156 
Rrx(Condition cond,Register rd,Register rm)3157   void Rrx(Condition cond, Register rd, Register rm) {
3158     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3159     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3160     VIXL_ASSERT(allow_macro_instructions_);
3161     VIXL_ASSERT(OutsideITBlock());
3162     MacroEmissionCheckScope guard(this);
3163     ITScope it_scope(this, &cond, guard);
3164     rrx(cond, rd, rm);
3165   }
Rrx(Register rd,Register rm)3166   void Rrx(Register rd, Register rm) { Rrx(al, rd, rm); }
Rrx(FlagsUpdate flags,Condition cond,Register rd,Register rm)3167   void Rrx(FlagsUpdate flags, Condition cond, Register rd, Register rm) {
3168     switch (flags) {
3169       case LeaveFlags:
3170         Rrx(cond, rd, rm);
3171         break;
3172       case SetFlags:
3173         Rrxs(cond, rd, rm);
3174         break;
3175       case DontCare:
3176         Rrx(cond, rd, rm);
3177         break;
3178     }
3179   }
Rrx(FlagsUpdate flags,Register rd,Register rm)3180   void Rrx(FlagsUpdate flags, Register rd, Register rm) {
3181     Rrx(flags, al, rd, rm);
3182   }
3183 
Rrxs(Condition cond,Register rd,Register rm)3184   void Rrxs(Condition cond, Register rd, Register rm) {
3185     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3186     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3187     VIXL_ASSERT(allow_macro_instructions_);
3188     VIXL_ASSERT(OutsideITBlock());
3189     MacroEmissionCheckScope guard(this);
3190     ITScope it_scope(this, &cond, guard);
3191     rrxs(cond, rd, rm);
3192   }
Rrxs(Register rd,Register rm)3193   void Rrxs(Register rd, Register rm) { Rrxs(al, rd, rm); }
3194 
Rsb(Condition cond,Register rd,Register rn,const Operand & operand)3195   void Rsb(Condition cond, Register rd, Register rn, const Operand& operand) {
3196     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3197     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3198     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3199     VIXL_ASSERT(allow_macro_instructions_);
3200     VIXL_ASSERT(OutsideITBlock());
3201     MacroEmissionCheckScope guard(this);
3202     bool can_use_it =
3203         // RSB<c>{<q>} {<Rd>, }<Rn>, #0 ; T1
3204         operand.IsImmediate() && rd.IsLow() && rn.IsLow() &&
3205         (operand.GetImmediate() == 0);
3206     ITScope it_scope(this, &cond, guard, can_use_it);
3207     rsb(cond, rd, rn, operand);
3208   }
Rsb(Register rd,Register rn,const Operand & operand)3209   void Rsb(Register rd, Register rn, const Operand& operand) {
3210     Rsb(al, rd, rn, operand);
3211   }
Rsb(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)3212   void Rsb(FlagsUpdate flags,
3213            Condition cond,
3214            Register rd,
3215            Register rn,
3216            const Operand& operand) {
3217     switch (flags) {
3218       case LeaveFlags:
3219         Rsb(cond, rd, rn, operand);
3220         break;
3221       case SetFlags:
3222         Rsbs(cond, rd, rn, operand);
3223         break;
3224       case DontCare:
3225         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3226                                    rn.IsLow() && operand.IsImmediate() &&
3227                                    (operand.GetImmediate() == 0);
3228         if (setflags_is_smaller) {
3229           Rsbs(cond, rd, rn, operand);
3230         } else {
3231           Rsb(cond, rd, rn, operand);
3232         }
3233         break;
3234     }
3235   }
Rsb(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)3236   void Rsb(FlagsUpdate flags,
3237            Register rd,
3238            Register rn,
3239            const Operand& operand) {
3240     Rsb(flags, al, rd, rn, operand);
3241   }
3242 
Rsbs(Condition cond,Register rd,Register rn,const Operand & operand)3243   void Rsbs(Condition cond, Register rd, Register rn, const Operand& operand) {
3244     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3245     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3246     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3247     VIXL_ASSERT(allow_macro_instructions_);
3248     VIXL_ASSERT(OutsideITBlock());
3249     MacroEmissionCheckScope guard(this);
3250     ITScope it_scope(this, &cond, guard);
3251     rsbs(cond, rd, rn, operand);
3252   }
Rsbs(Register rd,Register rn,const Operand & operand)3253   void Rsbs(Register rd, Register rn, const Operand& operand) {
3254     Rsbs(al, rd, rn, operand);
3255   }
3256 
Rsc(Condition cond,Register rd,Register rn,const Operand & operand)3257   void Rsc(Condition cond, Register rd, Register rn, const Operand& operand) {
3258     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3259     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3260     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3261     VIXL_ASSERT(allow_macro_instructions_);
3262     VIXL_ASSERT(OutsideITBlock());
3263     MacroEmissionCheckScope guard(this);
3264     ITScope it_scope(this, &cond, guard);
3265     rsc(cond, rd, rn, operand);
3266   }
Rsc(Register rd,Register rn,const Operand & operand)3267   void Rsc(Register rd, Register rn, const Operand& operand) {
3268     Rsc(al, rd, rn, operand);
3269   }
Rsc(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)3270   void Rsc(FlagsUpdate flags,
3271            Condition cond,
3272            Register rd,
3273            Register rn,
3274            const Operand& operand) {
3275     switch (flags) {
3276       case LeaveFlags:
3277         Rsc(cond, rd, rn, operand);
3278         break;
3279       case SetFlags:
3280         Rscs(cond, rd, rn, operand);
3281         break;
3282       case DontCare:
3283         Rsc(cond, rd, rn, operand);
3284         break;
3285     }
3286   }
Rsc(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)3287   void Rsc(FlagsUpdate flags,
3288            Register rd,
3289            Register rn,
3290            const Operand& operand) {
3291     Rsc(flags, al, rd, rn, operand);
3292   }
3293 
Rscs(Condition cond,Register rd,Register rn,const Operand & operand)3294   void Rscs(Condition cond, Register rd, Register rn, const Operand& operand) {
3295     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3296     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3297     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3298     VIXL_ASSERT(allow_macro_instructions_);
3299     VIXL_ASSERT(OutsideITBlock());
3300     MacroEmissionCheckScope guard(this);
3301     ITScope it_scope(this, &cond, guard);
3302     rscs(cond, rd, rn, operand);
3303   }
Rscs(Register rd,Register rn,const Operand & operand)3304   void Rscs(Register rd, Register rn, const Operand& operand) {
3305     Rscs(al, rd, rn, operand);
3306   }
3307 
Sadd16(Condition cond,Register rd,Register rn,Register rm)3308   void Sadd16(Condition cond, Register rd, Register rn, Register rm) {
3309     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3310     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3311     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3312     VIXL_ASSERT(allow_macro_instructions_);
3313     VIXL_ASSERT(OutsideITBlock());
3314     MacroEmissionCheckScope guard(this);
3315     ITScope it_scope(this, &cond, guard);
3316     sadd16(cond, rd, rn, rm);
3317   }
Sadd16(Register rd,Register rn,Register rm)3318   void Sadd16(Register rd, Register rn, Register rm) { Sadd16(al, rd, rn, rm); }
3319 
Sadd8(Condition cond,Register rd,Register rn,Register rm)3320   void Sadd8(Condition cond, Register rd, Register rn, Register rm) {
3321     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3322     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3323     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3324     VIXL_ASSERT(allow_macro_instructions_);
3325     VIXL_ASSERT(OutsideITBlock());
3326     MacroEmissionCheckScope guard(this);
3327     ITScope it_scope(this, &cond, guard);
3328     sadd8(cond, rd, rn, rm);
3329   }
Sadd8(Register rd,Register rn,Register rm)3330   void Sadd8(Register rd, Register rn, Register rm) { Sadd8(al, rd, rn, rm); }
3331 
Sasx(Condition cond,Register rd,Register rn,Register rm)3332   void Sasx(Condition cond, Register rd, Register rn, Register rm) {
3333     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3334     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3335     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3336     VIXL_ASSERT(allow_macro_instructions_);
3337     VIXL_ASSERT(OutsideITBlock());
3338     MacroEmissionCheckScope guard(this);
3339     ITScope it_scope(this, &cond, guard);
3340     sasx(cond, rd, rn, rm);
3341   }
Sasx(Register rd,Register rn,Register rm)3342   void Sasx(Register rd, Register rn, Register rm) { Sasx(al, rd, rn, rm); }
3343 
Sbc(Condition cond,Register rd,Register rn,const Operand & operand)3344   void Sbc(Condition cond, Register rd, Register rn, const Operand& operand) {
3345     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3346     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3347     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3348     VIXL_ASSERT(allow_macro_instructions_);
3349     VIXL_ASSERT(OutsideITBlock());
3350     MacroEmissionCheckScope guard(this);
3351     bool can_use_it =
3352         // SBC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
3353         operand.IsPlainRegister() && rn.IsLow() && rd.Is(rn) &&
3354         operand.GetBaseRegister().IsLow();
3355     ITScope it_scope(this, &cond, guard, can_use_it);
3356     sbc(cond, rd, rn, operand);
3357   }
Sbc(Register rd,Register rn,const Operand & operand)3358   void Sbc(Register rd, Register rn, const Operand& operand) {
3359     Sbc(al, rd, rn, operand);
3360   }
Sbc(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)3361   void Sbc(FlagsUpdate flags,
3362            Condition cond,
3363            Register rd,
3364            Register rn,
3365            const Operand& operand) {
3366     switch (flags) {
3367       case LeaveFlags:
3368         Sbc(cond, rd, rn, operand);
3369         break;
3370       case SetFlags:
3371         Sbcs(cond, rd, rn, operand);
3372         break;
3373       case DontCare:
3374         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3375                                    rn.Is(rd) && operand.IsPlainRegister() &&
3376                                    operand.GetBaseRegister().IsLow();
3377         if (setflags_is_smaller) {
3378           Sbcs(cond, rd, rn, operand);
3379         } else {
3380           Sbc(cond, rd, rn, operand);
3381         }
3382         break;
3383     }
3384   }
Sbc(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)3385   void Sbc(FlagsUpdate flags,
3386            Register rd,
3387            Register rn,
3388            const Operand& operand) {
3389     Sbc(flags, al, rd, rn, operand);
3390   }
3391 
Sbcs(Condition cond,Register rd,Register rn,const Operand & operand)3392   void Sbcs(Condition cond, Register rd, Register rn, const Operand& operand) {
3393     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3394     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3395     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3396     VIXL_ASSERT(allow_macro_instructions_);
3397     VIXL_ASSERT(OutsideITBlock());
3398     MacroEmissionCheckScope guard(this);
3399     ITScope it_scope(this, &cond, guard);
3400     sbcs(cond, rd, rn, operand);
3401   }
Sbcs(Register rd,Register rn,const Operand & operand)3402   void Sbcs(Register rd, Register rn, const Operand& operand) {
3403     Sbcs(al, rd, rn, operand);
3404   }
3405 
Sbfx(Condition cond,Register rd,Register rn,uint32_t lsb,uint32_t width)3406   void Sbfx(
3407       Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
3408     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3409     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3410     VIXL_ASSERT(allow_macro_instructions_);
3411     VIXL_ASSERT(OutsideITBlock());
3412     MacroEmissionCheckScope guard(this);
3413     ITScope it_scope(this, &cond, guard);
3414     sbfx(cond, rd, rn, lsb, width);
3415   }
Sbfx(Register rd,Register rn,uint32_t lsb,uint32_t width)3416   void Sbfx(Register rd, Register rn, uint32_t lsb, uint32_t width) {
3417     Sbfx(al, rd, rn, lsb, width);
3418   }
3419 
Sdiv(Condition cond,Register rd,Register rn,Register rm)3420   void Sdiv(Condition cond, Register rd, Register rn, Register rm) {
3421     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3422     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3423     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3424     VIXL_ASSERT(allow_macro_instructions_);
3425     VIXL_ASSERT(OutsideITBlock());
3426     MacroEmissionCheckScope guard(this);
3427     ITScope it_scope(this, &cond, guard);
3428     sdiv(cond, rd, rn, rm);
3429   }
Sdiv(Register rd,Register rn,Register rm)3430   void Sdiv(Register rd, Register rn, Register rm) { Sdiv(al, rd, rn, rm); }
3431 
Sel(Condition cond,Register rd,Register rn,Register rm)3432   void Sel(Condition cond, Register rd, Register rn, Register rm) {
3433     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3434     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3435     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3436     VIXL_ASSERT(allow_macro_instructions_);
3437     VIXL_ASSERT(OutsideITBlock());
3438     MacroEmissionCheckScope guard(this);
3439     ITScope it_scope(this, &cond, guard);
3440     sel(cond, rd, rn, rm);
3441   }
Sel(Register rd,Register rn,Register rm)3442   void Sel(Register rd, Register rn, Register rm) { Sel(al, rd, rn, rm); }
3443 
Shadd16(Condition cond,Register rd,Register rn,Register rm)3444   void Shadd16(Condition cond, Register rd, Register rn, Register rm) {
3445     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3446     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3447     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3448     VIXL_ASSERT(allow_macro_instructions_);
3449     VIXL_ASSERT(OutsideITBlock());
3450     MacroEmissionCheckScope guard(this);
3451     ITScope it_scope(this, &cond, guard);
3452     shadd16(cond, rd, rn, rm);
3453   }
Shadd16(Register rd,Register rn,Register rm)3454   void Shadd16(Register rd, Register rn, Register rm) {
3455     Shadd16(al, rd, rn, rm);
3456   }
3457 
Shadd8(Condition cond,Register rd,Register rn,Register rm)3458   void Shadd8(Condition cond, Register rd, Register rn, Register rm) {
3459     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3460     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3461     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3462     VIXL_ASSERT(allow_macro_instructions_);
3463     VIXL_ASSERT(OutsideITBlock());
3464     MacroEmissionCheckScope guard(this);
3465     ITScope it_scope(this, &cond, guard);
3466     shadd8(cond, rd, rn, rm);
3467   }
Shadd8(Register rd,Register rn,Register rm)3468   void Shadd8(Register rd, Register rn, Register rm) { Shadd8(al, rd, rn, rm); }
3469 
Shasx(Condition cond,Register rd,Register rn,Register rm)3470   void Shasx(Condition cond, Register rd, Register rn, Register rm) {
3471     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3472     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3473     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3474     VIXL_ASSERT(allow_macro_instructions_);
3475     VIXL_ASSERT(OutsideITBlock());
3476     MacroEmissionCheckScope guard(this);
3477     ITScope it_scope(this, &cond, guard);
3478     shasx(cond, rd, rn, rm);
3479   }
Shasx(Register rd,Register rn,Register rm)3480   void Shasx(Register rd, Register rn, Register rm) { Shasx(al, rd, rn, rm); }
3481 
Shsax(Condition cond,Register rd,Register rn,Register rm)3482   void Shsax(Condition cond, Register rd, Register rn, Register rm) {
3483     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3484     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3485     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3486     VIXL_ASSERT(allow_macro_instructions_);
3487     VIXL_ASSERT(OutsideITBlock());
3488     MacroEmissionCheckScope guard(this);
3489     ITScope it_scope(this, &cond, guard);
3490     shsax(cond, rd, rn, rm);
3491   }
Shsax(Register rd,Register rn,Register rm)3492   void Shsax(Register rd, Register rn, Register rm) { Shsax(al, rd, rn, rm); }
3493 
Shsub16(Condition cond,Register rd,Register rn,Register rm)3494   void Shsub16(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, guard);
3502     shsub16(cond, rd, rn, rm);
3503   }
Shsub16(Register rd,Register rn,Register rm)3504   void Shsub16(Register rd, Register rn, Register rm) {
3505     Shsub16(al, rd, rn, rm);
3506   }
3507 
Shsub8(Condition cond,Register rd,Register rn,Register rm)3508   void Shsub8(Condition cond, Register rd, Register rn, Register rm) {
3509     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3510     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3511     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3512     VIXL_ASSERT(allow_macro_instructions_);
3513     VIXL_ASSERT(OutsideITBlock());
3514     MacroEmissionCheckScope guard(this);
3515     ITScope it_scope(this, &cond, guard);
3516     shsub8(cond, rd, rn, rm);
3517   }
Shsub8(Register rd,Register rn,Register rm)3518   void Shsub8(Register rd, Register rn, Register rm) { Shsub8(al, rd, rn, rm); }
3519 
Smlabb(Condition cond,Register rd,Register rn,Register rm,Register ra)3520   void Smlabb(
3521       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3522     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3523     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3524     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3525     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3526     VIXL_ASSERT(allow_macro_instructions_);
3527     VIXL_ASSERT(OutsideITBlock());
3528     MacroEmissionCheckScope guard(this);
3529     ITScope it_scope(this, &cond, guard);
3530     smlabb(cond, rd, rn, rm, ra);
3531   }
Smlabb(Register rd,Register rn,Register rm,Register ra)3532   void Smlabb(Register rd, Register rn, Register rm, Register ra) {
3533     Smlabb(al, rd, rn, rm, ra);
3534   }
3535 
Smlabt(Condition cond,Register rd,Register rn,Register rm,Register ra)3536   void Smlabt(
3537       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3538     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3539     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3540     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3541     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3542     VIXL_ASSERT(allow_macro_instructions_);
3543     VIXL_ASSERT(OutsideITBlock());
3544     MacroEmissionCheckScope guard(this);
3545     ITScope it_scope(this, &cond, guard);
3546     smlabt(cond, rd, rn, rm, ra);
3547   }
Smlabt(Register rd,Register rn,Register rm,Register ra)3548   void Smlabt(Register rd, Register rn, Register rm, Register ra) {
3549     Smlabt(al, rd, rn, rm, ra);
3550   }
3551 
Smlad(Condition cond,Register rd,Register rn,Register rm,Register ra)3552   void Smlad(
3553       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3554     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3555     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3556     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3557     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3558     VIXL_ASSERT(allow_macro_instructions_);
3559     VIXL_ASSERT(OutsideITBlock());
3560     MacroEmissionCheckScope guard(this);
3561     ITScope it_scope(this, &cond, guard);
3562     smlad(cond, rd, rn, rm, ra);
3563   }
Smlad(Register rd,Register rn,Register rm,Register ra)3564   void Smlad(Register rd, Register rn, Register rm, Register ra) {
3565     Smlad(al, rd, rn, rm, ra);
3566   }
3567 
Smladx(Condition cond,Register rd,Register rn,Register rm,Register ra)3568   void Smladx(
3569       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3570     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3571     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3572     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3573     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3574     VIXL_ASSERT(allow_macro_instructions_);
3575     VIXL_ASSERT(OutsideITBlock());
3576     MacroEmissionCheckScope guard(this);
3577     ITScope it_scope(this, &cond, guard);
3578     smladx(cond, rd, rn, rm, ra);
3579   }
Smladx(Register rd,Register rn,Register rm,Register ra)3580   void Smladx(Register rd, Register rn, Register rm, Register ra) {
3581     Smladx(al, rd, rn, rm, ra);
3582   }
3583 
Smlal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3584   void Smlal(
3585       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3586     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3587     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3588     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3589     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3590     VIXL_ASSERT(allow_macro_instructions_);
3591     VIXL_ASSERT(OutsideITBlock());
3592     MacroEmissionCheckScope guard(this);
3593     ITScope it_scope(this, &cond, guard);
3594     smlal(cond, rdlo, rdhi, rn, rm);
3595   }
Smlal(Register rdlo,Register rdhi,Register rn,Register rm)3596   void Smlal(Register rdlo, Register rdhi, Register rn, Register rm) {
3597     Smlal(al, rdlo, rdhi, rn, rm);
3598   }
3599 
Smlalbb(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3600   void Smlalbb(
3601       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3602     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3603     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3604     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3605     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3606     VIXL_ASSERT(allow_macro_instructions_);
3607     VIXL_ASSERT(OutsideITBlock());
3608     MacroEmissionCheckScope guard(this);
3609     ITScope it_scope(this, &cond, guard);
3610     smlalbb(cond, rdlo, rdhi, rn, rm);
3611   }
Smlalbb(Register rdlo,Register rdhi,Register rn,Register rm)3612   void Smlalbb(Register rdlo, Register rdhi, Register rn, Register rm) {
3613     Smlalbb(al, rdlo, rdhi, rn, rm);
3614   }
3615 
Smlalbt(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3616   void Smlalbt(
3617       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3618     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3619     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3620     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3621     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3622     VIXL_ASSERT(allow_macro_instructions_);
3623     VIXL_ASSERT(OutsideITBlock());
3624     MacroEmissionCheckScope guard(this);
3625     ITScope it_scope(this, &cond, guard);
3626     smlalbt(cond, rdlo, rdhi, rn, rm);
3627   }
Smlalbt(Register rdlo,Register rdhi,Register rn,Register rm)3628   void Smlalbt(Register rdlo, Register rdhi, Register rn, Register rm) {
3629     Smlalbt(al, rdlo, rdhi, rn, rm);
3630   }
3631 
Smlald(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3632   void Smlald(
3633       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3634     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3635     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3636     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3637     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3638     VIXL_ASSERT(allow_macro_instructions_);
3639     VIXL_ASSERT(OutsideITBlock());
3640     MacroEmissionCheckScope guard(this);
3641     ITScope it_scope(this, &cond, guard);
3642     smlald(cond, rdlo, rdhi, rn, rm);
3643   }
Smlald(Register rdlo,Register rdhi,Register rn,Register rm)3644   void Smlald(Register rdlo, Register rdhi, Register rn, Register rm) {
3645     Smlald(al, rdlo, rdhi, rn, rm);
3646   }
3647 
Smlaldx(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3648   void Smlaldx(
3649       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3650     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3651     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3652     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3653     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3654     VIXL_ASSERT(allow_macro_instructions_);
3655     VIXL_ASSERT(OutsideITBlock());
3656     MacroEmissionCheckScope guard(this);
3657     ITScope it_scope(this, &cond, guard);
3658     smlaldx(cond, rdlo, rdhi, rn, rm);
3659   }
Smlaldx(Register rdlo,Register rdhi,Register rn,Register rm)3660   void Smlaldx(Register rdlo, Register rdhi, Register rn, Register rm) {
3661     Smlaldx(al, rdlo, rdhi, rn, rm);
3662   }
3663 
Smlals(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3664   void Smlals(
3665       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3666     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3667     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3668     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3669     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3670     VIXL_ASSERT(allow_macro_instructions_);
3671     VIXL_ASSERT(OutsideITBlock());
3672     MacroEmissionCheckScope guard(this);
3673     ITScope it_scope(this, &cond, guard);
3674     smlals(cond, rdlo, rdhi, rn, rm);
3675   }
Smlals(Register rdlo,Register rdhi,Register rn,Register rm)3676   void Smlals(Register rdlo, Register rdhi, Register rn, Register rm) {
3677     Smlals(al, rdlo, rdhi, rn, rm);
3678   }
3679 
Smlaltb(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3680   void Smlaltb(
3681       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3682     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3683     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3684     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3685     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3686     VIXL_ASSERT(allow_macro_instructions_);
3687     VIXL_ASSERT(OutsideITBlock());
3688     MacroEmissionCheckScope guard(this);
3689     ITScope it_scope(this, &cond, guard);
3690     smlaltb(cond, rdlo, rdhi, rn, rm);
3691   }
Smlaltb(Register rdlo,Register rdhi,Register rn,Register rm)3692   void Smlaltb(Register rdlo, Register rdhi, Register rn, Register rm) {
3693     Smlaltb(al, rdlo, rdhi, rn, rm);
3694   }
3695 
Smlaltt(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3696   void Smlaltt(
3697       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3698     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3699     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3700     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3701     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3702     VIXL_ASSERT(allow_macro_instructions_);
3703     VIXL_ASSERT(OutsideITBlock());
3704     MacroEmissionCheckScope guard(this);
3705     ITScope it_scope(this, &cond, guard);
3706     smlaltt(cond, rdlo, rdhi, rn, rm);
3707   }
Smlaltt(Register rdlo,Register rdhi,Register rn,Register rm)3708   void Smlaltt(Register rdlo, Register rdhi, Register rn, Register rm) {
3709     Smlaltt(al, rdlo, rdhi, rn, rm);
3710   }
3711 
Smlatb(Condition cond,Register rd,Register rn,Register rm,Register ra)3712   void Smlatb(
3713       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3714     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3715     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3716     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3717     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3718     VIXL_ASSERT(allow_macro_instructions_);
3719     VIXL_ASSERT(OutsideITBlock());
3720     MacroEmissionCheckScope guard(this);
3721     ITScope it_scope(this, &cond, guard);
3722     smlatb(cond, rd, rn, rm, ra);
3723   }
Smlatb(Register rd,Register rn,Register rm,Register ra)3724   void Smlatb(Register rd, Register rn, Register rm, Register ra) {
3725     Smlatb(al, rd, rn, rm, ra);
3726   }
3727 
Smlatt(Condition cond,Register rd,Register rn,Register rm,Register ra)3728   void Smlatt(
3729       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3730     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3731     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3732     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3733     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3734     VIXL_ASSERT(allow_macro_instructions_);
3735     VIXL_ASSERT(OutsideITBlock());
3736     MacroEmissionCheckScope guard(this);
3737     ITScope it_scope(this, &cond, guard);
3738     smlatt(cond, rd, rn, rm, ra);
3739   }
Smlatt(Register rd,Register rn,Register rm,Register ra)3740   void Smlatt(Register rd, Register rn, Register rm, Register ra) {
3741     Smlatt(al, rd, rn, rm, ra);
3742   }
3743 
Smlawb(Condition cond,Register rd,Register rn,Register rm,Register ra)3744   void Smlawb(
3745       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3746     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3747     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3748     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3749     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3750     VIXL_ASSERT(allow_macro_instructions_);
3751     VIXL_ASSERT(OutsideITBlock());
3752     MacroEmissionCheckScope guard(this);
3753     ITScope it_scope(this, &cond, guard);
3754     smlawb(cond, rd, rn, rm, ra);
3755   }
Smlawb(Register rd,Register rn,Register rm,Register ra)3756   void Smlawb(Register rd, Register rn, Register rm, Register ra) {
3757     Smlawb(al, rd, rn, rm, ra);
3758   }
3759 
Smlawt(Condition cond,Register rd,Register rn,Register rm,Register ra)3760   void Smlawt(
3761       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3762     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3763     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3764     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3765     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3766     VIXL_ASSERT(allow_macro_instructions_);
3767     VIXL_ASSERT(OutsideITBlock());
3768     MacroEmissionCheckScope guard(this);
3769     ITScope it_scope(this, &cond, guard);
3770     smlawt(cond, rd, rn, rm, ra);
3771   }
Smlawt(Register rd,Register rn,Register rm,Register ra)3772   void Smlawt(Register rd, Register rn, Register rm, Register ra) {
3773     Smlawt(al, rd, rn, rm, ra);
3774   }
3775 
Smlsd(Condition cond,Register rd,Register rn,Register rm,Register ra)3776   void Smlsd(
3777       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3778     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3779     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3780     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3781     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3782     VIXL_ASSERT(allow_macro_instructions_);
3783     VIXL_ASSERT(OutsideITBlock());
3784     MacroEmissionCheckScope guard(this);
3785     ITScope it_scope(this, &cond, guard);
3786     smlsd(cond, rd, rn, rm, ra);
3787   }
Smlsd(Register rd,Register rn,Register rm,Register ra)3788   void Smlsd(Register rd, Register rn, Register rm, Register ra) {
3789     Smlsd(al, rd, rn, rm, ra);
3790   }
3791 
Smlsdx(Condition cond,Register rd,Register rn,Register rm,Register ra)3792   void Smlsdx(
3793       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3794     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3795     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3796     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3797     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3798     VIXL_ASSERT(allow_macro_instructions_);
3799     VIXL_ASSERT(OutsideITBlock());
3800     MacroEmissionCheckScope guard(this);
3801     ITScope it_scope(this, &cond, guard);
3802     smlsdx(cond, rd, rn, rm, ra);
3803   }
Smlsdx(Register rd,Register rn,Register rm,Register ra)3804   void Smlsdx(Register rd, Register rn, Register rm, Register ra) {
3805     Smlsdx(al, rd, rn, rm, ra);
3806   }
3807 
Smlsld(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3808   void Smlsld(
3809       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3810     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3811     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3812     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3813     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3814     VIXL_ASSERT(allow_macro_instructions_);
3815     VIXL_ASSERT(OutsideITBlock());
3816     MacroEmissionCheckScope guard(this);
3817     ITScope it_scope(this, &cond, guard);
3818     smlsld(cond, rdlo, rdhi, rn, rm);
3819   }
Smlsld(Register rdlo,Register rdhi,Register rn,Register rm)3820   void Smlsld(Register rdlo, Register rdhi, Register rn, Register rm) {
3821     Smlsld(al, rdlo, rdhi, rn, rm);
3822   }
3823 
Smlsldx(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3824   void Smlsldx(
3825       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3826     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3827     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3828     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3829     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3830     VIXL_ASSERT(allow_macro_instructions_);
3831     VIXL_ASSERT(OutsideITBlock());
3832     MacroEmissionCheckScope guard(this);
3833     ITScope it_scope(this, &cond, guard);
3834     smlsldx(cond, rdlo, rdhi, rn, rm);
3835   }
Smlsldx(Register rdlo,Register rdhi,Register rn,Register rm)3836   void Smlsldx(Register rdlo, Register rdhi, Register rn, Register rm) {
3837     Smlsldx(al, rdlo, rdhi, rn, rm);
3838   }
3839 
Smmla(Condition cond,Register rd,Register rn,Register rm,Register ra)3840   void Smmla(
3841       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3842     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3843     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3844     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3845     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3846     VIXL_ASSERT(allow_macro_instructions_);
3847     VIXL_ASSERT(OutsideITBlock());
3848     MacroEmissionCheckScope guard(this);
3849     ITScope it_scope(this, &cond, guard);
3850     smmla(cond, rd, rn, rm, ra);
3851   }
Smmla(Register rd,Register rn,Register rm,Register ra)3852   void Smmla(Register rd, Register rn, Register rm, Register ra) {
3853     Smmla(al, rd, rn, rm, ra);
3854   }
3855 
Smmlar(Condition cond,Register rd,Register rn,Register rm,Register ra)3856   void Smmlar(
3857       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3858     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3859     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3860     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3861     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3862     VIXL_ASSERT(allow_macro_instructions_);
3863     VIXL_ASSERT(OutsideITBlock());
3864     MacroEmissionCheckScope guard(this);
3865     ITScope it_scope(this, &cond, guard);
3866     smmlar(cond, rd, rn, rm, ra);
3867   }
Smmlar(Register rd,Register rn,Register rm,Register ra)3868   void Smmlar(Register rd, Register rn, Register rm, Register ra) {
3869     Smmlar(al, rd, rn, rm, ra);
3870   }
3871 
Smmls(Condition cond,Register rd,Register rn,Register rm,Register ra)3872   void Smmls(
3873       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3874     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3875     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3876     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3877     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3878     VIXL_ASSERT(allow_macro_instructions_);
3879     VIXL_ASSERT(OutsideITBlock());
3880     MacroEmissionCheckScope guard(this);
3881     ITScope it_scope(this, &cond, guard);
3882     smmls(cond, rd, rn, rm, ra);
3883   }
Smmls(Register rd,Register rn,Register rm,Register ra)3884   void Smmls(Register rd, Register rn, Register rm, Register ra) {
3885     Smmls(al, rd, rn, rm, ra);
3886   }
3887 
Smmlsr(Condition cond,Register rd,Register rn,Register rm,Register ra)3888   void Smmlsr(
3889       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3890     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3891     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3892     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3893     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3894     VIXL_ASSERT(allow_macro_instructions_);
3895     VIXL_ASSERT(OutsideITBlock());
3896     MacroEmissionCheckScope guard(this);
3897     ITScope it_scope(this, &cond, guard);
3898     smmlsr(cond, rd, rn, rm, ra);
3899   }
Smmlsr(Register rd,Register rn,Register rm,Register ra)3900   void Smmlsr(Register rd, Register rn, Register rm, Register ra) {
3901     Smmlsr(al, rd, rn, rm, ra);
3902   }
3903 
Smmul(Condition cond,Register rd,Register rn,Register rm)3904   void Smmul(Condition cond, Register rd, Register rn, Register rm) {
3905     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3906     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3907     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3908     VIXL_ASSERT(allow_macro_instructions_);
3909     VIXL_ASSERT(OutsideITBlock());
3910     MacroEmissionCheckScope guard(this);
3911     ITScope it_scope(this, &cond, guard);
3912     smmul(cond, rd, rn, rm);
3913   }
Smmul(Register rd,Register rn,Register rm)3914   void Smmul(Register rd, Register rn, Register rm) { Smmul(al, rd, rn, rm); }
3915 
Smmulr(Condition cond,Register rd,Register rn,Register rm)3916   void Smmulr(Condition cond, Register rd, Register rn, Register rm) {
3917     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3918     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3919     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3920     VIXL_ASSERT(allow_macro_instructions_);
3921     VIXL_ASSERT(OutsideITBlock());
3922     MacroEmissionCheckScope guard(this);
3923     ITScope it_scope(this, &cond, guard);
3924     smmulr(cond, rd, rn, rm);
3925   }
Smmulr(Register rd,Register rn,Register rm)3926   void Smmulr(Register rd, Register rn, Register rm) { Smmulr(al, rd, rn, rm); }
3927 
Smuad(Condition cond,Register rd,Register rn,Register rm)3928   void Smuad(Condition cond, Register rd, Register rn, Register rm) {
3929     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3930     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3931     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3932     VIXL_ASSERT(allow_macro_instructions_);
3933     VIXL_ASSERT(OutsideITBlock());
3934     MacroEmissionCheckScope guard(this);
3935     ITScope it_scope(this, &cond, guard);
3936     smuad(cond, rd, rn, rm);
3937   }
Smuad(Register rd,Register rn,Register rm)3938   void Smuad(Register rd, Register rn, Register rm) { Smuad(al, rd, rn, rm); }
3939 
Smuadx(Condition cond,Register rd,Register rn,Register rm)3940   void Smuadx(Condition cond, Register rd, Register rn, Register rm) {
3941     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3942     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3943     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3944     VIXL_ASSERT(allow_macro_instructions_);
3945     VIXL_ASSERT(OutsideITBlock());
3946     MacroEmissionCheckScope guard(this);
3947     ITScope it_scope(this, &cond, guard);
3948     smuadx(cond, rd, rn, rm);
3949   }
Smuadx(Register rd,Register rn,Register rm)3950   void Smuadx(Register rd, Register rn, Register rm) { Smuadx(al, rd, rn, rm); }
3951 
Smulbb(Condition cond,Register rd,Register rn,Register rm)3952   void Smulbb(Condition cond, Register rd, Register rn, Register rm) {
3953     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3954     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3955     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3956     VIXL_ASSERT(allow_macro_instructions_);
3957     VIXL_ASSERT(OutsideITBlock());
3958     MacroEmissionCheckScope guard(this);
3959     ITScope it_scope(this, &cond, guard);
3960     smulbb(cond, rd, rn, rm);
3961   }
Smulbb(Register rd,Register rn,Register rm)3962   void Smulbb(Register rd, Register rn, Register rm) { Smulbb(al, rd, rn, rm); }
3963 
Smulbt(Condition cond,Register rd,Register rn,Register rm)3964   void Smulbt(Condition cond, Register rd, Register rn, Register rm) {
3965     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3966     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3967     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3968     VIXL_ASSERT(allow_macro_instructions_);
3969     VIXL_ASSERT(OutsideITBlock());
3970     MacroEmissionCheckScope guard(this);
3971     ITScope it_scope(this, &cond, guard);
3972     smulbt(cond, rd, rn, rm);
3973   }
Smulbt(Register rd,Register rn,Register rm)3974   void Smulbt(Register rd, Register rn, Register rm) { Smulbt(al, rd, rn, rm); }
3975 
Smull(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3976   void Smull(
3977       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3978     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3979     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
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, guard);
3986     smull(cond, rdlo, rdhi, rn, rm);
3987   }
Smull(Register rdlo,Register rdhi,Register rn,Register rm)3988   void Smull(Register rdlo, Register rdhi, Register rn, Register rm) {
3989     Smull(al, rdlo, rdhi, rn, rm);
3990   }
Smull(FlagsUpdate flags,Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3991   void Smull(FlagsUpdate flags,
3992              Condition cond,
3993              Register rdlo,
3994              Register rdhi,
3995              Register rn,
3996              Register rm) {
3997     switch (flags) {
3998       case LeaveFlags:
3999         Smull(cond, rdlo, rdhi, rn, rm);
4000         break;
4001       case SetFlags:
4002         Smulls(cond, rdlo, rdhi, rn, rm);
4003         break;
4004       case DontCare:
4005         Smull(cond, rdlo, rdhi, rn, rm);
4006         break;
4007     }
4008   }
Smull(FlagsUpdate flags,Register rdlo,Register rdhi,Register rn,Register rm)4009   void Smull(FlagsUpdate flags,
4010              Register rdlo,
4011              Register rdhi,
4012              Register rn,
4013              Register rm) {
4014     Smull(flags, al, rdlo, rdhi, rn, rm);
4015   }
4016 
Smulls(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4017   void Smulls(
4018       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4019     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4020     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4021     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4022     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4023     VIXL_ASSERT(allow_macro_instructions_);
4024     VIXL_ASSERT(OutsideITBlock());
4025     MacroEmissionCheckScope guard(this);
4026     ITScope it_scope(this, &cond, guard);
4027     smulls(cond, rdlo, rdhi, rn, rm);
4028   }
Smulls(Register rdlo,Register rdhi,Register rn,Register rm)4029   void Smulls(Register rdlo, Register rdhi, Register rn, Register rm) {
4030     Smulls(al, rdlo, rdhi, rn, rm);
4031   }
4032 
Smultb(Condition cond,Register rd,Register rn,Register rm)4033   void Smultb(Condition cond, Register rd, Register rn, Register rm) {
4034     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4035     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4036     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4037     VIXL_ASSERT(allow_macro_instructions_);
4038     VIXL_ASSERT(OutsideITBlock());
4039     MacroEmissionCheckScope guard(this);
4040     ITScope it_scope(this, &cond, guard);
4041     smultb(cond, rd, rn, rm);
4042   }
Smultb(Register rd,Register rn,Register rm)4043   void Smultb(Register rd, Register rn, Register rm) { Smultb(al, rd, rn, rm); }
4044 
Smultt(Condition cond,Register rd,Register rn,Register rm)4045   void Smultt(Condition cond, Register rd, Register rn, Register rm) {
4046     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4047     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4048     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4049     VIXL_ASSERT(allow_macro_instructions_);
4050     VIXL_ASSERT(OutsideITBlock());
4051     MacroEmissionCheckScope guard(this);
4052     ITScope it_scope(this, &cond, guard);
4053     smultt(cond, rd, rn, rm);
4054   }
Smultt(Register rd,Register rn,Register rm)4055   void Smultt(Register rd, Register rn, Register rm) { Smultt(al, rd, rn, rm); }
4056 
Smulwb(Condition cond,Register rd,Register rn,Register rm)4057   void Smulwb(Condition cond, Register rd, Register rn, Register rm) {
4058     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4059     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4060     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4061     VIXL_ASSERT(allow_macro_instructions_);
4062     VIXL_ASSERT(OutsideITBlock());
4063     MacroEmissionCheckScope guard(this);
4064     ITScope it_scope(this, &cond, guard);
4065     smulwb(cond, rd, rn, rm);
4066   }
Smulwb(Register rd,Register rn,Register rm)4067   void Smulwb(Register rd, Register rn, Register rm) { Smulwb(al, rd, rn, rm); }
4068 
Smulwt(Condition cond,Register rd,Register rn,Register rm)4069   void Smulwt(Condition cond, Register rd, Register rn, Register rm) {
4070     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4071     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4072     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4073     VIXL_ASSERT(allow_macro_instructions_);
4074     VIXL_ASSERT(OutsideITBlock());
4075     MacroEmissionCheckScope guard(this);
4076     ITScope it_scope(this, &cond, guard);
4077     smulwt(cond, rd, rn, rm);
4078   }
Smulwt(Register rd,Register rn,Register rm)4079   void Smulwt(Register rd, Register rn, Register rm) { Smulwt(al, rd, rn, rm); }
4080 
Smusd(Condition cond,Register rd,Register rn,Register rm)4081   void Smusd(Condition cond, Register rd, Register rn, Register rm) {
4082     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4083     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4084     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4085     VIXL_ASSERT(allow_macro_instructions_);
4086     VIXL_ASSERT(OutsideITBlock());
4087     MacroEmissionCheckScope guard(this);
4088     ITScope it_scope(this, &cond, guard);
4089     smusd(cond, rd, rn, rm);
4090   }
Smusd(Register rd,Register rn,Register rm)4091   void Smusd(Register rd, Register rn, Register rm) { Smusd(al, rd, rn, rm); }
4092 
Smusdx(Condition cond,Register rd,Register rn,Register rm)4093   void Smusdx(Condition cond, Register rd, Register rn, Register rm) {
4094     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
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, guard);
4101     smusdx(cond, rd, rn, rm);
4102   }
Smusdx(Register rd,Register rn,Register rm)4103   void Smusdx(Register rd, Register rn, Register rm) { Smusdx(al, rd, rn, rm); }
4104 
Ssat(Condition cond,Register rd,uint32_t imm,const Operand & operand)4105   void Ssat(Condition cond, Register rd, uint32_t imm, const Operand& operand) {
4106     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4107     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4108     VIXL_ASSERT(allow_macro_instructions_);
4109     VIXL_ASSERT(OutsideITBlock());
4110     MacroEmissionCheckScope guard(this);
4111     ITScope it_scope(this, &cond, guard);
4112     ssat(cond, rd, imm, operand);
4113   }
Ssat(Register rd,uint32_t imm,const Operand & operand)4114   void Ssat(Register rd, uint32_t imm, const Operand& operand) {
4115     Ssat(al, rd, imm, operand);
4116   }
4117 
Ssat16(Condition cond,Register rd,uint32_t imm,Register rn)4118   void Ssat16(Condition cond, Register rd, uint32_t imm, Register rn) {
4119     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4120     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4121     VIXL_ASSERT(allow_macro_instructions_);
4122     VIXL_ASSERT(OutsideITBlock());
4123     MacroEmissionCheckScope guard(this);
4124     ITScope it_scope(this, &cond, guard);
4125     ssat16(cond, rd, imm, rn);
4126   }
Ssat16(Register rd,uint32_t imm,Register rn)4127   void Ssat16(Register rd, uint32_t imm, Register rn) {
4128     Ssat16(al, rd, imm, rn);
4129   }
4130 
Ssax(Condition cond,Register rd,Register rn,Register rm)4131   void Ssax(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, guard);
4139     ssax(cond, rd, rn, rm);
4140   }
Ssax(Register rd,Register rn,Register rm)4141   void Ssax(Register rd, Register rn, Register rm) { Ssax(al, rd, rn, rm); }
4142 
Ssub16(Condition cond,Register rd,Register rn,Register rm)4143   void Ssub16(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, guard);
4151     ssub16(cond, rd, rn, rm);
4152   }
Ssub16(Register rd,Register rn,Register rm)4153   void Ssub16(Register rd, Register rn, Register rm) { Ssub16(al, rd, rn, rm); }
4154 
Ssub8(Condition cond,Register rd,Register rn,Register rm)4155   void Ssub8(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, guard);
4163     ssub8(cond, rd, rn, rm);
4164   }
Ssub8(Register rd,Register rn,Register rm)4165   void Ssub8(Register rd, Register rn, Register rm) { Ssub8(al, rd, rn, rm); }
4166 
Stl(Condition cond,Register rt,const MemOperand & operand)4167   void Stl(Condition cond, Register rt, const MemOperand& operand) {
4168     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4169     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4170     VIXL_ASSERT(allow_macro_instructions_);
4171     VIXL_ASSERT(OutsideITBlock());
4172     MacroEmissionCheckScope guard(this);
4173     ITScope it_scope(this, &cond, guard);
4174     stl(cond, rt, operand);
4175   }
Stl(Register rt,const MemOperand & operand)4176   void Stl(Register rt, const MemOperand& operand) { Stl(al, rt, operand); }
4177 
Stlb(Condition cond,Register rt,const MemOperand & operand)4178   void Stlb(Condition cond, Register rt, const MemOperand& operand) {
4179     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4180     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4181     VIXL_ASSERT(allow_macro_instructions_);
4182     VIXL_ASSERT(OutsideITBlock());
4183     MacroEmissionCheckScope guard(this);
4184     ITScope it_scope(this, &cond, guard);
4185     stlb(cond, rt, operand);
4186   }
Stlb(Register rt,const MemOperand & operand)4187   void Stlb(Register rt, const MemOperand& operand) { Stlb(al, rt, operand); }
4188 
Stlex(Condition cond,Register rd,Register rt,const MemOperand & operand)4189   void Stlex(Condition cond,
4190              Register rd,
4191              Register rt,
4192              const MemOperand& operand) {
4193     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4194     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4195     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4196     VIXL_ASSERT(allow_macro_instructions_);
4197     VIXL_ASSERT(OutsideITBlock());
4198     MacroEmissionCheckScope guard(this);
4199     ITScope it_scope(this, &cond, guard);
4200     stlex(cond, rd, rt, operand);
4201   }
Stlex(Register rd,Register rt,const MemOperand & operand)4202   void Stlex(Register rd, Register rt, const MemOperand& operand) {
4203     Stlex(al, rd, rt, operand);
4204   }
4205 
Stlexb(Condition cond,Register rd,Register rt,const MemOperand & operand)4206   void Stlexb(Condition cond,
4207               Register rd,
4208               Register rt,
4209               const MemOperand& operand) {
4210     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4211     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4212     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4213     VIXL_ASSERT(allow_macro_instructions_);
4214     VIXL_ASSERT(OutsideITBlock());
4215     MacroEmissionCheckScope guard(this);
4216     ITScope it_scope(this, &cond, guard);
4217     stlexb(cond, rd, rt, operand);
4218   }
Stlexb(Register rd,Register rt,const MemOperand & operand)4219   void Stlexb(Register rd, Register rt, const MemOperand& operand) {
4220     Stlexb(al, rd, rt, operand);
4221   }
4222 
Stlexd(Condition cond,Register rd,Register rt,Register rt2,const MemOperand & operand)4223   void Stlexd(Condition cond,
4224               Register rd,
4225               Register rt,
4226               Register rt2,
4227               const MemOperand& operand) {
4228     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4229     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4230     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
4231     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4232     VIXL_ASSERT(allow_macro_instructions_);
4233     VIXL_ASSERT(OutsideITBlock());
4234     MacroEmissionCheckScope guard(this);
4235     ITScope it_scope(this, &cond, guard);
4236     stlexd(cond, rd, rt, rt2, operand);
4237   }
Stlexd(Register rd,Register rt,Register rt2,const MemOperand & operand)4238   void Stlexd(Register rd,
4239               Register rt,
4240               Register rt2,
4241               const MemOperand& operand) {
4242     Stlexd(al, rd, rt, rt2, operand);
4243   }
4244 
Stlexh(Condition cond,Register rd,Register rt,const MemOperand & operand)4245   void Stlexh(Condition cond,
4246               Register rd,
4247               Register rt,
4248               const MemOperand& operand) {
4249     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4250     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4251     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4252     VIXL_ASSERT(allow_macro_instructions_);
4253     VIXL_ASSERT(OutsideITBlock());
4254     MacroEmissionCheckScope guard(this);
4255     ITScope it_scope(this, &cond, guard);
4256     stlexh(cond, rd, rt, operand);
4257   }
Stlexh(Register rd,Register rt,const MemOperand & operand)4258   void Stlexh(Register rd, Register rt, const MemOperand& operand) {
4259     Stlexh(al, rd, rt, operand);
4260   }
4261 
Stlh(Condition cond,Register rt,const MemOperand & operand)4262   void Stlh(Condition cond, Register rt, const MemOperand& operand) {
4263     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4264     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4265     VIXL_ASSERT(allow_macro_instructions_);
4266     VIXL_ASSERT(OutsideITBlock());
4267     MacroEmissionCheckScope guard(this);
4268     ITScope it_scope(this, &cond, guard);
4269     stlh(cond, rt, operand);
4270   }
Stlh(Register rt,const MemOperand & operand)4271   void Stlh(Register rt, const MemOperand& operand) { Stlh(al, rt, operand); }
4272 
Stm(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4273   void Stm(Condition cond,
4274            Register rn,
4275            WriteBack write_back,
4276            RegisterList registers) {
4277     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4278     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4279     VIXL_ASSERT(allow_macro_instructions_);
4280     VIXL_ASSERT(OutsideITBlock());
4281     MacroEmissionCheckScope guard(this);
4282     ITScope it_scope(this, &cond, guard);
4283     stm(cond, rn, write_back, registers);
4284   }
Stm(Register rn,WriteBack write_back,RegisterList registers)4285   void Stm(Register rn, WriteBack write_back, RegisterList registers) {
4286     Stm(al, rn, write_back, registers);
4287   }
4288 
Stmda(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4289   void Stmda(Condition cond,
4290              Register rn,
4291              WriteBack write_back,
4292              RegisterList registers) {
4293     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4294     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4295     VIXL_ASSERT(allow_macro_instructions_);
4296     VIXL_ASSERT(OutsideITBlock());
4297     MacroEmissionCheckScope guard(this);
4298     ITScope it_scope(this, &cond, guard);
4299     stmda(cond, rn, write_back, registers);
4300   }
Stmda(Register rn,WriteBack write_back,RegisterList registers)4301   void Stmda(Register rn, WriteBack write_back, RegisterList registers) {
4302     Stmda(al, rn, write_back, registers);
4303   }
4304 
Stmdb(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4305   void Stmdb(Condition cond,
4306              Register rn,
4307              WriteBack write_back,
4308              RegisterList registers) {
4309     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4310     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4311     VIXL_ASSERT(allow_macro_instructions_);
4312     VIXL_ASSERT(OutsideITBlock());
4313     MacroEmissionCheckScope guard(this);
4314     ITScope it_scope(this, &cond, guard);
4315     stmdb(cond, rn, write_back, registers);
4316   }
Stmdb(Register rn,WriteBack write_back,RegisterList registers)4317   void Stmdb(Register rn, WriteBack write_back, RegisterList registers) {
4318     Stmdb(al, rn, write_back, registers);
4319   }
4320 
Stmea(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4321   void Stmea(Condition cond,
4322              Register rn,
4323              WriteBack write_back,
4324              RegisterList registers) {
4325     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4326     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4327     VIXL_ASSERT(allow_macro_instructions_);
4328     VIXL_ASSERT(OutsideITBlock());
4329     MacroEmissionCheckScope guard(this);
4330     ITScope it_scope(this, &cond, guard);
4331     stmea(cond, rn, write_back, registers);
4332   }
Stmea(Register rn,WriteBack write_back,RegisterList registers)4333   void Stmea(Register rn, WriteBack write_back, RegisterList registers) {
4334     Stmea(al, rn, write_back, registers);
4335   }
4336 
Stmed(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4337   void Stmed(Condition cond,
4338              Register rn,
4339              WriteBack write_back,
4340              RegisterList registers) {
4341     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4342     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4343     VIXL_ASSERT(allow_macro_instructions_);
4344     VIXL_ASSERT(OutsideITBlock());
4345     MacroEmissionCheckScope guard(this);
4346     ITScope it_scope(this, &cond, guard);
4347     stmed(cond, rn, write_back, registers);
4348   }
Stmed(Register rn,WriteBack write_back,RegisterList registers)4349   void Stmed(Register rn, WriteBack write_back, RegisterList registers) {
4350     Stmed(al, rn, write_back, registers);
4351   }
4352 
Stmfa(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4353   void Stmfa(Condition cond,
4354              Register rn,
4355              WriteBack write_back,
4356              RegisterList registers) {
4357     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4358     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4359     VIXL_ASSERT(allow_macro_instructions_);
4360     VIXL_ASSERT(OutsideITBlock());
4361     MacroEmissionCheckScope guard(this);
4362     ITScope it_scope(this, &cond, guard);
4363     stmfa(cond, rn, write_back, registers);
4364   }
Stmfa(Register rn,WriteBack write_back,RegisterList registers)4365   void Stmfa(Register rn, WriteBack write_back, RegisterList registers) {
4366     Stmfa(al, rn, write_back, registers);
4367   }
4368 
Stmfd(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4369   void Stmfd(Condition cond,
4370              Register rn,
4371              WriteBack write_back,
4372              RegisterList registers) {
4373     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4374     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4375     VIXL_ASSERT(allow_macro_instructions_);
4376     VIXL_ASSERT(OutsideITBlock());
4377     MacroEmissionCheckScope guard(this);
4378     ITScope it_scope(this, &cond, guard);
4379     stmfd(cond, rn, write_back, registers);
4380   }
Stmfd(Register rn,WriteBack write_back,RegisterList registers)4381   void Stmfd(Register rn, WriteBack write_back, RegisterList registers) {
4382     Stmfd(al, rn, write_back, registers);
4383   }
4384 
Stmib(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4385   void Stmib(Condition cond,
4386              Register rn,
4387              WriteBack write_back,
4388              RegisterList registers) {
4389     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4390     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4391     VIXL_ASSERT(allow_macro_instructions_);
4392     VIXL_ASSERT(OutsideITBlock());
4393     MacroEmissionCheckScope guard(this);
4394     ITScope it_scope(this, &cond, guard);
4395     stmib(cond, rn, write_back, registers);
4396   }
Stmib(Register rn,WriteBack write_back,RegisterList registers)4397   void Stmib(Register rn, WriteBack write_back, RegisterList registers) {
4398     Stmib(al, rn, write_back, registers);
4399   }
4400 
Str(Condition cond,Register rt,const MemOperand & operand)4401   void Str(Condition cond, Register rt, const MemOperand& operand) {
4402     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4403     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4404     VIXL_ASSERT(allow_macro_instructions_);
4405     VIXL_ASSERT(OutsideITBlock());
4406     MacroEmissionCheckScope guard(this);
4407     bool can_use_it =
4408         // STR{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
4409         (operand.IsImmediate() && rt.IsLow() &&
4410          operand.GetBaseRegister().IsLow() &&
4411          operand.IsOffsetImmediateWithinRange(0, 124, 4) &&
4412          (operand.GetAddrMode() == Offset)) ||
4413         // STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
4414         (operand.IsImmediate() && rt.IsLow() &&
4415          operand.GetBaseRegister().IsSP() &&
4416          operand.IsOffsetImmediateWithinRange(0, 1020, 4) &&
4417          (operand.GetAddrMode() == Offset)) ||
4418         // STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
4419         (operand.IsPlainRegister() && rt.IsLow() &&
4420          operand.GetBaseRegister().IsLow() &&
4421          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
4422          (operand.GetAddrMode() == Offset));
4423     ITScope it_scope(this, &cond, guard, can_use_it);
4424     str(cond, rt, operand);
4425   }
Str(Register rt,const MemOperand & operand)4426   void Str(Register rt, const MemOperand& operand) { Str(al, rt, operand); }
4427 
Strb(Condition cond,Register rt,const MemOperand & operand)4428   void Strb(Condition cond, Register rt, const MemOperand& operand) {
4429     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4430     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4431     VIXL_ASSERT(allow_macro_instructions_);
4432     VIXL_ASSERT(OutsideITBlock());
4433     MacroEmissionCheckScope guard(this);
4434     bool can_use_it =
4435         // STRB{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
4436         (operand.IsImmediate() && rt.IsLow() &&
4437          operand.GetBaseRegister().IsLow() &&
4438          operand.IsOffsetImmediateWithinRange(0, 31) &&
4439          (operand.GetAddrMode() == Offset)) ||
4440         // STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
4441         (operand.IsPlainRegister() && rt.IsLow() &&
4442          operand.GetBaseRegister().IsLow() &&
4443          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
4444          (operand.GetAddrMode() == Offset));
4445     ITScope it_scope(this, &cond, guard, can_use_it);
4446     strb(cond, rt, operand);
4447   }
Strb(Register rt,const MemOperand & operand)4448   void Strb(Register rt, const MemOperand& operand) { Strb(al, rt, operand); }
4449 
Strd(Condition cond,Register rt,Register rt2,const MemOperand & operand)4450   void Strd(Condition cond,
4451             Register rt,
4452             Register rt2,
4453             const MemOperand& operand) {
4454     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4455     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
4456     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4457     VIXL_ASSERT(allow_macro_instructions_);
4458     VIXL_ASSERT(OutsideITBlock());
4459     MacroEmissionCheckScope guard(this);
4460     ITScope it_scope(this, &cond, guard);
4461     strd(cond, rt, rt2, operand);
4462   }
Strd(Register rt,Register rt2,const MemOperand & operand)4463   void Strd(Register rt, Register rt2, const MemOperand& operand) {
4464     Strd(al, rt, rt2, operand);
4465   }
4466 
Strex(Condition cond,Register rd,Register rt,const MemOperand & operand)4467   void Strex(Condition cond,
4468              Register rd,
4469              Register rt,
4470              const MemOperand& operand) {
4471     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4472     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4473     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4474     VIXL_ASSERT(allow_macro_instructions_);
4475     VIXL_ASSERT(OutsideITBlock());
4476     MacroEmissionCheckScope guard(this);
4477     ITScope it_scope(this, &cond, guard);
4478     strex(cond, rd, rt, operand);
4479   }
Strex(Register rd,Register rt,const MemOperand & operand)4480   void Strex(Register rd, Register rt, const MemOperand& operand) {
4481     Strex(al, rd, rt, operand);
4482   }
4483 
Strexb(Condition cond,Register rd,Register rt,const MemOperand & operand)4484   void Strexb(Condition cond,
4485               Register rd,
4486               Register rt,
4487               const MemOperand& operand) {
4488     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4489     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4490     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4491     VIXL_ASSERT(allow_macro_instructions_);
4492     VIXL_ASSERT(OutsideITBlock());
4493     MacroEmissionCheckScope guard(this);
4494     ITScope it_scope(this, &cond, guard);
4495     strexb(cond, rd, rt, operand);
4496   }
Strexb(Register rd,Register rt,const MemOperand & operand)4497   void Strexb(Register rd, Register rt, const MemOperand& operand) {
4498     Strexb(al, rd, rt, operand);
4499   }
4500 
Strexd(Condition cond,Register rd,Register rt,Register rt2,const MemOperand & operand)4501   void Strexd(Condition cond,
4502               Register rd,
4503               Register rt,
4504               Register rt2,
4505               const MemOperand& operand) {
4506     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4507     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4508     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
4509     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4510     VIXL_ASSERT(allow_macro_instructions_);
4511     VIXL_ASSERT(OutsideITBlock());
4512     MacroEmissionCheckScope guard(this);
4513     ITScope it_scope(this, &cond, guard);
4514     strexd(cond, rd, rt, rt2, operand);
4515   }
Strexd(Register rd,Register rt,Register rt2,const MemOperand & operand)4516   void Strexd(Register rd,
4517               Register rt,
4518               Register rt2,
4519               const MemOperand& operand) {
4520     Strexd(al, rd, rt, rt2, operand);
4521   }
4522 
Strexh(Condition cond,Register rd,Register rt,const MemOperand & operand)4523   void Strexh(Condition cond,
4524               Register rd,
4525               Register rt,
4526               const MemOperand& operand) {
4527     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4528     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4529     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4530     VIXL_ASSERT(allow_macro_instructions_);
4531     VIXL_ASSERT(OutsideITBlock());
4532     MacroEmissionCheckScope guard(this);
4533     ITScope it_scope(this, &cond, guard);
4534     strexh(cond, rd, rt, operand);
4535   }
Strexh(Register rd,Register rt,const MemOperand & operand)4536   void Strexh(Register rd, Register rt, const MemOperand& operand) {
4537     Strexh(al, rd, rt, operand);
4538   }
4539 
Strh(Condition cond,Register rt,const MemOperand & operand)4540   void Strh(Condition cond, Register rt, const MemOperand& operand) {
4541     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4542     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4543     VIXL_ASSERT(allow_macro_instructions_);
4544     VIXL_ASSERT(OutsideITBlock());
4545     MacroEmissionCheckScope guard(this);
4546     bool can_use_it =
4547         // STRH{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
4548         (operand.IsImmediate() && rt.IsLow() &&
4549          operand.GetBaseRegister().IsLow() &&
4550          operand.IsOffsetImmediateWithinRange(0, 62, 2) &&
4551          (operand.GetAddrMode() == Offset)) ||
4552         // STRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
4553         (operand.IsPlainRegister() && rt.IsLow() &&
4554          operand.GetBaseRegister().IsLow() &&
4555          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
4556          (operand.GetAddrMode() == Offset));
4557     ITScope it_scope(this, &cond, guard, can_use_it);
4558     strh(cond, rt, operand);
4559   }
Strh(Register rt,const MemOperand & operand)4560   void Strh(Register rt, const MemOperand& operand) { Strh(al, rt, operand); }
4561 
Sub(Condition cond,Register rd,Register rn,const Operand & operand)4562   void Sub(Condition cond, Register rd, Register rn, const Operand& operand) {
4563     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4564     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4565     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4566     VIXL_ASSERT(allow_macro_instructions_);
4567     VIXL_ASSERT(OutsideITBlock());
4568     MacroEmissionCheckScope guard(this);
4569     if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) {
4570       uint32_t immediate = operand.GetImmediate();
4571       if (immediate == 0) {
4572         return;
4573       }
4574     }
4575     bool can_use_it =
4576         // SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
4577         (operand.IsImmediate() && (operand.GetImmediate() <= 7) && rn.IsLow() &&
4578          rd.IsLow()) ||
4579         // SUB<c>{<q>} {<Rdn>,} <Rdn>, #<imm8> ; T2
4580         (operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
4581          rd.IsLow() && rn.Is(rd)) ||
4582         // SUB<c>{<q>} <Rd>, <Rn>, <Rm>
4583         (operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
4584          operand.GetBaseRegister().IsLow());
4585     ITScope it_scope(this, &cond, guard, can_use_it);
4586     sub(cond, rd, rn, operand);
4587   }
Sub(Register rd,Register rn,const Operand & operand)4588   void Sub(Register rd, Register rn, const Operand& operand) {
4589     Sub(al, rd, rn, operand);
4590   }
Sub(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)4591   void Sub(FlagsUpdate flags,
4592            Condition cond,
4593            Register rd,
4594            Register rn,
4595            const Operand& operand) {
4596     switch (flags) {
4597       case LeaveFlags:
4598         Sub(cond, rd, rn, operand);
4599         break;
4600       case SetFlags:
4601         Subs(cond, rd, rn, operand);
4602         break;
4603       case DontCare:
4604         bool setflags_is_smaller =
4605             IsUsingT32() && cond.Is(al) &&
4606             ((operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
4607               operand.GetBaseRegister().IsLow()) ||
4608              (operand.IsImmediate() &&
4609               ((rd.IsLow() && rn.IsLow() && (operand.GetImmediate() < 8)) ||
4610                (rd.IsLow() && rn.Is(rd) && (operand.GetImmediate() < 256)))));
4611         if (setflags_is_smaller) {
4612           Subs(cond, rd, rn, operand);
4613         } else {
4614           bool changed_op_is_smaller =
4615               operand.IsImmediate() && (operand.GetSignedImmediate() < 0) &&
4616               ((rd.IsLow() && rn.IsLow() &&
4617                 (operand.GetSignedImmediate() >= -7)) ||
4618                (rd.IsLow() && rn.Is(rd) &&
4619                 (operand.GetSignedImmediate() >= -255)));
4620           if (changed_op_is_smaller) {
4621             Adds(cond, rd, rn, -operand.GetSignedImmediate());
4622           } else {
4623             Sub(cond, rd, rn, operand);
4624           }
4625         }
4626         break;
4627     }
4628   }
Sub(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)4629   void Sub(FlagsUpdate flags,
4630            Register rd,
4631            Register rn,
4632            const Operand& operand) {
4633     Sub(flags, al, rd, rn, operand);
4634   }
4635 
Subs(Condition cond,Register rd,Register rn,const Operand & operand)4636   void Subs(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     ITScope it_scope(this, &cond, guard);
4644     subs(cond, rd, rn, operand);
4645   }
Subs(Register rd,Register rn,const Operand & operand)4646   void Subs(Register rd, Register rn, const Operand& operand) {
4647     Subs(al, rd, rn, operand);
4648   }
4649 
Svc(Condition cond,uint32_t imm)4650   void Svc(Condition cond, uint32_t imm) {
4651     VIXL_ASSERT(allow_macro_instructions_);
4652     VIXL_ASSERT(OutsideITBlock());
4653     MacroEmissionCheckScope guard(this);
4654     ITScope it_scope(this, &cond, guard);
4655     svc(cond, imm);
4656   }
Svc(uint32_t imm)4657   void Svc(uint32_t imm) { Svc(al, imm); }
4658 
Sxtab(Condition cond,Register rd,Register rn,const Operand & operand)4659   void Sxtab(Condition cond, Register rd, Register rn, const Operand& operand) {
4660     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4661     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4662     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4663     VIXL_ASSERT(allow_macro_instructions_);
4664     VIXL_ASSERT(OutsideITBlock());
4665     MacroEmissionCheckScope guard(this);
4666     ITScope it_scope(this, &cond, guard);
4667     sxtab(cond, rd, rn, operand);
4668   }
Sxtab(Register rd,Register rn,const Operand & operand)4669   void Sxtab(Register rd, Register rn, const Operand& operand) {
4670     Sxtab(al, rd, rn, operand);
4671   }
4672 
Sxtab16(Condition cond,Register rd,Register rn,const Operand & operand)4673   void Sxtab16(Condition cond,
4674                Register rd,
4675                Register rn,
4676                const Operand& operand) {
4677     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4678     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4679     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4680     VIXL_ASSERT(allow_macro_instructions_);
4681     VIXL_ASSERT(OutsideITBlock());
4682     MacroEmissionCheckScope guard(this);
4683     ITScope it_scope(this, &cond, guard);
4684     sxtab16(cond, rd, rn, operand);
4685   }
Sxtab16(Register rd,Register rn,const Operand & operand)4686   void Sxtab16(Register rd, Register rn, const Operand& operand) {
4687     Sxtab16(al, rd, rn, operand);
4688   }
4689 
Sxtah(Condition cond,Register rd,Register rn,const Operand & operand)4690   void Sxtah(Condition cond, Register rd, Register rn, const Operand& operand) {
4691     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4692     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4693     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4694     VIXL_ASSERT(allow_macro_instructions_);
4695     VIXL_ASSERT(OutsideITBlock());
4696     MacroEmissionCheckScope guard(this);
4697     ITScope it_scope(this, &cond, guard);
4698     sxtah(cond, rd, rn, operand);
4699   }
Sxtah(Register rd,Register rn,const Operand & operand)4700   void Sxtah(Register rd, Register rn, const Operand& operand) {
4701     Sxtah(al, rd, rn, operand);
4702   }
4703 
Sxtb(Condition cond,Register rd,const Operand & operand)4704   void Sxtb(Condition cond, Register rd, const Operand& operand) {
4705     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4706     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4707     VIXL_ASSERT(allow_macro_instructions_);
4708     VIXL_ASSERT(OutsideITBlock());
4709     MacroEmissionCheckScope guard(this);
4710     ITScope it_scope(this, &cond, guard);
4711     sxtb(cond, rd, operand);
4712   }
Sxtb(Register rd,const Operand & operand)4713   void Sxtb(Register rd, const Operand& operand) { Sxtb(al, rd, operand); }
4714 
Sxtb16(Condition cond,Register rd,const Operand & operand)4715   void Sxtb16(Condition cond, Register rd, const Operand& operand) {
4716     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4717     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4718     VIXL_ASSERT(allow_macro_instructions_);
4719     VIXL_ASSERT(OutsideITBlock());
4720     MacroEmissionCheckScope guard(this);
4721     ITScope it_scope(this, &cond, guard);
4722     sxtb16(cond, rd, operand);
4723   }
Sxtb16(Register rd,const Operand & operand)4724   void Sxtb16(Register rd, const Operand& operand) { Sxtb16(al, rd, operand); }
4725 
Sxth(Condition cond,Register rd,const Operand & operand)4726   void Sxth(Condition cond, Register rd, const Operand& operand) {
4727     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4728     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4729     VIXL_ASSERT(allow_macro_instructions_);
4730     VIXL_ASSERT(OutsideITBlock());
4731     MacroEmissionCheckScope guard(this);
4732     ITScope it_scope(this, &cond, guard);
4733     sxth(cond, rd, operand);
4734   }
Sxth(Register rd,const Operand & operand)4735   void Sxth(Register rd, const Operand& operand) { Sxth(al, rd, operand); }
4736 
Teq(Condition cond,Register rn,const Operand & operand)4737   void Teq(Condition cond, Register rn, const Operand& operand) {
4738     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4739     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4740     VIXL_ASSERT(allow_macro_instructions_);
4741     VIXL_ASSERT(OutsideITBlock());
4742     MacroEmissionCheckScope guard(this);
4743     ITScope it_scope(this, &cond, guard);
4744     teq(cond, rn, operand);
4745   }
Teq(Register rn,const Operand & operand)4746   void Teq(Register rn, const Operand& operand) { Teq(al, rn, operand); }
4747 
Tst(Condition cond,Register rn,const Operand & operand)4748   void Tst(Condition cond, Register rn, const Operand& operand) {
4749     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4750     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4751     VIXL_ASSERT(allow_macro_instructions_);
4752     VIXL_ASSERT(OutsideITBlock());
4753     MacroEmissionCheckScope guard(this);
4754     bool can_use_it =
4755         // TST{<c>}{<q>} <Rn>, <Rm> ; T1
4756         operand.IsPlainRegister() && rn.IsLow() &&
4757         operand.GetBaseRegister().IsLow();
4758     ITScope it_scope(this, &cond, guard, can_use_it);
4759     tst(cond, rn, operand);
4760   }
Tst(Register rn,const Operand & operand)4761   void Tst(Register rn, const Operand& operand) { Tst(al, rn, operand); }
4762 
Uadd16(Condition cond,Register rd,Register rn,Register rm)4763   void Uadd16(Condition cond, Register rd, Register rn, Register rm) {
4764     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4765     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4766     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4767     VIXL_ASSERT(allow_macro_instructions_);
4768     VIXL_ASSERT(OutsideITBlock());
4769     MacroEmissionCheckScope guard(this);
4770     ITScope it_scope(this, &cond, guard);
4771     uadd16(cond, rd, rn, rm);
4772   }
Uadd16(Register rd,Register rn,Register rm)4773   void Uadd16(Register rd, Register rn, Register rm) { Uadd16(al, rd, rn, rm); }
4774 
Uadd8(Condition cond,Register rd,Register rn,Register rm)4775   void Uadd8(Condition cond, Register rd, Register rn, Register rm) {
4776     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4777     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4778     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4779     VIXL_ASSERT(allow_macro_instructions_);
4780     VIXL_ASSERT(OutsideITBlock());
4781     MacroEmissionCheckScope guard(this);
4782     ITScope it_scope(this, &cond, guard);
4783     uadd8(cond, rd, rn, rm);
4784   }
Uadd8(Register rd,Register rn,Register rm)4785   void Uadd8(Register rd, Register rn, Register rm) { Uadd8(al, rd, rn, rm); }
4786 
Uasx(Condition cond,Register rd,Register rn,Register rm)4787   void Uasx(Condition cond, Register rd, Register rn, Register rm) {
4788     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4789     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4790     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4791     VIXL_ASSERT(allow_macro_instructions_);
4792     VIXL_ASSERT(OutsideITBlock());
4793     MacroEmissionCheckScope guard(this);
4794     ITScope it_scope(this, &cond, guard);
4795     uasx(cond, rd, rn, rm);
4796   }
Uasx(Register rd,Register rn,Register rm)4797   void Uasx(Register rd, Register rn, Register rm) { Uasx(al, rd, rn, rm); }
4798 
Ubfx(Condition cond,Register rd,Register rn,uint32_t lsb,uint32_t width)4799   void Ubfx(
4800       Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
4801     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4802     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4803     VIXL_ASSERT(allow_macro_instructions_);
4804     VIXL_ASSERT(OutsideITBlock());
4805     MacroEmissionCheckScope guard(this);
4806     ITScope it_scope(this, &cond, guard);
4807     ubfx(cond, rd, rn, lsb, width);
4808   }
Ubfx(Register rd,Register rn,uint32_t lsb,uint32_t width)4809   void Ubfx(Register rd, Register rn, uint32_t lsb, uint32_t width) {
4810     Ubfx(al, rd, rn, lsb, width);
4811   }
4812 
Udf(Condition cond,uint32_t imm)4813   void Udf(Condition cond, uint32_t imm) {
4814     VIXL_ASSERT(allow_macro_instructions_);
4815     VIXL_ASSERT(OutsideITBlock());
4816     MacroEmissionCheckScope guard(this);
4817     ITScope it_scope(this, &cond, guard);
4818     udf(cond, imm);
4819   }
Udf(uint32_t imm)4820   void Udf(uint32_t imm) { Udf(al, imm); }
4821 
Udiv(Condition cond,Register rd,Register rn,Register rm)4822   void Udiv(Condition cond, Register rd, Register rn, Register rm) {
4823     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4824     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4825     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4826     VIXL_ASSERT(allow_macro_instructions_);
4827     VIXL_ASSERT(OutsideITBlock());
4828     MacroEmissionCheckScope guard(this);
4829     ITScope it_scope(this, &cond, guard);
4830     udiv(cond, rd, rn, rm);
4831   }
Udiv(Register rd,Register rn,Register rm)4832   void Udiv(Register rd, Register rn, Register rm) { Udiv(al, rd, rn, rm); }
4833 
Uhadd16(Condition cond,Register rd,Register rn,Register rm)4834   void Uhadd16(Condition cond, Register rd, Register rn, Register rm) {
4835     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4836     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4837     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4838     VIXL_ASSERT(allow_macro_instructions_);
4839     VIXL_ASSERT(OutsideITBlock());
4840     MacroEmissionCheckScope guard(this);
4841     ITScope it_scope(this, &cond, guard);
4842     uhadd16(cond, rd, rn, rm);
4843   }
Uhadd16(Register rd,Register rn,Register rm)4844   void Uhadd16(Register rd, Register rn, Register rm) {
4845     Uhadd16(al, rd, rn, rm);
4846   }
4847 
Uhadd8(Condition cond,Register rd,Register rn,Register rm)4848   void Uhadd8(Condition cond, Register rd, Register rn, Register rm) {
4849     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4850     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4851     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4852     VIXL_ASSERT(allow_macro_instructions_);
4853     VIXL_ASSERT(OutsideITBlock());
4854     MacroEmissionCheckScope guard(this);
4855     ITScope it_scope(this, &cond, guard);
4856     uhadd8(cond, rd, rn, rm);
4857   }
Uhadd8(Register rd,Register rn,Register rm)4858   void Uhadd8(Register rd, Register rn, Register rm) { Uhadd8(al, rd, rn, rm); }
4859 
Uhasx(Condition cond,Register rd,Register rn,Register rm)4860   void Uhasx(Condition cond, Register rd, Register rn, Register rm) {
4861     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4862     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4863     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4864     VIXL_ASSERT(allow_macro_instructions_);
4865     VIXL_ASSERT(OutsideITBlock());
4866     MacroEmissionCheckScope guard(this);
4867     ITScope it_scope(this, &cond, guard);
4868     uhasx(cond, rd, rn, rm);
4869   }
Uhasx(Register rd,Register rn,Register rm)4870   void Uhasx(Register rd, Register rn, Register rm) { Uhasx(al, rd, rn, rm); }
4871 
Uhsax(Condition cond,Register rd,Register rn,Register rm)4872   void Uhsax(Condition cond, Register rd, Register rn, Register rm) {
4873     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4874     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4875     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4876     VIXL_ASSERT(allow_macro_instructions_);
4877     VIXL_ASSERT(OutsideITBlock());
4878     MacroEmissionCheckScope guard(this);
4879     ITScope it_scope(this, &cond, guard);
4880     uhsax(cond, rd, rn, rm);
4881   }
Uhsax(Register rd,Register rn,Register rm)4882   void Uhsax(Register rd, Register rn, Register rm) { Uhsax(al, rd, rn, rm); }
4883 
Uhsub16(Condition cond,Register rd,Register rn,Register rm)4884   void Uhsub16(Condition cond, Register rd, Register rn, Register rm) {
4885     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4886     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4887     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4888     VIXL_ASSERT(allow_macro_instructions_);
4889     VIXL_ASSERT(OutsideITBlock());
4890     MacroEmissionCheckScope guard(this);
4891     ITScope it_scope(this, &cond, guard);
4892     uhsub16(cond, rd, rn, rm);
4893   }
Uhsub16(Register rd,Register rn,Register rm)4894   void Uhsub16(Register rd, Register rn, Register rm) {
4895     Uhsub16(al, rd, rn, rm);
4896   }
4897 
Uhsub8(Condition cond,Register rd,Register rn,Register rm)4898   void Uhsub8(Condition cond, Register rd, Register rn, Register rm) {
4899     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4900     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4901     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4902     VIXL_ASSERT(allow_macro_instructions_);
4903     VIXL_ASSERT(OutsideITBlock());
4904     MacroEmissionCheckScope guard(this);
4905     ITScope it_scope(this, &cond, guard);
4906     uhsub8(cond, rd, rn, rm);
4907   }
Uhsub8(Register rd,Register rn,Register rm)4908   void Uhsub8(Register rd, Register rn, Register rm) { Uhsub8(al, rd, rn, rm); }
4909 
Umaal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4910   void Umaal(
4911       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4912     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4913     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
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, guard);
4920     umaal(cond, rdlo, rdhi, rn, rm);
4921   }
Umaal(Register rdlo,Register rdhi,Register rn,Register rm)4922   void Umaal(Register rdlo, Register rdhi, Register rn, Register rm) {
4923     Umaal(al, rdlo, rdhi, rn, rm);
4924   }
4925 
Umlal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4926   void Umlal(
4927       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4928     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4929     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4930     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4931     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4932     VIXL_ASSERT(allow_macro_instructions_);
4933     VIXL_ASSERT(OutsideITBlock());
4934     MacroEmissionCheckScope guard(this);
4935     ITScope it_scope(this, &cond, guard);
4936     umlal(cond, rdlo, rdhi, rn, rm);
4937   }
Umlal(Register rdlo,Register rdhi,Register rn,Register rm)4938   void Umlal(Register rdlo, Register rdhi, Register rn, Register rm) {
4939     Umlal(al, rdlo, rdhi, rn, rm);
4940   }
Umlal(FlagsUpdate flags,Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4941   void Umlal(FlagsUpdate flags,
4942              Condition cond,
4943              Register rdlo,
4944              Register rdhi,
4945              Register rn,
4946              Register rm) {
4947     switch (flags) {
4948       case LeaveFlags:
4949         Umlal(cond, rdlo, rdhi, rn, rm);
4950         break;
4951       case SetFlags:
4952         Umlals(cond, rdlo, rdhi, rn, rm);
4953         break;
4954       case DontCare:
4955         Umlal(cond, rdlo, rdhi, rn, rm);
4956         break;
4957     }
4958   }
Umlal(FlagsUpdate flags,Register rdlo,Register rdhi,Register rn,Register rm)4959   void Umlal(FlagsUpdate flags,
4960              Register rdlo,
4961              Register rdhi,
4962              Register rn,
4963              Register rm) {
4964     Umlal(flags, al, rdlo, rdhi, rn, rm);
4965   }
4966 
Umlals(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4967   void Umlals(
4968       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4969     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4970     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4971     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4972     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4973     VIXL_ASSERT(allow_macro_instructions_);
4974     VIXL_ASSERT(OutsideITBlock());
4975     MacroEmissionCheckScope guard(this);
4976     ITScope it_scope(this, &cond, guard);
4977     umlals(cond, rdlo, rdhi, rn, rm);
4978   }
Umlals(Register rdlo,Register rdhi,Register rn,Register rm)4979   void Umlals(Register rdlo, Register rdhi, Register rn, Register rm) {
4980     Umlals(al, rdlo, rdhi, rn, rm);
4981   }
4982 
Umull(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4983   void Umull(
4984       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4985     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4986     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4987     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4988     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4989     VIXL_ASSERT(allow_macro_instructions_);
4990     VIXL_ASSERT(OutsideITBlock());
4991     MacroEmissionCheckScope guard(this);
4992     ITScope it_scope(this, &cond, guard);
4993     umull(cond, rdlo, rdhi, rn, rm);
4994   }
Umull(Register rdlo,Register rdhi,Register rn,Register rm)4995   void Umull(Register rdlo, Register rdhi, Register rn, Register rm) {
4996     Umull(al, rdlo, rdhi, rn, rm);
4997   }
Umull(FlagsUpdate flags,Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4998   void Umull(FlagsUpdate flags,
4999              Condition cond,
5000              Register rdlo,
5001              Register rdhi,
5002              Register rn,
5003              Register rm) {
5004     switch (flags) {
5005       case LeaveFlags:
5006         Umull(cond, rdlo, rdhi, rn, rm);
5007         break;
5008       case SetFlags:
5009         Umulls(cond, rdlo, rdhi, rn, rm);
5010         break;
5011       case DontCare:
5012         Umull(cond, rdlo, rdhi, rn, rm);
5013         break;
5014     }
5015   }
Umull(FlagsUpdate flags,Register rdlo,Register rdhi,Register rn,Register rm)5016   void Umull(FlagsUpdate flags,
5017              Register rdlo,
5018              Register rdhi,
5019              Register rn,
5020              Register rm) {
5021     Umull(flags, al, rdlo, rdhi, rn, rm);
5022   }
5023 
Umulls(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)5024   void Umulls(
5025       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
5026     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
5027     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
5028     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5029     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5030     VIXL_ASSERT(allow_macro_instructions_);
5031     VIXL_ASSERT(OutsideITBlock());
5032     MacroEmissionCheckScope guard(this);
5033     ITScope it_scope(this, &cond, guard);
5034     umulls(cond, rdlo, rdhi, rn, rm);
5035   }
Umulls(Register rdlo,Register rdhi,Register rn,Register rm)5036   void Umulls(Register rdlo, Register rdhi, Register rn, Register rm) {
5037     Umulls(al, rdlo, rdhi, rn, rm);
5038   }
5039 
Uqadd16(Condition cond,Register rd,Register rn,Register rm)5040   void Uqadd16(Condition cond, Register rd, Register rn, Register rm) {
5041     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5042     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5043     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5044     VIXL_ASSERT(allow_macro_instructions_);
5045     VIXL_ASSERT(OutsideITBlock());
5046     MacroEmissionCheckScope guard(this);
5047     ITScope it_scope(this, &cond, guard);
5048     uqadd16(cond, rd, rn, rm);
5049   }
Uqadd16(Register rd,Register rn,Register rm)5050   void Uqadd16(Register rd, Register rn, Register rm) {
5051     Uqadd16(al, rd, rn, rm);
5052   }
5053 
Uqadd8(Condition cond,Register rd,Register rn,Register rm)5054   void Uqadd8(Condition cond, Register rd, Register rn, Register rm) {
5055     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5056     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5057     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5058     VIXL_ASSERT(allow_macro_instructions_);
5059     VIXL_ASSERT(OutsideITBlock());
5060     MacroEmissionCheckScope guard(this);
5061     ITScope it_scope(this, &cond, guard);
5062     uqadd8(cond, rd, rn, rm);
5063   }
Uqadd8(Register rd,Register rn,Register rm)5064   void Uqadd8(Register rd, Register rn, Register rm) { Uqadd8(al, rd, rn, rm); }
5065 
Uqasx(Condition cond,Register rd,Register rn,Register rm)5066   void Uqasx(Condition cond, Register rd, Register rn, Register rm) {
5067     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5068     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5069     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5070     VIXL_ASSERT(allow_macro_instructions_);
5071     VIXL_ASSERT(OutsideITBlock());
5072     MacroEmissionCheckScope guard(this);
5073     ITScope it_scope(this, &cond, guard);
5074     uqasx(cond, rd, rn, rm);
5075   }
Uqasx(Register rd,Register rn,Register rm)5076   void Uqasx(Register rd, Register rn, Register rm) { Uqasx(al, rd, rn, rm); }
5077 
Uqsax(Condition cond,Register rd,Register rn,Register rm)5078   void Uqsax(Condition cond, Register rd, Register rn, Register rm) {
5079     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5080     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5081     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5082     VIXL_ASSERT(allow_macro_instructions_);
5083     VIXL_ASSERT(OutsideITBlock());
5084     MacroEmissionCheckScope guard(this);
5085     ITScope it_scope(this, &cond, guard);
5086     uqsax(cond, rd, rn, rm);
5087   }
Uqsax(Register rd,Register rn,Register rm)5088   void Uqsax(Register rd, Register rn, Register rm) { Uqsax(al, rd, rn, rm); }
5089 
Uqsub16(Condition cond,Register rd,Register rn,Register rm)5090   void Uqsub16(Condition cond, Register rd, Register rn, Register rm) {
5091     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5092     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5093     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5094     VIXL_ASSERT(allow_macro_instructions_);
5095     VIXL_ASSERT(OutsideITBlock());
5096     MacroEmissionCheckScope guard(this);
5097     ITScope it_scope(this, &cond, guard);
5098     uqsub16(cond, rd, rn, rm);
5099   }
Uqsub16(Register rd,Register rn,Register rm)5100   void Uqsub16(Register rd, Register rn, Register rm) {
5101     Uqsub16(al, rd, rn, rm);
5102   }
5103 
Uqsub8(Condition cond,Register rd,Register rn,Register rm)5104   void Uqsub8(Condition cond, Register rd, Register rn, Register rm) {
5105     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
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, guard);
5112     uqsub8(cond, rd, rn, rm);
5113   }
Uqsub8(Register rd,Register rn,Register rm)5114   void Uqsub8(Register rd, Register rn, Register rm) { Uqsub8(al, rd, rn, rm); }
5115 
Usad8(Condition cond,Register rd,Register rn,Register rm)5116   void Usad8(Condition cond, Register rd, Register rn, Register rm) {
5117     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5118     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5119     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5120     VIXL_ASSERT(allow_macro_instructions_);
5121     VIXL_ASSERT(OutsideITBlock());
5122     MacroEmissionCheckScope guard(this);
5123     ITScope it_scope(this, &cond, guard);
5124     usad8(cond, rd, rn, rm);
5125   }
Usad8(Register rd,Register rn,Register rm)5126   void Usad8(Register rd, Register rn, Register rm) { Usad8(al, rd, rn, rm); }
5127 
Usada8(Condition cond,Register rd,Register rn,Register rm,Register ra)5128   void Usada8(
5129       Condition cond, Register rd, Register rn, Register rm, Register ra) {
5130     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5131     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5132     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5133     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
5134     VIXL_ASSERT(allow_macro_instructions_);
5135     VIXL_ASSERT(OutsideITBlock());
5136     MacroEmissionCheckScope guard(this);
5137     ITScope it_scope(this, &cond, guard);
5138     usada8(cond, rd, rn, rm, ra);
5139   }
Usada8(Register rd,Register rn,Register rm,Register ra)5140   void Usada8(Register rd, Register rn, Register rm, Register ra) {
5141     Usada8(al, rd, rn, rm, ra);
5142   }
5143 
Usat(Condition cond,Register rd,uint32_t imm,const Operand & operand)5144   void Usat(Condition cond, Register rd, uint32_t imm, const Operand& operand) {
5145     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5146     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5147     VIXL_ASSERT(allow_macro_instructions_);
5148     VIXL_ASSERT(OutsideITBlock());
5149     MacroEmissionCheckScope guard(this);
5150     ITScope it_scope(this, &cond, guard);
5151     usat(cond, rd, imm, operand);
5152   }
Usat(Register rd,uint32_t imm,const Operand & operand)5153   void Usat(Register rd, uint32_t imm, const Operand& operand) {
5154     Usat(al, rd, imm, operand);
5155   }
5156 
Usat16(Condition cond,Register rd,uint32_t imm,Register rn)5157   void Usat16(Condition cond, Register rd, uint32_t imm, Register rn) {
5158     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5159     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5160     VIXL_ASSERT(allow_macro_instructions_);
5161     VIXL_ASSERT(OutsideITBlock());
5162     MacroEmissionCheckScope guard(this);
5163     ITScope it_scope(this, &cond, guard);
5164     usat16(cond, rd, imm, rn);
5165   }
Usat16(Register rd,uint32_t imm,Register rn)5166   void Usat16(Register rd, uint32_t imm, Register rn) {
5167     Usat16(al, rd, imm, rn);
5168   }
5169 
Usax(Condition cond,Register rd,Register rn,Register rm)5170   void Usax(Condition cond, Register rd, Register rn, Register rm) {
5171     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5172     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5173     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5174     VIXL_ASSERT(allow_macro_instructions_);
5175     VIXL_ASSERT(OutsideITBlock());
5176     MacroEmissionCheckScope guard(this);
5177     ITScope it_scope(this, &cond, guard);
5178     usax(cond, rd, rn, rm);
5179   }
Usax(Register rd,Register rn,Register rm)5180   void Usax(Register rd, Register rn, Register rm) { Usax(al, rd, rn, rm); }
5181 
Usub16(Condition cond,Register rd,Register rn,Register rm)5182   void Usub16(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, guard);
5190     usub16(cond, rd, rn, rm);
5191   }
Usub16(Register rd,Register rn,Register rm)5192   void Usub16(Register rd, Register rn, Register rm) { Usub16(al, rd, rn, rm); }
5193 
Usub8(Condition cond,Register rd,Register rn,Register rm)5194   void Usub8(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, guard);
5202     usub8(cond, rd, rn, rm);
5203   }
Usub8(Register rd,Register rn,Register rm)5204   void Usub8(Register rd, Register rn, Register rm) { Usub8(al, rd, rn, rm); }
5205 
Uxtab(Condition cond,Register rd,Register rn,const Operand & operand)5206   void Uxtab(Condition cond, Register rd, Register rn, const Operand& operand) {
5207     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5208     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5209     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5210     VIXL_ASSERT(allow_macro_instructions_);
5211     VIXL_ASSERT(OutsideITBlock());
5212     MacroEmissionCheckScope guard(this);
5213     ITScope it_scope(this, &cond, guard);
5214     uxtab(cond, rd, rn, operand);
5215   }
Uxtab(Register rd,Register rn,const Operand & operand)5216   void Uxtab(Register rd, Register rn, const Operand& operand) {
5217     Uxtab(al, rd, rn, operand);
5218   }
5219 
Uxtab16(Condition cond,Register rd,Register rn,const Operand & operand)5220   void Uxtab16(Condition cond,
5221                Register rd,
5222                Register rn,
5223                const Operand& operand) {
5224     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5225     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5226     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5227     VIXL_ASSERT(allow_macro_instructions_);
5228     VIXL_ASSERT(OutsideITBlock());
5229     MacroEmissionCheckScope guard(this);
5230     ITScope it_scope(this, &cond, guard);
5231     uxtab16(cond, rd, rn, operand);
5232   }
Uxtab16(Register rd,Register rn,const Operand & operand)5233   void Uxtab16(Register rd, Register rn, const Operand& operand) {
5234     Uxtab16(al, rd, rn, operand);
5235   }
5236 
Uxtah(Condition cond,Register rd,Register rn,const Operand & operand)5237   void Uxtah(Condition cond, Register rd, Register rn, const Operand& operand) {
5238     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5239     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5240     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5241     VIXL_ASSERT(allow_macro_instructions_);
5242     VIXL_ASSERT(OutsideITBlock());
5243     MacroEmissionCheckScope guard(this);
5244     ITScope it_scope(this, &cond, guard);
5245     uxtah(cond, rd, rn, operand);
5246   }
Uxtah(Register rd,Register rn,const Operand & operand)5247   void Uxtah(Register rd, Register rn, const Operand& operand) {
5248     Uxtah(al, rd, rn, operand);
5249   }
5250 
Uxtb(Condition cond,Register rd,const Operand & operand)5251   void Uxtb(Condition cond, Register rd, const Operand& operand) {
5252     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5253     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5254     VIXL_ASSERT(allow_macro_instructions_);
5255     VIXL_ASSERT(OutsideITBlock());
5256     MacroEmissionCheckScope guard(this);
5257     ITScope it_scope(this, &cond, guard);
5258     uxtb(cond, rd, operand);
5259   }
Uxtb(Register rd,const Operand & operand)5260   void Uxtb(Register rd, const Operand& operand) { Uxtb(al, rd, operand); }
5261 
Uxtb16(Condition cond,Register rd,const Operand & operand)5262   void Uxtb16(Condition cond, Register rd, const Operand& operand) {
5263     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5264     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5265     VIXL_ASSERT(allow_macro_instructions_);
5266     VIXL_ASSERT(OutsideITBlock());
5267     MacroEmissionCheckScope guard(this);
5268     ITScope it_scope(this, &cond, guard);
5269     uxtb16(cond, rd, operand);
5270   }
Uxtb16(Register rd,const Operand & operand)5271   void Uxtb16(Register rd, const Operand& operand) { Uxtb16(al, rd, operand); }
5272 
Uxth(Condition cond,Register rd,const Operand & operand)5273   void Uxth(Condition cond, Register rd, const Operand& operand) {
5274     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5275     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5276     VIXL_ASSERT(allow_macro_instructions_);
5277     VIXL_ASSERT(OutsideITBlock());
5278     MacroEmissionCheckScope guard(this);
5279     ITScope it_scope(this, &cond, guard);
5280     uxth(cond, rd, operand);
5281   }
Uxth(Register rd,const Operand & operand)5282   void Uxth(Register rd, const Operand& operand) { Uxth(al, rd, operand); }
5283 
Vaba(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5284   void Vaba(
5285       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5286     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5287     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5288     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5289     VIXL_ASSERT(allow_macro_instructions_);
5290     VIXL_ASSERT(OutsideITBlock());
5291     MacroEmissionCheckScope guard(this);
5292     ITScope it_scope(this, &cond, guard);
5293     vaba(cond, dt, rd, rn, rm);
5294   }
Vaba(DataType dt,DRegister rd,DRegister rn,DRegister rm)5295   void Vaba(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5296     Vaba(al, dt, rd, rn, rm);
5297   }
5298 
Vaba(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5299   void Vaba(
5300       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5301     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5302     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5303     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5304     VIXL_ASSERT(allow_macro_instructions_);
5305     VIXL_ASSERT(OutsideITBlock());
5306     MacroEmissionCheckScope guard(this);
5307     ITScope it_scope(this, &cond, guard);
5308     vaba(cond, dt, rd, rn, rm);
5309   }
Vaba(DataType dt,QRegister rd,QRegister rn,QRegister rm)5310   void Vaba(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5311     Vaba(al, dt, rd, rn, rm);
5312   }
5313 
Vabal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5314   void Vabal(
5315       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5316     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5317     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5318     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5319     VIXL_ASSERT(allow_macro_instructions_);
5320     VIXL_ASSERT(OutsideITBlock());
5321     MacroEmissionCheckScope guard(this);
5322     ITScope it_scope(this, &cond, guard);
5323     vabal(cond, dt, rd, rn, rm);
5324   }
Vabal(DataType dt,QRegister rd,DRegister rn,DRegister rm)5325   void Vabal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5326     Vabal(al, dt, rd, rn, rm);
5327   }
5328 
Vabd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5329   void Vabd(
5330       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5331     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5332     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5333     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5334     VIXL_ASSERT(allow_macro_instructions_);
5335     VIXL_ASSERT(OutsideITBlock());
5336     MacroEmissionCheckScope guard(this);
5337     ITScope it_scope(this, &cond, guard);
5338     vabd(cond, dt, rd, rn, rm);
5339   }
Vabd(DataType dt,DRegister rd,DRegister rn,DRegister rm)5340   void Vabd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5341     Vabd(al, dt, rd, rn, rm);
5342   }
5343 
Vabd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5344   void Vabd(
5345       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5346     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5347     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5348     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5349     VIXL_ASSERT(allow_macro_instructions_);
5350     VIXL_ASSERT(OutsideITBlock());
5351     MacroEmissionCheckScope guard(this);
5352     ITScope it_scope(this, &cond, guard);
5353     vabd(cond, dt, rd, rn, rm);
5354   }
Vabd(DataType dt,QRegister rd,QRegister rn,QRegister rm)5355   void Vabd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5356     Vabd(al, dt, rd, rn, rm);
5357   }
5358 
Vabdl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5359   void Vabdl(
5360       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5361     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5362     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5363     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5364     VIXL_ASSERT(allow_macro_instructions_);
5365     VIXL_ASSERT(OutsideITBlock());
5366     MacroEmissionCheckScope guard(this);
5367     ITScope it_scope(this, &cond, guard);
5368     vabdl(cond, dt, rd, rn, rm);
5369   }
Vabdl(DataType dt,QRegister rd,DRegister rn,DRegister rm)5370   void Vabdl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5371     Vabdl(al, dt, rd, rn, rm);
5372   }
5373 
Vabs(Condition cond,DataType dt,DRegister rd,DRegister rm)5374   void Vabs(Condition cond, DataType dt, DRegister rd, DRegister rm) {
5375     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5376     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5377     VIXL_ASSERT(allow_macro_instructions_);
5378     VIXL_ASSERT(OutsideITBlock());
5379     MacroEmissionCheckScope guard(this);
5380     ITScope it_scope(this, &cond, guard);
5381     vabs(cond, dt, rd, rm);
5382   }
Vabs(DataType dt,DRegister rd,DRegister rm)5383   void Vabs(DataType dt, DRegister rd, DRegister rm) { Vabs(al, dt, rd, rm); }
5384 
Vabs(Condition cond,DataType dt,QRegister rd,QRegister rm)5385   void Vabs(Condition cond, DataType dt, QRegister rd, QRegister rm) {
5386     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5387     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5388     VIXL_ASSERT(allow_macro_instructions_);
5389     VIXL_ASSERT(OutsideITBlock());
5390     MacroEmissionCheckScope guard(this);
5391     ITScope it_scope(this, &cond, guard);
5392     vabs(cond, dt, rd, rm);
5393   }
Vabs(DataType dt,QRegister rd,QRegister rm)5394   void Vabs(DataType dt, QRegister rd, QRegister rm) { Vabs(al, dt, rd, rm); }
5395 
Vabs(Condition cond,DataType dt,SRegister rd,SRegister rm)5396   void Vabs(Condition cond, DataType dt, SRegister rd, SRegister rm) {
5397     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5398     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5399     VIXL_ASSERT(allow_macro_instructions_);
5400     VIXL_ASSERT(OutsideITBlock());
5401     MacroEmissionCheckScope guard(this);
5402     ITScope it_scope(this, &cond, guard);
5403     vabs(cond, dt, rd, rm);
5404   }
Vabs(DataType dt,SRegister rd,SRegister rm)5405   void Vabs(DataType dt, SRegister rd, SRegister rm) { Vabs(al, dt, rd, rm); }
5406 
Vacge(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5407   void Vacge(
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, guard);
5416     vacge(cond, dt, rd, rn, rm);
5417   }
Vacge(DataType dt,DRegister rd,DRegister rn,DRegister rm)5418   void Vacge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5419     Vacge(al, dt, rd, rn, rm);
5420   }
5421 
Vacge(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5422   void Vacge(
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, guard);
5431     vacge(cond, dt, rd, rn, rm);
5432   }
Vacge(DataType dt,QRegister rd,QRegister rn,QRegister rm)5433   void Vacge(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5434     Vacge(al, dt, rd, rn, rm);
5435   }
5436 
Vacgt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5437   void Vacgt(
5438       Condition cond, DataType dt, DRegister 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, guard);
5446     vacgt(cond, dt, rd, rn, rm);
5447   }
Vacgt(DataType dt,DRegister rd,DRegister rn,DRegister rm)5448   void Vacgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5449     Vacgt(al, dt, rd, rn, rm);
5450   }
5451 
Vacgt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5452   void Vacgt(
5453       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5454     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5455     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5456     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5457     VIXL_ASSERT(allow_macro_instructions_);
5458     VIXL_ASSERT(OutsideITBlock());
5459     MacroEmissionCheckScope guard(this);
5460     ITScope it_scope(this, &cond, guard);
5461     vacgt(cond, dt, rd, rn, rm);
5462   }
Vacgt(DataType dt,QRegister rd,QRegister rn,QRegister rm)5463   void Vacgt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5464     Vacgt(al, dt, rd, rn, rm);
5465   }
5466 
Vacle(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5467   void Vacle(
5468       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5469     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5470     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5471     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5472     VIXL_ASSERT(allow_macro_instructions_);
5473     VIXL_ASSERT(OutsideITBlock());
5474     MacroEmissionCheckScope guard(this);
5475     ITScope it_scope(this, &cond, guard);
5476     vacle(cond, dt, rd, rn, rm);
5477   }
Vacle(DataType dt,DRegister rd,DRegister rn,DRegister rm)5478   void Vacle(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5479     Vacle(al, dt, rd, rn, rm);
5480   }
5481 
Vacle(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5482   void Vacle(
5483       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5484     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5485     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5486     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5487     VIXL_ASSERT(allow_macro_instructions_);
5488     VIXL_ASSERT(OutsideITBlock());
5489     MacroEmissionCheckScope guard(this);
5490     ITScope it_scope(this, &cond, guard);
5491     vacle(cond, dt, rd, rn, rm);
5492   }
Vacle(DataType dt,QRegister rd,QRegister rn,QRegister rm)5493   void Vacle(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5494     Vacle(al, dt, rd, rn, rm);
5495   }
5496 
Vaclt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5497   void Vaclt(
5498       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5499     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5500     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5501     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5502     VIXL_ASSERT(allow_macro_instructions_);
5503     VIXL_ASSERT(OutsideITBlock());
5504     MacroEmissionCheckScope guard(this);
5505     ITScope it_scope(this, &cond, guard);
5506     vaclt(cond, dt, rd, rn, rm);
5507   }
Vaclt(DataType dt,DRegister rd,DRegister rn,DRegister rm)5508   void Vaclt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5509     Vaclt(al, dt, rd, rn, rm);
5510   }
5511 
Vaclt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5512   void Vaclt(
5513       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5514     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5515     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5516     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5517     VIXL_ASSERT(allow_macro_instructions_);
5518     VIXL_ASSERT(OutsideITBlock());
5519     MacroEmissionCheckScope guard(this);
5520     ITScope it_scope(this, &cond, guard);
5521     vaclt(cond, dt, rd, rn, rm);
5522   }
Vaclt(DataType dt,QRegister rd,QRegister rn,QRegister rm)5523   void Vaclt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5524     Vaclt(al, dt, rd, rn, rm);
5525   }
5526 
Vadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5527   void Vadd(
5528       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5529     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5530     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5531     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5532     VIXL_ASSERT(allow_macro_instructions_);
5533     VIXL_ASSERT(OutsideITBlock());
5534     MacroEmissionCheckScope guard(this);
5535     ITScope it_scope(this, &cond, guard);
5536     vadd(cond, dt, rd, rn, rm);
5537   }
Vadd(DataType dt,DRegister rd,DRegister rn,DRegister rm)5538   void Vadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5539     Vadd(al, dt, rd, rn, rm);
5540   }
5541 
Vadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5542   void Vadd(
5543       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5544     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5545     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5546     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5547     VIXL_ASSERT(allow_macro_instructions_);
5548     VIXL_ASSERT(OutsideITBlock());
5549     MacroEmissionCheckScope guard(this);
5550     ITScope it_scope(this, &cond, guard);
5551     vadd(cond, dt, rd, rn, rm);
5552   }
Vadd(DataType dt,QRegister rd,QRegister rn,QRegister rm)5553   void Vadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5554     Vadd(al, dt, rd, rn, rm);
5555   }
5556 
Vadd(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)5557   void Vadd(
5558       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5559     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5560     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5561     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5562     VIXL_ASSERT(allow_macro_instructions_);
5563     VIXL_ASSERT(OutsideITBlock());
5564     MacroEmissionCheckScope guard(this);
5565     ITScope it_scope(this, &cond, guard);
5566     vadd(cond, dt, rd, rn, rm);
5567   }
Vadd(DataType dt,SRegister rd,SRegister rn,SRegister rm)5568   void Vadd(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5569     Vadd(al, dt, rd, rn, rm);
5570   }
5571 
Vaddhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)5572   void Vaddhn(
5573       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
5574     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5575     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5576     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5577     VIXL_ASSERT(allow_macro_instructions_);
5578     VIXL_ASSERT(OutsideITBlock());
5579     MacroEmissionCheckScope guard(this);
5580     ITScope it_scope(this, &cond, guard);
5581     vaddhn(cond, dt, rd, rn, rm);
5582   }
Vaddhn(DataType dt,DRegister rd,QRegister rn,QRegister rm)5583   void Vaddhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
5584     Vaddhn(al, dt, rd, rn, rm);
5585   }
5586 
Vaddl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5587   void Vaddl(
5588       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5589     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5590     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5591     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5592     VIXL_ASSERT(allow_macro_instructions_);
5593     VIXL_ASSERT(OutsideITBlock());
5594     MacroEmissionCheckScope guard(this);
5595     ITScope it_scope(this, &cond, guard);
5596     vaddl(cond, dt, rd, rn, rm);
5597   }
Vaddl(DataType dt,QRegister rd,DRegister rn,DRegister rm)5598   void Vaddl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5599     Vaddl(al, dt, rd, rn, rm);
5600   }
5601 
Vaddw(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegister rm)5602   void Vaddw(
5603       Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
5604     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5605     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5606     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5607     VIXL_ASSERT(allow_macro_instructions_);
5608     VIXL_ASSERT(OutsideITBlock());
5609     MacroEmissionCheckScope guard(this);
5610     ITScope it_scope(this, &cond, guard);
5611     vaddw(cond, dt, rd, rn, rm);
5612   }
Vaddw(DataType dt,QRegister rd,QRegister rn,DRegister rm)5613   void Vaddw(DataType dt, QRegister rd, QRegister rn, DRegister rm) {
5614     Vaddw(al, dt, rd, rn, rm);
5615   }
5616 
Vand(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5617   void Vand(Condition cond,
5618             DataType dt,
5619             DRegister rd,
5620             DRegister rn,
5621             const DOperand& operand) {
5622     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5623     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5624     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5625     VIXL_ASSERT(allow_macro_instructions_);
5626     VIXL_ASSERT(OutsideITBlock());
5627     MacroEmissionCheckScope guard(this);
5628     ITScope it_scope(this, &cond, guard);
5629     vand(cond, dt, rd, rn, operand);
5630   }
Vand(DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5631   void Vand(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
5632     Vand(al, dt, rd, rn, operand);
5633   }
5634 
Vand(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5635   void Vand(Condition cond,
5636             DataType dt,
5637             QRegister rd,
5638             QRegister rn,
5639             const QOperand& operand) {
5640     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5641     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5642     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5643     VIXL_ASSERT(allow_macro_instructions_);
5644     VIXL_ASSERT(OutsideITBlock());
5645     MacroEmissionCheckScope guard(this);
5646     ITScope it_scope(this, &cond, guard);
5647     vand(cond, dt, rd, rn, operand);
5648   }
Vand(DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5649   void Vand(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
5650     Vand(al, dt, rd, rn, operand);
5651   }
5652 
Vbic(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5653   void Vbic(Condition cond,
5654             DataType dt,
5655             DRegister rd,
5656             DRegister rn,
5657             const DOperand& operand) {
5658     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5659     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5660     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5661     VIXL_ASSERT(allow_macro_instructions_);
5662     VIXL_ASSERT(OutsideITBlock());
5663     MacroEmissionCheckScope guard(this);
5664     ITScope it_scope(this, &cond, guard);
5665     vbic(cond, dt, rd, rn, operand);
5666   }
Vbic(DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5667   void Vbic(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
5668     Vbic(al, dt, rd, rn, operand);
5669   }
5670 
Vbic(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5671   void Vbic(Condition cond,
5672             DataType dt,
5673             QRegister rd,
5674             QRegister rn,
5675             const QOperand& operand) {
5676     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5677     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5678     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5679     VIXL_ASSERT(allow_macro_instructions_);
5680     VIXL_ASSERT(OutsideITBlock());
5681     MacroEmissionCheckScope guard(this);
5682     ITScope it_scope(this, &cond, guard);
5683     vbic(cond, dt, rd, rn, operand);
5684   }
Vbic(DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5685   void Vbic(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
5686     Vbic(al, dt, rd, rn, operand);
5687   }
5688 
Vbif(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5689   void Vbif(
5690       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5691     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5692     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5693     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5694     VIXL_ASSERT(allow_macro_instructions_);
5695     VIXL_ASSERT(OutsideITBlock());
5696     MacroEmissionCheckScope guard(this);
5697     ITScope it_scope(this, &cond, guard);
5698     vbif(cond, dt, rd, rn, rm);
5699   }
Vbif(DataType dt,DRegister rd,DRegister rn,DRegister rm)5700   void Vbif(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5701     Vbif(al, dt, rd, rn, rm);
5702   }
Vbif(Condition cond,DRegister rd,DRegister rn,DRegister rm)5703   void Vbif(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
5704     Vbif(cond, kDataTypeValueNone, rd, rn, rm);
5705   }
Vbif(DRegister rd,DRegister rn,DRegister rm)5706   void Vbif(DRegister rd, DRegister rn, DRegister rm) {
5707     Vbif(al, kDataTypeValueNone, rd, rn, rm);
5708   }
5709 
Vbif(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5710   void Vbif(
5711       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5712     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5713     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5714     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5715     VIXL_ASSERT(allow_macro_instructions_);
5716     VIXL_ASSERT(OutsideITBlock());
5717     MacroEmissionCheckScope guard(this);
5718     ITScope it_scope(this, &cond, guard);
5719     vbif(cond, dt, rd, rn, rm);
5720   }
Vbif(DataType dt,QRegister rd,QRegister rn,QRegister rm)5721   void Vbif(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5722     Vbif(al, dt, rd, rn, rm);
5723   }
Vbif(Condition cond,QRegister rd,QRegister rn,QRegister rm)5724   void Vbif(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
5725     Vbif(cond, kDataTypeValueNone, rd, rn, rm);
5726   }
Vbif(QRegister rd,QRegister rn,QRegister rm)5727   void Vbif(QRegister rd, QRegister rn, QRegister rm) {
5728     Vbif(al, kDataTypeValueNone, rd, rn, rm);
5729   }
5730 
Vbit(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5731   void Vbit(
5732       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5733     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5734     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5735     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5736     VIXL_ASSERT(allow_macro_instructions_);
5737     VIXL_ASSERT(OutsideITBlock());
5738     MacroEmissionCheckScope guard(this);
5739     ITScope it_scope(this, &cond, guard);
5740     vbit(cond, dt, rd, rn, rm);
5741   }
Vbit(DataType dt,DRegister rd,DRegister rn,DRegister rm)5742   void Vbit(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5743     Vbit(al, dt, rd, rn, rm);
5744   }
Vbit(Condition cond,DRegister rd,DRegister rn,DRegister rm)5745   void Vbit(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
5746     Vbit(cond, kDataTypeValueNone, rd, rn, rm);
5747   }
Vbit(DRegister rd,DRegister rn,DRegister rm)5748   void Vbit(DRegister rd, DRegister rn, DRegister rm) {
5749     Vbit(al, kDataTypeValueNone, rd, rn, rm);
5750   }
5751 
Vbit(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5752   void Vbit(
5753       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5754     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5755     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5756     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5757     VIXL_ASSERT(allow_macro_instructions_);
5758     VIXL_ASSERT(OutsideITBlock());
5759     MacroEmissionCheckScope guard(this);
5760     ITScope it_scope(this, &cond, guard);
5761     vbit(cond, dt, rd, rn, rm);
5762   }
Vbit(DataType dt,QRegister rd,QRegister rn,QRegister rm)5763   void Vbit(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5764     Vbit(al, dt, rd, rn, rm);
5765   }
Vbit(Condition cond,QRegister rd,QRegister rn,QRegister rm)5766   void Vbit(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
5767     Vbit(cond, kDataTypeValueNone, rd, rn, rm);
5768   }
Vbit(QRegister rd,QRegister rn,QRegister rm)5769   void Vbit(QRegister rd, QRegister rn, QRegister rm) {
5770     Vbit(al, kDataTypeValueNone, rd, rn, rm);
5771   }
5772 
Vbsl(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5773   void Vbsl(
5774       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5775     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5776     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5777     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5778     VIXL_ASSERT(allow_macro_instructions_);
5779     VIXL_ASSERT(OutsideITBlock());
5780     MacroEmissionCheckScope guard(this);
5781     ITScope it_scope(this, &cond, guard);
5782     vbsl(cond, dt, rd, rn, rm);
5783   }
Vbsl(DataType dt,DRegister rd,DRegister rn,DRegister rm)5784   void Vbsl(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5785     Vbsl(al, dt, rd, rn, rm);
5786   }
Vbsl(Condition cond,DRegister rd,DRegister rn,DRegister rm)5787   void Vbsl(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
5788     Vbsl(cond, kDataTypeValueNone, rd, rn, rm);
5789   }
Vbsl(DRegister rd,DRegister rn,DRegister rm)5790   void Vbsl(DRegister rd, DRegister rn, DRegister rm) {
5791     Vbsl(al, kDataTypeValueNone, rd, rn, rm);
5792   }
5793 
Vbsl(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5794   void Vbsl(
5795       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5796     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5797     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5798     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5799     VIXL_ASSERT(allow_macro_instructions_);
5800     VIXL_ASSERT(OutsideITBlock());
5801     MacroEmissionCheckScope guard(this);
5802     ITScope it_scope(this, &cond, guard);
5803     vbsl(cond, dt, rd, rn, rm);
5804   }
Vbsl(DataType dt,QRegister rd,QRegister rn,QRegister rm)5805   void Vbsl(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5806     Vbsl(al, dt, rd, rn, rm);
5807   }
Vbsl(Condition cond,QRegister rd,QRegister rn,QRegister rm)5808   void Vbsl(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
5809     Vbsl(cond, kDataTypeValueNone, rd, rn, rm);
5810   }
Vbsl(QRegister rd,QRegister rn,QRegister rm)5811   void Vbsl(QRegister rd, QRegister rn, QRegister rm) {
5812     Vbsl(al, kDataTypeValueNone, rd, rn, rm);
5813   }
5814 
Vceq(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5815   void Vceq(Condition cond,
5816             DataType dt,
5817             DRegister rd,
5818             DRegister rm,
5819             const DOperand& operand) {
5820     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5821     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5822     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5823     VIXL_ASSERT(allow_macro_instructions_);
5824     VIXL_ASSERT(OutsideITBlock());
5825     MacroEmissionCheckScope guard(this);
5826     ITScope it_scope(this, &cond, guard);
5827     vceq(cond, dt, rd, rm, operand);
5828   }
Vceq(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5829   void Vceq(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
5830     Vceq(al, dt, rd, rm, operand);
5831   }
5832 
Vceq(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5833   void Vceq(Condition cond,
5834             DataType dt,
5835             QRegister rd,
5836             QRegister rm,
5837             const QOperand& operand) {
5838     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5839     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5840     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5841     VIXL_ASSERT(allow_macro_instructions_);
5842     VIXL_ASSERT(OutsideITBlock());
5843     MacroEmissionCheckScope guard(this);
5844     ITScope it_scope(this, &cond, guard);
5845     vceq(cond, dt, rd, rm, operand);
5846   }
Vceq(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5847   void Vceq(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
5848     Vceq(al, dt, rd, rm, operand);
5849   }
5850 
Vceq(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5851   void Vceq(
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, guard);
5860     vceq(cond, dt, rd, rn, rm);
5861   }
Vceq(DataType dt,DRegister rd,DRegister rn,DRegister rm)5862   void Vceq(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5863     Vceq(al, dt, rd, rn, rm);
5864   }
5865 
Vceq(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5866   void Vceq(
5867       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5868     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5869     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5870     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5871     VIXL_ASSERT(allow_macro_instructions_);
5872     VIXL_ASSERT(OutsideITBlock());
5873     MacroEmissionCheckScope guard(this);
5874     ITScope it_scope(this, &cond, guard);
5875     vceq(cond, dt, rd, rn, rm);
5876   }
Vceq(DataType dt,QRegister rd,QRegister rn,QRegister rm)5877   void Vceq(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5878     Vceq(al, dt, rd, rn, rm);
5879   }
5880 
Vcge(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5881   void Vcge(Condition cond,
5882             DataType dt,
5883             DRegister rd,
5884             DRegister rm,
5885             const DOperand& operand) {
5886     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5887     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5888     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5889     VIXL_ASSERT(allow_macro_instructions_);
5890     VIXL_ASSERT(OutsideITBlock());
5891     MacroEmissionCheckScope guard(this);
5892     ITScope it_scope(this, &cond, guard);
5893     vcge(cond, dt, rd, rm, operand);
5894   }
Vcge(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5895   void Vcge(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
5896     Vcge(al, dt, rd, rm, operand);
5897   }
5898 
Vcge(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5899   void Vcge(Condition cond,
5900             DataType dt,
5901             QRegister rd,
5902             QRegister rm,
5903             const QOperand& operand) {
5904     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5905     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5906     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5907     VIXL_ASSERT(allow_macro_instructions_);
5908     VIXL_ASSERT(OutsideITBlock());
5909     MacroEmissionCheckScope guard(this);
5910     ITScope it_scope(this, &cond, guard);
5911     vcge(cond, dt, rd, rm, operand);
5912   }
Vcge(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5913   void Vcge(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
5914     Vcge(al, dt, rd, rm, operand);
5915   }
5916 
Vcge(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5917   void Vcge(
5918       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5919     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5920     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5921     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5922     VIXL_ASSERT(allow_macro_instructions_);
5923     VIXL_ASSERT(OutsideITBlock());
5924     MacroEmissionCheckScope guard(this);
5925     ITScope it_scope(this, &cond, guard);
5926     vcge(cond, dt, rd, rn, rm);
5927   }
Vcge(DataType dt,DRegister rd,DRegister rn,DRegister rm)5928   void Vcge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5929     Vcge(al, dt, rd, rn, rm);
5930   }
5931 
Vcge(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5932   void Vcge(
5933       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5934     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5935     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5936     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5937     VIXL_ASSERT(allow_macro_instructions_);
5938     VIXL_ASSERT(OutsideITBlock());
5939     MacroEmissionCheckScope guard(this);
5940     ITScope it_scope(this, &cond, guard);
5941     vcge(cond, dt, rd, rn, rm);
5942   }
Vcge(DataType dt,QRegister rd,QRegister rn,QRegister rm)5943   void Vcge(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5944     Vcge(al, dt, rd, rn, rm);
5945   }
5946 
Vcgt(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5947   void Vcgt(Condition cond,
5948             DataType dt,
5949             DRegister rd,
5950             DRegister rm,
5951             const DOperand& operand) {
5952     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5953     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5954     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5955     VIXL_ASSERT(allow_macro_instructions_);
5956     VIXL_ASSERT(OutsideITBlock());
5957     MacroEmissionCheckScope guard(this);
5958     ITScope it_scope(this, &cond, guard);
5959     vcgt(cond, dt, rd, rm, operand);
5960   }
Vcgt(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5961   void Vcgt(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
5962     Vcgt(al, dt, rd, rm, operand);
5963   }
5964 
Vcgt(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5965   void Vcgt(Condition cond,
5966             DataType dt,
5967             QRegister rd,
5968             QRegister rm,
5969             const QOperand& operand) {
5970     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5971     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5972     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5973     VIXL_ASSERT(allow_macro_instructions_);
5974     VIXL_ASSERT(OutsideITBlock());
5975     MacroEmissionCheckScope guard(this);
5976     ITScope it_scope(this, &cond, guard);
5977     vcgt(cond, dt, rd, rm, operand);
5978   }
Vcgt(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5979   void Vcgt(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
5980     Vcgt(al, dt, rd, rm, operand);
5981   }
5982 
Vcgt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5983   void Vcgt(
5984       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5985     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5986     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5987     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5988     VIXL_ASSERT(allow_macro_instructions_);
5989     VIXL_ASSERT(OutsideITBlock());
5990     MacroEmissionCheckScope guard(this);
5991     ITScope it_scope(this, &cond, guard);
5992     vcgt(cond, dt, rd, rn, rm);
5993   }
Vcgt(DataType dt,DRegister rd,DRegister rn,DRegister rm)5994   void Vcgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5995     Vcgt(al, dt, rd, rn, rm);
5996   }
5997 
Vcgt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5998   void Vcgt(
5999       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6000     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6001     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6002     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6003     VIXL_ASSERT(allow_macro_instructions_);
6004     VIXL_ASSERT(OutsideITBlock());
6005     MacroEmissionCheckScope guard(this);
6006     ITScope it_scope(this, &cond, guard);
6007     vcgt(cond, dt, rd, rn, rm);
6008   }
Vcgt(DataType dt,QRegister rd,QRegister rn,QRegister rm)6009   void Vcgt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6010     Vcgt(al, dt, rd, rn, rm);
6011   }
6012 
Vcle(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6013   void Vcle(Condition cond,
6014             DataType dt,
6015             DRegister rd,
6016             DRegister rm,
6017             const DOperand& operand) {
6018     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6019     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6020     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6021     VIXL_ASSERT(allow_macro_instructions_);
6022     VIXL_ASSERT(OutsideITBlock());
6023     MacroEmissionCheckScope guard(this);
6024     ITScope it_scope(this, &cond, guard);
6025     vcle(cond, dt, rd, rm, operand);
6026   }
Vcle(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6027   void Vcle(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
6028     Vcle(al, dt, rd, rm, operand);
6029   }
6030 
Vcle(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6031   void Vcle(Condition cond,
6032             DataType dt,
6033             QRegister rd,
6034             QRegister rm,
6035             const QOperand& operand) {
6036     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6037     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6038     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6039     VIXL_ASSERT(allow_macro_instructions_);
6040     VIXL_ASSERT(OutsideITBlock());
6041     MacroEmissionCheckScope guard(this);
6042     ITScope it_scope(this, &cond, guard);
6043     vcle(cond, dt, rd, rm, operand);
6044   }
Vcle(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6045   void Vcle(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
6046     Vcle(al, dt, rd, rm, operand);
6047   }
6048 
Vcle(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6049   void Vcle(
6050       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6051     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6052     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6053     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6054     VIXL_ASSERT(allow_macro_instructions_);
6055     VIXL_ASSERT(OutsideITBlock());
6056     MacroEmissionCheckScope guard(this);
6057     ITScope it_scope(this, &cond, guard);
6058     vcle(cond, dt, rd, rn, rm);
6059   }
Vcle(DataType dt,DRegister rd,DRegister rn,DRegister rm)6060   void Vcle(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6061     Vcle(al, dt, rd, rn, rm);
6062   }
6063 
Vcle(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6064   void Vcle(
6065       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6066     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6067     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6068     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6069     VIXL_ASSERT(allow_macro_instructions_);
6070     VIXL_ASSERT(OutsideITBlock());
6071     MacroEmissionCheckScope guard(this);
6072     ITScope it_scope(this, &cond, guard);
6073     vcle(cond, dt, rd, rn, rm);
6074   }
Vcle(DataType dt,QRegister rd,QRegister rn,QRegister rm)6075   void Vcle(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6076     Vcle(al, dt, rd, rn, rm);
6077   }
6078 
Vcls(Condition cond,DataType dt,DRegister rd,DRegister rm)6079   void Vcls(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6080     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6081     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6082     VIXL_ASSERT(allow_macro_instructions_);
6083     VIXL_ASSERT(OutsideITBlock());
6084     MacroEmissionCheckScope guard(this);
6085     ITScope it_scope(this, &cond, guard);
6086     vcls(cond, dt, rd, rm);
6087   }
Vcls(DataType dt,DRegister rd,DRegister rm)6088   void Vcls(DataType dt, DRegister rd, DRegister rm) { Vcls(al, dt, rd, rm); }
6089 
Vcls(Condition cond,DataType dt,QRegister rd,QRegister rm)6090   void Vcls(Condition cond, DataType dt, QRegister rd, QRegister rm) {
6091     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6092     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6093     VIXL_ASSERT(allow_macro_instructions_);
6094     VIXL_ASSERT(OutsideITBlock());
6095     MacroEmissionCheckScope guard(this);
6096     ITScope it_scope(this, &cond, guard);
6097     vcls(cond, dt, rd, rm);
6098   }
Vcls(DataType dt,QRegister rd,QRegister rm)6099   void Vcls(DataType dt, QRegister rd, QRegister rm) { Vcls(al, dt, rd, rm); }
6100 
Vclt(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6101   void Vclt(Condition cond,
6102             DataType dt,
6103             DRegister rd,
6104             DRegister rm,
6105             const DOperand& operand) {
6106     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6107     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6108     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6109     VIXL_ASSERT(allow_macro_instructions_);
6110     VIXL_ASSERT(OutsideITBlock());
6111     MacroEmissionCheckScope guard(this);
6112     ITScope it_scope(this, &cond, guard);
6113     vclt(cond, dt, rd, rm, operand);
6114   }
Vclt(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6115   void Vclt(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
6116     Vclt(al, dt, rd, rm, operand);
6117   }
6118 
Vclt(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6119   void Vclt(Condition cond,
6120             DataType dt,
6121             QRegister rd,
6122             QRegister rm,
6123             const QOperand& operand) {
6124     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6125     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6126     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6127     VIXL_ASSERT(allow_macro_instructions_);
6128     VIXL_ASSERT(OutsideITBlock());
6129     MacroEmissionCheckScope guard(this);
6130     ITScope it_scope(this, &cond, guard);
6131     vclt(cond, dt, rd, rm, operand);
6132   }
Vclt(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6133   void Vclt(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
6134     Vclt(al, dt, rd, rm, operand);
6135   }
6136 
Vclt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6137   void Vclt(
6138       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6139     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6140     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6141     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6142     VIXL_ASSERT(allow_macro_instructions_);
6143     VIXL_ASSERT(OutsideITBlock());
6144     MacroEmissionCheckScope guard(this);
6145     ITScope it_scope(this, &cond, guard);
6146     vclt(cond, dt, rd, rn, rm);
6147   }
Vclt(DataType dt,DRegister rd,DRegister rn,DRegister rm)6148   void Vclt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6149     Vclt(al, dt, rd, rn, rm);
6150   }
6151 
Vclt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6152   void Vclt(
6153       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6154     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6155     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6156     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6157     VIXL_ASSERT(allow_macro_instructions_);
6158     VIXL_ASSERT(OutsideITBlock());
6159     MacroEmissionCheckScope guard(this);
6160     ITScope it_scope(this, &cond, guard);
6161     vclt(cond, dt, rd, rn, rm);
6162   }
Vclt(DataType dt,QRegister rd,QRegister rn,QRegister rm)6163   void Vclt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6164     Vclt(al, dt, rd, rn, rm);
6165   }
6166 
Vclz(Condition cond,DataType dt,DRegister rd,DRegister rm)6167   void Vclz(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6168     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6169     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6170     VIXL_ASSERT(allow_macro_instructions_);
6171     VIXL_ASSERT(OutsideITBlock());
6172     MacroEmissionCheckScope guard(this);
6173     ITScope it_scope(this, &cond, guard);
6174     vclz(cond, dt, rd, rm);
6175   }
Vclz(DataType dt,DRegister rd,DRegister rm)6176   void Vclz(DataType dt, DRegister rd, DRegister rm) { Vclz(al, dt, rd, rm); }
6177 
Vclz(Condition cond,DataType dt,QRegister rd,QRegister rm)6178   void Vclz(Condition cond, DataType dt, QRegister rd, QRegister rm) {
6179     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6180     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6181     VIXL_ASSERT(allow_macro_instructions_);
6182     VIXL_ASSERT(OutsideITBlock());
6183     MacroEmissionCheckScope guard(this);
6184     ITScope it_scope(this, &cond, guard);
6185     vclz(cond, dt, rd, rm);
6186   }
Vclz(DataType dt,QRegister rd,QRegister rm)6187   void Vclz(DataType dt, QRegister rd, QRegister rm) { Vclz(al, dt, rd, rm); }
6188 
Vcmp(Condition cond,DataType dt,SRegister rd,const SOperand & operand)6189   void Vcmp(Condition cond,
6190             DataType dt,
6191             SRegister rd,
6192             const SOperand& operand) {
6193     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6194     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6195     VIXL_ASSERT(allow_macro_instructions_);
6196     VIXL_ASSERT(OutsideITBlock());
6197     MacroEmissionCheckScope guard(this);
6198     ITScope it_scope(this, &cond, guard);
6199     vcmp(cond, dt, rd, operand);
6200   }
Vcmp(DataType dt,SRegister rd,const SOperand & operand)6201   void Vcmp(DataType dt, SRegister rd, const SOperand& operand) {
6202     Vcmp(al, dt, rd, operand);
6203   }
6204 
Vcmp(Condition cond,DataType dt,DRegister rd,const DOperand & operand)6205   void Vcmp(Condition cond,
6206             DataType dt,
6207             DRegister rd,
6208             const DOperand& operand) {
6209     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6210     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6211     VIXL_ASSERT(allow_macro_instructions_);
6212     VIXL_ASSERT(OutsideITBlock());
6213     MacroEmissionCheckScope guard(this);
6214     ITScope it_scope(this, &cond, guard);
6215     vcmp(cond, dt, rd, operand);
6216   }
Vcmp(DataType dt,DRegister rd,const DOperand & operand)6217   void Vcmp(DataType dt, DRegister rd, const DOperand& operand) {
6218     Vcmp(al, dt, rd, operand);
6219   }
6220 
Vcmpe(Condition cond,DataType dt,SRegister rd,const SOperand & operand)6221   void Vcmpe(Condition cond,
6222              DataType dt,
6223              SRegister rd,
6224              const SOperand& operand) {
6225     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6226     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6227     VIXL_ASSERT(allow_macro_instructions_);
6228     VIXL_ASSERT(OutsideITBlock());
6229     MacroEmissionCheckScope guard(this);
6230     ITScope it_scope(this, &cond, guard);
6231     vcmpe(cond, dt, rd, operand);
6232   }
Vcmpe(DataType dt,SRegister rd,const SOperand & operand)6233   void Vcmpe(DataType dt, SRegister rd, const SOperand& operand) {
6234     Vcmpe(al, dt, rd, operand);
6235   }
6236 
Vcmpe(Condition cond,DataType dt,DRegister rd,const DOperand & operand)6237   void Vcmpe(Condition cond,
6238              DataType dt,
6239              DRegister rd,
6240              const DOperand& operand) {
6241     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6242     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6243     VIXL_ASSERT(allow_macro_instructions_);
6244     VIXL_ASSERT(OutsideITBlock());
6245     MacroEmissionCheckScope guard(this);
6246     ITScope it_scope(this, &cond, guard);
6247     vcmpe(cond, dt, rd, operand);
6248   }
Vcmpe(DataType dt,DRegister rd,const DOperand & operand)6249   void Vcmpe(DataType dt, DRegister rd, const DOperand& operand) {
6250     Vcmpe(al, dt, rd, operand);
6251   }
6252 
Vcnt(Condition cond,DataType dt,DRegister rd,DRegister rm)6253   void Vcnt(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6254     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6255     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6256     VIXL_ASSERT(allow_macro_instructions_);
6257     VIXL_ASSERT(OutsideITBlock());
6258     MacroEmissionCheckScope guard(this);
6259     ITScope it_scope(this, &cond, guard);
6260     vcnt(cond, dt, rd, rm);
6261   }
Vcnt(DataType dt,DRegister rd,DRegister rm)6262   void Vcnt(DataType dt, DRegister rd, DRegister rm) { Vcnt(al, dt, rd, rm); }
6263 
Vcnt(Condition cond,DataType dt,QRegister rd,QRegister rm)6264   void Vcnt(Condition cond, DataType dt, QRegister rd, QRegister rm) {
6265     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6266     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6267     VIXL_ASSERT(allow_macro_instructions_);
6268     VIXL_ASSERT(OutsideITBlock());
6269     MacroEmissionCheckScope guard(this);
6270     ITScope it_scope(this, &cond, guard);
6271     vcnt(cond, dt, rd, rm);
6272   }
Vcnt(DataType dt,QRegister rd,QRegister rm)6273   void Vcnt(DataType dt, QRegister rd, QRegister rm) { Vcnt(al, dt, rd, rm); }
6274 
Vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,SRegister rm)6275   void Vcvt(
6276       Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6277     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6278     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6279     VIXL_ASSERT(allow_macro_instructions_);
6280     VIXL_ASSERT(OutsideITBlock());
6281     MacroEmissionCheckScope guard(this);
6282     ITScope it_scope(this, &cond, guard);
6283     vcvt(cond, dt1, dt2, rd, rm);
6284   }
Vcvt(DataType dt1,DataType dt2,DRegister rd,SRegister rm)6285   void Vcvt(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6286     Vcvt(al, dt1, dt2, rd, rm);
6287   }
6288 
Vcvt(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)6289   void Vcvt(
6290       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6291     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6292     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6293     VIXL_ASSERT(allow_macro_instructions_);
6294     VIXL_ASSERT(OutsideITBlock());
6295     MacroEmissionCheckScope guard(this);
6296     ITScope it_scope(this, &cond, guard);
6297     vcvt(cond, dt1, dt2, rd, rm);
6298   }
Vcvt(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6299   void Vcvt(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6300     Vcvt(al, dt1, dt2, rd, rm);
6301   }
6302 
Vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm,int32_t fbits)6303   void Vcvt(Condition cond,
6304             DataType dt1,
6305             DataType dt2,
6306             DRegister rd,
6307             DRegister rm,
6308             int32_t fbits) {
6309     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6310     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6311     VIXL_ASSERT(allow_macro_instructions_);
6312     VIXL_ASSERT(OutsideITBlock());
6313     MacroEmissionCheckScope guard(this);
6314     ITScope it_scope(this, &cond, guard);
6315     vcvt(cond, dt1, dt2, rd, rm, fbits);
6316   }
Vcvt(DataType dt1,DataType dt2,DRegister rd,DRegister rm,int32_t fbits)6317   void Vcvt(
6318       DataType dt1, DataType dt2, DRegister rd, DRegister rm, int32_t fbits) {
6319     Vcvt(al, dt1, dt2, rd, rm, fbits);
6320   }
6321 
Vcvt(Condition cond,DataType dt1,DataType dt2,QRegister rd,QRegister rm,int32_t fbits)6322   void Vcvt(Condition cond,
6323             DataType dt1,
6324             DataType dt2,
6325             QRegister rd,
6326             QRegister rm,
6327             int32_t fbits) {
6328     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6329     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6330     VIXL_ASSERT(allow_macro_instructions_);
6331     VIXL_ASSERT(OutsideITBlock());
6332     MacroEmissionCheckScope guard(this);
6333     ITScope it_scope(this, &cond, guard);
6334     vcvt(cond, dt1, dt2, rd, rm, fbits);
6335   }
Vcvt(DataType dt1,DataType dt2,QRegister rd,QRegister rm,int32_t fbits)6336   void Vcvt(
6337       DataType dt1, DataType dt2, QRegister rd, QRegister rm, int32_t fbits) {
6338     Vcvt(al, dt1, dt2, rd, rm, fbits);
6339   }
6340 
Vcvt(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm,int32_t fbits)6341   void Vcvt(Condition cond,
6342             DataType dt1,
6343             DataType dt2,
6344             SRegister rd,
6345             SRegister rm,
6346             int32_t fbits) {
6347     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6348     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6349     VIXL_ASSERT(allow_macro_instructions_);
6350     VIXL_ASSERT(OutsideITBlock());
6351     MacroEmissionCheckScope guard(this);
6352     ITScope it_scope(this, &cond, guard);
6353     vcvt(cond, dt1, dt2, rd, rm, fbits);
6354   }
Vcvt(DataType dt1,DataType dt2,SRegister rd,SRegister rm,int32_t fbits)6355   void Vcvt(
6356       DataType dt1, DataType dt2, SRegister rd, SRegister rm, int32_t fbits) {
6357     Vcvt(al, dt1, dt2, rd, rm, fbits);
6358   }
6359 
Vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)6360   void Vcvt(
6361       Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6362     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6363     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6364     VIXL_ASSERT(allow_macro_instructions_);
6365     VIXL_ASSERT(OutsideITBlock());
6366     MacroEmissionCheckScope guard(this);
6367     ITScope it_scope(this, &cond, guard);
6368     vcvt(cond, dt1, dt2, rd, rm);
6369   }
Vcvt(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6370   void Vcvt(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6371     Vcvt(al, dt1, dt2, rd, rm);
6372   }
6373 
Vcvt(Condition cond,DataType dt1,DataType dt2,QRegister rd,QRegister rm)6374   void Vcvt(
6375       Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6376     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6377     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6378     VIXL_ASSERT(allow_macro_instructions_);
6379     VIXL_ASSERT(OutsideITBlock());
6380     MacroEmissionCheckScope guard(this);
6381     ITScope it_scope(this, &cond, guard);
6382     vcvt(cond, dt1, dt2, rd, rm);
6383   }
Vcvt(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6384   void Vcvt(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6385     Vcvt(al, dt1, dt2, rd, rm);
6386   }
6387 
Vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,QRegister rm)6388   void Vcvt(
6389       Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
6390     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6391     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6392     VIXL_ASSERT(allow_macro_instructions_);
6393     VIXL_ASSERT(OutsideITBlock());
6394     MacroEmissionCheckScope guard(this);
6395     ITScope it_scope(this, &cond, guard);
6396     vcvt(cond, dt1, dt2, rd, rm);
6397   }
Vcvt(DataType dt1,DataType dt2,DRegister rd,QRegister rm)6398   void Vcvt(DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
6399     Vcvt(al, dt1, dt2, rd, rm);
6400   }
6401 
Vcvt(Condition cond,DataType dt1,DataType dt2,QRegister rd,DRegister rm)6402   void Vcvt(
6403       Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
6404     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6405     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6406     VIXL_ASSERT(allow_macro_instructions_);
6407     VIXL_ASSERT(OutsideITBlock());
6408     MacroEmissionCheckScope guard(this);
6409     ITScope it_scope(this, &cond, guard);
6410     vcvt(cond, dt1, dt2, rd, rm);
6411   }
Vcvt(DataType dt1,DataType dt2,QRegister rd,DRegister rm)6412   void Vcvt(DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
6413     Vcvt(al, dt1, dt2, rd, rm);
6414   }
6415 
Vcvt(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6416   void Vcvt(
6417       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6418     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6419     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6420     VIXL_ASSERT(allow_macro_instructions_);
6421     VIXL_ASSERT(OutsideITBlock());
6422     MacroEmissionCheckScope guard(this);
6423     ITScope it_scope(this, &cond, guard);
6424     vcvt(cond, dt1, dt2, rd, rm);
6425   }
Vcvt(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6426   void Vcvt(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6427     Vcvt(al, dt1, dt2, rd, rm);
6428   }
6429 
Vcvta(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6430   void Vcvta(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6431     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6432     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6433     VIXL_ASSERT(allow_macro_instructions_);
6434     VIXL_ASSERT(OutsideITBlock());
6435     MacroEmissionCheckScope guard(this);
6436     vcvta(dt1, dt2, rd, rm);
6437   }
6438 
Vcvta(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6439   void Vcvta(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6440     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6441     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6442     VIXL_ASSERT(allow_macro_instructions_);
6443     VIXL_ASSERT(OutsideITBlock());
6444     MacroEmissionCheckScope guard(this);
6445     vcvta(dt1, dt2, rd, rm);
6446   }
6447 
Vcvta(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6448   void Vcvta(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6449     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6450     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6451     VIXL_ASSERT(allow_macro_instructions_);
6452     VIXL_ASSERT(OutsideITBlock());
6453     MacroEmissionCheckScope guard(this);
6454     vcvta(dt1, dt2, rd, rm);
6455   }
6456 
Vcvta(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6457   void Vcvta(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6458     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6459     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6460     VIXL_ASSERT(allow_macro_instructions_);
6461     VIXL_ASSERT(OutsideITBlock());
6462     MacroEmissionCheckScope guard(this);
6463     vcvta(dt1, dt2, rd, rm);
6464   }
6465 
Vcvtb(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6466   void Vcvtb(
6467       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6468     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6469     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6470     VIXL_ASSERT(allow_macro_instructions_);
6471     VIXL_ASSERT(OutsideITBlock());
6472     MacroEmissionCheckScope guard(this);
6473     ITScope it_scope(this, &cond, guard);
6474     vcvtb(cond, dt1, dt2, rd, rm);
6475   }
Vcvtb(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6476   void Vcvtb(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6477     Vcvtb(al, dt1, dt2, rd, rm);
6478   }
6479 
Vcvtb(Condition cond,DataType dt1,DataType dt2,DRegister rd,SRegister rm)6480   void Vcvtb(
6481       Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6482     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6483     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6484     VIXL_ASSERT(allow_macro_instructions_);
6485     VIXL_ASSERT(OutsideITBlock());
6486     MacroEmissionCheckScope guard(this);
6487     ITScope it_scope(this, &cond, guard);
6488     vcvtb(cond, dt1, dt2, rd, rm);
6489   }
Vcvtb(DataType dt1,DataType dt2,DRegister rd,SRegister rm)6490   void Vcvtb(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6491     Vcvtb(al, dt1, dt2, rd, rm);
6492   }
6493 
Vcvtb(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)6494   void Vcvtb(
6495       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6496     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6497     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6498     VIXL_ASSERT(allow_macro_instructions_);
6499     VIXL_ASSERT(OutsideITBlock());
6500     MacroEmissionCheckScope guard(this);
6501     ITScope it_scope(this, &cond, guard);
6502     vcvtb(cond, dt1, dt2, rd, rm);
6503   }
Vcvtb(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6504   void Vcvtb(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6505     Vcvtb(al, dt1, dt2, rd, rm);
6506   }
6507 
Vcvtm(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6508   void Vcvtm(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6509     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6510     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6511     VIXL_ASSERT(allow_macro_instructions_);
6512     VIXL_ASSERT(OutsideITBlock());
6513     MacroEmissionCheckScope guard(this);
6514     vcvtm(dt1, dt2, rd, rm);
6515   }
6516 
Vcvtm(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6517   void Vcvtm(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6518     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6519     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6520     VIXL_ASSERT(allow_macro_instructions_);
6521     VIXL_ASSERT(OutsideITBlock());
6522     MacroEmissionCheckScope guard(this);
6523     vcvtm(dt1, dt2, rd, rm);
6524   }
6525 
Vcvtm(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6526   void Vcvtm(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6527     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6528     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6529     VIXL_ASSERT(allow_macro_instructions_);
6530     VIXL_ASSERT(OutsideITBlock());
6531     MacroEmissionCheckScope guard(this);
6532     vcvtm(dt1, dt2, rd, rm);
6533   }
6534 
Vcvtm(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6535   void Vcvtm(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6536     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6537     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6538     VIXL_ASSERT(allow_macro_instructions_);
6539     VIXL_ASSERT(OutsideITBlock());
6540     MacroEmissionCheckScope guard(this);
6541     vcvtm(dt1, dt2, rd, rm);
6542   }
6543 
Vcvtn(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6544   void Vcvtn(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6545     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6546     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6547     VIXL_ASSERT(allow_macro_instructions_);
6548     VIXL_ASSERT(OutsideITBlock());
6549     MacroEmissionCheckScope guard(this);
6550     vcvtn(dt1, dt2, rd, rm);
6551   }
6552 
Vcvtn(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6553   void Vcvtn(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6554     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6555     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6556     VIXL_ASSERT(allow_macro_instructions_);
6557     VIXL_ASSERT(OutsideITBlock());
6558     MacroEmissionCheckScope guard(this);
6559     vcvtn(dt1, dt2, rd, rm);
6560   }
6561 
Vcvtn(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6562   void Vcvtn(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6563     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6564     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6565     VIXL_ASSERT(allow_macro_instructions_);
6566     VIXL_ASSERT(OutsideITBlock());
6567     MacroEmissionCheckScope guard(this);
6568     vcvtn(dt1, dt2, rd, rm);
6569   }
6570 
Vcvtn(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6571   void Vcvtn(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6572     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6573     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6574     VIXL_ASSERT(allow_macro_instructions_);
6575     VIXL_ASSERT(OutsideITBlock());
6576     MacroEmissionCheckScope guard(this);
6577     vcvtn(dt1, dt2, rd, rm);
6578   }
6579 
Vcvtp(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6580   void Vcvtp(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6581     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6582     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6583     VIXL_ASSERT(allow_macro_instructions_);
6584     VIXL_ASSERT(OutsideITBlock());
6585     MacroEmissionCheckScope guard(this);
6586     vcvtp(dt1, dt2, rd, rm);
6587   }
6588 
Vcvtp(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6589   void Vcvtp(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6590     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6591     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6592     VIXL_ASSERT(allow_macro_instructions_);
6593     VIXL_ASSERT(OutsideITBlock());
6594     MacroEmissionCheckScope guard(this);
6595     vcvtp(dt1, dt2, rd, rm);
6596   }
6597 
Vcvtp(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6598   void Vcvtp(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6599     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6600     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6601     VIXL_ASSERT(allow_macro_instructions_);
6602     VIXL_ASSERT(OutsideITBlock());
6603     MacroEmissionCheckScope guard(this);
6604     vcvtp(dt1, dt2, rd, rm);
6605   }
6606 
Vcvtp(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6607   void Vcvtp(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6608     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6609     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6610     VIXL_ASSERT(allow_macro_instructions_);
6611     VIXL_ASSERT(OutsideITBlock());
6612     MacroEmissionCheckScope guard(this);
6613     vcvtp(dt1, dt2, rd, rm);
6614   }
6615 
Vcvtr(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6616   void Vcvtr(
6617       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6618     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6619     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6620     VIXL_ASSERT(allow_macro_instructions_);
6621     VIXL_ASSERT(OutsideITBlock());
6622     MacroEmissionCheckScope guard(this);
6623     ITScope it_scope(this, &cond, guard);
6624     vcvtr(cond, dt1, dt2, rd, rm);
6625   }
Vcvtr(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6626   void Vcvtr(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6627     Vcvtr(al, dt1, dt2, rd, rm);
6628   }
6629 
Vcvtr(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)6630   void Vcvtr(
6631       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6632     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6633     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6634     VIXL_ASSERT(allow_macro_instructions_);
6635     VIXL_ASSERT(OutsideITBlock());
6636     MacroEmissionCheckScope guard(this);
6637     ITScope it_scope(this, &cond, guard);
6638     vcvtr(cond, dt1, dt2, rd, rm);
6639   }
Vcvtr(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6640   void Vcvtr(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6641     Vcvtr(al, dt1, dt2, rd, rm);
6642   }
6643 
Vcvtt(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6644   void Vcvtt(
6645       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6646     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6647     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6648     VIXL_ASSERT(allow_macro_instructions_);
6649     VIXL_ASSERT(OutsideITBlock());
6650     MacroEmissionCheckScope guard(this);
6651     ITScope it_scope(this, &cond, guard);
6652     vcvtt(cond, dt1, dt2, rd, rm);
6653   }
Vcvtt(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6654   void Vcvtt(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6655     Vcvtt(al, dt1, dt2, rd, rm);
6656   }
6657 
Vcvtt(Condition cond,DataType dt1,DataType dt2,DRegister rd,SRegister rm)6658   void Vcvtt(
6659       Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6660     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6661     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6662     VIXL_ASSERT(allow_macro_instructions_);
6663     VIXL_ASSERT(OutsideITBlock());
6664     MacroEmissionCheckScope guard(this);
6665     ITScope it_scope(this, &cond, guard);
6666     vcvtt(cond, dt1, dt2, rd, rm);
6667   }
Vcvtt(DataType dt1,DataType dt2,DRegister rd,SRegister rm)6668   void Vcvtt(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6669     Vcvtt(al, dt1, dt2, rd, rm);
6670   }
6671 
Vcvtt(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)6672   void Vcvtt(
6673       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6674     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6675     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6676     VIXL_ASSERT(allow_macro_instructions_);
6677     VIXL_ASSERT(OutsideITBlock());
6678     MacroEmissionCheckScope guard(this);
6679     ITScope it_scope(this, &cond, guard);
6680     vcvtt(cond, dt1, dt2, rd, rm);
6681   }
Vcvtt(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6682   void Vcvtt(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6683     Vcvtt(al, dt1, dt2, rd, rm);
6684   }
6685 
Vdiv(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6686   void Vdiv(
6687       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6688     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6689     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6690     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6691     VIXL_ASSERT(allow_macro_instructions_);
6692     VIXL_ASSERT(OutsideITBlock());
6693     MacroEmissionCheckScope guard(this);
6694     ITScope it_scope(this, &cond, guard);
6695     vdiv(cond, dt, rd, rn, rm);
6696   }
Vdiv(DataType dt,SRegister rd,SRegister rn,SRegister rm)6697   void Vdiv(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6698     Vdiv(al, dt, rd, rn, rm);
6699   }
6700 
Vdiv(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6701   void Vdiv(
6702       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6703     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6704     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6705     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6706     VIXL_ASSERT(allow_macro_instructions_);
6707     VIXL_ASSERT(OutsideITBlock());
6708     MacroEmissionCheckScope guard(this);
6709     ITScope it_scope(this, &cond, guard);
6710     vdiv(cond, dt, rd, rn, rm);
6711   }
Vdiv(DataType dt,DRegister rd,DRegister rn,DRegister rm)6712   void Vdiv(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6713     Vdiv(al, dt, rd, rn, rm);
6714   }
6715 
Vdup(Condition cond,DataType dt,QRegister rd,Register rt)6716   void Vdup(Condition cond, DataType dt, QRegister rd, Register rt) {
6717     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6718     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
6719     VIXL_ASSERT(allow_macro_instructions_);
6720     VIXL_ASSERT(OutsideITBlock());
6721     MacroEmissionCheckScope guard(this);
6722     ITScope it_scope(this, &cond, guard);
6723     vdup(cond, dt, rd, rt);
6724   }
Vdup(DataType dt,QRegister rd,Register rt)6725   void Vdup(DataType dt, QRegister rd, Register rt) { Vdup(al, dt, rd, rt); }
6726 
Vdup(Condition cond,DataType dt,DRegister rd,Register rt)6727   void Vdup(Condition cond, DataType dt, DRegister rd, Register rt) {
6728     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6729     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
6730     VIXL_ASSERT(allow_macro_instructions_);
6731     VIXL_ASSERT(OutsideITBlock());
6732     MacroEmissionCheckScope guard(this);
6733     ITScope it_scope(this, &cond, guard);
6734     vdup(cond, dt, rd, rt);
6735   }
Vdup(DataType dt,DRegister rd,Register rt)6736   void Vdup(DataType dt, DRegister rd, Register rt) { Vdup(al, dt, rd, rt); }
6737 
Vdup(Condition cond,DataType dt,DRegister rd,DRegisterLane rm)6738   void Vdup(Condition cond, DataType dt, DRegister rd, DRegisterLane rm) {
6739     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6740     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6741     VIXL_ASSERT(allow_macro_instructions_);
6742     VIXL_ASSERT(OutsideITBlock());
6743     MacroEmissionCheckScope guard(this);
6744     ITScope it_scope(this, &cond, guard);
6745     vdup(cond, dt, rd, rm);
6746   }
Vdup(DataType dt,DRegister rd,DRegisterLane rm)6747   void Vdup(DataType dt, DRegister rd, DRegisterLane rm) {
6748     Vdup(al, dt, rd, rm);
6749   }
6750 
Vdup(Condition cond,DataType dt,QRegister rd,DRegisterLane rm)6751   void Vdup(Condition cond, DataType dt, QRegister rd, DRegisterLane rm) {
6752     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6753     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6754     VIXL_ASSERT(allow_macro_instructions_);
6755     VIXL_ASSERT(OutsideITBlock());
6756     MacroEmissionCheckScope guard(this);
6757     ITScope it_scope(this, &cond, guard);
6758     vdup(cond, dt, rd, rm);
6759   }
Vdup(DataType dt,QRegister rd,DRegisterLane rm)6760   void Vdup(DataType dt, QRegister rd, DRegisterLane rm) {
6761     Vdup(al, dt, rd, rm);
6762   }
6763 
Veor(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6764   void Veor(
6765       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6766     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6767     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6768     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6769     VIXL_ASSERT(allow_macro_instructions_);
6770     VIXL_ASSERT(OutsideITBlock());
6771     MacroEmissionCheckScope guard(this);
6772     ITScope it_scope(this, &cond, guard);
6773     veor(cond, dt, rd, rn, rm);
6774   }
Veor(DataType dt,DRegister rd,DRegister rn,DRegister rm)6775   void Veor(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6776     Veor(al, dt, rd, rn, rm);
6777   }
Veor(Condition cond,DRegister rd,DRegister rn,DRegister rm)6778   void Veor(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
6779     Veor(cond, kDataTypeValueNone, rd, rn, rm);
6780   }
Veor(DRegister rd,DRegister rn,DRegister rm)6781   void Veor(DRegister rd, DRegister rn, DRegister rm) {
6782     Veor(al, kDataTypeValueNone, rd, rn, rm);
6783   }
6784 
Veor(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6785   void Veor(
6786       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6787     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6788     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6789     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6790     VIXL_ASSERT(allow_macro_instructions_);
6791     VIXL_ASSERT(OutsideITBlock());
6792     MacroEmissionCheckScope guard(this);
6793     ITScope it_scope(this, &cond, guard);
6794     veor(cond, dt, rd, rn, rm);
6795   }
Veor(DataType dt,QRegister rd,QRegister rn,QRegister rm)6796   void Veor(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6797     Veor(al, dt, rd, rn, rm);
6798   }
Veor(Condition cond,QRegister rd,QRegister rn,QRegister rm)6799   void Veor(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
6800     Veor(cond, kDataTypeValueNone, rd, rn, rm);
6801   }
Veor(QRegister rd,QRegister rn,QRegister rm)6802   void Veor(QRegister rd, QRegister rn, QRegister rm) {
6803     Veor(al, kDataTypeValueNone, rd, rn, rm);
6804   }
6805 
Vext(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm,const DOperand & operand)6806   void Vext(Condition cond,
6807             DataType dt,
6808             DRegister rd,
6809             DRegister rn,
6810             DRegister rm,
6811             const DOperand& operand) {
6812     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6813     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6814     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6815     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6816     VIXL_ASSERT(allow_macro_instructions_);
6817     VIXL_ASSERT(OutsideITBlock());
6818     MacroEmissionCheckScope guard(this);
6819     ITScope it_scope(this, &cond, guard);
6820     vext(cond, dt, rd, rn, rm, operand);
6821   }
Vext(DataType dt,DRegister rd,DRegister rn,DRegister rm,const DOperand & operand)6822   void Vext(DataType dt,
6823             DRegister rd,
6824             DRegister rn,
6825             DRegister rm,
6826             const DOperand& operand) {
6827     Vext(al, dt, rd, rn, rm, operand);
6828   }
6829 
Vext(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm,const QOperand & operand)6830   void Vext(Condition cond,
6831             DataType dt,
6832             QRegister rd,
6833             QRegister rn,
6834             QRegister rm,
6835             const QOperand& operand) {
6836     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6837     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6838     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6839     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6840     VIXL_ASSERT(allow_macro_instructions_);
6841     VIXL_ASSERT(OutsideITBlock());
6842     MacroEmissionCheckScope guard(this);
6843     ITScope it_scope(this, &cond, guard);
6844     vext(cond, dt, rd, rn, rm, operand);
6845   }
Vext(DataType dt,QRegister rd,QRegister rn,QRegister rm,const QOperand & operand)6846   void Vext(DataType dt,
6847             QRegister rd,
6848             QRegister rn,
6849             QRegister rm,
6850             const QOperand& operand) {
6851     Vext(al, dt, rd, rn, rm, operand);
6852   }
6853 
Vfma(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6854   void Vfma(
6855       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6856     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6857     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6858     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6859     VIXL_ASSERT(allow_macro_instructions_);
6860     VIXL_ASSERT(OutsideITBlock());
6861     MacroEmissionCheckScope guard(this);
6862     ITScope it_scope(this, &cond, guard);
6863     vfma(cond, dt, rd, rn, rm);
6864   }
Vfma(DataType dt,DRegister rd,DRegister rn,DRegister rm)6865   void Vfma(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6866     Vfma(al, dt, rd, rn, rm);
6867   }
6868 
Vfma(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6869   void Vfma(
6870       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6871     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6872     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6873     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6874     VIXL_ASSERT(allow_macro_instructions_);
6875     VIXL_ASSERT(OutsideITBlock());
6876     MacroEmissionCheckScope guard(this);
6877     ITScope it_scope(this, &cond, guard);
6878     vfma(cond, dt, rd, rn, rm);
6879   }
Vfma(DataType dt,QRegister rd,QRegister rn,QRegister rm)6880   void Vfma(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6881     Vfma(al, dt, rd, rn, rm);
6882   }
6883 
Vfma(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6884   void Vfma(
6885       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6886     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6887     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6888     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6889     VIXL_ASSERT(allow_macro_instructions_);
6890     VIXL_ASSERT(OutsideITBlock());
6891     MacroEmissionCheckScope guard(this);
6892     ITScope it_scope(this, &cond, guard);
6893     vfma(cond, dt, rd, rn, rm);
6894   }
Vfma(DataType dt,SRegister rd,SRegister rn,SRegister rm)6895   void Vfma(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6896     Vfma(al, dt, rd, rn, rm);
6897   }
6898 
Vfms(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6899   void Vfms(
6900       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6901     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6902     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6903     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6904     VIXL_ASSERT(allow_macro_instructions_);
6905     VIXL_ASSERT(OutsideITBlock());
6906     MacroEmissionCheckScope guard(this);
6907     ITScope it_scope(this, &cond, guard);
6908     vfms(cond, dt, rd, rn, rm);
6909   }
Vfms(DataType dt,DRegister rd,DRegister rn,DRegister rm)6910   void Vfms(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6911     Vfms(al, dt, rd, rn, rm);
6912   }
6913 
Vfms(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6914   void Vfms(
6915       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6916     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6917     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6918     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6919     VIXL_ASSERT(allow_macro_instructions_);
6920     VIXL_ASSERT(OutsideITBlock());
6921     MacroEmissionCheckScope guard(this);
6922     ITScope it_scope(this, &cond, guard);
6923     vfms(cond, dt, rd, rn, rm);
6924   }
Vfms(DataType dt,QRegister rd,QRegister rn,QRegister rm)6925   void Vfms(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6926     Vfms(al, dt, rd, rn, rm);
6927   }
6928 
Vfms(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6929   void Vfms(
6930       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6931     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6932     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6933     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6934     VIXL_ASSERT(allow_macro_instructions_);
6935     VIXL_ASSERT(OutsideITBlock());
6936     MacroEmissionCheckScope guard(this);
6937     ITScope it_scope(this, &cond, guard);
6938     vfms(cond, dt, rd, rn, rm);
6939   }
Vfms(DataType dt,SRegister rd,SRegister rn,SRegister rm)6940   void Vfms(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6941     Vfms(al, dt, rd, rn, rm);
6942   }
6943 
Vfnma(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6944   void Vfnma(
6945       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6946     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6947     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6948     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6949     VIXL_ASSERT(allow_macro_instructions_);
6950     VIXL_ASSERT(OutsideITBlock());
6951     MacroEmissionCheckScope guard(this);
6952     ITScope it_scope(this, &cond, guard);
6953     vfnma(cond, dt, rd, rn, rm);
6954   }
Vfnma(DataType dt,SRegister rd,SRegister rn,SRegister rm)6955   void Vfnma(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6956     Vfnma(al, dt, rd, rn, rm);
6957   }
6958 
Vfnma(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6959   void Vfnma(
6960       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6961     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6962     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6963     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6964     VIXL_ASSERT(allow_macro_instructions_);
6965     VIXL_ASSERT(OutsideITBlock());
6966     MacroEmissionCheckScope guard(this);
6967     ITScope it_scope(this, &cond, guard);
6968     vfnma(cond, dt, rd, rn, rm);
6969   }
Vfnma(DataType dt,DRegister rd,DRegister rn,DRegister rm)6970   void Vfnma(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6971     Vfnma(al, dt, rd, rn, rm);
6972   }
6973 
Vfnms(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6974   void Vfnms(
6975       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6976     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6977     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6978     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6979     VIXL_ASSERT(allow_macro_instructions_);
6980     VIXL_ASSERT(OutsideITBlock());
6981     MacroEmissionCheckScope guard(this);
6982     ITScope it_scope(this, &cond, guard);
6983     vfnms(cond, dt, rd, rn, rm);
6984   }
Vfnms(DataType dt,SRegister rd,SRegister rn,SRegister rm)6985   void Vfnms(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6986     Vfnms(al, dt, rd, rn, rm);
6987   }
6988 
Vfnms(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6989   void Vfnms(
6990       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6991     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6992     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6993     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6994     VIXL_ASSERT(allow_macro_instructions_);
6995     VIXL_ASSERT(OutsideITBlock());
6996     MacroEmissionCheckScope guard(this);
6997     ITScope it_scope(this, &cond, guard);
6998     vfnms(cond, dt, rd, rn, rm);
6999   }
Vfnms(DataType dt,DRegister rd,DRegister rn,DRegister rm)7000   void Vfnms(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7001     Vfnms(al, dt, rd, rn, rm);
7002   }
7003 
Vhadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7004   void Vhadd(
7005       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7006     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7007     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7008     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7009     VIXL_ASSERT(allow_macro_instructions_);
7010     VIXL_ASSERT(OutsideITBlock());
7011     MacroEmissionCheckScope guard(this);
7012     ITScope it_scope(this, &cond, guard);
7013     vhadd(cond, dt, rd, rn, rm);
7014   }
Vhadd(DataType dt,DRegister rd,DRegister rn,DRegister rm)7015   void Vhadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7016     Vhadd(al, dt, rd, rn, rm);
7017   }
7018 
Vhadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7019   void Vhadd(
7020       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7021     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7022     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7023     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7024     VIXL_ASSERT(allow_macro_instructions_);
7025     VIXL_ASSERT(OutsideITBlock());
7026     MacroEmissionCheckScope guard(this);
7027     ITScope it_scope(this, &cond, guard);
7028     vhadd(cond, dt, rd, rn, rm);
7029   }
Vhadd(DataType dt,QRegister rd,QRegister rn,QRegister rm)7030   void Vhadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7031     Vhadd(al, dt, rd, rn, rm);
7032   }
7033 
Vhsub(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7034   void Vhsub(
7035       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7036     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7037     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7038     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7039     VIXL_ASSERT(allow_macro_instructions_);
7040     VIXL_ASSERT(OutsideITBlock());
7041     MacroEmissionCheckScope guard(this);
7042     ITScope it_scope(this, &cond, guard);
7043     vhsub(cond, dt, rd, rn, rm);
7044   }
Vhsub(DataType dt,DRegister rd,DRegister rn,DRegister rm)7045   void Vhsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7046     Vhsub(al, dt, rd, rn, rm);
7047   }
7048 
Vhsub(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7049   void Vhsub(
7050       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7051     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7052     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7053     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7054     VIXL_ASSERT(allow_macro_instructions_);
7055     VIXL_ASSERT(OutsideITBlock());
7056     MacroEmissionCheckScope guard(this);
7057     ITScope it_scope(this, &cond, guard);
7058     vhsub(cond, dt, rd, rn, rm);
7059   }
Vhsub(DataType dt,QRegister rd,QRegister rn,QRegister rm)7060   void Vhsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7061     Vhsub(al, dt, rd, rn, rm);
7062   }
7063 
Vld1(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7064   void Vld1(Condition cond,
7065             DataType dt,
7066             const NeonRegisterList& nreglist,
7067             const AlignedMemOperand& operand) {
7068     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7069     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7070     VIXL_ASSERT(allow_macro_instructions_);
7071     VIXL_ASSERT(OutsideITBlock());
7072     MacroEmissionCheckScope guard(this);
7073     ITScope it_scope(this, &cond, guard);
7074     vld1(cond, dt, nreglist, operand);
7075   }
Vld1(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7076   void Vld1(DataType dt,
7077             const NeonRegisterList& nreglist,
7078             const AlignedMemOperand& operand) {
7079     Vld1(al, dt, nreglist, operand);
7080   }
7081 
Vld2(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7082   void Vld2(Condition cond,
7083             DataType dt,
7084             const NeonRegisterList& nreglist,
7085             const AlignedMemOperand& operand) {
7086     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7087     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7088     VIXL_ASSERT(allow_macro_instructions_);
7089     VIXL_ASSERT(OutsideITBlock());
7090     MacroEmissionCheckScope guard(this);
7091     ITScope it_scope(this, &cond, guard);
7092     vld2(cond, dt, nreglist, operand);
7093   }
Vld2(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7094   void Vld2(DataType dt,
7095             const NeonRegisterList& nreglist,
7096             const AlignedMemOperand& operand) {
7097     Vld2(al, dt, nreglist, operand);
7098   }
7099 
Vld3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7100   void Vld3(Condition cond,
7101             DataType dt,
7102             const NeonRegisterList& nreglist,
7103             const AlignedMemOperand& operand) {
7104     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7105     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7106     VIXL_ASSERT(allow_macro_instructions_);
7107     VIXL_ASSERT(OutsideITBlock());
7108     MacroEmissionCheckScope guard(this);
7109     ITScope it_scope(this, &cond, guard);
7110     vld3(cond, dt, nreglist, operand);
7111   }
Vld3(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7112   void Vld3(DataType dt,
7113             const NeonRegisterList& nreglist,
7114             const AlignedMemOperand& operand) {
7115     Vld3(al, dt, nreglist, operand);
7116   }
7117 
Vld3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)7118   void Vld3(Condition cond,
7119             DataType dt,
7120             const NeonRegisterList& nreglist,
7121             const MemOperand& operand) {
7122     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7123     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7124     VIXL_ASSERT(allow_macro_instructions_);
7125     VIXL_ASSERT(OutsideITBlock());
7126     MacroEmissionCheckScope guard(this);
7127     ITScope it_scope(this, &cond, guard);
7128     vld3(cond, dt, nreglist, operand);
7129   }
Vld3(DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)7130   void Vld3(DataType dt,
7131             const NeonRegisterList& nreglist,
7132             const MemOperand& operand) {
7133     Vld3(al, dt, nreglist, operand);
7134   }
7135 
Vld4(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7136   void Vld4(Condition cond,
7137             DataType dt,
7138             const NeonRegisterList& nreglist,
7139             const AlignedMemOperand& operand) {
7140     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7141     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7142     VIXL_ASSERT(allow_macro_instructions_);
7143     VIXL_ASSERT(OutsideITBlock());
7144     MacroEmissionCheckScope guard(this);
7145     ITScope it_scope(this, &cond, guard);
7146     vld4(cond, dt, nreglist, operand);
7147   }
Vld4(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7148   void Vld4(DataType dt,
7149             const NeonRegisterList& nreglist,
7150             const AlignedMemOperand& operand) {
7151     Vld4(al, dt, nreglist, operand);
7152   }
7153 
Vldm(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7154   void Vldm(Condition cond,
7155             DataType dt,
7156             Register rn,
7157             WriteBack write_back,
7158             DRegisterList dreglist) {
7159     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7160     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
7161     VIXL_ASSERT(allow_macro_instructions_);
7162     VIXL_ASSERT(OutsideITBlock());
7163     MacroEmissionCheckScope guard(this);
7164     ITScope it_scope(this, &cond, guard);
7165     vldm(cond, dt, rn, write_back, dreglist);
7166   }
Vldm(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7167   void Vldm(DataType dt,
7168             Register rn,
7169             WriteBack write_back,
7170             DRegisterList dreglist) {
7171     Vldm(al, dt, rn, write_back, dreglist);
7172   }
Vldm(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)7173   void Vldm(Condition cond,
7174             Register rn,
7175             WriteBack write_back,
7176             DRegisterList dreglist) {
7177     Vldm(cond, kDataTypeValueNone, rn, write_back, dreglist);
7178   }
Vldm(Register rn,WriteBack write_back,DRegisterList dreglist)7179   void Vldm(Register rn, WriteBack write_back, DRegisterList dreglist) {
7180     Vldm(al, kDataTypeValueNone, rn, write_back, dreglist);
7181   }
7182 
Vldm(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7183   void Vldm(Condition cond,
7184             DataType dt,
7185             Register rn,
7186             WriteBack write_back,
7187             SRegisterList sreglist) {
7188     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7189     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
7190     VIXL_ASSERT(allow_macro_instructions_);
7191     VIXL_ASSERT(OutsideITBlock());
7192     MacroEmissionCheckScope guard(this);
7193     ITScope it_scope(this, &cond, guard);
7194     vldm(cond, dt, rn, write_back, sreglist);
7195   }
Vldm(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7196   void Vldm(DataType dt,
7197             Register rn,
7198             WriteBack write_back,
7199             SRegisterList sreglist) {
7200     Vldm(al, dt, rn, write_back, sreglist);
7201   }
Vldm(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)7202   void Vldm(Condition cond,
7203             Register rn,
7204             WriteBack write_back,
7205             SRegisterList sreglist) {
7206     Vldm(cond, kDataTypeValueNone, rn, write_back, sreglist);
7207   }
Vldm(Register rn,WriteBack write_back,SRegisterList sreglist)7208   void Vldm(Register rn, WriteBack write_back, SRegisterList sreglist) {
7209     Vldm(al, kDataTypeValueNone, rn, write_back, sreglist);
7210   }
7211 
Vldmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7212   void Vldmdb(Condition cond,
7213               DataType dt,
7214               Register rn,
7215               WriteBack write_back,
7216               DRegisterList dreglist) {
7217     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7218     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
7219     VIXL_ASSERT(allow_macro_instructions_);
7220     VIXL_ASSERT(OutsideITBlock());
7221     MacroEmissionCheckScope guard(this);
7222     ITScope it_scope(this, &cond, guard);
7223     vldmdb(cond, dt, rn, write_back, dreglist);
7224   }
Vldmdb(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7225   void Vldmdb(DataType dt,
7226               Register rn,
7227               WriteBack write_back,
7228               DRegisterList dreglist) {
7229     Vldmdb(al, dt, rn, write_back, dreglist);
7230   }
Vldmdb(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)7231   void Vldmdb(Condition cond,
7232               Register rn,
7233               WriteBack write_back,
7234               DRegisterList dreglist) {
7235     Vldmdb(cond, kDataTypeValueNone, rn, write_back, dreglist);
7236   }
Vldmdb(Register rn,WriteBack write_back,DRegisterList dreglist)7237   void Vldmdb(Register rn, WriteBack write_back, DRegisterList dreglist) {
7238     Vldmdb(al, kDataTypeValueNone, rn, write_back, dreglist);
7239   }
7240 
Vldmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7241   void Vldmdb(Condition cond,
7242               DataType dt,
7243               Register rn,
7244               WriteBack write_back,
7245               SRegisterList sreglist) {
7246     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7247     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
7248     VIXL_ASSERT(allow_macro_instructions_);
7249     VIXL_ASSERT(OutsideITBlock());
7250     MacroEmissionCheckScope guard(this);
7251     ITScope it_scope(this, &cond, guard);
7252     vldmdb(cond, dt, rn, write_back, sreglist);
7253   }
Vldmdb(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7254   void Vldmdb(DataType dt,
7255               Register rn,
7256               WriteBack write_back,
7257               SRegisterList sreglist) {
7258     Vldmdb(al, dt, rn, write_back, sreglist);
7259   }
Vldmdb(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)7260   void Vldmdb(Condition cond,
7261               Register rn,
7262               WriteBack write_back,
7263               SRegisterList sreglist) {
7264     Vldmdb(cond, kDataTypeValueNone, rn, write_back, sreglist);
7265   }
Vldmdb(Register rn,WriteBack write_back,SRegisterList sreglist)7266   void Vldmdb(Register rn, WriteBack write_back, SRegisterList sreglist) {
7267     Vldmdb(al, kDataTypeValueNone, rn, write_back, sreglist);
7268   }
7269 
Vldmia(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7270   void Vldmia(Condition cond,
7271               DataType dt,
7272               Register rn,
7273               WriteBack write_back,
7274               DRegisterList dreglist) {
7275     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7276     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
7277     VIXL_ASSERT(allow_macro_instructions_);
7278     VIXL_ASSERT(OutsideITBlock());
7279     MacroEmissionCheckScope guard(this);
7280     ITScope it_scope(this, &cond, guard);
7281     vldmia(cond, dt, rn, write_back, dreglist);
7282   }
Vldmia(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7283   void Vldmia(DataType dt,
7284               Register rn,
7285               WriteBack write_back,
7286               DRegisterList dreglist) {
7287     Vldmia(al, dt, rn, write_back, dreglist);
7288   }
Vldmia(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)7289   void Vldmia(Condition cond,
7290               Register rn,
7291               WriteBack write_back,
7292               DRegisterList dreglist) {
7293     Vldmia(cond, kDataTypeValueNone, rn, write_back, dreglist);
7294   }
Vldmia(Register rn,WriteBack write_back,DRegisterList dreglist)7295   void Vldmia(Register rn, WriteBack write_back, DRegisterList dreglist) {
7296     Vldmia(al, kDataTypeValueNone, rn, write_back, dreglist);
7297   }
7298 
Vldmia(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7299   void Vldmia(Condition cond,
7300               DataType dt,
7301               Register rn,
7302               WriteBack write_back,
7303               SRegisterList sreglist) {
7304     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7305     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
7306     VIXL_ASSERT(allow_macro_instructions_);
7307     VIXL_ASSERT(OutsideITBlock());
7308     MacroEmissionCheckScope guard(this);
7309     ITScope it_scope(this, &cond, guard);
7310     vldmia(cond, dt, rn, write_back, sreglist);
7311   }
Vldmia(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7312   void Vldmia(DataType dt,
7313               Register rn,
7314               WriteBack write_back,
7315               SRegisterList sreglist) {
7316     Vldmia(al, dt, rn, write_back, sreglist);
7317   }
Vldmia(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)7318   void Vldmia(Condition cond,
7319               Register rn,
7320               WriteBack write_back,
7321               SRegisterList sreglist) {
7322     Vldmia(cond, kDataTypeValueNone, rn, write_back, sreglist);
7323   }
Vldmia(Register rn,WriteBack write_back,SRegisterList sreglist)7324   void Vldmia(Register rn, WriteBack write_back, SRegisterList sreglist) {
7325     Vldmia(al, kDataTypeValueNone, rn, write_back, sreglist);
7326   }
7327 
7328 
Vldr(Condition cond,DataType dt,DRegister rd,const MemOperand & operand)7329   void Vldr(Condition cond,
7330             DataType dt,
7331             DRegister rd,
7332             const MemOperand& operand) {
7333     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7334     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7335     VIXL_ASSERT(allow_macro_instructions_);
7336     VIXL_ASSERT(OutsideITBlock());
7337     MacroEmissionCheckScope guard(this);
7338     ITScope it_scope(this, &cond, guard);
7339     vldr(cond, dt, rd, operand);
7340   }
Vldr(DataType dt,DRegister rd,const MemOperand & operand)7341   void Vldr(DataType dt, DRegister rd, const MemOperand& operand) {
7342     Vldr(al, dt, rd, operand);
7343   }
Vldr(Condition cond,DRegister rd,const MemOperand & operand)7344   void Vldr(Condition cond, DRegister rd, const MemOperand& operand) {
7345     Vldr(cond, Untyped64, rd, operand);
7346   }
Vldr(DRegister rd,const MemOperand & operand)7347   void Vldr(DRegister rd, const MemOperand& operand) {
7348     Vldr(al, Untyped64, rd, operand);
7349   }
7350 
7351 
Vldr(Condition cond,DataType dt,SRegister rd,const MemOperand & operand)7352   void Vldr(Condition cond,
7353             DataType dt,
7354             SRegister rd,
7355             const MemOperand& operand) {
7356     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7357     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7358     VIXL_ASSERT(allow_macro_instructions_);
7359     VIXL_ASSERT(OutsideITBlock());
7360     MacroEmissionCheckScope guard(this);
7361     ITScope it_scope(this, &cond, guard);
7362     vldr(cond, dt, rd, operand);
7363   }
Vldr(DataType dt,SRegister rd,const MemOperand & operand)7364   void Vldr(DataType dt, SRegister rd, const MemOperand& operand) {
7365     Vldr(al, dt, rd, operand);
7366   }
Vldr(Condition cond,SRegister rd,const MemOperand & operand)7367   void Vldr(Condition cond, SRegister rd, const MemOperand& operand) {
7368     Vldr(cond, Untyped32, rd, operand);
7369   }
Vldr(SRegister rd,const MemOperand & operand)7370   void Vldr(SRegister rd, const MemOperand& operand) {
7371     Vldr(al, Untyped32, rd, operand);
7372   }
7373 
Vmax(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7374   void Vmax(
7375       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7376     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7377     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7378     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7379     VIXL_ASSERT(allow_macro_instructions_);
7380     VIXL_ASSERT(OutsideITBlock());
7381     MacroEmissionCheckScope guard(this);
7382     ITScope it_scope(this, &cond, guard);
7383     vmax(cond, dt, rd, rn, rm);
7384   }
Vmax(DataType dt,DRegister rd,DRegister rn,DRegister rm)7385   void Vmax(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7386     Vmax(al, dt, rd, rn, rm);
7387   }
7388 
Vmax(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7389   void Vmax(
7390       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7391     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7392     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7393     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7394     VIXL_ASSERT(allow_macro_instructions_);
7395     VIXL_ASSERT(OutsideITBlock());
7396     MacroEmissionCheckScope guard(this);
7397     ITScope it_scope(this, &cond, guard);
7398     vmax(cond, dt, rd, rn, rm);
7399   }
Vmax(DataType dt,QRegister rd,QRegister rn,QRegister rm)7400   void Vmax(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7401     Vmax(al, dt, rd, rn, rm);
7402   }
7403 
Vmaxnm(DataType dt,DRegister rd,DRegister rn,DRegister rm)7404   void Vmaxnm(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7405     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7406     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7407     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7408     VIXL_ASSERT(allow_macro_instructions_);
7409     VIXL_ASSERT(OutsideITBlock());
7410     MacroEmissionCheckScope guard(this);
7411     vmaxnm(dt, rd, rn, rm);
7412   }
7413 
Vmaxnm(DataType dt,QRegister rd,QRegister rn,QRegister rm)7414   void Vmaxnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7415     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7416     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7417     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7418     VIXL_ASSERT(allow_macro_instructions_);
7419     VIXL_ASSERT(OutsideITBlock());
7420     MacroEmissionCheckScope guard(this);
7421     vmaxnm(dt, rd, rn, rm);
7422   }
7423 
Vmaxnm(DataType dt,SRegister rd,SRegister rn,SRegister rm)7424   void Vmaxnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7425     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7426     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7427     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7428     VIXL_ASSERT(allow_macro_instructions_);
7429     VIXL_ASSERT(OutsideITBlock());
7430     MacroEmissionCheckScope guard(this);
7431     vmaxnm(dt, rd, rn, rm);
7432   }
7433 
Vmin(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7434   void Vmin(
7435       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7436     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7437     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7438     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7439     VIXL_ASSERT(allow_macro_instructions_);
7440     VIXL_ASSERT(OutsideITBlock());
7441     MacroEmissionCheckScope guard(this);
7442     ITScope it_scope(this, &cond, guard);
7443     vmin(cond, dt, rd, rn, rm);
7444   }
Vmin(DataType dt,DRegister rd,DRegister rn,DRegister rm)7445   void Vmin(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7446     Vmin(al, dt, rd, rn, rm);
7447   }
7448 
Vmin(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7449   void Vmin(
7450       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7451     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7452     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7453     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7454     VIXL_ASSERT(allow_macro_instructions_);
7455     VIXL_ASSERT(OutsideITBlock());
7456     MacroEmissionCheckScope guard(this);
7457     ITScope it_scope(this, &cond, guard);
7458     vmin(cond, dt, rd, rn, rm);
7459   }
Vmin(DataType dt,QRegister rd,QRegister rn,QRegister rm)7460   void Vmin(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7461     Vmin(al, dt, rd, rn, rm);
7462   }
7463 
Vminnm(DataType dt,DRegister rd,DRegister rn,DRegister rm)7464   void Vminnm(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7465     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7466     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7467     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7468     VIXL_ASSERT(allow_macro_instructions_);
7469     VIXL_ASSERT(OutsideITBlock());
7470     MacroEmissionCheckScope guard(this);
7471     vminnm(dt, rd, rn, rm);
7472   }
7473 
Vminnm(DataType dt,QRegister rd,QRegister rn,QRegister rm)7474   void Vminnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7475     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7476     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7477     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7478     VIXL_ASSERT(allow_macro_instructions_);
7479     VIXL_ASSERT(OutsideITBlock());
7480     MacroEmissionCheckScope guard(this);
7481     vminnm(dt, rd, rn, rm);
7482   }
7483 
Vminnm(DataType dt,SRegister rd,SRegister rn,SRegister rm)7484   void Vminnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7485     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7486     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7487     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7488     VIXL_ASSERT(allow_macro_instructions_);
7489     VIXL_ASSERT(OutsideITBlock());
7490     MacroEmissionCheckScope guard(this);
7491     vminnm(dt, rd, rn, rm);
7492   }
7493 
Vmla(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)7494   void Vmla(Condition cond,
7495             DataType dt,
7496             DRegister rd,
7497             DRegister rn,
7498             DRegisterLane rm) {
7499     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7500     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7501     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7502     VIXL_ASSERT(allow_macro_instructions_);
7503     VIXL_ASSERT(OutsideITBlock());
7504     MacroEmissionCheckScope guard(this);
7505     ITScope it_scope(this, &cond, guard);
7506     vmla(cond, dt, rd, rn, rm);
7507   }
Vmla(DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)7508   void Vmla(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
7509     Vmla(al, dt, rd, rn, rm);
7510   }
7511 
Vmla(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)7512   void Vmla(Condition cond,
7513             DataType dt,
7514             QRegister rd,
7515             QRegister rn,
7516             DRegisterLane rm) {
7517     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7518     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7519     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7520     VIXL_ASSERT(allow_macro_instructions_);
7521     VIXL_ASSERT(OutsideITBlock());
7522     MacroEmissionCheckScope guard(this);
7523     ITScope it_scope(this, &cond, guard);
7524     vmla(cond, dt, rd, rn, rm);
7525   }
Vmla(DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)7526   void Vmla(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
7527     Vmla(al, dt, rd, rn, rm);
7528   }
7529 
Vmla(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7530   void Vmla(
7531       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7532     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7533     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7534     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7535     VIXL_ASSERT(allow_macro_instructions_);
7536     VIXL_ASSERT(OutsideITBlock());
7537     MacroEmissionCheckScope guard(this);
7538     ITScope it_scope(this, &cond, guard);
7539     vmla(cond, dt, rd, rn, rm);
7540   }
Vmla(DataType dt,DRegister rd,DRegister rn,DRegister rm)7541   void Vmla(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7542     Vmla(al, dt, rd, rn, rm);
7543   }
7544 
Vmla(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7545   void Vmla(
7546       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7547     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7548     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7549     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7550     VIXL_ASSERT(allow_macro_instructions_);
7551     VIXL_ASSERT(OutsideITBlock());
7552     MacroEmissionCheckScope guard(this);
7553     ITScope it_scope(this, &cond, guard);
7554     vmla(cond, dt, rd, rn, rm);
7555   }
Vmla(DataType dt,QRegister rd,QRegister rn,QRegister rm)7556   void Vmla(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7557     Vmla(al, dt, rd, rn, rm);
7558   }
7559 
Vmla(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)7560   void Vmla(
7561       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7562     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7563     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7564     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7565     VIXL_ASSERT(allow_macro_instructions_);
7566     VIXL_ASSERT(OutsideITBlock());
7567     MacroEmissionCheckScope guard(this);
7568     ITScope it_scope(this, &cond, guard);
7569     vmla(cond, dt, rd, rn, rm);
7570   }
Vmla(DataType dt,SRegister rd,SRegister rn,SRegister rm)7571   void Vmla(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7572     Vmla(al, dt, rd, rn, rm);
7573   }
7574 
Vmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)7575   void Vmlal(Condition cond,
7576              DataType dt,
7577              QRegister rd,
7578              DRegister rn,
7579              DRegisterLane rm) {
7580     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7581     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7582     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7583     VIXL_ASSERT(allow_macro_instructions_);
7584     VIXL_ASSERT(OutsideITBlock());
7585     MacroEmissionCheckScope guard(this);
7586     ITScope it_scope(this, &cond, guard);
7587     vmlal(cond, dt, rd, rn, rm);
7588   }
Vmlal(DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)7589   void Vmlal(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
7590     Vmlal(al, dt, rd, rn, rm);
7591   }
7592 
Vmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)7593   void Vmlal(
7594       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7595     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7596     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7597     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7598     VIXL_ASSERT(allow_macro_instructions_);
7599     VIXL_ASSERT(OutsideITBlock());
7600     MacroEmissionCheckScope guard(this);
7601     ITScope it_scope(this, &cond, guard);
7602     vmlal(cond, dt, rd, rn, rm);
7603   }
Vmlal(DataType dt,QRegister rd,DRegister rn,DRegister rm)7604   void Vmlal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7605     Vmlal(al, dt, rd, rn, rm);
7606   }
7607 
Vmls(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)7608   void Vmls(Condition cond,
7609             DataType dt,
7610             DRegister rd,
7611             DRegister rn,
7612             DRegisterLane rm) {
7613     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7614     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7615     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7616     VIXL_ASSERT(allow_macro_instructions_);
7617     VIXL_ASSERT(OutsideITBlock());
7618     MacroEmissionCheckScope guard(this);
7619     ITScope it_scope(this, &cond, guard);
7620     vmls(cond, dt, rd, rn, rm);
7621   }
Vmls(DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)7622   void Vmls(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
7623     Vmls(al, dt, rd, rn, rm);
7624   }
7625 
Vmls(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)7626   void Vmls(Condition cond,
7627             DataType dt,
7628             QRegister rd,
7629             QRegister rn,
7630             DRegisterLane rm) {
7631     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7632     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7633     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7634     VIXL_ASSERT(allow_macro_instructions_);
7635     VIXL_ASSERT(OutsideITBlock());
7636     MacroEmissionCheckScope guard(this);
7637     ITScope it_scope(this, &cond, guard);
7638     vmls(cond, dt, rd, rn, rm);
7639   }
Vmls(DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)7640   void Vmls(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
7641     Vmls(al, dt, rd, rn, rm);
7642   }
7643 
Vmls(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7644   void Vmls(
7645       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7646     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7647     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7648     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7649     VIXL_ASSERT(allow_macro_instructions_);
7650     VIXL_ASSERT(OutsideITBlock());
7651     MacroEmissionCheckScope guard(this);
7652     ITScope it_scope(this, &cond, guard);
7653     vmls(cond, dt, rd, rn, rm);
7654   }
Vmls(DataType dt,DRegister rd,DRegister rn,DRegister rm)7655   void Vmls(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7656     Vmls(al, dt, rd, rn, rm);
7657   }
7658 
Vmls(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7659   void Vmls(
7660       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7661     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7662     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7663     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7664     VIXL_ASSERT(allow_macro_instructions_);
7665     VIXL_ASSERT(OutsideITBlock());
7666     MacroEmissionCheckScope guard(this);
7667     ITScope it_scope(this, &cond, guard);
7668     vmls(cond, dt, rd, rn, rm);
7669   }
Vmls(DataType dt,QRegister rd,QRegister rn,QRegister rm)7670   void Vmls(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7671     Vmls(al, dt, rd, rn, rm);
7672   }
7673 
Vmls(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)7674   void Vmls(
7675       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7676     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7677     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7678     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7679     VIXL_ASSERT(allow_macro_instructions_);
7680     VIXL_ASSERT(OutsideITBlock());
7681     MacroEmissionCheckScope guard(this);
7682     ITScope it_scope(this, &cond, guard);
7683     vmls(cond, dt, rd, rn, rm);
7684   }
Vmls(DataType dt,SRegister rd,SRegister rn,SRegister rm)7685   void Vmls(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7686     Vmls(al, dt, rd, rn, rm);
7687   }
7688 
Vmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)7689   void Vmlsl(Condition cond,
7690              DataType dt,
7691              QRegister rd,
7692              DRegister rn,
7693              DRegisterLane rm) {
7694     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7695     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7696     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7697     VIXL_ASSERT(allow_macro_instructions_);
7698     VIXL_ASSERT(OutsideITBlock());
7699     MacroEmissionCheckScope guard(this);
7700     ITScope it_scope(this, &cond, guard);
7701     vmlsl(cond, dt, rd, rn, rm);
7702   }
Vmlsl(DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)7703   void Vmlsl(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
7704     Vmlsl(al, dt, rd, rn, rm);
7705   }
7706 
Vmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)7707   void Vmlsl(
7708       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7709     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7710     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7711     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7712     VIXL_ASSERT(allow_macro_instructions_);
7713     VIXL_ASSERT(OutsideITBlock());
7714     MacroEmissionCheckScope guard(this);
7715     ITScope it_scope(this, &cond, guard);
7716     vmlsl(cond, dt, rd, rn, rm);
7717   }
Vmlsl(DataType dt,QRegister rd,DRegister rn,DRegister rm)7718   void Vmlsl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7719     Vmlsl(al, dt, rd, rn, rm);
7720   }
7721 
Vmov(Condition cond,Register rt,SRegister rn)7722   void Vmov(Condition cond, Register rt, SRegister rn) {
7723     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7724     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7725     VIXL_ASSERT(allow_macro_instructions_);
7726     VIXL_ASSERT(OutsideITBlock());
7727     MacroEmissionCheckScope guard(this);
7728     ITScope it_scope(this, &cond, guard);
7729     vmov(cond, rt, rn);
7730   }
Vmov(Register rt,SRegister rn)7731   void Vmov(Register rt, SRegister rn) { Vmov(al, rt, rn); }
7732 
Vmov(Condition cond,SRegister rn,Register rt)7733   void Vmov(Condition cond, SRegister rn, Register rt) {
7734     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7735     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7736     VIXL_ASSERT(allow_macro_instructions_);
7737     VIXL_ASSERT(OutsideITBlock());
7738     MacroEmissionCheckScope guard(this);
7739     ITScope it_scope(this, &cond, guard);
7740     vmov(cond, rn, rt);
7741   }
Vmov(SRegister rn,Register rt)7742   void Vmov(SRegister rn, Register rt) { Vmov(al, rn, rt); }
7743 
Vmov(Condition cond,Register rt,Register rt2,DRegister rm)7744   void Vmov(Condition cond, Register rt, Register rt2, DRegister rm) {
7745     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7746     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7747     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7748     VIXL_ASSERT(allow_macro_instructions_);
7749     VIXL_ASSERT(OutsideITBlock());
7750     MacroEmissionCheckScope guard(this);
7751     ITScope it_scope(this, &cond, guard);
7752     vmov(cond, rt, rt2, rm);
7753   }
Vmov(Register rt,Register rt2,DRegister rm)7754   void Vmov(Register rt, Register rt2, DRegister rm) { Vmov(al, rt, rt2, rm); }
7755 
Vmov(Condition cond,DRegister rm,Register rt,Register rt2)7756   void Vmov(Condition cond, DRegister rm, Register rt, Register rt2) {
7757     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7758     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7759     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7760     VIXL_ASSERT(allow_macro_instructions_);
7761     VIXL_ASSERT(OutsideITBlock());
7762     MacroEmissionCheckScope guard(this);
7763     ITScope it_scope(this, &cond, guard);
7764     vmov(cond, rm, rt, rt2);
7765   }
Vmov(DRegister rm,Register rt,Register rt2)7766   void Vmov(DRegister rm, Register rt, Register rt2) { Vmov(al, rm, rt, rt2); }
7767 
Vmov(Condition cond,Register rt,Register rt2,SRegister rm,SRegister rm1)7768   void Vmov(
7769       Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) {
7770     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7771     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7772     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7773     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm1));
7774     VIXL_ASSERT(allow_macro_instructions_);
7775     VIXL_ASSERT(OutsideITBlock());
7776     MacroEmissionCheckScope guard(this);
7777     ITScope it_scope(this, &cond, guard);
7778     vmov(cond, rt, rt2, rm, rm1);
7779   }
Vmov(Register rt,Register rt2,SRegister rm,SRegister rm1)7780   void Vmov(Register rt, Register rt2, SRegister rm, SRegister rm1) {
7781     Vmov(al, rt, rt2, rm, rm1);
7782   }
7783 
Vmov(Condition cond,SRegister rm,SRegister rm1,Register rt,Register rt2)7784   void Vmov(
7785       Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) {
7786     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7787     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm1));
7788     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7789     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7790     VIXL_ASSERT(allow_macro_instructions_);
7791     VIXL_ASSERT(OutsideITBlock());
7792     MacroEmissionCheckScope guard(this);
7793     ITScope it_scope(this, &cond, guard);
7794     vmov(cond, rm, rm1, rt, rt2);
7795   }
Vmov(SRegister rm,SRegister rm1,Register rt,Register rt2)7796   void Vmov(SRegister rm, SRegister rm1, Register rt, Register rt2) {
7797     Vmov(al, rm, rm1, rt, rt2);
7798   }
7799 
Vmov(Condition cond,DataType dt,DRegisterLane rd,Register rt)7800   void Vmov(Condition cond, DataType dt, DRegisterLane rd, Register rt) {
7801     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7802     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7803     VIXL_ASSERT(allow_macro_instructions_);
7804     VIXL_ASSERT(OutsideITBlock());
7805     MacroEmissionCheckScope guard(this);
7806     ITScope it_scope(this, &cond, guard);
7807     vmov(cond, dt, rd, rt);
7808   }
Vmov(DataType dt,DRegisterLane rd,Register rt)7809   void Vmov(DataType dt, DRegisterLane rd, Register rt) {
7810     Vmov(al, dt, rd, rt);
7811   }
Vmov(Condition cond,DRegisterLane rd,Register rt)7812   void Vmov(Condition cond, DRegisterLane rd, Register rt) {
7813     Vmov(cond, kDataTypeValueNone, rd, rt);
7814   }
Vmov(DRegisterLane rd,Register rt)7815   void Vmov(DRegisterLane rd, Register rt) {
7816     Vmov(al, kDataTypeValueNone, rd, rt);
7817   }
7818 
Vmov(Condition cond,DataType dt,DRegister rd,const DOperand & operand)7819   void Vmov(Condition cond,
7820             DataType dt,
7821             DRegister rd,
7822             const DOperand& operand) {
7823     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7824     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7825     VIXL_ASSERT(allow_macro_instructions_);
7826     VIXL_ASSERT(OutsideITBlock());
7827     MacroEmissionCheckScope guard(this);
7828     ITScope it_scope(this, &cond, guard);
7829     vmov(cond, dt, rd, operand);
7830   }
Vmov(DataType dt,DRegister rd,const DOperand & operand)7831   void Vmov(DataType dt, DRegister rd, const DOperand& operand) {
7832     Vmov(al, dt, rd, operand);
7833   }
7834 
Vmov(Condition cond,DataType dt,QRegister rd,const QOperand & operand)7835   void Vmov(Condition cond,
7836             DataType dt,
7837             QRegister rd,
7838             const QOperand& operand) {
7839     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7840     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7841     VIXL_ASSERT(allow_macro_instructions_);
7842     VIXL_ASSERT(OutsideITBlock());
7843     MacroEmissionCheckScope guard(this);
7844     ITScope it_scope(this, &cond, guard);
7845     vmov(cond, dt, rd, operand);
7846   }
Vmov(DataType dt,QRegister rd,const QOperand & operand)7847   void Vmov(DataType dt, QRegister rd, const QOperand& operand) {
7848     Vmov(al, dt, rd, operand);
7849   }
7850 
Vmov(Condition cond,DataType dt,SRegister rd,const SOperand & operand)7851   void Vmov(Condition cond,
7852             DataType dt,
7853             SRegister rd,
7854             const SOperand& operand) {
7855     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7856     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7857     VIXL_ASSERT(allow_macro_instructions_);
7858     VIXL_ASSERT(OutsideITBlock());
7859     MacroEmissionCheckScope guard(this);
7860     ITScope it_scope(this, &cond, guard);
7861     vmov(cond, dt, rd, operand);
7862   }
Vmov(DataType dt,SRegister rd,const SOperand & operand)7863   void Vmov(DataType dt, SRegister rd, const SOperand& operand) {
7864     Vmov(al, dt, rd, operand);
7865   }
7866 
Vmov(Condition cond,DataType dt,Register rt,DRegisterLane rn)7867   void Vmov(Condition cond, DataType dt, Register rt, DRegisterLane rn) {
7868     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7869     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7870     VIXL_ASSERT(allow_macro_instructions_);
7871     VIXL_ASSERT(OutsideITBlock());
7872     MacroEmissionCheckScope guard(this);
7873     ITScope it_scope(this, &cond, guard);
7874     vmov(cond, dt, rt, rn);
7875   }
Vmov(DataType dt,Register rt,DRegisterLane rn)7876   void Vmov(DataType dt, Register rt, DRegisterLane rn) {
7877     Vmov(al, dt, rt, rn);
7878   }
Vmov(Condition cond,Register rt,DRegisterLane rn)7879   void Vmov(Condition cond, Register rt, DRegisterLane rn) {
7880     Vmov(cond, kDataTypeValueNone, rt, rn);
7881   }
Vmov(Register rt,DRegisterLane rn)7882   void Vmov(Register rt, DRegisterLane rn) {
7883     Vmov(al, kDataTypeValueNone, rt, rn);
7884   }
7885 
Vmovl(Condition cond,DataType dt,QRegister rd,DRegister rm)7886   void Vmovl(Condition cond, DataType dt, QRegister rd, DRegister rm) {
7887     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7888     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7889     VIXL_ASSERT(allow_macro_instructions_);
7890     VIXL_ASSERT(OutsideITBlock());
7891     MacroEmissionCheckScope guard(this);
7892     ITScope it_scope(this, &cond, guard);
7893     vmovl(cond, dt, rd, rm);
7894   }
Vmovl(DataType dt,QRegister rd,DRegister rm)7895   void Vmovl(DataType dt, QRegister rd, DRegister rm) { Vmovl(al, dt, rd, rm); }
7896 
Vmovn(Condition cond,DataType dt,DRegister rd,QRegister rm)7897   void Vmovn(Condition cond, DataType dt, DRegister rd, QRegister rm) {
7898     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7899     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7900     VIXL_ASSERT(allow_macro_instructions_);
7901     VIXL_ASSERT(OutsideITBlock());
7902     MacroEmissionCheckScope guard(this);
7903     ITScope it_scope(this, &cond, guard);
7904     vmovn(cond, dt, rd, rm);
7905   }
Vmovn(DataType dt,DRegister rd,QRegister rm)7906   void Vmovn(DataType dt, DRegister rd, QRegister rm) { Vmovn(al, dt, rd, rm); }
7907 
Vmrs(Condition cond,RegisterOrAPSR_nzcv rt,SpecialFPRegister spec_reg)7908   void Vmrs(Condition cond,
7909             RegisterOrAPSR_nzcv rt,
7910             SpecialFPRegister spec_reg) {
7911     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7912     VIXL_ASSERT(allow_macro_instructions_);
7913     VIXL_ASSERT(OutsideITBlock());
7914     MacroEmissionCheckScope guard(this);
7915     ITScope it_scope(this, &cond, guard);
7916     vmrs(cond, rt, spec_reg);
7917   }
Vmrs(RegisterOrAPSR_nzcv rt,SpecialFPRegister spec_reg)7918   void Vmrs(RegisterOrAPSR_nzcv rt, SpecialFPRegister spec_reg) {
7919     Vmrs(al, rt, spec_reg);
7920   }
7921 
Vmsr(Condition cond,SpecialFPRegister spec_reg,Register rt)7922   void Vmsr(Condition cond, SpecialFPRegister spec_reg, Register rt) {
7923     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7924     VIXL_ASSERT(allow_macro_instructions_);
7925     VIXL_ASSERT(OutsideITBlock());
7926     MacroEmissionCheckScope guard(this);
7927     ITScope it_scope(this, &cond, guard);
7928     vmsr(cond, spec_reg, rt);
7929   }
Vmsr(SpecialFPRegister spec_reg,Register rt)7930   void Vmsr(SpecialFPRegister spec_reg, Register rt) { Vmsr(al, spec_reg, rt); }
7931 
Vmul(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister dm,unsigned index)7932   void Vmul(Condition cond,
7933             DataType dt,
7934             DRegister rd,
7935             DRegister rn,
7936             DRegister dm,
7937             unsigned index) {
7938     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7939     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7940     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
7941     VIXL_ASSERT(allow_macro_instructions_);
7942     VIXL_ASSERT(OutsideITBlock());
7943     MacroEmissionCheckScope guard(this);
7944     ITScope it_scope(this, &cond, guard);
7945     vmul(cond, dt, rd, rn, dm, index);
7946   }
Vmul(DataType dt,DRegister rd,DRegister rn,DRegister dm,unsigned index)7947   void Vmul(
7948       DataType dt, DRegister rd, DRegister rn, DRegister dm, unsigned index) {
7949     Vmul(al, dt, rd, rn, dm, index);
7950   }
7951 
Vmul(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegister dm,unsigned index)7952   void Vmul(Condition cond,
7953             DataType dt,
7954             QRegister rd,
7955             QRegister rn,
7956             DRegister dm,
7957             unsigned index) {
7958     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7959     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7960     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
7961     VIXL_ASSERT(allow_macro_instructions_);
7962     VIXL_ASSERT(OutsideITBlock());
7963     MacroEmissionCheckScope guard(this);
7964     ITScope it_scope(this, &cond, guard);
7965     vmul(cond, dt, rd, rn, dm, index);
7966   }
Vmul(DataType dt,QRegister rd,QRegister rn,DRegister dm,unsigned index)7967   void Vmul(
7968       DataType dt, QRegister rd, QRegister rn, DRegister dm, unsigned index) {
7969     Vmul(al, dt, rd, rn, dm, index);
7970   }
7971 
Vmul(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7972   void Vmul(
7973       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7974     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7975     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7976     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7977     VIXL_ASSERT(allow_macro_instructions_);
7978     VIXL_ASSERT(OutsideITBlock());
7979     MacroEmissionCheckScope guard(this);
7980     ITScope it_scope(this, &cond, guard);
7981     vmul(cond, dt, rd, rn, rm);
7982   }
Vmul(DataType dt,DRegister rd,DRegister rn,DRegister rm)7983   void Vmul(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7984     Vmul(al, dt, rd, rn, rm);
7985   }
7986 
Vmul(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7987   void Vmul(
7988       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7989     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7990     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7991     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7992     VIXL_ASSERT(allow_macro_instructions_);
7993     VIXL_ASSERT(OutsideITBlock());
7994     MacroEmissionCheckScope guard(this);
7995     ITScope it_scope(this, &cond, guard);
7996     vmul(cond, dt, rd, rn, rm);
7997   }
Vmul(DataType dt,QRegister rd,QRegister rn,QRegister rm)7998   void Vmul(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7999     Vmul(al, dt, rd, rn, rm);
8000   }
8001 
Vmul(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)8002   void Vmul(
8003       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8004     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8005     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8006     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8007     VIXL_ASSERT(allow_macro_instructions_);
8008     VIXL_ASSERT(OutsideITBlock());
8009     MacroEmissionCheckScope guard(this);
8010     ITScope it_scope(this, &cond, guard);
8011     vmul(cond, dt, rd, rn, rm);
8012   }
Vmul(DataType dt,SRegister rd,SRegister rn,SRegister rm)8013   void Vmul(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8014     Vmul(al, dt, rd, rn, rm);
8015   }
8016 
Vmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8017   void Vmull(Condition cond,
8018              DataType dt,
8019              QRegister rd,
8020              DRegister rn,
8021              DRegister dm,
8022              unsigned index) {
8023     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8024     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8025     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8026     VIXL_ASSERT(allow_macro_instructions_);
8027     VIXL_ASSERT(OutsideITBlock());
8028     MacroEmissionCheckScope guard(this);
8029     ITScope it_scope(this, &cond, guard);
8030     vmull(cond, dt, rd, rn, dm, index);
8031   }
Vmull(DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8032   void Vmull(
8033       DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
8034     Vmull(al, dt, rd, rn, dm, index);
8035   }
8036 
Vmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)8037   void Vmull(
8038       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8039     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8040     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8041     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8042     VIXL_ASSERT(allow_macro_instructions_);
8043     VIXL_ASSERT(OutsideITBlock());
8044     MacroEmissionCheckScope guard(this);
8045     ITScope it_scope(this, &cond, guard);
8046     vmull(cond, dt, rd, rn, rm);
8047   }
Vmull(DataType dt,QRegister rd,DRegister rn,DRegister rm)8048   void Vmull(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8049     Vmull(al, dt, rd, rn, rm);
8050   }
8051 
Vmvn(Condition cond,DataType dt,DRegister rd,const DOperand & operand)8052   void Vmvn(Condition cond,
8053             DataType dt,
8054             DRegister rd,
8055             const DOperand& operand) {
8056     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8057     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8058     VIXL_ASSERT(allow_macro_instructions_);
8059     VIXL_ASSERT(OutsideITBlock());
8060     MacroEmissionCheckScope guard(this);
8061     ITScope it_scope(this, &cond, guard);
8062     vmvn(cond, dt, rd, operand);
8063   }
Vmvn(DataType dt,DRegister rd,const DOperand & operand)8064   void Vmvn(DataType dt, DRegister rd, const DOperand& operand) {
8065     Vmvn(al, dt, rd, operand);
8066   }
8067 
Vmvn(Condition cond,DataType dt,QRegister rd,const QOperand & operand)8068   void Vmvn(Condition cond,
8069             DataType dt,
8070             QRegister rd,
8071             const QOperand& operand) {
8072     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8073     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8074     VIXL_ASSERT(allow_macro_instructions_);
8075     VIXL_ASSERT(OutsideITBlock());
8076     MacroEmissionCheckScope guard(this);
8077     ITScope it_scope(this, &cond, guard);
8078     vmvn(cond, dt, rd, operand);
8079   }
Vmvn(DataType dt,QRegister rd,const QOperand & operand)8080   void Vmvn(DataType dt, QRegister rd, const QOperand& operand) {
8081     Vmvn(al, dt, rd, operand);
8082   }
8083 
Vneg(Condition cond,DataType dt,DRegister rd,DRegister rm)8084   void Vneg(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8085     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8086     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8087     VIXL_ASSERT(allow_macro_instructions_);
8088     VIXL_ASSERT(OutsideITBlock());
8089     MacroEmissionCheckScope guard(this);
8090     ITScope it_scope(this, &cond, guard);
8091     vneg(cond, dt, rd, rm);
8092   }
Vneg(DataType dt,DRegister rd,DRegister rm)8093   void Vneg(DataType dt, DRegister rd, DRegister rm) { Vneg(al, dt, rd, rm); }
8094 
Vneg(Condition cond,DataType dt,QRegister rd,QRegister rm)8095   void Vneg(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8096     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8097     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8098     VIXL_ASSERT(allow_macro_instructions_);
8099     VIXL_ASSERT(OutsideITBlock());
8100     MacroEmissionCheckScope guard(this);
8101     ITScope it_scope(this, &cond, guard);
8102     vneg(cond, dt, rd, rm);
8103   }
Vneg(DataType dt,QRegister rd,QRegister rm)8104   void Vneg(DataType dt, QRegister rd, QRegister rm) { Vneg(al, dt, rd, rm); }
8105 
Vneg(Condition cond,DataType dt,SRegister rd,SRegister rm)8106   void Vneg(Condition cond, DataType dt, SRegister rd, SRegister rm) {
8107     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8108     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8109     VIXL_ASSERT(allow_macro_instructions_);
8110     VIXL_ASSERT(OutsideITBlock());
8111     MacroEmissionCheckScope guard(this);
8112     ITScope it_scope(this, &cond, guard);
8113     vneg(cond, dt, rd, rm);
8114   }
Vneg(DataType dt,SRegister rd,SRegister rm)8115   void Vneg(DataType dt, SRegister rd, SRegister rm) { Vneg(al, dt, rd, rm); }
8116 
Vnmla(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)8117   void Vnmla(
8118       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8119     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8120     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8121     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8122     VIXL_ASSERT(allow_macro_instructions_);
8123     VIXL_ASSERT(OutsideITBlock());
8124     MacroEmissionCheckScope guard(this);
8125     ITScope it_scope(this, &cond, guard);
8126     vnmla(cond, dt, rd, rn, rm);
8127   }
Vnmla(DataType dt,SRegister rd,SRegister rn,SRegister rm)8128   void Vnmla(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8129     Vnmla(al, dt, rd, rn, rm);
8130   }
8131 
Vnmla(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8132   void Vnmla(
8133       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8134     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8135     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8136     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8137     VIXL_ASSERT(allow_macro_instructions_);
8138     VIXL_ASSERT(OutsideITBlock());
8139     MacroEmissionCheckScope guard(this);
8140     ITScope it_scope(this, &cond, guard);
8141     vnmla(cond, dt, rd, rn, rm);
8142   }
Vnmla(DataType dt,DRegister rd,DRegister rn,DRegister rm)8143   void Vnmla(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8144     Vnmla(al, dt, rd, rn, rm);
8145   }
8146 
Vnmls(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)8147   void Vnmls(
8148       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8149     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8150     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8151     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8152     VIXL_ASSERT(allow_macro_instructions_);
8153     VIXL_ASSERT(OutsideITBlock());
8154     MacroEmissionCheckScope guard(this);
8155     ITScope it_scope(this, &cond, guard);
8156     vnmls(cond, dt, rd, rn, rm);
8157   }
Vnmls(DataType dt,SRegister rd,SRegister rn,SRegister rm)8158   void Vnmls(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8159     Vnmls(al, dt, rd, rn, rm);
8160   }
8161 
Vnmls(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8162   void Vnmls(
8163       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8164     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8165     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8166     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8167     VIXL_ASSERT(allow_macro_instructions_);
8168     VIXL_ASSERT(OutsideITBlock());
8169     MacroEmissionCheckScope guard(this);
8170     ITScope it_scope(this, &cond, guard);
8171     vnmls(cond, dt, rd, rn, rm);
8172   }
Vnmls(DataType dt,DRegister rd,DRegister rn,DRegister rm)8173   void Vnmls(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8174     Vnmls(al, dt, rd, rn, rm);
8175   }
8176 
Vnmul(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)8177   void Vnmul(
8178       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8179     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8180     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8181     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8182     VIXL_ASSERT(allow_macro_instructions_);
8183     VIXL_ASSERT(OutsideITBlock());
8184     MacroEmissionCheckScope guard(this);
8185     ITScope it_scope(this, &cond, guard);
8186     vnmul(cond, dt, rd, rn, rm);
8187   }
Vnmul(DataType dt,SRegister rd,SRegister rn,SRegister rm)8188   void Vnmul(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8189     Vnmul(al, dt, rd, rn, rm);
8190   }
8191 
Vnmul(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8192   void Vnmul(
8193       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8194     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8195     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8196     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8197     VIXL_ASSERT(allow_macro_instructions_);
8198     VIXL_ASSERT(OutsideITBlock());
8199     MacroEmissionCheckScope guard(this);
8200     ITScope it_scope(this, &cond, guard);
8201     vnmul(cond, dt, rd, rn, rm);
8202   }
Vnmul(DataType dt,DRegister rd,DRegister rn,DRegister rm)8203   void Vnmul(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8204     Vnmul(al, dt, rd, rn, rm);
8205   }
8206 
Vorn(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)8207   void Vorn(Condition cond,
8208             DataType dt,
8209             DRegister rd,
8210             DRegister rn,
8211             const DOperand& operand) {
8212     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8213     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8214     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8215     VIXL_ASSERT(allow_macro_instructions_);
8216     VIXL_ASSERT(OutsideITBlock());
8217     MacroEmissionCheckScope guard(this);
8218     ITScope it_scope(this, &cond, guard);
8219     vorn(cond, dt, rd, rn, operand);
8220   }
Vorn(DataType dt,DRegister rd,DRegister rn,const DOperand & operand)8221   void Vorn(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
8222     Vorn(al, dt, rd, rn, operand);
8223   }
8224 
Vorn(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)8225   void Vorn(Condition cond,
8226             DataType dt,
8227             QRegister rd,
8228             QRegister rn,
8229             const QOperand& operand) {
8230     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8231     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8232     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8233     VIXL_ASSERT(allow_macro_instructions_);
8234     VIXL_ASSERT(OutsideITBlock());
8235     MacroEmissionCheckScope guard(this);
8236     ITScope it_scope(this, &cond, guard);
8237     vorn(cond, dt, rd, rn, operand);
8238   }
Vorn(DataType dt,QRegister rd,QRegister rn,const QOperand & operand)8239   void Vorn(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
8240     Vorn(al, dt, rd, rn, operand);
8241   }
8242 
Vorr(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)8243   void Vorr(Condition cond,
8244             DataType dt,
8245             DRegister rd,
8246             DRegister rn,
8247             const DOperand& operand) {
8248     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8249     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8250     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8251     VIXL_ASSERT(allow_macro_instructions_);
8252     VIXL_ASSERT(OutsideITBlock());
8253     MacroEmissionCheckScope guard(this);
8254     ITScope it_scope(this, &cond, guard);
8255     vorr(cond, dt, rd, rn, operand);
8256   }
Vorr(DataType dt,DRegister rd,DRegister rn,const DOperand & operand)8257   void Vorr(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
8258     Vorr(al, dt, rd, rn, operand);
8259   }
Vorr(Condition cond,DRegister rd,DRegister rn,const DOperand & operand)8260   void Vorr(Condition cond,
8261             DRegister rd,
8262             DRegister rn,
8263             const DOperand& operand) {
8264     Vorr(cond, kDataTypeValueNone, rd, rn, operand);
8265   }
Vorr(DRegister rd,DRegister rn,const DOperand & operand)8266   void Vorr(DRegister rd, DRegister rn, const DOperand& operand) {
8267     Vorr(al, kDataTypeValueNone, rd, rn, operand);
8268   }
8269 
Vorr(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)8270   void Vorr(Condition cond,
8271             DataType dt,
8272             QRegister rd,
8273             QRegister rn,
8274             const QOperand& operand) {
8275     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8276     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8277     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8278     VIXL_ASSERT(allow_macro_instructions_);
8279     VIXL_ASSERT(OutsideITBlock());
8280     MacroEmissionCheckScope guard(this);
8281     ITScope it_scope(this, &cond, guard);
8282     vorr(cond, dt, rd, rn, operand);
8283   }
Vorr(DataType dt,QRegister rd,QRegister rn,const QOperand & operand)8284   void Vorr(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
8285     Vorr(al, dt, rd, rn, operand);
8286   }
Vorr(Condition cond,QRegister rd,QRegister rn,const QOperand & operand)8287   void Vorr(Condition cond,
8288             QRegister rd,
8289             QRegister rn,
8290             const QOperand& operand) {
8291     Vorr(cond, kDataTypeValueNone, rd, rn, operand);
8292   }
Vorr(QRegister rd,QRegister rn,const QOperand & operand)8293   void Vorr(QRegister rd, QRegister rn, const QOperand& operand) {
8294     Vorr(al, kDataTypeValueNone, rd, rn, operand);
8295   }
8296 
Vpadal(Condition cond,DataType dt,DRegister rd,DRegister rm)8297   void Vpadal(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8298     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8299     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8300     VIXL_ASSERT(allow_macro_instructions_);
8301     VIXL_ASSERT(OutsideITBlock());
8302     MacroEmissionCheckScope guard(this);
8303     ITScope it_scope(this, &cond, guard);
8304     vpadal(cond, dt, rd, rm);
8305   }
Vpadal(DataType dt,DRegister rd,DRegister rm)8306   void Vpadal(DataType dt, DRegister rd, DRegister rm) {
8307     Vpadal(al, dt, rd, rm);
8308   }
8309 
Vpadal(Condition cond,DataType dt,QRegister rd,QRegister rm)8310   void Vpadal(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8311     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8312     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8313     VIXL_ASSERT(allow_macro_instructions_);
8314     VIXL_ASSERT(OutsideITBlock());
8315     MacroEmissionCheckScope guard(this);
8316     ITScope it_scope(this, &cond, guard);
8317     vpadal(cond, dt, rd, rm);
8318   }
Vpadal(DataType dt,QRegister rd,QRegister rm)8319   void Vpadal(DataType dt, QRegister rd, QRegister rm) {
8320     Vpadal(al, dt, rd, rm);
8321   }
8322 
Vpadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8323   void Vpadd(
8324       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8325     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8326     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8327     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8328     VIXL_ASSERT(allow_macro_instructions_);
8329     VIXL_ASSERT(OutsideITBlock());
8330     MacroEmissionCheckScope guard(this);
8331     ITScope it_scope(this, &cond, guard);
8332     vpadd(cond, dt, rd, rn, rm);
8333   }
Vpadd(DataType dt,DRegister rd,DRegister rn,DRegister rm)8334   void Vpadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8335     Vpadd(al, dt, rd, rn, rm);
8336   }
8337 
Vpaddl(Condition cond,DataType dt,DRegister rd,DRegister rm)8338   void Vpaddl(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8339     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8340     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8341     VIXL_ASSERT(allow_macro_instructions_);
8342     VIXL_ASSERT(OutsideITBlock());
8343     MacroEmissionCheckScope guard(this);
8344     ITScope it_scope(this, &cond, guard);
8345     vpaddl(cond, dt, rd, rm);
8346   }
Vpaddl(DataType dt,DRegister rd,DRegister rm)8347   void Vpaddl(DataType dt, DRegister rd, DRegister rm) {
8348     Vpaddl(al, dt, rd, rm);
8349   }
8350 
Vpaddl(Condition cond,DataType dt,QRegister rd,QRegister rm)8351   void Vpaddl(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8352     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8353     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8354     VIXL_ASSERT(allow_macro_instructions_);
8355     VIXL_ASSERT(OutsideITBlock());
8356     MacroEmissionCheckScope guard(this);
8357     ITScope it_scope(this, &cond, guard);
8358     vpaddl(cond, dt, rd, rm);
8359   }
Vpaddl(DataType dt,QRegister rd,QRegister rm)8360   void Vpaddl(DataType dt, QRegister rd, QRegister rm) {
8361     Vpaddl(al, dt, rd, rm);
8362   }
8363 
Vpmax(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8364   void Vpmax(
8365       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8366     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8367     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8368     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8369     VIXL_ASSERT(allow_macro_instructions_);
8370     VIXL_ASSERT(OutsideITBlock());
8371     MacroEmissionCheckScope guard(this);
8372     ITScope it_scope(this, &cond, guard);
8373     vpmax(cond, dt, rd, rn, rm);
8374   }
Vpmax(DataType dt,DRegister rd,DRegister rn,DRegister rm)8375   void Vpmax(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8376     Vpmax(al, dt, rd, rn, rm);
8377   }
8378 
Vpmin(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8379   void Vpmin(
8380       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8381     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8382     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8383     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8384     VIXL_ASSERT(allow_macro_instructions_);
8385     VIXL_ASSERT(OutsideITBlock());
8386     MacroEmissionCheckScope guard(this);
8387     ITScope it_scope(this, &cond, guard);
8388     vpmin(cond, dt, rd, rn, rm);
8389   }
Vpmin(DataType dt,DRegister rd,DRegister rn,DRegister rm)8390   void Vpmin(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8391     Vpmin(al, dt, rd, rn, rm);
8392   }
8393 
Vpop(Condition cond,DataType dt,DRegisterList dreglist)8394   void Vpop(Condition cond, DataType dt, DRegisterList dreglist) {
8395     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
8396     VIXL_ASSERT(allow_macro_instructions_);
8397     VIXL_ASSERT(OutsideITBlock());
8398     MacroEmissionCheckScope guard(this);
8399     ITScope it_scope(this, &cond, guard);
8400     vpop(cond, dt, dreglist);
8401   }
Vpop(DataType dt,DRegisterList dreglist)8402   void Vpop(DataType dt, DRegisterList dreglist) { Vpop(al, dt, dreglist); }
Vpop(Condition cond,DRegisterList dreglist)8403   void Vpop(Condition cond, DRegisterList dreglist) {
8404     Vpop(cond, kDataTypeValueNone, dreglist);
8405   }
Vpop(DRegisterList dreglist)8406   void Vpop(DRegisterList dreglist) { Vpop(al, kDataTypeValueNone, dreglist); }
8407 
Vpop(Condition cond,DataType dt,SRegisterList sreglist)8408   void Vpop(Condition cond, DataType dt, SRegisterList sreglist) {
8409     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
8410     VIXL_ASSERT(allow_macro_instructions_);
8411     VIXL_ASSERT(OutsideITBlock());
8412     MacroEmissionCheckScope guard(this);
8413     ITScope it_scope(this, &cond, guard);
8414     vpop(cond, dt, sreglist);
8415   }
Vpop(DataType dt,SRegisterList sreglist)8416   void Vpop(DataType dt, SRegisterList sreglist) { Vpop(al, dt, sreglist); }
Vpop(Condition cond,SRegisterList sreglist)8417   void Vpop(Condition cond, SRegisterList sreglist) {
8418     Vpop(cond, kDataTypeValueNone, sreglist);
8419   }
Vpop(SRegisterList sreglist)8420   void Vpop(SRegisterList sreglist) { Vpop(al, kDataTypeValueNone, sreglist); }
8421 
Vpush(Condition cond,DataType dt,DRegisterList dreglist)8422   void Vpush(Condition cond, DataType dt, DRegisterList dreglist) {
8423     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
8424     VIXL_ASSERT(allow_macro_instructions_);
8425     VIXL_ASSERT(OutsideITBlock());
8426     MacroEmissionCheckScope guard(this);
8427     ITScope it_scope(this, &cond, guard);
8428     vpush(cond, dt, dreglist);
8429   }
Vpush(DataType dt,DRegisterList dreglist)8430   void Vpush(DataType dt, DRegisterList dreglist) { Vpush(al, dt, dreglist); }
Vpush(Condition cond,DRegisterList dreglist)8431   void Vpush(Condition cond, DRegisterList dreglist) {
8432     Vpush(cond, kDataTypeValueNone, dreglist);
8433   }
Vpush(DRegisterList dreglist)8434   void Vpush(DRegisterList dreglist) {
8435     Vpush(al, kDataTypeValueNone, dreglist);
8436   }
8437 
Vpush(Condition cond,DataType dt,SRegisterList sreglist)8438   void Vpush(Condition cond, DataType dt, SRegisterList sreglist) {
8439     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
8440     VIXL_ASSERT(allow_macro_instructions_);
8441     VIXL_ASSERT(OutsideITBlock());
8442     MacroEmissionCheckScope guard(this);
8443     ITScope it_scope(this, &cond, guard);
8444     vpush(cond, dt, sreglist);
8445   }
Vpush(DataType dt,SRegisterList sreglist)8446   void Vpush(DataType dt, SRegisterList sreglist) { Vpush(al, dt, sreglist); }
Vpush(Condition cond,SRegisterList sreglist)8447   void Vpush(Condition cond, SRegisterList sreglist) {
8448     Vpush(cond, kDataTypeValueNone, sreglist);
8449   }
Vpush(SRegisterList sreglist)8450   void Vpush(SRegisterList sreglist) {
8451     Vpush(al, kDataTypeValueNone, sreglist);
8452   }
8453 
Vqabs(Condition cond,DataType dt,DRegister rd,DRegister rm)8454   void Vqabs(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8455     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8456     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8457     VIXL_ASSERT(allow_macro_instructions_);
8458     VIXL_ASSERT(OutsideITBlock());
8459     MacroEmissionCheckScope guard(this);
8460     ITScope it_scope(this, &cond, guard);
8461     vqabs(cond, dt, rd, rm);
8462   }
Vqabs(DataType dt,DRegister rd,DRegister rm)8463   void Vqabs(DataType dt, DRegister rd, DRegister rm) { Vqabs(al, dt, rd, rm); }
8464 
Vqabs(Condition cond,DataType dt,QRegister rd,QRegister rm)8465   void Vqabs(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8466     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8467     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8468     VIXL_ASSERT(allow_macro_instructions_);
8469     VIXL_ASSERT(OutsideITBlock());
8470     MacroEmissionCheckScope guard(this);
8471     ITScope it_scope(this, &cond, guard);
8472     vqabs(cond, dt, rd, rm);
8473   }
Vqabs(DataType dt,QRegister rd,QRegister rm)8474   void Vqabs(DataType dt, QRegister rd, QRegister rm) { Vqabs(al, dt, rd, rm); }
8475 
Vqadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8476   void Vqadd(
8477       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8478     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8479     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8480     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8481     VIXL_ASSERT(allow_macro_instructions_);
8482     VIXL_ASSERT(OutsideITBlock());
8483     MacroEmissionCheckScope guard(this);
8484     ITScope it_scope(this, &cond, guard);
8485     vqadd(cond, dt, rd, rn, rm);
8486   }
Vqadd(DataType dt,DRegister rd,DRegister rn,DRegister rm)8487   void Vqadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8488     Vqadd(al, dt, rd, rn, rm);
8489   }
8490 
Vqadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)8491   void Vqadd(
8492       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8493     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8494     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8495     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8496     VIXL_ASSERT(allow_macro_instructions_);
8497     VIXL_ASSERT(OutsideITBlock());
8498     MacroEmissionCheckScope guard(this);
8499     ITScope it_scope(this, &cond, guard);
8500     vqadd(cond, dt, rd, rn, rm);
8501   }
Vqadd(DataType dt,QRegister rd,QRegister rn,QRegister rm)8502   void Vqadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8503     Vqadd(al, dt, rd, rn, rm);
8504   }
8505 
Vqdmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)8506   void Vqdmlal(
8507       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8508     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8509     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8510     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8511     VIXL_ASSERT(allow_macro_instructions_);
8512     VIXL_ASSERT(OutsideITBlock());
8513     MacroEmissionCheckScope guard(this);
8514     ITScope it_scope(this, &cond, guard);
8515     vqdmlal(cond, dt, rd, rn, rm);
8516   }
Vqdmlal(DataType dt,QRegister rd,DRegister rn,DRegister rm)8517   void Vqdmlal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8518     Vqdmlal(al, dt, rd, rn, rm);
8519   }
8520 
Vqdmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8521   void Vqdmlal(Condition cond,
8522                DataType dt,
8523                QRegister rd,
8524                DRegister rn,
8525                DRegister dm,
8526                unsigned index) {
8527     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8528     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8529     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8530     VIXL_ASSERT(allow_macro_instructions_);
8531     VIXL_ASSERT(OutsideITBlock());
8532     MacroEmissionCheckScope guard(this);
8533     ITScope it_scope(this, &cond, guard);
8534     vqdmlal(cond, dt, rd, rn, dm, index);
8535   }
Vqdmlal(DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8536   void Vqdmlal(
8537       DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
8538     Vqdmlal(al, dt, rd, rn, dm, index);
8539   }
8540 
Vqdmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)8541   void Vqdmlsl(
8542       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8543     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8544     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8545     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8546     VIXL_ASSERT(allow_macro_instructions_);
8547     VIXL_ASSERT(OutsideITBlock());
8548     MacroEmissionCheckScope guard(this);
8549     ITScope it_scope(this, &cond, guard);
8550     vqdmlsl(cond, dt, rd, rn, rm);
8551   }
Vqdmlsl(DataType dt,QRegister rd,DRegister rn,DRegister rm)8552   void Vqdmlsl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8553     Vqdmlsl(al, dt, rd, rn, rm);
8554   }
8555 
Vqdmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8556   void Vqdmlsl(Condition cond,
8557                DataType dt,
8558                QRegister rd,
8559                DRegister rn,
8560                DRegister dm,
8561                unsigned index) {
8562     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8563     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8564     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8565     VIXL_ASSERT(allow_macro_instructions_);
8566     VIXL_ASSERT(OutsideITBlock());
8567     MacroEmissionCheckScope guard(this);
8568     ITScope it_scope(this, &cond, guard);
8569     vqdmlsl(cond, dt, rd, rn, dm, index);
8570   }
Vqdmlsl(DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8571   void Vqdmlsl(
8572       DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
8573     Vqdmlsl(al, dt, rd, rn, dm, index);
8574   }
8575 
Vqdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8576   void Vqdmulh(
8577       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8578     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8579     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8580     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8581     VIXL_ASSERT(allow_macro_instructions_);
8582     VIXL_ASSERT(OutsideITBlock());
8583     MacroEmissionCheckScope guard(this);
8584     ITScope it_scope(this, &cond, guard);
8585     vqdmulh(cond, dt, rd, rn, rm);
8586   }
Vqdmulh(DataType dt,DRegister rd,DRegister rn,DRegister rm)8587   void Vqdmulh(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8588     Vqdmulh(al, dt, rd, rn, rm);
8589   }
8590 
Vqdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)8591   void Vqdmulh(
8592       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8593     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8594     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8595     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8596     VIXL_ASSERT(allow_macro_instructions_);
8597     VIXL_ASSERT(OutsideITBlock());
8598     MacroEmissionCheckScope guard(this);
8599     ITScope it_scope(this, &cond, guard);
8600     vqdmulh(cond, dt, rd, rn, rm);
8601   }
Vqdmulh(DataType dt,QRegister rd,QRegister rn,QRegister rm)8602   void Vqdmulh(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8603     Vqdmulh(al, dt, rd, rn, rm);
8604   }
8605 
Vqdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)8606   void Vqdmulh(Condition cond,
8607                DataType dt,
8608                DRegister rd,
8609                DRegister rn,
8610                DRegisterLane rm) {
8611     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8612     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8613     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8614     VIXL_ASSERT(allow_macro_instructions_);
8615     VIXL_ASSERT(OutsideITBlock());
8616     MacroEmissionCheckScope guard(this);
8617     ITScope it_scope(this, &cond, guard);
8618     vqdmulh(cond, dt, rd, rn, rm);
8619   }
Vqdmulh(DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)8620   void Vqdmulh(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
8621     Vqdmulh(al, dt, rd, rn, rm);
8622   }
8623 
Vqdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)8624   void Vqdmulh(Condition cond,
8625                DataType dt,
8626                QRegister rd,
8627                QRegister rn,
8628                DRegisterLane rm) {
8629     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8630     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8631     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8632     VIXL_ASSERT(allow_macro_instructions_);
8633     VIXL_ASSERT(OutsideITBlock());
8634     MacroEmissionCheckScope guard(this);
8635     ITScope it_scope(this, &cond, guard);
8636     vqdmulh(cond, dt, rd, rn, rm);
8637   }
Vqdmulh(DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)8638   void Vqdmulh(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
8639     Vqdmulh(al, dt, rd, rn, rm);
8640   }
8641 
Vqdmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)8642   void Vqdmull(
8643       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8644     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8645     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8646     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8647     VIXL_ASSERT(allow_macro_instructions_);
8648     VIXL_ASSERT(OutsideITBlock());
8649     MacroEmissionCheckScope guard(this);
8650     ITScope it_scope(this, &cond, guard);
8651     vqdmull(cond, dt, rd, rn, rm);
8652   }
Vqdmull(DataType dt,QRegister rd,DRegister rn,DRegister rm)8653   void Vqdmull(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8654     Vqdmull(al, dt, rd, rn, rm);
8655   }
8656 
Vqdmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)8657   void Vqdmull(Condition cond,
8658                DataType dt,
8659                QRegister rd,
8660                DRegister rn,
8661                DRegisterLane rm) {
8662     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8663     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8664     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8665     VIXL_ASSERT(allow_macro_instructions_);
8666     VIXL_ASSERT(OutsideITBlock());
8667     MacroEmissionCheckScope guard(this);
8668     ITScope it_scope(this, &cond, guard);
8669     vqdmull(cond, dt, rd, rn, rm);
8670   }
Vqdmull(DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)8671   void Vqdmull(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
8672     Vqdmull(al, dt, rd, rn, rm);
8673   }
8674 
Vqmovn(Condition cond,DataType dt,DRegister rd,QRegister rm)8675   void Vqmovn(Condition cond, DataType dt, DRegister rd, QRegister rm) {
8676     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8677     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8678     VIXL_ASSERT(allow_macro_instructions_);
8679     VIXL_ASSERT(OutsideITBlock());
8680     MacroEmissionCheckScope guard(this);
8681     ITScope it_scope(this, &cond, guard);
8682     vqmovn(cond, dt, rd, rm);
8683   }
Vqmovn(DataType dt,DRegister rd,QRegister rm)8684   void Vqmovn(DataType dt, DRegister rd, QRegister rm) {
8685     Vqmovn(al, dt, rd, rm);
8686   }
8687 
Vqmovun(Condition cond,DataType dt,DRegister rd,QRegister rm)8688   void Vqmovun(Condition cond, DataType dt, DRegister rd, QRegister rm) {
8689     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8690     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8691     VIXL_ASSERT(allow_macro_instructions_);
8692     VIXL_ASSERT(OutsideITBlock());
8693     MacroEmissionCheckScope guard(this);
8694     ITScope it_scope(this, &cond, guard);
8695     vqmovun(cond, dt, rd, rm);
8696   }
Vqmovun(DataType dt,DRegister rd,QRegister rm)8697   void Vqmovun(DataType dt, DRegister rd, QRegister rm) {
8698     Vqmovun(al, dt, rd, rm);
8699   }
8700 
Vqneg(Condition cond,DataType dt,DRegister rd,DRegister rm)8701   void Vqneg(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8702     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8703     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8704     VIXL_ASSERT(allow_macro_instructions_);
8705     VIXL_ASSERT(OutsideITBlock());
8706     MacroEmissionCheckScope guard(this);
8707     ITScope it_scope(this, &cond, guard);
8708     vqneg(cond, dt, rd, rm);
8709   }
Vqneg(DataType dt,DRegister rd,DRegister rm)8710   void Vqneg(DataType dt, DRegister rd, DRegister rm) { Vqneg(al, dt, rd, rm); }
8711 
Vqneg(Condition cond,DataType dt,QRegister rd,QRegister rm)8712   void Vqneg(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8713     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8714     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8715     VIXL_ASSERT(allow_macro_instructions_);
8716     VIXL_ASSERT(OutsideITBlock());
8717     MacroEmissionCheckScope guard(this);
8718     ITScope it_scope(this, &cond, guard);
8719     vqneg(cond, dt, rd, rm);
8720   }
Vqneg(DataType dt,QRegister rd,QRegister rm)8721   void Vqneg(DataType dt, QRegister rd, QRegister rm) { Vqneg(al, dt, rd, rm); }
8722 
Vqrdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8723   void Vqrdmulh(
8724       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8725     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8726     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8727     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8728     VIXL_ASSERT(allow_macro_instructions_);
8729     VIXL_ASSERT(OutsideITBlock());
8730     MacroEmissionCheckScope guard(this);
8731     ITScope it_scope(this, &cond, guard);
8732     vqrdmulh(cond, dt, rd, rn, rm);
8733   }
Vqrdmulh(DataType dt,DRegister rd,DRegister rn,DRegister rm)8734   void Vqrdmulh(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8735     Vqrdmulh(al, dt, rd, rn, rm);
8736   }
8737 
Vqrdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)8738   void Vqrdmulh(
8739       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8740     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8741     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8742     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8743     VIXL_ASSERT(allow_macro_instructions_);
8744     VIXL_ASSERT(OutsideITBlock());
8745     MacroEmissionCheckScope guard(this);
8746     ITScope it_scope(this, &cond, guard);
8747     vqrdmulh(cond, dt, rd, rn, rm);
8748   }
Vqrdmulh(DataType dt,QRegister rd,QRegister rn,QRegister rm)8749   void Vqrdmulh(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8750     Vqrdmulh(al, dt, rd, rn, rm);
8751   }
8752 
Vqrdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)8753   void Vqrdmulh(Condition cond,
8754                 DataType dt,
8755                 DRegister rd,
8756                 DRegister rn,
8757                 DRegisterLane rm) {
8758     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8759     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8760     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8761     VIXL_ASSERT(allow_macro_instructions_);
8762     VIXL_ASSERT(OutsideITBlock());
8763     MacroEmissionCheckScope guard(this);
8764     ITScope it_scope(this, &cond, guard);
8765     vqrdmulh(cond, dt, rd, rn, rm);
8766   }
Vqrdmulh(DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)8767   void Vqrdmulh(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
8768     Vqrdmulh(al, dt, rd, rn, rm);
8769   }
8770 
Vqrdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)8771   void Vqrdmulh(Condition cond,
8772                 DataType dt,
8773                 QRegister rd,
8774                 QRegister rn,
8775                 DRegisterLane rm) {
8776     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8777     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8778     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8779     VIXL_ASSERT(allow_macro_instructions_);
8780     VIXL_ASSERT(OutsideITBlock());
8781     MacroEmissionCheckScope guard(this);
8782     ITScope it_scope(this, &cond, guard);
8783     vqrdmulh(cond, dt, rd, rn, rm);
8784   }
Vqrdmulh(DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)8785   void Vqrdmulh(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
8786     Vqrdmulh(al, dt, rd, rn, rm);
8787   }
8788 
Vqrshl(Condition cond,DataType dt,DRegister rd,DRegister rm,DRegister rn)8789   void Vqrshl(
8790       Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
8791     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8792     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8793     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8794     VIXL_ASSERT(allow_macro_instructions_);
8795     VIXL_ASSERT(OutsideITBlock());
8796     MacroEmissionCheckScope guard(this);
8797     ITScope it_scope(this, &cond, guard);
8798     vqrshl(cond, dt, rd, rm, rn);
8799   }
Vqrshl(DataType dt,DRegister rd,DRegister rm,DRegister rn)8800   void Vqrshl(DataType dt, DRegister rd, DRegister rm, DRegister rn) {
8801     Vqrshl(al, dt, rd, rm, rn);
8802   }
8803 
Vqrshl(Condition cond,DataType dt,QRegister rd,QRegister rm,QRegister rn)8804   void Vqrshl(
8805       Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
8806     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8807     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8808     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8809     VIXL_ASSERT(allow_macro_instructions_);
8810     VIXL_ASSERT(OutsideITBlock());
8811     MacroEmissionCheckScope guard(this);
8812     ITScope it_scope(this, &cond, guard);
8813     vqrshl(cond, dt, rd, rm, rn);
8814   }
Vqrshl(DataType dt,QRegister rd,QRegister rm,QRegister rn)8815   void Vqrshl(DataType dt, QRegister rd, QRegister rm, QRegister rn) {
8816     Vqrshl(al, dt, rd, rm, rn);
8817   }
8818 
Vqrshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8819   void Vqrshrn(Condition cond,
8820                DataType dt,
8821                DRegister rd,
8822                QRegister rm,
8823                const QOperand& operand) {
8824     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8825     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8826     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8827     VIXL_ASSERT(allow_macro_instructions_);
8828     VIXL_ASSERT(OutsideITBlock());
8829     MacroEmissionCheckScope guard(this);
8830     ITScope it_scope(this, &cond, guard);
8831     vqrshrn(cond, dt, rd, rm, operand);
8832   }
Vqrshrn(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8833   void Vqrshrn(DataType dt,
8834                DRegister rd,
8835                QRegister rm,
8836                const QOperand& operand) {
8837     Vqrshrn(al, dt, rd, rm, operand);
8838   }
8839 
Vqrshrun(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8840   void Vqrshrun(Condition cond,
8841                 DataType dt,
8842                 DRegister rd,
8843                 QRegister rm,
8844                 const QOperand& operand) {
8845     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8846     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8847     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8848     VIXL_ASSERT(allow_macro_instructions_);
8849     VIXL_ASSERT(OutsideITBlock());
8850     MacroEmissionCheckScope guard(this);
8851     ITScope it_scope(this, &cond, guard);
8852     vqrshrun(cond, dt, rd, rm, operand);
8853   }
Vqrshrun(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8854   void Vqrshrun(DataType dt,
8855                 DRegister rd,
8856                 QRegister rm,
8857                 const QOperand& operand) {
8858     Vqrshrun(al, dt, rd, rm, operand);
8859   }
8860 
Vqshl(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)8861   void Vqshl(Condition cond,
8862              DataType dt,
8863              DRegister rd,
8864              DRegister rm,
8865              const DOperand& operand) {
8866     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8867     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8868     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8869     VIXL_ASSERT(allow_macro_instructions_);
8870     VIXL_ASSERT(OutsideITBlock());
8871     MacroEmissionCheckScope guard(this);
8872     ITScope it_scope(this, &cond, guard);
8873     vqshl(cond, dt, rd, rm, operand);
8874   }
Vqshl(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)8875   void Vqshl(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
8876     Vqshl(al, dt, rd, rm, operand);
8877   }
8878 
Vqshl(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)8879   void Vqshl(Condition cond,
8880              DataType dt,
8881              QRegister rd,
8882              QRegister rm,
8883              const QOperand& operand) {
8884     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8885     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8886     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8887     VIXL_ASSERT(allow_macro_instructions_);
8888     VIXL_ASSERT(OutsideITBlock());
8889     MacroEmissionCheckScope guard(this);
8890     ITScope it_scope(this, &cond, guard);
8891     vqshl(cond, dt, rd, rm, operand);
8892   }
Vqshl(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)8893   void Vqshl(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
8894     Vqshl(al, dt, rd, rm, operand);
8895   }
8896 
Vqshlu(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)8897   void Vqshlu(Condition cond,
8898               DataType dt,
8899               DRegister rd,
8900               DRegister rm,
8901               const DOperand& operand) {
8902     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8903     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8904     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8905     VIXL_ASSERT(allow_macro_instructions_);
8906     VIXL_ASSERT(OutsideITBlock());
8907     MacroEmissionCheckScope guard(this);
8908     ITScope it_scope(this, &cond, guard);
8909     vqshlu(cond, dt, rd, rm, operand);
8910   }
Vqshlu(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)8911   void Vqshlu(DataType dt,
8912               DRegister rd,
8913               DRegister rm,
8914               const DOperand& operand) {
8915     Vqshlu(al, dt, rd, rm, operand);
8916   }
8917 
Vqshlu(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)8918   void Vqshlu(Condition cond,
8919               DataType dt,
8920               QRegister rd,
8921               QRegister rm,
8922               const QOperand& operand) {
8923     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8924     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8925     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8926     VIXL_ASSERT(allow_macro_instructions_);
8927     VIXL_ASSERT(OutsideITBlock());
8928     MacroEmissionCheckScope guard(this);
8929     ITScope it_scope(this, &cond, guard);
8930     vqshlu(cond, dt, rd, rm, operand);
8931   }
Vqshlu(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)8932   void Vqshlu(DataType dt,
8933               QRegister rd,
8934               QRegister rm,
8935               const QOperand& operand) {
8936     Vqshlu(al, dt, rd, rm, operand);
8937   }
8938 
Vqshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8939   void Vqshrn(Condition cond,
8940               DataType dt,
8941               DRegister rd,
8942               QRegister rm,
8943               const QOperand& operand) {
8944     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8945     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8946     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8947     VIXL_ASSERT(allow_macro_instructions_);
8948     VIXL_ASSERT(OutsideITBlock());
8949     MacroEmissionCheckScope guard(this);
8950     ITScope it_scope(this, &cond, guard);
8951     vqshrn(cond, dt, rd, rm, operand);
8952   }
Vqshrn(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8953   void Vqshrn(DataType dt,
8954               DRegister rd,
8955               QRegister rm,
8956               const QOperand& operand) {
8957     Vqshrn(al, dt, rd, rm, operand);
8958   }
8959 
Vqshrun(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8960   void Vqshrun(Condition cond,
8961                DataType dt,
8962                DRegister rd,
8963                QRegister rm,
8964                const QOperand& operand) {
8965     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8966     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8967     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8968     VIXL_ASSERT(allow_macro_instructions_);
8969     VIXL_ASSERT(OutsideITBlock());
8970     MacroEmissionCheckScope guard(this);
8971     ITScope it_scope(this, &cond, guard);
8972     vqshrun(cond, dt, rd, rm, operand);
8973   }
Vqshrun(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8974   void Vqshrun(DataType dt,
8975                DRegister rd,
8976                QRegister rm,
8977                const QOperand& operand) {
8978     Vqshrun(al, dt, rd, rm, operand);
8979   }
8980 
Vqsub(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8981   void Vqsub(
8982       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8983     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8984     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8985     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8986     VIXL_ASSERT(allow_macro_instructions_);
8987     VIXL_ASSERT(OutsideITBlock());
8988     MacroEmissionCheckScope guard(this);
8989     ITScope it_scope(this, &cond, guard);
8990     vqsub(cond, dt, rd, rn, rm);
8991   }
Vqsub(DataType dt,DRegister rd,DRegister rn,DRegister rm)8992   void Vqsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8993     Vqsub(al, dt, rd, rn, rm);
8994   }
8995 
Vqsub(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)8996   void Vqsub(
8997       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8998     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8999     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9000     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9001     VIXL_ASSERT(allow_macro_instructions_);
9002     VIXL_ASSERT(OutsideITBlock());
9003     MacroEmissionCheckScope guard(this);
9004     ITScope it_scope(this, &cond, guard);
9005     vqsub(cond, dt, rd, rn, rm);
9006   }
Vqsub(DataType dt,QRegister rd,QRegister rn,QRegister rm)9007   void Vqsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9008     Vqsub(al, dt, rd, rn, rm);
9009   }
9010 
Vraddhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)9011   void Vraddhn(
9012       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9013     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9014     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9015     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9016     VIXL_ASSERT(allow_macro_instructions_);
9017     VIXL_ASSERT(OutsideITBlock());
9018     MacroEmissionCheckScope guard(this);
9019     ITScope it_scope(this, &cond, guard);
9020     vraddhn(cond, dt, rd, rn, rm);
9021   }
Vraddhn(DataType dt,DRegister rd,QRegister rn,QRegister rm)9022   void Vraddhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9023     Vraddhn(al, dt, rd, rn, rm);
9024   }
9025 
Vrecpe(Condition cond,DataType dt,DRegister rd,DRegister rm)9026   void Vrecpe(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9027     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9028     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9029     VIXL_ASSERT(allow_macro_instructions_);
9030     VIXL_ASSERT(OutsideITBlock());
9031     MacroEmissionCheckScope guard(this);
9032     ITScope it_scope(this, &cond, guard);
9033     vrecpe(cond, dt, rd, rm);
9034   }
Vrecpe(DataType dt,DRegister rd,DRegister rm)9035   void Vrecpe(DataType dt, DRegister rd, DRegister rm) {
9036     Vrecpe(al, dt, rd, rm);
9037   }
9038 
Vrecpe(Condition cond,DataType dt,QRegister rd,QRegister rm)9039   void Vrecpe(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9040     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9041     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9042     VIXL_ASSERT(allow_macro_instructions_);
9043     VIXL_ASSERT(OutsideITBlock());
9044     MacroEmissionCheckScope guard(this);
9045     ITScope it_scope(this, &cond, guard);
9046     vrecpe(cond, dt, rd, rm);
9047   }
Vrecpe(DataType dt,QRegister rd,QRegister rm)9048   void Vrecpe(DataType dt, QRegister rd, QRegister rm) {
9049     Vrecpe(al, dt, rd, rm);
9050   }
9051 
Vrecps(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)9052   void Vrecps(
9053       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9054     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9055     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9056     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9057     VIXL_ASSERT(allow_macro_instructions_);
9058     VIXL_ASSERT(OutsideITBlock());
9059     MacroEmissionCheckScope guard(this);
9060     ITScope it_scope(this, &cond, guard);
9061     vrecps(cond, dt, rd, rn, rm);
9062   }
Vrecps(DataType dt,DRegister rd,DRegister rn,DRegister rm)9063   void Vrecps(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9064     Vrecps(al, dt, rd, rn, rm);
9065   }
9066 
Vrecps(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)9067   void Vrecps(
9068       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9069     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9070     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9071     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9072     VIXL_ASSERT(allow_macro_instructions_);
9073     VIXL_ASSERT(OutsideITBlock());
9074     MacroEmissionCheckScope guard(this);
9075     ITScope it_scope(this, &cond, guard);
9076     vrecps(cond, dt, rd, rn, rm);
9077   }
Vrecps(DataType dt,QRegister rd,QRegister rn,QRegister rm)9078   void Vrecps(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9079     Vrecps(al, dt, rd, rn, rm);
9080   }
9081 
Vrev16(Condition cond,DataType dt,DRegister rd,DRegister rm)9082   void Vrev16(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9083     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9084     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9085     VIXL_ASSERT(allow_macro_instructions_);
9086     VIXL_ASSERT(OutsideITBlock());
9087     MacroEmissionCheckScope guard(this);
9088     ITScope it_scope(this, &cond, guard);
9089     vrev16(cond, dt, rd, rm);
9090   }
Vrev16(DataType dt,DRegister rd,DRegister rm)9091   void Vrev16(DataType dt, DRegister rd, DRegister rm) {
9092     Vrev16(al, dt, rd, rm);
9093   }
9094 
Vrev16(Condition cond,DataType dt,QRegister rd,QRegister rm)9095   void Vrev16(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9096     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9097     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9098     VIXL_ASSERT(allow_macro_instructions_);
9099     VIXL_ASSERT(OutsideITBlock());
9100     MacroEmissionCheckScope guard(this);
9101     ITScope it_scope(this, &cond, guard);
9102     vrev16(cond, dt, rd, rm);
9103   }
Vrev16(DataType dt,QRegister rd,QRegister rm)9104   void Vrev16(DataType dt, QRegister rd, QRegister rm) {
9105     Vrev16(al, dt, rd, rm);
9106   }
9107 
Vrev32(Condition cond,DataType dt,DRegister rd,DRegister rm)9108   void Vrev32(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9109     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9110     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9111     VIXL_ASSERT(allow_macro_instructions_);
9112     VIXL_ASSERT(OutsideITBlock());
9113     MacroEmissionCheckScope guard(this);
9114     ITScope it_scope(this, &cond, guard);
9115     vrev32(cond, dt, rd, rm);
9116   }
Vrev32(DataType dt,DRegister rd,DRegister rm)9117   void Vrev32(DataType dt, DRegister rd, DRegister rm) {
9118     Vrev32(al, dt, rd, rm);
9119   }
9120 
Vrev32(Condition cond,DataType dt,QRegister rd,QRegister rm)9121   void Vrev32(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9122     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9123     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9124     VIXL_ASSERT(allow_macro_instructions_);
9125     VIXL_ASSERT(OutsideITBlock());
9126     MacroEmissionCheckScope guard(this);
9127     ITScope it_scope(this, &cond, guard);
9128     vrev32(cond, dt, rd, rm);
9129   }
Vrev32(DataType dt,QRegister rd,QRegister rm)9130   void Vrev32(DataType dt, QRegister rd, QRegister rm) {
9131     Vrev32(al, dt, rd, rm);
9132   }
9133 
Vrev64(Condition cond,DataType dt,DRegister rd,DRegister rm)9134   void Vrev64(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9135     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9136     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9137     VIXL_ASSERT(allow_macro_instructions_);
9138     VIXL_ASSERT(OutsideITBlock());
9139     MacroEmissionCheckScope guard(this);
9140     ITScope it_scope(this, &cond, guard);
9141     vrev64(cond, dt, rd, rm);
9142   }
Vrev64(DataType dt,DRegister rd,DRegister rm)9143   void Vrev64(DataType dt, DRegister rd, DRegister rm) {
9144     Vrev64(al, dt, rd, rm);
9145   }
9146 
Vrev64(Condition cond,DataType dt,QRegister rd,QRegister rm)9147   void Vrev64(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9148     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9149     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9150     VIXL_ASSERT(allow_macro_instructions_);
9151     VIXL_ASSERT(OutsideITBlock());
9152     MacroEmissionCheckScope guard(this);
9153     ITScope it_scope(this, &cond, guard);
9154     vrev64(cond, dt, rd, rm);
9155   }
Vrev64(DataType dt,QRegister rd,QRegister rm)9156   void Vrev64(DataType dt, QRegister rd, QRegister rm) {
9157     Vrev64(al, dt, rd, rm);
9158   }
9159 
Vrhadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)9160   void Vrhadd(
9161       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9162     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9163     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9164     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9165     VIXL_ASSERT(allow_macro_instructions_);
9166     VIXL_ASSERT(OutsideITBlock());
9167     MacroEmissionCheckScope guard(this);
9168     ITScope it_scope(this, &cond, guard);
9169     vrhadd(cond, dt, rd, rn, rm);
9170   }
Vrhadd(DataType dt,DRegister rd,DRegister rn,DRegister rm)9171   void Vrhadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9172     Vrhadd(al, dt, rd, rn, rm);
9173   }
9174 
Vrhadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)9175   void Vrhadd(
9176       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9177     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9178     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9179     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9180     VIXL_ASSERT(allow_macro_instructions_);
9181     VIXL_ASSERT(OutsideITBlock());
9182     MacroEmissionCheckScope guard(this);
9183     ITScope it_scope(this, &cond, guard);
9184     vrhadd(cond, dt, rd, rn, rm);
9185   }
Vrhadd(DataType dt,QRegister rd,QRegister rn,QRegister rm)9186   void Vrhadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9187     Vrhadd(al, dt, rd, rn, rm);
9188   }
9189 
Vrinta(DataType dt,DRegister rd,DRegister rm)9190   void Vrinta(DataType dt, DRegister rd, DRegister rm) {
9191     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9192     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9193     VIXL_ASSERT(allow_macro_instructions_);
9194     VIXL_ASSERT(OutsideITBlock());
9195     MacroEmissionCheckScope guard(this);
9196     vrinta(dt, rd, rm);
9197   }
9198 
Vrinta(DataType dt,QRegister rd,QRegister rm)9199   void Vrinta(DataType dt, QRegister rd, QRegister rm) {
9200     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9201     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9202     VIXL_ASSERT(allow_macro_instructions_);
9203     VIXL_ASSERT(OutsideITBlock());
9204     MacroEmissionCheckScope guard(this);
9205     vrinta(dt, rd, rm);
9206   }
9207 
Vrinta(DataType dt,SRegister rd,SRegister rm)9208   void Vrinta(DataType dt, SRegister rd, SRegister rm) {
9209     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9210     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9211     VIXL_ASSERT(allow_macro_instructions_);
9212     VIXL_ASSERT(OutsideITBlock());
9213     MacroEmissionCheckScope guard(this);
9214     vrinta(dt, rd, rm);
9215   }
9216 
Vrintm(DataType dt,DRegister rd,DRegister rm)9217   void Vrintm(DataType dt, DRegister rd, DRegister rm) {
9218     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9219     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9220     VIXL_ASSERT(allow_macro_instructions_);
9221     VIXL_ASSERT(OutsideITBlock());
9222     MacroEmissionCheckScope guard(this);
9223     vrintm(dt, rd, rm);
9224   }
9225 
Vrintm(DataType dt,QRegister rd,QRegister rm)9226   void Vrintm(DataType dt, QRegister rd, QRegister rm) {
9227     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9228     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9229     VIXL_ASSERT(allow_macro_instructions_);
9230     VIXL_ASSERT(OutsideITBlock());
9231     MacroEmissionCheckScope guard(this);
9232     vrintm(dt, rd, rm);
9233   }
9234 
Vrintm(DataType dt,SRegister rd,SRegister rm)9235   void Vrintm(DataType dt, SRegister rd, SRegister rm) {
9236     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9237     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9238     VIXL_ASSERT(allow_macro_instructions_);
9239     VIXL_ASSERT(OutsideITBlock());
9240     MacroEmissionCheckScope guard(this);
9241     vrintm(dt, rd, rm);
9242   }
9243 
Vrintn(DataType dt,DRegister rd,DRegister rm)9244   void Vrintn(DataType dt, DRegister rd, DRegister rm) {
9245     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9246     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9247     VIXL_ASSERT(allow_macro_instructions_);
9248     VIXL_ASSERT(OutsideITBlock());
9249     MacroEmissionCheckScope guard(this);
9250     vrintn(dt, rd, rm);
9251   }
9252 
Vrintn(DataType dt,QRegister rd,QRegister rm)9253   void Vrintn(DataType dt, QRegister rd, QRegister rm) {
9254     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9255     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9256     VIXL_ASSERT(allow_macro_instructions_);
9257     VIXL_ASSERT(OutsideITBlock());
9258     MacroEmissionCheckScope guard(this);
9259     vrintn(dt, rd, rm);
9260   }
9261 
Vrintn(DataType dt,SRegister rd,SRegister rm)9262   void Vrintn(DataType dt, SRegister rd, SRegister rm) {
9263     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9264     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9265     VIXL_ASSERT(allow_macro_instructions_);
9266     VIXL_ASSERT(OutsideITBlock());
9267     MacroEmissionCheckScope guard(this);
9268     vrintn(dt, rd, rm);
9269   }
9270 
Vrintp(DataType dt,DRegister rd,DRegister rm)9271   void Vrintp(DataType dt, DRegister rd, DRegister rm) {
9272     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9273     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9274     VIXL_ASSERT(allow_macro_instructions_);
9275     VIXL_ASSERT(OutsideITBlock());
9276     MacroEmissionCheckScope guard(this);
9277     vrintp(dt, rd, rm);
9278   }
9279 
Vrintp(DataType dt,QRegister rd,QRegister rm)9280   void Vrintp(DataType dt, QRegister rd, QRegister rm) {
9281     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9282     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9283     VIXL_ASSERT(allow_macro_instructions_);
9284     VIXL_ASSERT(OutsideITBlock());
9285     MacroEmissionCheckScope guard(this);
9286     vrintp(dt, rd, rm);
9287   }
9288 
Vrintp(DataType dt,SRegister rd,SRegister rm)9289   void Vrintp(DataType dt, SRegister rd, SRegister rm) {
9290     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9291     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9292     VIXL_ASSERT(allow_macro_instructions_);
9293     VIXL_ASSERT(OutsideITBlock());
9294     MacroEmissionCheckScope guard(this);
9295     vrintp(dt, rd, rm);
9296   }
9297 
Vrintr(Condition cond,DataType dt,SRegister rd,SRegister rm)9298   void Vrintr(Condition cond, DataType dt, SRegister rd, SRegister rm) {
9299     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9300     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9301     VIXL_ASSERT(allow_macro_instructions_);
9302     VIXL_ASSERT(OutsideITBlock());
9303     MacroEmissionCheckScope guard(this);
9304     ITScope it_scope(this, &cond, guard);
9305     vrintr(cond, dt, rd, rm);
9306   }
Vrintr(DataType dt,SRegister rd,SRegister rm)9307   void Vrintr(DataType dt, SRegister rd, SRegister rm) {
9308     Vrintr(al, dt, rd, rm);
9309   }
9310 
Vrintr(Condition cond,DataType dt,DRegister rd,DRegister rm)9311   void Vrintr(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9312     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9313     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9314     VIXL_ASSERT(allow_macro_instructions_);
9315     VIXL_ASSERT(OutsideITBlock());
9316     MacroEmissionCheckScope guard(this);
9317     ITScope it_scope(this, &cond, guard);
9318     vrintr(cond, dt, rd, rm);
9319   }
Vrintr(DataType dt,DRegister rd,DRegister rm)9320   void Vrintr(DataType dt, DRegister rd, DRegister rm) {
9321     Vrintr(al, dt, rd, rm);
9322   }
9323 
Vrintx(Condition cond,DataType dt,DRegister rd,DRegister rm)9324   void Vrintx(Condition cond, DataType dt, DRegister rd, DRegister 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     ITScope it_scope(this, &cond, guard);
9331     vrintx(cond, dt, rd, rm);
9332   }
Vrintx(DataType dt,DRegister rd,DRegister rm)9333   void Vrintx(DataType dt, DRegister rd, DRegister rm) {
9334     Vrintx(al, dt, rd, rm);
9335   }
9336 
Vrintx(DataType dt,QRegister rd,QRegister rm)9337   void Vrintx(DataType dt, QRegister rd, QRegister rm) {
9338     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9339     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9340     VIXL_ASSERT(allow_macro_instructions_);
9341     VIXL_ASSERT(OutsideITBlock());
9342     MacroEmissionCheckScope guard(this);
9343     vrintx(dt, rd, rm);
9344   }
9345 
Vrintx(Condition cond,DataType dt,SRegister rd,SRegister rm)9346   void Vrintx(Condition cond, DataType dt, SRegister rd, SRegister rm) {
9347     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9348     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9349     VIXL_ASSERT(allow_macro_instructions_);
9350     VIXL_ASSERT(OutsideITBlock());
9351     MacroEmissionCheckScope guard(this);
9352     ITScope it_scope(this, &cond, guard);
9353     vrintx(cond, dt, rd, rm);
9354   }
Vrintx(DataType dt,SRegister rd,SRegister rm)9355   void Vrintx(DataType dt, SRegister rd, SRegister rm) {
9356     Vrintx(al, dt, rd, rm);
9357   }
9358 
Vrintz(Condition cond,DataType dt,DRegister rd,DRegister rm)9359   void Vrintz(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9360     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9361     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9362     VIXL_ASSERT(allow_macro_instructions_);
9363     VIXL_ASSERT(OutsideITBlock());
9364     MacroEmissionCheckScope guard(this);
9365     ITScope it_scope(this, &cond, guard);
9366     vrintz(cond, dt, rd, rm);
9367   }
Vrintz(DataType dt,DRegister rd,DRegister rm)9368   void Vrintz(DataType dt, DRegister rd, DRegister rm) {
9369     Vrintz(al, dt, rd, rm);
9370   }
9371 
Vrintz(DataType dt,QRegister rd,QRegister rm)9372   void Vrintz(DataType dt, QRegister rd, QRegister rm) {
9373     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9374     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9375     VIXL_ASSERT(allow_macro_instructions_);
9376     VIXL_ASSERT(OutsideITBlock());
9377     MacroEmissionCheckScope guard(this);
9378     vrintz(dt, rd, rm);
9379   }
9380 
Vrintz(Condition cond,DataType dt,SRegister rd,SRegister rm)9381   void Vrintz(Condition cond, DataType dt, SRegister rd, SRegister rm) {
9382     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9383     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9384     VIXL_ASSERT(allow_macro_instructions_);
9385     VIXL_ASSERT(OutsideITBlock());
9386     MacroEmissionCheckScope guard(this);
9387     ITScope it_scope(this, &cond, guard);
9388     vrintz(cond, dt, rd, rm);
9389   }
Vrintz(DataType dt,SRegister rd,SRegister rm)9390   void Vrintz(DataType dt, SRegister rd, SRegister rm) {
9391     Vrintz(al, dt, rd, rm);
9392   }
9393 
Vrshl(Condition cond,DataType dt,DRegister rd,DRegister rm,DRegister rn)9394   void Vrshl(
9395       Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
9396     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9397     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9398     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9399     VIXL_ASSERT(allow_macro_instructions_);
9400     VIXL_ASSERT(OutsideITBlock());
9401     MacroEmissionCheckScope guard(this);
9402     ITScope it_scope(this, &cond, guard);
9403     vrshl(cond, dt, rd, rm, rn);
9404   }
Vrshl(DataType dt,DRegister rd,DRegister rm,DRegister rn)9405   void Vrshl(DataType dt, DRegister rd, DRegister rm, DRegister rn) {
9406     Vrshl(al, dt, rd, rm, rn);
9407   }
9408 
Vrshl(Condition cond,DataType dt,QRegister rd,QRegister rm,QRegister rn)9409   void Vrshl(
9410       Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
9411     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9412     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9413     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9414     VIXL_ASSERT(allow_macro_instructions_);
9415     VIXL_ASSERT(OutsideITBlock());
9416     MacroEmissionCheckScope guard(this);
9417     ITScope it_scope(this, &cond, guard);
9418     vrshl(cond, dt, rd, rm, rn);
9419   }
Vrshl(DataType dt,QRegister rd,QRegister rm,QRegister rn)9420   void Vrshl(DataType dt, QRegister rd, QRegister rm, QRegister rn) {
9421     Vrshl(al, dt, rd, rm, rn);
9422   }
9423 
Vrshr(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9424   void Vrshr(Condition cond,
9425              DataType dt,
9426              DRegister rd,
9427              DRegister rm,
9428              const DOperand& operand) {
9429     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9430     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9431     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9432     VIXL_ASSERT(allow_macro_instructions_);
9433     VIXL_ASSERT(OutsideITBlock());
9434     MacroEmissionCheckScope guard(this);
9435     ITScope it_scope(this, &cond, guard);
9436     vrshr(cond, dt, rd, rm, operand);
9437   }
Vrshr(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9438   void Vrshr(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9439     Vrshr(al, dt, rd, rm, operand);
9440   }
9441 
Vrshr(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9442   void Vrshr(Condition cond,
9443              DataType dt,
9444              QRegister rd,
9445              QRegister rm,
9446              const QOperand& operand) {
9447     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9448     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9449     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9450     VIXL_ASSERT(allow_macro_instructions_);
9451     VIXL_ASSERT(OutsideITBlock());
9452     MacroEmissionCheckScope guard(this);
9453     ITScope it_scope(this, &cond, guard);
9454     vrshr(cond, dt, rd, rm, operand);
9455   }
Vrshr(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9456   void Vrshr(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9457     Vrshr(al, dt, rd, rm, operand);
9458   }
9459 
Vrshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9460   void Vrshrn(Condition cond,
9461               DataType dt,
9462               DRegister rd,
9463               QRegister rm,
9464               const QOperand& operand) {
9465     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9466     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9467     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9468     VIXL_ASSERT(allow_macro_instructions_);
9469     VIXL_ASSERT(OutsideITBlock());
9470     MacroEmissionCheckScope guard(this);
9471     ITScope it_scope(this, &cond, guard);
9472     vrshrn(cond, dt, rd, rm, operand);
9473   }
Vrshrn(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9474   void Vrshrn(DataType dt,
9475               DRegister rd,
9476               QRegister rm,
9477               const QOperand& operand) {
9478     Vrshrn(al, dt, rd, rm, operand);
9479   }
9480 
Vrsqrte(Condition cond,DataType dt,DRegister rd,DRegister rm)9481   void Vrsqrte(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9482     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9483     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9484     VIXL_ASSERT(allow_macro_instructions_);
9485     VIXL_ASSERT(OutsideITBlock());
9486     MacroEmissionCheckScope guard(this);
9487     ITScope it_scope(this, &cond, guard);
9488     vrsqrte(cond, dt, rd, rm);
9489   }
Vrsqrte(DataType dt,DRegister rd,DRegister rm)9490   void Vrsqrte(DataType dt, DRegister rd, DRegister rm) {
9491     Vrsqrte(al, dt, rd, rm);
9492   }
9493 
Vrsqrte(Condition cond,DataType dt,QRegister rd,QRegister rm)9494   void Vrsqrte(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9495     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9496     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9497     VIXL_ASSERT(allow_macro_instructions_);
9498     VIXL_ASSERT(OutsideITBlock());
9499     MacroEmissionCheckScope guard(this);
9500     ITScope it_scope(this, &cond, guard);
9501     vrsqrte(cond, dt, rd, rm);
9502   }
Vrsqrte(DataType dt,QRegister rd,QRegister rm)9503   void Vrsqrte(DataType dt, QRegister rd, QRegister rm) {
9504     Vrsqrte(al, dt, rd, rm);
9505   }
9506 
Vrsqrts(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)9507   void Vrsqrts(
9508       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9509     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9510     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9511     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9512     VIXL_ASSERT(allow_macro_instructions_);
9513     VIXL_ASSERT(OutsideITBlock());
9514     MacroEmissionCheckScope guard(this);
9515     ITScope it_scope(this, &cond, guard);
9516     vrsqrts(cond, dt, rd, rn, rm);
9517   }
Vrsqrts(DataType dt,DRegister rd,DRegister rn,DRegister rm)9518   void Vrsqrts(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9519     Vrsqrts(al, dt, rd, rn, rm);
9520   }
9521 
Vrsqrts(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)9522   void Vrsqrts(
9523       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9524     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9525     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9526     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9527     VIXL_ASSERT(allow_macro_instructions_);
9528     VIXL_ASSERT(OutsideITBlock());
9529     MacroEmissionCheckScope guard(this);
9530     ITScope it_scope(this, &cond, guard);
9531     vrsqrts(cond, dt, rd, rn, rm);
9532   }
Vrsqrts(DataType dt,QRegister rd,QRegister rn,QRegister rm)9533   void Vrsqrts(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9534     Vrsqrts(al, dt, rd, rn, rm);
9535   }
9536 
Vrsra(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9537   void Vrsra(Condition cond,
9538              DataType dt,
9539              DRegister rd,
9540              DRegister rm,
9541              const DOperand& operand) {
9542     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9543     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9544     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9545     VIXL_ASSERT(allow_macro_instructions_);
9546     VIXL_ASSERT(OutsideITBlock());
9547     MacroEmissionCheckScope guard(this);
9548     ITScope it_scope(this, &cond, guard);
9549     vrsra(cond, dt, rd, rm, operand);
9550   }
Vrsra(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9551   void Vrsra(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9552     Vrsra(al, dt, rd, rm, operand);
9553   }
9554 
Vrsra(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9555   void Vrsra(Condition cond,
9556              DataType dt,
9557              QRegister rd,
9558              QRegister rm,
9559              const QOperand& operand) {
9560     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9561     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9562     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9563     VIXL_ASSERT(allow_macro_instructions_);
9564     VIXL_ASSERT(OutsideITBlock());
9565     MacroEmissionCheckScope guard(this);
9566     ITScope it_scope(this, &cond, guard);
9567     vrsra(cond, dt, rd, rm, operand);
9568   }
Vrsra(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9569   void Vrsra(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9570     Vrsra(al, dt, rd, rm, operand);
9571   }
9572 
Vrsubhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)9573   void Vrsubhn(
9574       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9575     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9576     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9577     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9578     VIXL_ASSERT(allow_macro_instructions_);
9579     VIXL_ASSERT(OutsideITBlock());
9580     MacroEmissionCheckScope guard(this);
9581     ITScope it_scope(this, &cond, guard);
9582     vrsubhn(cond, dt, rd, rn, rm);
9583   }
Vrsubhn(DataType dt,DRegister rd,QRegister rn,QRegister rm)9584   void Vrsubhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9585     Vrsubhn(al, dt, rd, rn, rm);
9586   }
9587 
Vseleq(DataType dt,DRegister rd,DRegister rn,DRegister rm)9588   void Vseleq(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9589     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9590     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9591     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9592     VIXL_ASSERT(allow_macro_instructions_);
9593     VIXL_ASSERT(OutsideITBlock());
9594     MacroEmissionCheckScope guard(this);
9595     vseleq(dt, rd, rn, rm);
9596   }
9597 
Vseleq(DataType dt,SRegister rd,SRegister rn,SRegister rm)9598   void Vseleq(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9599     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9600     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9601     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9602     VIXL_ASSERT(allow_macro_instructions_);
9603     VIXL_ASSERT(OutsideITBlock());
9604     MacroEmissionCheckScope guard(this);
9605     vseleq(dt, rd, rn, rm);
9606   }
9607 
Vselge(DataType dt,DRegister rd,DRegister rn,DRegister rm)9608   void Vselge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9609     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9610     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9611     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9612     VIXL_ASSERT(allow_macro_instructions_);
9613     VIXL_ASSERT(OutsideITBlock());
9614     MacroEmissionCheckScope guard(this);
9615     vselge(dt, rd, rn, rm);
9616   }
9617 
Vselge(DataType dt,SRegister rd,SRegister rn,SRegister rm)9618   void Vselge(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9619     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9620     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9621     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9622     VIXL_ASSERT(allow_macro_instructions_);
9623     VIXL_ASSERT(OutsideITBlock());
9624     MacroEmissionCheckScope guard(this);
9625     vselge(dt, rd, rn, rm);
9626   }
9627 
Vselgt(DataType dt,DRegister rd,DRegister rn,DRegister rm)9628   void Vselgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9629     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9630     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9631     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9632     VIXL_ASSERT(allow_macro_instructions_);
9633     VIXL_ASSERT(OutsideITBlock());
9634     MacroEmissionCheckScope guard(this);
9635     vselgt(dt, rd, rn, rm);
9636   }
9637 
Vselgt(DataType dt,SRegister rd,SRegister rn,SRegister rm)9638   void Vselgt(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9639     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9640     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9641     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9642     VIXL_ASSERT(allow_macro_instructions_);
9643     VIXL_ASSERT(OutsideITBlock());
9644     MacroEmissionCheckScope guard(this);
9645     vselgt(dt, rd, rn, rm);
9646   }
9647 
Vselvs(DataType dt,DRegister rd,DRegister rn,DRegister rm)9648   void Vselvs(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9649     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9650     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9651     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9652     VIXL_ASSERT(allow_macro_instructions_);
9653     VIXL_ASSERT(OutsideITBlock());
9654     MacroEmissionCheckScope guard(this);
9655     vselvs(dt, rd, rn, rm);
9656   }
9657 
Vselvs(DataType dt,SRegister rd,SRegister rn,SRegister rm)9658   void Vselvs(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9659     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9660     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9661     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9662     VIXL_ASSERT(allow_macro_instructions_);
9663     VIXL_ASSERT(OutsideITBlock());
9664     MacroEmissionCheckScope guard(this);
9665     vselvs(dt, rd, rn, rm);
9666   }
9667 
Vshl(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9668   void Vshl(Condition cond,
9669             DataType dt,
9670             DRegister rd,
9671             DRegister rm,
9672             const DOperand& operand) {
9673     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9674     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9675     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9676     VIXL_ASSERT(allow_macro_instructions_);
9677     VIXL_ASSERT(OutsideITBlock());
9678     MacroEmissionCheckScope guard(this);
9679     ITScope it_scope(this, &cond, guard);
9680     vshl(cond, dt, rd, rm, operand);
9681   }
Vshl(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9682   void Vshl(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9683     Vshl(al, dt, rd, rm, operand);
9684   }
9685 
Vshl(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9686   void Vshl(Condition cond,
9687             DataType dt,
9688             QRegister rd,
9689             QRegister rm,
9690             const QOperand& operand) {
9691     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9692     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9693     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9694     VIXL_ASSERT(allow_macro_instructions_);
9695     VIXL_ASSERT(OutsideITBlock());
9696     MacroEmissionCheckScope guard(this);
9697     ITScope it_scope(this, &cond, guard);
9698     vshl(cond, dt, rd, rm, operand);
9699   }
Vshl(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9700   void Vshl(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9701     Vshl(al, dt, rd, rm, operand);
9702   }
9703 
Vshll(Condition cond,DataType dt,QRegister rd,DRegister rm,const DOperand & operand)9704   void Vshll(Condition cond,
9705              DataType dt,
9706              QRegister rd,
9707              DRegister rm,
9708              const DOperand& operand) {
9709     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9710     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9711     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9712     VIXL_ASSERT(allow_macro_instructions_);
9713     VIXL_ASSERT(OutsideITBlock());
9714     MacroEmissionCheckScope guard(this);
9715     ITScope it_scope(this, &cond, guard);
9716     vshll(cond, dt, rd, rm, operand);
9717   }
Vshll(DataType dt,QRegister rd,DRegister rm,const DOperand & operand)9718   void Vshll(DataType dt, QRegister rd, DRegister rm, const DOperand& operand) {
9719     Vshll(al, dt, rd, rm, operand);
9720   }
9721 
Vshr(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9722   void Vshr(Condition cond,
9723             DataType dt,
9724             DRegister rd,
9725             DRegister rm,
9726             const DOperand& operand) {
9727     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9728     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9729     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9730     VIXL_ASSERT(allow_macro_instructions_);
9731     VIXL_ASSERT(OutsideITBlock());
9732     MacroEmissionCheckScope guard(this);
9733     ITScope it_scope(this, &cond, guard);
9734     vshr(cond, dt, rd, rm, operand);
9735   }
Vshr(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9736   void Vshr(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9737     Vshr(al, dt, rd, rm, operand);
9738   }
9739 
Vshr(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9740   void Vshr(Condition cond,
9741             DataType dt,
9742             QRegister rd,
9743             QRegister rm,
9744             const QOperand& operand) {
9745     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9746     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9747     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9748     VIXL_ASSERT(allow_macro_instructions_);
9749     VIXL_ASSERT(OutsideITBlock());
9750     MacroEmissionCheckScope guard(this);
9751     ITScope it_scope(this, &cond, guard);
9752     vshr(cond, dt, rd, rm, operand);
9753   }
Vshr(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9754   void Vshr(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9755     Vshr(al, dt, rd, rm, operand);
9756   }
9757 
Vshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9758   void Vshrn(Condition cond,
9759              DataType dt,
9760              DRegister rd,
9761              QRegister rm,
9762              const QOperand& operand) {
9763     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9764     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9765     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9766     VIXL_ASSERT(allow_macro_instructions_);
9767     VIXL_ASSERT(OutsideITBlock());
9768     MacroEmissionCheckScope guard(this);
9769     ITScope it_scope(this, &cond, guard);
9770     vshrn(cond, dt, rd, rm, operand);
9771   }
Vshrn(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9772   void Vshrn(DataType dt, DRegister rd, QRegister rm, const QOperand& operand) {
9773     Vshrn(al, dt, rd, rm, operand);
9774   }
9775 
Vsli(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9776   void Vsli(Condition cond,
9777             DataType dt,
9778             DRegister rd,
9779             DRegister rm,
9780             const DOperand& operand) {
9781     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9782     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9783     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9784     VIXL_ASSERT(allow_macro_instructions_);
9785     VIXL_ASSERT(OutsideITBlock());
9786     MacroEmissionCheckScope guard(this);
9787     ITScope it_scope(this, &cond, guard);
9788     vsli(cond, dt, rd, rm, operand);
9789   }
Vsli(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9790   void Vsli(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9791     Vsli(al, dt, rd, rm, operand);
9792   }
9793 
Vsli(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9794   void Vsli(Condition cond,
9795             DataType dt,
9796             QRegister rd,
9797             QRegister rm,
9798             const QOperand& operand) {
9799     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9800     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9801     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9802     VIXL_ASSERT(allow_macro_instructions_);
9803     VIXL_ASSERT(OutsideITBlock());
9804     MacroEmissionCheckScope guard(this);
9805     ITScope it_scope(this, &cond, guard);
9806     vsli(cond, dt, rd, rm, operand);
9807   }
Vsli(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9808   void Vsli(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9809     Vsli(al, dt, rd, rm, operand);
9810   }
9811 
Vsqrt(Condition cond,DataType dt,SRegister rd,SRegister rm)9812   void Vsqrt(Condition cond, DataType dt, SRegister rd, SRegister rm) {
9813     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9814     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9815     VIXL_ASSERT(allow_macro_instructions_);
9816     VIXL_ASSERT(OutsideITBlock());
9817     MacroEmissionCheckScope guard(this);
9818     ITScope it_scope(this, &cond, guard);
9819     vsqrt(cond, dt, rd, rm);
9820   }
Vsqrt(DataType dt,SRegister rd,SRegister rm)9821   void Vsqrt(DataType dt, SRegister rd, SRegister rm) { Vsqrt(al, dt, rd, rm); }
9822 
Vsqrt(Condition cond,DataType dt,DRegister rd,DRegister rm)9823   void Vsqrt(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9824     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9825     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9826     VIXL_ASSERT(allow_macro_instructions_);
9827     VIXL_ASSERT(OutsideITBlock());
9828     MacroEmissionCheckScope guard(this);
9829     ITScope it_scope(this, &cond, guard);
9830     vsqrt(cond, dt, rd, rm);
9831   }
Vsqrt(DataType dt,DRegister rd,DRegister rm)9832   void Vsqrt(DataType dt, DRegister rd, DRegister rm) { Vsqrt(al, dt, rd, rm); }
9833 
Vsra(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9834   void Vsra(Condition cond,
9835             DataType dt,
9836             DRegister rd,
9837             DRegister rm,
9838             const DOperand& operand) {
9839     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9840     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9841     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9842     VIXL_ASSERT(allow_macro_instructions_);
9843     VIXL_ASSERT(OutsideITBlock());
9844     MacroEmissionCheckScope guard(this);
9845     ITScope it_scope(this, &cond, guard);
9846     vsra(cond, dt, rd, rm, operand);
9847   }
Vsra(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9848   void Vsra(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9849     Vsra(al, dt, rd, rm, operand);
9850   }
9851 
Vsra(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9852   void Vsra(Condition cond,
9853             DataType dt,
9854             QRegister rd,
9855             QRegister rm,
9856             const QOperand& operand) {
9857     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9858     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9859     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9860     VIXL_ASSERT(allow_macro_instructions_);
9861     VIXL_ASSERT(OutsideITBlock());
9862     MacroEmissionCheckScope guard(this);
9863     ITScope it_scope(this, &cond, guard);
9864     vsra(cond, dt, rd, rm, operand);
9865   }
Vsra(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9866   void Vsra(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9867     Vsra(al, dt, rd, rm, operand);
9868   }
9869 
Vsri(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9870   void Vsri(Condition cond,
9871             DataType dt,
9872             DRegister rd,
9873             DRegister rm,
9874             const DOperand& operand) {
9875     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9876     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9877     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9878     VIXL_ASSERT(allow_macro_instructions_);
9879     VIXL_ASSERT(OutsideITBlock());
9880     MacroEmissionCheckScope guard(this);
9881     ITScope it_scope(this, &cond, guard);
9882     vsri(cond, dt, rd, rm, operand);
9883   }
Vsri(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9884   void Vsri(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9885     Vsri(al, dt, rd, rm, operand);
9886   }
9887 
Vsri(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9888   void Vsri(Condition cond,
9889             DataType dt,
9890             QRegister rd,
9891             QRegister rm,
9892             const QOperand& operand) {
9893     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9894     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9895     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9896     VIXL_ASSERT(allow_macro_instructions_);
9897     VIXL_ASSERT(OutsideITBlock());
9898     MacroEmissionCheckScope guard(this);
9899     ITScope it_scope(this, &cond, guard);
9900     vsri(cond, dt, rd, rm, operand);
9901   }
Vsri(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9902   void Vsri(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9903     Vsri(al, dt, rd, rm, operand);
9904   }
9905 
Vst1(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9906   void Vst1(Condition cond,
9907             DataType dt,
9908             const NeonRegisterList& nreglist,
9909             const AlignedMemOperand& operand) {
9910     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
9911     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9912     VIXL_ASSERT(allow_macro_instructions_);
9913     VIXL_ASSERT(OutsideITBlock());
9914     MacroEmissionCheckScope guard(this);
9915     ITScope it_scope(this, &cond, guard);
9916     vst1(cond, dt, nreglist, operand);
9917   }
Vst1(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9918   void Vst1(DataType dt,
9919             const NeonRegisterList& nreglist,
9920             const AlignedMemOperand& operand) {
9921     Vst1(al, dt, nreglist, operand);
9922   }
9923 
Vst2(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9924   void Vst2(Condition cond,
9925             DataType dt,
9926             const NeonRegisterList& nreglist,
9927             const AlignedMemOperand& operand) {
9928     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
9929     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9930     VIXL_ASSERT(allow_macro_instructions_);
9931     VIXL_ASSERT(OutsideITBlock());
9932     MacroEmissionCheckScope guard(this);
9933     ITScope it_scope(this, &cond, guard);
9934     vst2(cond, dt, nreglist, operand);
9935   }
Vst2(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9936   void Vst2(DataType dt,
9937             const NeonRegisterList& nreglist,
9938             const AlignedMemOperand& operand) {
9939     Vst2(al, dt, nreglist, operand);
9940   }
9941 
Vst3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9942   void Vst3(Condition cond,
9943             DataType dt,
9944             const NeonRegisterList& nreglist,
9945             const AlignedMemOperand& operand) {
9946     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
9947     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9948     VIXL_ASSERT(allow_macro_instructions_);
9949     VIXL_ASSERT(OutsideITBlock());
9950     MacroEmissionCheckScope guard(this);
9951     ITScope it_scope(this, &cond, guard);
9952     vst3(cond, dt, nreglist, operand);
9953   }
Vst3(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9954   void Vst3(DataType dt,
9955             const NeonRegisterList& nreglist,
9956             const AlignedMemOperand& operand) {
9957     Vst3(al, dt, nreglist, operand);
9958   }
9959 
Vst3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)9960   void Vst3(Condition cond,
9961             DataType dt,
9962             const NeonRegisterList& nreglist,
9963             const MemOperand& operand) {
9964     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
9965     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9966     VIXL_ASSERT(allow_macro_instructions_);
9967     VIXL_ASSERT(OutsideITBlock());
9968     MacroEmissionCheckScope guard(this);
9969     ITScope it_scope(this, &cond, guard);
9970     vst3(cond, dt, nreglist, operand);
9971   }
Vst3(DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)9972   void Vst3(DataType dt,
9973             const NeonRegisterList& nreglist,
9974             const MemOperand& operand) {
9975     Vst3(al, dt, nreglist, operand);
9976   }
9977 
Vst4(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9978   void Vst4(Condition cond,
9979             DataType dt,
9980             const NeonRegisterList& nreglist,
9981             const AlignedMemOperand& operand) {
9982     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
9983     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9984     VIXL_ASSERT(allow_macro_instructions_);
9985     VIXL_ASSERT(OutsideITBlock());
9986     MacroEmissionCheckScope guard(this);
9987     ITScope it_scope(this, &cond, guard);
9988     vst4(cond, dt, nreglist, operand);
9989   }
Vst4(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9990   void Vst4(DataType dt,
9991             const NeonRegisterList& nreglist,
9992             const AlignedMemOperand& operand) {
9993     Vst4(al, dt, nreglist, operand);
9994   }
9995 
Vstm(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)9996   void Vstm(Condition cond,
9997             DataType dt,
9998             Register rn,
9999             WriteBack write_back,
10000             DRegisterList dreglist) {
10001     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10002     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
10003     VIXL_ASSERT(allow_macro_instructions_);
10004     VIXL_ASSERT(OutsideITBlock());
10005     MacroEmissionCheckScope guard(this);
10006     ITScope it_scope(this, &cond, guard);
10007     vstm(cond, dt, rn, write_back, dreglist);
10008   }
Vstm(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10009   void Vstm(DataType dt,
10010             Register rn,
10011             WriteBack write_back,
10012             DRegisterList dreglist) {
10013     Vstm(al, dt, rn, write_back, dreglist);
10014   }
Vstm(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)10015   void Vstm(Condition cond,
10016             Register rn,
10017             WriteBack write_back,
10018             DRegisterList dreglist) {
10019     Vstm(cond, kDataTypeValueNone, rn, write_back, dreglist);
10020   }
Vstm(Register rn,WriteBack write_back,DRegisterList dreglist)10021   void Vstm(Register rn, WriteBack write_back, DRegisterList dreglist) {
10022     Vstm(al, kDataTypeValueNone, rn, write_back, dreglist);
10023   }
10024 
Vstm(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10025   void Vstm(Condition cond,
10026             DataType dt,
10027             Register rn,
10028             WriteBack write_back,
10029             SRegisterList sreglist) {
10030     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10031     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
10032     VIXL_ASSERT(allow_macro_instructions_);
10033     VIXL_ASSERT(OutsideITBlock());
10034     MacroEmissionCheckScope guard(this);
10035     ITScope it_scope(this, &cond, guard);
10036     vstm(cond, dt, rn, write_back, sreglist);
10037   }
Vstm(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10038   void Vstm(DataType dt,
10039             Register rn,
10040             WriteBack write_back,
10041             SRegisterList sreglist) {
10042     Vstm(al, dt, rn, write_back, sreglist);
10043   }
Vstm(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)10044   void Vstm(Condition cond,
10045             Register rn,
10046             WriteBack write_back,
10047             SRegisterList sreglist) {
10048     Vstm(cond, kDataTypeValueNone, rn, write_back, sreglist);
10049   }
Vstm(Register rn,WriteBack write_back,SRegisterList sreglist)10050   void Vstm(Register rn, WriteBack write_back, SRegisterList sreglist) {
10051     Vstm(al, kDataTypeValueNone, rn, write_back, sreglist);
10052   }
10053 
Vstmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10054   void Vstmdb(Condition cond,
10055               DataType dt,
10056               Register rn,
10057               WriteBack write_back,
10058               DRegisterList dreglist) {
10059     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10060     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
10061     VIXL_ASSERT(allow_macro_instructions_);
10062     VIXL_ASSERT(OutsideITBlock());
10063     MacroEmissionCheckScope guard(this);
10064     ITScope it_scope(this, &cond, guard);
10065     vstmdb(cond, dt, rn, write_back, dreglist);
10066   }
Vstmdb(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10067   void Vstmdb(DataType dt,
10068               Register rn,
10069               WriteBack write_back,
10070               DRegisterList dreglist) {
10071     Vstmdb(al, dt, rn, write_back, dreglist);
10072   }
Vstmdb(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)10073   void Vstmdb(Condition cond,
10074               Register rn,
10075               WriteBack write_back,
10076               DRegisterList dreglist) {
10077     Vstmdb(cond, kDataTypeValueNone, rn, write_back, dreglist);
10078   }
Vstmdb(Register rn,WriteBack write_back,DRegisterList dreglist)10079   void Vstmdb(Register rn, WriteBack write_back, DRegisterList dreglist) {
10080     Vstmdb(al, kDataTypeValueNone, rn, write_back, dreglist);
10081   }
10082 
Vstmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10083   void Vstmdb(Condition cond,
10084               DataType dt,
10085               Register rn,
10086               WriteBack write_back,
10087               SRegisterList sreglist) {
10088     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10089     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
10090     VIXL_ASSERT(allow_macro_instructions_);
10091     VIXL_ASSERT(OutsideITBlock());
10092     MacroEmissionCheckScope guard(this);
10093     ITScope it_scope(this, &cond, guard);
10094     vstmdb(cond, dt, rn, write_back, sreglist);
10095   }
Vstmdb(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10096   void Vstmdb(DataType dt,
10097               Register rn,
10098               WriteBack write_back,
10099               SRegisterList sreglist) {
10100     Vstmdb(al, dt, rn, write_back, sreglist);
10101   }
Vstmdb(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)10102   void Vstmdb(Condition cond,
10103               Register rn,
10104               WriteBack write_back,
10105               SRegisterList sreglist) {
10106     Vstmdb(cond, kDataTypeValueNone, rn, write_back, sreglist);
10107   }
Vstmdb(Register rn,WriteBack write_back,SRegisterList sreglist)10108   void Vstmdb(Register rn, WriteBack write_back, SRegisterList sreglist) {
10109     Vstmdb(al, kDataTypeValueNone, rn, write_back, sreglist);
10110   }
10111 
Vstmia(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10112   void Vstmia(Condition cond,
10113               DataType dt,
10114               Register rn,
10115               WriteBack write_back,
10116               DRegisterList dreglist) {
10117     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10118     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
10119     VIXL_ASSERT(allow_macro_instructions_);
10120     VIXL_ASSERT(OutsideITBlock());
10121     MacroEmissionCheckScope guard(this);
10122     ITScope it_scope(this, &cond, guard);
10123     vstmia(cond, dt, rn, write_back, dreglist);
10124   }
Vstmia(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10125   void Vstmia(DataType dt,
10126               Register rn,
10127               WriteBack write_back,
10128               DRegisterList dreglist) {
10129     Vstmia(al, dt, rn, write_back, dreglist);
10130   }
Vstmia(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)10131   void Vstmia(Condition cond,
10132               Register rn,
10133               WriteBack write_back,
10134               DRegisterList dreglist) {
10135     Vstmia(cond, kDataTypeValueNone, rn, write_back, dreglist);
10136   }
Vstmia(Register rn,WriteBack write_back,DRegisterList dreglist)10137   void Vstmia(Register rn, WriteBack write_back, DRegisterList dreglist) {
10138     Vstmia(al, kDataTypeValueNone, rn, write_back, dreglist);
10139   }
10140 
Vstmia(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10141   void Vstmia(Condition cond,
10142               DataType dt,
10143               Register rn,
10144               WriteBack write_back,
10145               SRegisterList sreglist) {
10146     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10147     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
10148     VIXL_ASSERT(allow_macro_instructions_);
10149     VIXL_ASSERT(OutsideITBlock());
10150     MacroEmissionCheckScope guard(this);
10151     ITScope it_scope(this, &cond, guard);
10152     vstmia(cond, dt, rn, write_back, sreglist);
10153   }
Vstmia(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10154   void Vstmia(DataType dt,
10155               Register rn,
10156               WriteBack write_back,
10157               SRegisterList sreglist) {
10158     Vstmia(al, dt, rn, write_back, sreglist);
10159   }
Vstmia(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)10160   void Vstmia(Condition cond,
10161               Register rn,
10162               WriteBack write_back,
10163               SRegisterList sreglist) {
10164     Vstmia(cond, kDataTypeValueNone, rn, write_back, sreglist);
10165   }
Vstmia(Register rn,WriteBack write_back,SRegisterList sreglist)10166   void Vstmia(Register rn, WriteBack write_back, SRegisterList sreglist) {
10167     Vstmia(al, kDataTypeValueNone, rn, write_back, sreglist);
10168   }
10169 
Vstr(Condition cond,DataType dt,DRegister rd,const MemOperand & operand)10170   void Vstr(Condition cond,
10171             DataType dt,
10172             DRegister rd,
10173             const MemOperand& operand) {
10174     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10175     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10176     VIXL_ASSERT(allow_macro_instructions_);
10177     VIXL_ASSERT(OutsideITBlock());
10178     MacroEmissionCheckScope guard(this);
10179     ITScope it_scope(this, &cond, guard);
10180     vstr(cond, dt, rd, operand);
10181   }
Vstr(DataType dt,DRegister rd,const MemOperand & operand)10182   void Vstr(DataType dt, DRegister rd, const MemOperand& operand) {
10183     Vstr(al, dt, rd, operand);
10184   }
Vstr(Condition cond,DRegister rd,const MemOperand & operand)10185   void Vstr(Condition cond, DRegister rd, const MemOperand& operand) {
10186     Vstr(cond, Untyped64, rd, operand);
10187   }
Vstr(DRegister rd,const MemOperand & operand)10188   void Vstr(DRegister rd, const MemOperand& operand) {
10189     Vstr(al, Untyped64, rd, operand);
10190   }
10191 
Vstr(Condition cond,DataType dt,SRegister rd,const MemOperand & operand)10192   void Vstr(Condition cond,
10193             DataType dt,
10194             SRegister rd,
10195             const MemOperand& operand) {
10196     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10197     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10198     VIXL_ASSERT(allow_macro_instructions_);
10199     VIXL_ASSERT(OutsideITBlock());
10200     MacroEmissionCheckScope guard(this);
10201     ITScope it_scope(this, &cond, guard);
10202     vstr(cond, dt, rd, operand);
10203   }
Vstr(DataType dt,SRegister rd,const MemOperand & operand)10204   void Vstr(DataType dt, SRegister rd, const MemOperand& operand) {
10205     Vstr(al, dt, rd, operand);
10206   }
Vstr(Condition cond,SRegister rd,const MemOperand & operand)10207   void Vstr(Condition cond, SRegister rd, const MemOperand& operand) {
10208     Vstr(cond, Untyped32, rd, operand);
10209   }
Vstr(SRegister rd,const MemOperand & operand)10210   void Vstr(SRegister rd, const MemOperand& operand) {
10211     Vstr(al, Untyped32, rd, operand);
10212   }
10213 
Vsub(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)10214   void Vsub(
10215       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10216     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10217     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10218     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10219     VIXL_ASSERT(allow_macro_instructions_);
10220     VIXL_ASSERT(OutsideITBlock());
10221     MacroEmissionCheckScope guard(this);
10222     ITScope it_scope(this, &cond, guard);
10223     vsub(cond, dt, rd, rn, rm);
10224   }
Vsub(DataType dt,DRegister rd,DRegister rn,DRegister rm)10225   void Vsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10226     Vsub(al, dt, rd, rn, rm);
10227   }
10228 
Vsub(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)10229   void Vsub(
10230       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10231     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10232     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10233     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10234     VIXL_ASSERT(allow_macro_instructions_);
10235     VIXL_ASSERT(OutsideITBlock());
10236     MacroEmissionCheckScope guard(this);
10237     ITScope it_scope(this, &cond, guard);
10238     vsub(cond, dt, rd, rn, rm);
10239   }
Vsub(DataType dt,QRegister rd,QRegister rn,QRegister rm)10240   void Vsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10241     Vsub(al, dt, rd, rn, rm);
10242   }
10243 
Vsub(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)10244   void Vsub(
10245       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
10246     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10247     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10248     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10249     VIXL_ASSERT(allow_macro_instructions_);
10250     VIXL_ASSERT(OutsideITBlock());
10251     MacroEmissionCheckScope guard(this);
10252     ITScope it_scope(this, &cond, guard);
10253     vsub(cond, dt, rd, rn, rm);
10254   }
Vsub(DataType dt,SRegister rd,SRegister rn,SRegister rm)10255   void Vsub(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
10256     Vsub(al, dt, rd, rn, rm);
10257   }
10258 
Vsubhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)10259   void Vsubhn(
10260       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
10261     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10262     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10263     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10264     VIXL_ASSERT(allow_macro_instructions_);
10265     VIXL_ASSERT(OutsideITBlock());
10266     MacroEmissionCheckScope guard(this);
10267     ITScope it_scope(this, &cond, guard);
10268     vsubhn(cond, dt, rd, rn, rm);
10269   }
Vsubhn(DataType dt,DRegister rd,QRegister rn,QRegister rm)10270   void Vsubhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
10271     Vsubhn(al, dt, rd, rn, rm);
10272   }
10273 
Vsubl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)10274   void Vsubl(
10275       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
10276     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10277     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10278     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10279     VIXL_ASSERT(allow_macro_instructions_);
10280     VIXL_ASSERT(OutsideITBlock());
10281     MacroEmissionCheckScope guard(this);
10282     ITScope it_scope(this, &cond, guard);
10283     vsubl(cond, dt, rd, rn, rm);
10284   }
Vsubl(DataType dt,QRegister rd,DRegister rn,DRegister rm)10285   void Vsubl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
10286     Vsubl(al, dt, rd, rn, rm);
10287   }
10288 
Vsubw(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegister rm)10289   void Vsubw(
10290       Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
10291     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10292     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10293     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10294     VIXL_ASSERT(allow_macro_instructions_);
10295     VIXL_ASSERT(OutsideITBlock());
10296     MacroEmissionCheckScope guard(this);
10297     ITScope it_scope(this, &cond, guard);
10298     vsubw(cond, dt, rd, rn, rm);
10299   }
Vsubw(DataType dt,QRegister rd,QRegister rn,DRegister rm)10300   void Vsubw(DataType dt, QRegister rd, QRegister rn, DRegister rm) {
10301     Vsubw(al, dt, rd, rn, rm);
10302   }
10303 
Vswp(Condition cond,DataType dt,DRegister rd,DRegister rm)10304   void Vswp(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10305     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10306     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10307     VIXL_ASSERT(allow_macro_instructions_);
10308     VIXL_ASSERT(OutsideITBlock());
10309     MacroEmissionCheckScope guard(this);
10310     ITScope it_scope(this, &cond, guard);
10311     vswp(cond, dt, rd, rm);
10312   }
Vswp(DataType dt,DRegister rd,DRegister rm)10313   void Vswp(DataType dt, DRegister rd, DRegister rm) { Vswp(al, dt, rd, rm); }
Vswp(Condition cond,DRegister rd,DRegister rm)10314   void Vswp(Condition cond, DRegister rd, DRegister rm) {
10315     Vswp(cond, kDataTypeValueNone, rd, rm);
10316   }
Vswp(DRegister rd,DRegister rm)10317   void Vswp(DRegister rd, DRegister rm) {
10318     Vswp(al, kDataTypeValueNone, rd, rm);
10319   }
10320 
Vswp(Condition cond,DataType dt,QRegister rd,QRegister rm)10321   void Vswp(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10322     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10323     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10324     VIXL_ASSERT(allow_macro_instructions_);
10325     VIXL_ASSERT(OutsideITBlock());
10326     MacroEmissionCheckScope guard(this);
10327     ITScope it_scope(this, &cond, guard);
10328     vswp(cond, dt, rd, rm);
10329   }
Vswp(DataType dt,QRegister rd,QRegister rm)10330   void Vswp(DataType dt, QRegister rd, QRegister rm) { Vswp(al, dt, rd, rm); }
Vswp(Condition cond,QRegister rd,QRegister rm)10331   void Vswp(Condition cond, QRegister rd, QRegister rm) {
10332     Vswp(cond, kDataTypeValueNone, rd, rm);
10333   }
Vswp(QRegister rd,QRegister rm)10334   void Vswp(QRegister rd, QRegister rm) {
10335     Vswp(al, kDataTypeValueNone, rd, rm);
10336   }
10337 
Vtbl(Condition cond,DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)10338   void Vtbl(Condition cond,
10339             DataType dt,
10340             DRegister rd,
10341             const NeonRegisterList& nreglist,
10342             DRegister rm) {
10343     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10344     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10345     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10346     VIXL_ASSERT(allow_macro_instructions_);
10347     VIXL_ASSERT(OutsideITBlock());
10348     MacroEmissionCheckScope guard(this);
10349     ITScope it_scope(this, &cond, guard);
10350     vtbl(cond, dt, rd, nreglist, rm);
10351   }
Vtbl(DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)10352   void Vtbl(DataType dt,
10353             DRegister rd,
10354             const NeonRegisterList& nreglist,
10355             DRegister rm) {
10356     Vtbl(al, dt, rd, nreglist, rm);
10357   }
10358 
Vtbx(Condition cond,DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)10359   void Vtbx(Condition cond,
10360             DataType dt,
10361             DRegister rd,
10362             const NeonRegisterList& nreglist,
10363             DRegister rm) {
10364     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10365     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10366     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10367     VIXL_ASSERT(allow_macro_instructions_);
10368     VIXL_ASSERT(OutsideITBlock());
10369     MacroEmissionCheckScope guard(this);
10370     ITScope it_scope(this, &cond, guard);
10371     vtbx(cond, dt, rd, nreglist, rm);
10372   }
Vtbx(DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)10373   void Vtbx(DataType dt,
10374             DRegister rd,
10375             const NeonRegisterList& nreglist,
10376             DRegister rm) {
10377     Vtbx(al, dt, rd, nreglist, rm);
10378   }
10379 
Vtrn(Condition cond,DataType dt,DRegister rd,DRegister rm)10380   void Vtrn(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10381     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
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, guard);
10387     vtrn(cond, dt, rd, rm);
10388   }
Vtrn(DataType dt,DRegister rd,DRegister rm)10389   void Vtrn(DataType dt, DRegister rd, DRegister rm) { Vtrn(al, dt, rd, rm); }
10390 
Vtrn(Condition cond,DataType dt,QRegister rd,QRegister rm)10391   void Vtrn(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10392     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10393     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10394     VIXL_ASSERT(allow_macro_instructions_);
10395     VIXL_ASSERT(OutsideITBlock());
10396     MacroEmissionCheckScope guard(this);
10397     ITScope it_scope(this, &cond, guard);
10398     vtrn(cond, dt, rd, rm);
10399   }
Vtrn(DataType dt,QRegister rd,QRegister rm)10400   void Vtrn(DataType dt, QRegister rd, QRegister rm) { Vtrn(al, dt, rd, rm); }
10401 
Vtst(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)10402   void Vtst(
10403       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10404     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10405     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10406     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10407     VIXL_ASSERT(allow_macro_instructions_);
10408     VIXL_ASSERT(OutsideITBlock());
10409     MacroEmissionCheckScope guard(this);
10410     ITScope it_scope(this, &cond, guard);
10411     vtst(cond, dt, rd, rn, rm);
10412   }
Vtst(DataType dt,DRegister rd,DRegister rn,DRegister rm)10413   void Vtst(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10414     Vtst(al, dt, rd, rn, rm);
10415   }
10416 
Vtst(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)10417   void Vtst(
10418       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10419     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10420     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10421     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10422     VIXL_ASSERT(allow_macro_instructions_);
10423     VIXL_ASSERT(OutsideITBlock());
10424     MacroEmissionCheckScope guard(this);
10425     ITScope it_scope(this, &cond, guard);
10426     vtst(cond, dt, rd, rn, rm);
10427   }
Vtst(DataType dt,QRegister rd,QRegister rn,QRegister rm)10428   void Vtst(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10429     Vtst(al, dt, rd, rn, rm);
10430   }
10431 
Vuzp(Condition cond,DataType dt,DRegister rd,DRegister rm)10432   void Vuzp(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10433     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10434     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10435     VIXL_ASSERT(allow_macro_instructions_);
10436     VIXL_ASSERT(OutsideITBlock());
10437     MacroEmissionCheckScope guard(this);
10438     ITScope it_scope(this, &cond, guard);
10439     vuzp(cond, dt, rd, rm);
10440   }
Vuzp(DataType dt,DRegister rd,DRegister rm)10441   void Vuzp(DataType dt, DRegister rd, DRegister rm) { Vuzp(al, dt, rd, rm); }
10442 
Vuzp(Condition cond,DataType dt,QRegister rd,QRegister rm)10443   void Vuzp(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10444     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10445     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10446     VIXL_ASSERT(allow_macro_instructions_);
10447     VIXL_ASSERT(OutsideITBlock());
10448     MacroEmissionCheckScope guard(this);
10449     ITScope it_scope(this, &cond, guard);
10450     vuzp(cond, dt, rd, rm);
10451   }
Vuzp(DataType dt,QRegister rd,QRegister rm)10452   void Vuzp(DataType dt, QRegister rd, QRegister rm) { Vuzp(al, dt, rd, rm); }
10453 
Vzip(Condition cond,DataType dt,DRegister rd,DRegister rm)10454   void Vzip(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10455     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10456     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10457     VIXL_ASSERT(allow_macro_instructions_);
10458     VIXL_ASSERT(OutsideITBlock());
10459     MacroEmissionCheckScope guard(this);
10460     ITScope it_scope(this, &cond, guard);
10461     vzip(cond, dt, rd, rm);
10462   }
Vzip(DataType dt,DRegister rd,DRegister rm)10463   void Vzip(DataType dt, DRegister rd, DRegister rm) { Vzip(al, dt, rd, rm); }
10464 
Vzip(Condition cond,DataType dt,QRegister rd,QRegister rm)10465   void Vzip(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10466     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10467     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10468     VIXL_ASSERT(allow_macro_instructions_);
10469     VIXL_ASSERT(OutsideITBlock());
10470     MacroEmissionCheckScope guard(this);
10471     ITScope it_scope(this, &cond, guard);
10472     vzip(cond, dt, rd, rm);
10473   }
Vzip(DataType dt,QRegister rd,QRegister rm)10474   void Vzip(DataType dt, QRegister rd, QRegister rm) { Vzip(al, dt, rd, rm); }
10475 
Yield(Condition cond)10476   void Yield(Condition cond) {
10477     VIXL_ASSERT(allow_macro_instructions_);
10478     VIXL_ASSERT(OutsideITBlock());
10479     MacroEmissionCheckScope guard(this);
10480     ITScope it_scope(this, &cond, guard);
10481     yield(cond);
10482   }
Yield()10483   void Yield() { Yield(al); }
Vabs(Condition cond,VRegister rd,VRegister rm)10484   void Vabs(Condition cond, VRegister rd, VRegister rm) {
10485     VIXL_ASSERT(rd.IsS() || rd.IsD());
10486     VIXL_ASSERT(rd.GetType() == rm.GetType());
10487     if (rd.IsS()) {
10488       Vabs(cond, F32, rd.S(), rm.S());
10489     } else {
10490       Vabs(cond, F64, rd.D(), rm.D());
10491     }
10492   }
Vabs(VRegister rd,VRegister rm)10493   void Vabs(VRegister rd, VRegister rm) { Vabs(al, rd, rm); }
Vadd(Condition cond,VRegister rd,VRegister rn,VRegister rm)10494   void Vadd(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10495     VIXL_ASSERT(rd.IsS() || rd.IsD());
10496     VIXL_ASSERT(rd.GetType() == rn.GetType());
10497     VIXL_ASSERT(rd.GetType() == rm.GetType());
10498     if (rd.IsS()) {
10499       Vadd(cond, F32, rd.S(), rn.S(), rm.S());
10500     } else {
10501       Vadd(cond, F64, rd.D(), rn.D(), rm.D());
10502     }
10503   }
Vadd(VRegister rd,VRegister rn,VRegister rm)10504   void Vadd(VRegister rd, VRegister rn, VRegister rm) { Vadd(al, rd, rn, rm); }
Vcmp(Condition cond,VRegister rd,VRegister rm)10505   void Vcmp(Condition cond, VRegister rd, VRegister rm) {
10506     VIXL_ASSERT(rd.IsS() || rd.IsD());
10507     VIXL_ASSERT(rd.GetType() == rm.GetType());
10508     if (rd.IsS()) {
10509       Vcmp(cond, F32, rd.S(), rm.S());
10510     } else {
10511       Vcmp(cond, F64, rd.D(), rm.D());
10512     }
10513   }
Vcmp(VRegister rd,VRegister rm)10514   void Vcmp(VRegister rd, VRegister rm) { Vcmp(al, rd, rm); }
Vcmpe(Condition cond,VRegister rd,VRegister rm)10515   void Vcmpe(Condition cond, VRegister rd, VRegister rm) {
10516     VIXL_ASSERT(rd.IsS() || rd.IsD());
10517     VIXL_ASSERT(rd.GetType() == rm.GetType());
10518     if (rd.IsS()) {
10519       Vcmpe(cond, F32, rd.S(), rm.S());
10520     } else {
10521       Vcmpe(cond, F64, rd.D(), rm.D());
10522     }
10523   }
Vcmpe(VRegister rd,VRegister rm)10524   void Vcmpe(VRegister rd, VRegister rm) { Vcmpe(al, rd, rm); }
Vdiv(Condition cond,VRegister rd,VRegister rn,VRegister rm)10525   void Vdiv(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10526     VIXL_ASSERT(rd.IsS() || rd.IsD());
10527     VIXL_ASSERT(rd.GetType() == rn.GetType());
10528     VIXL_ASSERT(rd.GetType() == rm.GetType());
10529     if (rd.IsS()) {
10530       Vdiv(cond, F32, rd.S(), rn.S(), rm.S());
10531     } else {
10532       Vdiv(cond, F64, rd.D(), rn.D(), rm.D());
10533     }
10534   }
Vdiv(VRegister rd,VRegister rn,VRegister rm)10535   void Vdiv(VRegister rd, VRegister rn, VRegister rm) { Vdiv(al, rd, rn, rm); }
Vfma(Condition cond,VRegister rd,VRegister rn,VRegister rm)10536   void Vfma(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10537     VIXL_ASSERT(rd.IsS() || rd.IsD());
10538     VIXL_ASSERT(rd.GetType() == rn.GetType());
10539     VIXL_ASSERT(rd.GetType() == rm.GetType());
10540     if (rd.IsS()) {
10541       Vfma(cond, F32, rd.S(), rn.S(), rm.S());
10542     } else {
10543       Vfma(cond, F64, rd.D(), rn.D(), rm.D());
10544     }
10545   }
Vfma(VRegister rd,VRegister rn,VRegister rm)10546   void Vfma(VRegister rd, VRegister rn, VRegister rm) { Vfma(al, rd, rn, rm); }
Vfms(Condition cond,VRegister rd,VRegister rn,VRegister rm)10547   void Vfms(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10548     VIXL_ASSERT(rd.IsS() || rd.IsD());
10549     VIXL_ASSERT(rd.GetType() == rn.GetType());
10550     VIXL_ASSERT(rd.GetType() == rm.GetType());
10551     if (rd.IsS()) {
10552       Vfms(cond, F32, rd.S(), rn.S(), rm.S());
10553     } else {
10554       Vfms(cond, F64, rd.D(), rn.D(), rm.D());
10555     }
10556   }
Vfms(VRegister rd,VRegister rn,VRegister rm)10557   void Vfms(VRegister rd, VRegister rn, VRegister rm) { Vfms(al, rd, rn, rm); }
Vfnma(Condition cond,VRegister rd,VRegister rn,VRegister rm)10558   void Vfnma(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10559     VIXL_ASSERT(rd.IsS() || rd.IsD());
10560     VIXL_ASSERT(rd.GetType() == rn.GetType());
10561     VIXL_ASSERT(rd.GetType() == rm.GetType());
10562     if (rd.IsS()) {
10563       Vfnma(cond, F32, rd.S(), rn.S(), rm.S());
10564     } else {
10565       Vfnma(cond, F64, rd.D(), rn.D(), rm.D());
10566     }
10567   }
Vfnma(VRegister rd,VRegister rn,VRegister rm)10568   void Vfnma(VRegister rd, VRegister rn, VRegister rm) {
10569     Vfnma(al, rd, rn, rm);
10570   }
Vfnms(Condition cond,VRegister rd,VRegister rn,VRegister rm)10571   void Vfnms(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10572     VIXL_ASSERT(rd.IsS() || rd.IsD());
10573     VIXL_ASSERT(rd.GetType() == rn.GetType());
10574     VIXL_ASSERT(rd.GetType() == rm.GetType());
10575     if (rd.IsS()) {
10576       Vfnms(cond, F32, rd.S(), rn.S(), rm.S());
10577     } else {
10578       Vfnms(cond, F64, rd.D(), rn.D(), rm.D());
10579     }
10580   }
Vfnms(VRegister rd,VRegister rn,VRegister rm)10581   void Vfnms(VRegister rd, VRegister rn, VRegister rm) {
10582     Vfnms(al, rd, rn, rm);
10583   }
Vmaxnm(VRegister rd,VRegister rn,VRegister rm)10584   void Vmaxnm(VRegister rd, VRegister rn, VRegister rm) {
10585     VIXL_ASSERT(rd.IsS() || rd.IsD());
10586     VIXL_ASSERT(rd.GetType() == rn.GetType());
10587     VIXL_ASSERT(rd.GetType() == rm.GetType());
10588     if (rd.IsS()) {
10589       Vmaxnm(F32, rd.S(), rn.S(), rm.S());
10590     } else {
10591       Vmaxnm(F64, rd.D(), rn.D(), rm.D());
10592     }
10593   }
Vminnm(VRegister rd,VRegister rn,VRegister rm)10594   void Vminnm(VRegister rd, VRegister rn, VRegister rm) {
10595     VIXL_ASSERT(rd.IsS() || rd.IsD());
10596     VIXL_ASSERT(rd.GetType() == rn.GetType());
10597     VIXL_ASSERT(rd.GetType() == rm.GetType());
10598     if (rd.IsS()) {
10599       Vminnm(F32, rd.S(), rn.S(), rm.S());
10600     } else {
10601       Vminnm(F64, rd.D(), rn.D(), rm.D());
10602     }
10603   }
Vmla(Condition cond,VRegister rd,VRegister rn,VRegister rm)10604   void Vmla(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10605     VIXL_ASSERT(rd.IsS() || rd.IsD());
10606     VIXL_ASSERT(rd.GetType() == rn.GetType());
10607     VIXL_ASSERT(rd.GetType() == rm.GetType());
10608     if (rd.IsS()) {
10609       Vmla(cond, F32, rd.S(), rn.S(), rm.S());
10610     } else {
10611       Vmla(cond, F64, rd.D(), rn.D(), rm.D());
10612     }
10613   }
Vmla(VRegister rd,VRegister rn,VRegister rm)10614   void Vmla(VRegister rd, VRegister rn, VRegister rm) { Vmla(al, rd, rn, rm); }
Vmls(Condition cond,VRegister rd,VRegister rn,VRegister rm)10615   void Vmls(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10616     VIXL_ASSERT(rd.IsS() || rd.IsD());
10617     VIXL_ASSERT(rd.GetType() == rn.GetType());
10618     VIXL_ASSERT(rd.GetType() == rm.GetType());
10619     if (rd.IsS()) {
10620       Vmls(cond, F32, rd.S(), rn.S(), rm.S());
10621     } else {
10622       Vmls(cond, F64, rd.D(), rn.D(), rm.D());
10623     }
10624   }
Vmls(VRegister rd,VRegister rn,VRegister rm)10625   void Vmls(VRegister rd, VRegister rn, VRegister rm) { Vmls(al, rd, rn, rm); }
Vmov(Condition cond,VRegister rd,VRegister rm)10626   void Vmov(Condition cond, VRegister rd, VRegister rm) {
10627     VIXL_ASSERT(rd.IsS() || rd.IsD());
10628     VIXL_ASSERT(rd.GetType() == rm.GetType());
10629     if (rd.IsS()) {
10630       Vmov(cond, F32, rd.S(), rm.S());
10631     } else {
10632       Vmov(cond, F64, rd.D(), rm.D());
10633     }
10634   }
Vmov(VRegister rd,VRegister rm)10635   void Vmov(VRegister rd, VRegister rm) { Vmov(al, rd, rm); }
Vmul(Condition cond,VRegister rd,VRegister rn,VRegister rm)10636   void Vmul(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10637     VIXL_ASSERT(rd.IsS() || rd.IsD());
10638     VIXL_ASSERT(rd.GetType() == rn.GetType());
10639     VIXL_ASSERT(rd.GetType() == rm.GetType());
10640     if (rd.IsS()) {
10641       Vmul(cond, F32, rd.S(), rn.S(), rm.S());
10642     } else {
10643       Vmul(cond, F64, rd.D(), rn.D(), rm.D());
10644     }
10645   }
Vmul(VRegister rd,VRegister rn,VRegister rm)10646   void Vmul(VRegister rd, VRegister rn, VRegister rm) { Vmul(al, rd, rn, rm); }
Vneg(Condition cond,VRegister rd,VRegister rm)10647   void Vneg(Condition cond, VRegister rd, VRegister rm) {
10648     VIXL_ASSERT(rd.IsS() || rd.IsD());
10649     VIXL_ASSERT(rd.GetType() == rm.GetType());
10650     if (rd.IsS()) {
10651       Vneg(cond, F32, rd.S(), rm.S());
10652     } else {
10653       Vneg(cond, F64, rd.D(), rm.D());
10654     }
10655   }
Vneg(VRegister rd,VRegister rm)10656   void Vneg(VRegister rd, VRegister rm) { Vneg(al, rd, rm); }
Vnmla(Condition cond,VRegister rd,VRegister rn,VRegister rm)10657   void Vnmla(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10658     VIXL_ASSERT(rd.IsS() || rd.IsD());
10659     VIXL_ASSERT(rd.GetType() == rn.GetType());
10660     VIXL_ASSERT(rd.GetType() == rm.GetType());
10661     if (rd.IsS()) {
10662       Vnmla(cond, F32, rd.S(), rn.S(), rm.S());
10663     } else {
10664       Vnmla(cond, F64, rd.D(), rn.D(), rm.D());
10665     }
10666   }
Vnmla(VRegister rd,VRegister rn,VRegister rm)10667   void Vnmla(VRegister rd, VRegister rn, VRegister rm) {
10668     Vnmla(al, rd, rn, rm);
10669   }
Vnmls(Condition cond,VRegister rd,VRegister rn,VRegister rm)10670   void Vnmls(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10671     VIXL_ASSERT(rd.IsS() || rd.IsD());
10672     VIXL_ASSERT(rd.GetType() == rn.GetType());
10673     VIXL_ASSERT(rd.GetType() == rm.GetType());
10674     if (rd.IsS()) {
10675       Vnmls(cond, F32, rd.S(), rn.S(), rm.S());
10676     } else {
10677       Vnmls(cond, F64, rd.D(), rn.D(), rm.D());
10678     }
10679   }
Vnmls(VRegister rd,VRegister rn,VRegister rm)10680   void Vnmls(VRegister rd, VRegister rn, VRegister rm) {
10681     Vnmls(al, rd, rn, rm);
10682   }
Vnmul(Condition cond,VRegister rd,VRegister rn,VRegister rm)10683   void Vnmul(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10684     VIXL_ASSERT(rd.IsS() || rd.IsD());
10685     VIXL_ASSERT(rd.GetType() == rn.GetType());
10686     VIXL_ASSERT(rd.GetType() == rm.GetType());
10687     if (rd.IsS()) {
10688       Vnmul(cond, F32, rd.S(), rn.S(), rm.S());
10689     } else {
10690       Vnmul(cond, F64, rd.D(), rn.D(), rm.D());
10691     }
10692   }
Vnmul(VRegister rd,VRegister rn,VRegister rm)10693   void Vnmul(VRegister rd, VRegister rn, VRegister rm) {
10694     Vnmul(al, rd, rn, rm);
10695   }
Vrinta(VRegister rd,VRegister rm)10696   void Vrinta(VRegister rd, VRegister rm) {
10697     VIXL_ASSERT(rd.IsS() || rd.IsD());
10698     VIXL_ASSERT(rd.GetType() == rm.GetType());
10699     if (rd.IsS()) {
10700       Vrinta(F32, rd.S(), rm.S());
10701     } else {
10702       Vrinta(F64, rd.D(), rm.D());
10703     }
10704   }
Vrintm(VRegister rd,VRegister rm)10705   void Vrintm(VRegister rd, VRegister rm) {
10706     VIXL_ASSERT(rd.IsS() || rd.IsD());
10707     VIXL_ASSERT(rd.GetType() == rm.GetType());
10708     if (rd.IsS()) {
10709       Vrintm(F32, rd.S(), rm.S());
10710     } else {
10711       Vrintm(F64, rd.D(), rm.D());
10712     }
10713   }
Vrintn(VRegister rd,VRegister rm)10714   void Vrintn(VRegister rd, VRegister rm) {
10715     VIXL_ASSERT(rd.IsS() || rd.IsD());
10716     VIXL_ASSERT(rd.GetType() == rm.GetType());
10717     if (rd.IsS()) {
10718       Vrintn(F32, rd.S(), rm.S());
10719     } else {
10720       Vrintn(F64, rd.D(), rm.D());
10721     }
10722   }
Vrintp(VRegister rd,VRegister rm)10723   void Vrintp(VRegister rd, VRegister rm) {
10724     VIXL_ASSERT(rd.IsS() || rd.IsD());
10725     VIXL_ASSERT(rd.GetType() == rm.GetType());
10726     if (rd.IsS()) {
10727       Vrintp(F32, rd.S(), rm.S());
10728     } else {
10729       Vrintp(F64, rd.D(), rm.D());
10730     }
10731   }
Vrintr(Condition cond,VRegister rd,VRegister rm)10732   void Vrintr(Condition cond, VRegister rd, VRegister rm) {
10733     VIXL_ASSERT(rd.IsS() || rd.IsD());
10734     VIXL_ASSERT(rd.GetType() == rm.GetType());
10735     if (rd.IsS()) {
10736       Vrintr(cond, F32, rd.S(), rm.S());
10737     } else {
10738       Vrintr(cond, F64, rd.D(), rm.D());
10739     }
10740   }
Vrintr(VRegister rd,VRegister rm)10741   void Vrintr(VRegister rd, VRegister rm) { Vrintr(al, rd, rm); }
Vrintx(Condition cond,VRegister rd,VRegister rm)10742   void Vrintx(Condition cond, VRegister rd, VRegister rm) {
10743     VIXL_ASSERT(rd.IsS() || rd.IsD());
10744     VIXL_ASSERT(rd.GetType() == rm.GetType());
10745     if (rd.IsS()) {
10746       Vrintx(cond, F32, rd.S(), rm.S());
10747     } else {
10748       Vrintx(cond, F64, rd.D(), rm.D());
10749     }
10750   }
Vrintx(VRegister rd,VRegister rm)10751   void Vrintx(VRegister rd, VRegister rm) { Vrintx(al, rd, rm); }
Vrintz(Condition cond,VRegister rd,VRegister rm)10752   void Vrintz(Condition cond, VRegister rd, VRegister rm) {
10753     VIXL_ASSERT(rd.IsS() || rd.IsD());
10754     VIXL_ASSERT(rd.GetType() == rm.GetType());
10755     if (rd.IsS()) {
10756       Vrintz(cond, F32, rd.S(), rm.S());
10757     } else {
10758       Vrintz(cond, F64, rd.D(), rm.D());
10759     }
10760   }
Vrintz(VRegister rd,VRegister rm)10761   void Vrintz(VRegister rd, VRegister rm) { Vrintz(al, rd, rm); }
Vseleq(VRegister rd,VRegister rn,VRegister rm)10762   void Vseleq(VRegister rd, VRegister rn, VRegister rm) {
10763     VIXL_ASSERT(rd.IsS() || rd.IsD());
10764     VIXL_ASSERT(rd.GetType() == rn.GetType());
10765     VIXL_ASSERT(rd.GetType() == rm.GetType());
10766     if (rd.IsS()) {
10767       Vseleq(F32, rd.S(), rn.S(), rm.S());
10768     } else {
10769       Vseleq(F64, rd.D(), rn.D(), rm.D());
10770     }
10771   }
Vselge(VRegister rd,VRegister rn,VRegister rm)10772   void Vselge(VRegister rd, VRegister rn, VRegister rm) {
10773     VIXL_ASSERT(rd.IsS() || rd.IsD());
10774     VIXL_ASSERT(rd.GetType() == rn.GetType());
10775     VIXL_ASSERT(rd.GetType() == rm.GetType());
10776     if (rd.IsS()) {
10777       Vselge(F32, rd.S(), rn.S(), rm.S());
10778     } else {
10779       Vselge(F64, rd.D(), rn.D(), rm.D());
10780     }
10781   }
Vselgt(VRegister rd,VRegister rn,VRegister rm)10782   void Vselgt(VRegister rd, VRegister rn, VRegister rm) {
10783     VIXL_ASSERT(rd.IsS() || rd.IsD());
10784     VIXL_ASSERT(rd.GetType() == rn.GetType());
10785     VIXL_ASSERT(rd.GetType() == rm.GetType());
10786     if (rd.IsS()) {
10787       Vselgt(F32, rd.S(), rn.S(), rm.S());
10788     } else {
10789       Vselgt(F64, rd.D(), rn.D(), rm.D());
10790     }
10791   }
Vselvs(VRegister rd,VRegister rn,VRegister rm)10792   void Vselvs(VRegister rd, VRegister rn, VRegister rm) {
10793     VIXL_ASSERT(rd.IsS() || rd.IsD());
10794     VIXL_ASSERT(rd.GetType() == rn.GetType());
10795     VIXL_ASSERT(rd.GetType() == rm.GetType());
10796     if (rd.IsS()) {
10797       Vselvs(F32, rd.S(), rn.S(), rm.S());
10798     } else {
10799       Vselvs(F64, rd.D(), rn.D(), rm.D());
10800     }
10801   }
Vsqrt(Condition cond,VRegister rd,VRegister rm)10802   void Vsqrt(Condition cond, VRegister rd, VRegister rm) {
10803     VIXL_ASSERT(rd.IsS() || rd.IsD());
10804     VIXL_ASSERT(rd.GetType() == rm.GetType());
10805     if (rd.IsS()) {
10806       Vsqrt(cond, F32, rd.S(), rm.S());
10807     } else {
10808       Vsqrt(cond, F64, rd.D(), rm.D());
10809     }
10810   }
Vsqrt(VRegister rd,VRegister rm)10811   void Vsqrt(VRegister rd, VRegister rm) { Vsqrt(al, rd, rm); }
Vsub(Condition cond,VRegister rd,VRegister rn,VRegister rm)10812   void Vsub(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10813     VIXL_ASSERT(rd.IsS() || rd.IsD());
10814     VIXL_ASSERT(rd.GetType() == rn.GetType());
10815     VIXL_ASSERT(rd.GetType() == rm.GetType());
10816     if (rd.IsS()) {
10817       Vsub(cond, F32, rd.S(), rn.S(), rm.S());
10818     } else {
10819       Vsub(cond, F64, rd.D(), rn.D(), rm.D());
10820     }
10821   }
Vsub(VRegister rd,VRegister rn,VRegister rm)10822   void Vsub(VRegister rd, VRegister rn, VRegister rm) { Vsub(al, rd, rn, rm); }
10823   // End of generated code.
10824 
AllowUnpredictable()10825   virtual bool AllowUnpredictable() VIXL_OVERRIDE {
10826     VIXL_ABORT_WITH_MSG("Unpredictable instruction.\n");
10827     return false;
10828   }
AllowStronglyDiscouraged()10829   virtual bool AllowStronglyDiscouraged() VIXL_OVERRIDE {
10830     VIXL_ABORT_WITH_MSG(
10831         "ARM strongly recommends to not use this instruction.\n");
10832     return false;
10833   }
10834   // Old syntax of vrint instructions.
10835   VIXL_DEPRECATED(
10836       "void Vrinta(DataType dt, DRegister rd, DRegister rm)",
Vrinta(DataType dt1,DataType dt2,DRegister rd,DRegister rm)10837       void Vrinta(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
10838     USE(dt2);
10839     VIXL_ASSERT(dt1.Is(dt2));
10840     return Vrinta(dt1, rd, rm);
10841   }
10842   VIXL_DEPRECATED(
10843       "void Vrinta(DataType dt, QRegister rd, QRegister rm)",
Vrinta(DataType dt1,DataType dt2,QRegister rd,QRegister rm)10844       void Vrinta(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
10845     USE(dt2);
10846     VIXL_ASSERT(dt1.Is(dt2));
10847     return Vrinta(dt1, rd, rm);
10848   }
10849   VIXL_DEPRECATED(
10850       "void Vrinta(DataType dt, SRegister rd, SRegister rm)",
Vrinta(DataType dt1,DataType dt2,SRegister rd,SRegister rm)10851       void Vrinta(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
10852     USE(dt2);
10853     VIXL_ASSERT(dt1.Is(dt2));
10854     return Vrinta(dt1, rd, rm);
10855   }
10856 
10857   VIXL_DEPRECATED(
10858       "void Vrintm(DataType dt, DRegister rd, DRegister rm)",
Vrintm(DataType dt1,DataType dt2,DRegister rd,DRegister rm)10859       void Vrintm(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
10860     USE(dt2);
10861     VIXL_ASSERT(dt1.Is(dt2));
10862     return Vrintm(dt1, rd, rm);
10863   }
10864   VIXL_DEPRECATED(
10865       "void Vrintm(DataType dt, QRegister rd, QRegister rm)",
Vrintm(DataType dt1,DataType dt2,QRegister rd,QRegister rm)10866       void Vrintm(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
10867     USE(dt2);
10868     VIXL_ASSERT(dt1.Is(dt2));
10869     return Vrintm(dt1, rd, rm);
10870   }
10871   VIXL_DEPRECATED(
10872       "void Vrintm(DataType dt, SRegister rd, SRegister rm)",
Vrintm(DataType dt1,DataType dt2,SRegister rd,SRegister rm)10873       void Vrintm(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
10874     USE(dt2);
10875     VIXL_ASSERT(dt1.Is(dt2));
10876     return Vrintm(dt1, rd, rm);
10877   }
10878 
10879   VIXL_DEPRECATED(
10880       "void Vrintn(DataType dt, DRegister rd, DRegister rm)",
Vrintn(DataType dt1,DataType dt2,DRegister rd,DRegister rm)10881       void Vrintn(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
10882     USE(dt2);
10883     VIXL_ASSERT(dt1.Is(dt2));
10884     return Vrintn(dt1, rd, rm);
10885   }
10886   VIXL_DEPRECATED(
10887       "void Vrintn(DataType dt, QRegister rd, QRegister rm)",
Vrintn(DataType dt1,DataType dt2,QRegister rd,QRegister rm)10888       void Vrintn(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
10889     USE(dt2);
10890     VIXL_ASSERT(dt1.Is(dt2));
10891     return Vrintn(dt1, rd, rm);
10892   }
10893   VIXL_DEPRECATED(
10894       "void Vrintn(DataType dt, SRegister rd, SRegister rm)",
Vrintn(DataType dt1,DataType dt2,SRegister rd,SRegister rm)10895       void Vrintn(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
10896     USE(dt2);
10897     VIXL_ASSERT(dt1.Is(dt2));
10898     return Vrintn(dt1, rd, rm);
10899   }
10900 
10901   VIXL_DEPRECATED(
10902       "void Vrintp(DataType dt, DRegister rd, DRegister rm)",
Vrintp(DataType dt1,DataType dt2,DRegister rd,DRegister rm)10903       void Vrintp(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
10904     USE(dt2);
10905     VIXL_ASSERT(dt1.Is(dt2));
10906     return Vrintp(dt1, rd, rm);
10907   }
10908   VIXL_DEPRECATED(
10909       "void Vrintp(DataType dt, QRegister rd, QRegister rm)",
Vrintp(DataType dt1,DataType dt2,QRegister rd,QRegister rm)10910       void Vrintp(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
10911     USE(dt2);
10912     VIXL_ASSERT(dt1.Is(dt2));
10913     return Vrintp(dt1, rd, rm);
10914   }
10915   VIXL_DEPRECATED(
10916       "void Vrintp(DataType dt, SRegister rd, SRegister rm)",
Vrintp(DataType dt1,DataType dt2,SRegister rd,SRegister rm)10917       void Vrintp(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
10918     USE(dt2);
10919     VIXL_ASSERT(dt1.Is(dt2));
10920     return Vrintp(dt1, rd, rm);
10921   }
10922 
10923   VIXL_DEPRECATED(
10924       "void Vrintr(Condition cond, DataType dt, SRegister rd, SRegister rm)",
Vrintr(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)10925       void Vrintr(Condition cond,
10926                   DataType dt1,
10927                   DataType dt2,
10928                   SRegister rd,
10929                   SRegister rm)) {
10930     USE(dt2);
10931     VIXL_ASSERT(dt1.Is(dt2));
10932     return Vrintr(cond, dt1, rd, rm);
10933   }
10934   VIXL_DEPRECATED(
10935       "void Vrintr(DataType dt, SRegister rd, SRegister rm)",
Vrintr(DataType dt1,DataType dt2,SRegister rd,SRegister rm)10936       void Vrintr(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
10937     USE(dt2);
10938     VIXL_ASSERT(dt1.Is(dt2));
10939     return Vrintr(dt1, rd, rm);
10940   }
10941 
10942   VIXL_DEPRECATED(
10943       "void Vrintr(Condition cond, DataType dt, DRegister rd, DRegister rm)",
Vrintr(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)10944       void Vrintr(Condition cond,
10945                   DataType dt1,
10946                   DataType dt2,
10947                   DRegister rd,
10948                   DRegister rm)) {
10949     USE(dt2);
10950     VIXL_ASSERT(dt1.Is(dt2));
10951     return Vrintr(cond, dt1, rd, rm);
10952   }
10953   VIXL_DEPRECATED(
10954       "void Vrintr(DataType dt, DRegister rd, DRegister rm)",
Vrintr(DataType dt1,DataType dt2,DRegister rd,DRegister rm)10955       void Vrintr(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
10956     USE(dt2);
10957     VIXL_ASSERT(dt1.Is(dt2));
10958     return Vrintr(dt1, rd, rm);
10959   }
10960 
10961   VIXL_DEPRECATED(
10962       "void Vrintx(Condition cond, DataType dt, DRegister rd, DRegister rm)",
Vrintx(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)10963       void Vrintx(Condition cond,
10964                   DataType dt1,
10965                   DataType dt2,
10966                   DRegister rd,
10967                   DRegister rm)) {
10968     USE(dt2);
10969     VIXL_ASSERT(dt1.Is(dt2));
10970     return Vrintx(cond, dt1, rd, rm);
10971   }
10972   VIXL_DEPRECATED(
10973       "void Vrintx(DataType dt, DRegister rd, DRegister rm)",
Vrintx(DataType dt1,DataType dt2,DRegister rd,DRegister rm)10974       void Vrintx(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
10975     USE(dt2);
10976     VIXL_ASSERT(dt1.Is(dt2));
10977     return Vrintx(dt1, rd, rm);
10978   }
10979 
10980   VIXL_DEPRECATED(
10981       "void Vrintx(DataType dt, QRegister rd, QRegister rm)",
Vrintx(DataType dt1,DataType dt2,QRegister rd,QRegister rm)10982       void Vrintx(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
10983     USE(dt2);
10984     VIXL_ASSERT(dt1.Is(dt2));
10985     return Vrintx(dt1, rd, rm);
10986   }
10987 
10988   VIXL_DEPRECATED(
10989       "void Vrintx(Condition cond, DataType dt, SRegister rd, SRegister rm)",
Vrintx(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)10990       void Vrintx(Condition cond,
10991                   DataType dt1,
10992                   DataType dt2,
10993                   SRegister rd,
10994                   SRegister rm)) {
10995     USE(dt2);
10996     VIXL_ASSERT(dt1.Is(dt2));
10997     return Vrintx(cond, dt1, rd, rm);
10998   }
10999   VIXL_DEPRECATED(
11000       "void Vrintx(DataType dt, SRegister rd, SRegister rm)",
Vrintx(DataType dt1,DataType dt2,SRegister rd,SRegister rm)11001       void Vrintx(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
11002     USE(dt2);
11003     VIXL_ASSERT(dt1.Is(dt2));
11004     return Vrintx(dt1, rd, rm);
11005   }
11006 
11007   VIXL_DEPRECATED(
11008       "void Vrintz(Condition cond, DataType dt, DRegister rd, DRegister rm)",
Vrintz(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)11009       void Vrintz(Condition cond,
11010                   DataType dt1,
11011                   DataType dt2,
11012                   DRegister rd,
11013                   DRegister rm)) {
11014     USE(dt2);
11015     VIXL_ASSERT(dt1.Is(dt2));
11016     return Vrintz(cond, dt1, rd, rm);
11017   }
11018   VIXL_DEPRECATED(
11019       "void Vrintz(DataType dt, DRegister rd, DRegister rm)",
Vrintz(DataType dt1,DataType dt2,DRegister rd,DRegister rm)11020       void Vrintz(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
11021     USE(dt2);
11022     VIXL_ASSERT(dt1.Is(dt2));
11023     return Vrintz(dt1, rd, rm);
11024   }
11025 
11026   VIXL_DEPRECATED(
11027       "void Vrintz(DataType dt, QRegister rd, QRegister rm)",
Vrintz(DataType dt1,DataType dt2,QRegister rd,QRegister rm)11028       void Vrintz(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
11029     USE(dt2);
11030     VIXL_ASSERT(dt1.Is(dt2));
11031     return Vrintz(dt1, rd, rm);
11032   }
11033 
11034   VIXL_DEPRECATED(
11035       "void Vrintz(Condition cond, DataType dt, SRegister rd, SRegister rm)",
Vrintz(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)11036       void Vrintz(Condition cond,
11037                   DataType dt1,
11038                   DataType dt2,
11039                   SRegister rd,
11040                   SRegister rm)) {
11041     USE(dt2);
11042     VIXL_ASSERT(dt1.Is(dt2));
11043     return Vrintz(cond, dt1, rd, rm);
11044   }
11045   VIXL_DEPRECATED(
11046       "void Vrintz(DataType dt, SRegister rd, SRegister rm)",
Vrintz(DataType dt1,DataType dt2,SRegister rd,SRegister rm)11047       void Vrintz(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
11048     USE(dt2);
11049     VIXL_ASSERT(dt1.Is(dt2));
11050     return Vrintz(dt1, rd, rm);
11051   }
11052 
11053  private:
NeedBranch(Condition * cond)11054   bool NeedBranch(Condition* cond) { return !cond->Is(al) && IsUsingT32(); }
11055   static const int kBranchSize = kMaxInstructionSizeInBytes;
11056 
11057   RegisterList available_;
11058   VRegisterList available_vfp_;
11059   UseScratchRegisterScope* current_scratch_scope_;
11060   MacroAssemblerContext context_;
11061   PoolManager<int32_t> pool_manager_;
11062   bool generate_simulator_code_;
11063   bool allow_macro_instructions_;
11064   Label* pool_end_;
11065 
11066   friend class TestMacroAssembler;
11067 };
11068 
11069 // This scope utility allows scratch registers to be managed safely. The
11070 // MacroAssembler's GetScratchRegisterList() is used as a pool of scratch
11071 // registers. These registers can be allocated on demand, and will be returned
11072 // at the end of the scope.
11073 //
11074 // When the scope ends, the MacroAssembler's lists will be restored to their
11075 // original state, even if the lists were modified by some other means.
11076 //
11077 // Scopes must nest perfectly. That is, they must be destructed in reverse
11078 // construction order. Otherwise, it is not clear how to handle cases where one
11079 // scope acquires a register that was included in a now-closing scope. With
11080 // perfect nesting, this cannot occur.
11081 class UseScratchRegisterScope {
11082  public:
11083   // This constructor implicitly calls the `Open` function to initialise the
11084   // scope, so it is ready to use immediately after it has been constructed.
UseScratchRegisterScope(MacroAssembler * masm)11085   explicit UseScratchRegisterScope(MacroAssembler* masm)
11086       : masm_(NULL), parent_(NULL), old_available_(0), old_available_vfp_(0) {
11087     Open(masm);
11088   }
11089   // This constructor allows deferred and optional initialisation of the scope.
11090   // The user is required to explicitly call the `Open` function before using
11091   // the scope.
UseScratchRegisterScope()11092   UseScratchRegisterScope()
11093       : masm_(NULL), parent_(NULL), old_available_(0), old_available_vfp_(0) {}
11094 
11095   // This function performs the actual initialisation work.
11096   void Open(MacroAssembler* masm);
11097 
11098   // The destructor always implicitly calls the `Close` function.
~UseScratchRegisterScope()11099   ~UseScratchRegisterScope() { Close(); }
11100 
11101   // This function performs the cleaning-up work. It must succeed even if the
11102   // scope has not been opened. It is safe to call multiple times.
11103   void Close();
11104 
11105   bool IsAvailable(const Register& reg) const;
11106   bool IsAvailable(const VRegister& reg) const;
11107 
11108   // Take a register from the temp list. It will be returned automatically when
11109   // the scope ends.
11110   Register Acquire();
11111   VRegister AcquireV(unsigned size_in_bits);
11112   QRegister AcquireQ();
11113   DRegister AcquireD();
11114   SRegister AcquireS();
11115 
11116   // Explicitly release an acquired (or excluded) register, putting it back in
11117   // the temp list.
11118   void Release(const Register& reg);
11119   void Release(const VRegister& reg);
11120 
11121   // Make the specified registers available as scratch registers for the
11122   // duration of this scope.
11123   void Include(const RegisterList& list);
11124   void Include(const Register& reg1,
11125                const Register& reg2 = NoReg,
11126                const Register& reg3 = NoReg,
11127                const Register& reg4 = NoReg) {
11128     Include(RegisterList(reg1, reg2, reg3, reg4));
11129   }
11130   void Include(const VRegisterList& list);
11131   void Include(const VRegister& reg1,
11132                const VRegister& reg2 = NoVReg,
11133                const VRegister& reg3 = NoVReg,
11134                const VRegister& reg4 = NoVReg) {
11135     Include(VRegisterList(reg1, reg2, reg3, reg4));
11136   }
11137 
11138   // Make sure that the specified registers are not available in this scope.
11139   // This can be used to prevent helper functions from using sensitive
11140   // registers, for example.
11141   void Exclude(const RegisterList& list);
11142   void Exclude(const Register& reg1,
11143                const Register& reg2 = NoReg,
11144                const Register& reg3 = NoReg,
11145                const Register& reg4 = NoReg) {
11146     Exclude(RegisterList(reg1, reg2, reg3, reg4));
11147   }
11148   void Exclude(const VRegisterList& list);
11149   void Exclude(const VRegister& reg1,
11150                const VRegister& reg2 = NoVReg,
11151                const VRegister& reg3 = NoVReg,
11152                const VRegister& reg4 = NoVReg) {
11153     Exclude(VRegisterList(reg1, reg2, reg3, reg4));
11154   }
11155 
11156   // A convenience helper to exclude any registers used by the operand.
11157   void Exclude(const Operand& operand);
11158 
11159   // Prevent any scratch registers from being used in this scope.
11160   void ExcludeAll();
11161 
11162  private:
11163   // The MacroAssembler maintains a list of available scratch registers, and
11164   // also keeps track of the most recently-opened scope so that on destruction
11165   // we can check that scopes do not outlive their parents.
11166   MacroAssembler* masm_;
11167   UseScratchRegisterScope* parent_;
11168 
11169   // The state of the available lists at the start of this scope.
11170   uint32_t old_available_;      // kRRegister
11171   uint64_t old_available_vfp_;  // kVRegister
11172 
UseScratchRegisterScope(const UseScratchRegisterScope &)11173   VIXL_DEBUG_NO_RETURN UseScratchRegisterScope(const UseScratchRegisterScope&) {
11174     VIXL_UNREACHABLE();
11175   }
11176   VIXL_DEBUG_NO_RETURN void operator=(const UseScratchRegisterScope&) {
11177     VIXL_UNREACHABLE();
11178   }
11179 };
11180 
11181 
11182 }  // namespace aarch32
11183 }  // namespace vixl
11184 
11185 #endif  // VIXL_AARCH32_MACRO_ASSEMBLER_AARCH32_H_
11186