• 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(  // NOLINT(clang-analyzer-optin.cplusplus.VirtualCall)
272         true);
273 #else
274     USE(allow_macro_instructions_);
275 #endif
276   }
277   explicit MacroAssembler(size_t size, InstructionSet isa = kDefaultISA)
Assembler(size,isa)278       : Assembler(size, isa),
279         available_(r12),
280         current_scratch_scope_(NULL),
281         pool_manager_(4 /*header_size*/,
282                       4 /*alignment*/,
283                       4 /*buffer_alignment*/),
284         generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE),
285         pool_end_(NULL) {
286 #ifdef VIXL_DEBUG
287     SetAllowMacroInstructions(  // NOLINT(clang-analyzer-optin.cplusplus.VirtualCall)
288         true);
289 #endif
290   }
291   MacroAssembler(byte* buffer, size_t size, InstructionSet isa = kDefaultISA)
Assembler(buffer,size,isa)292       : Assembler(buffer, size, isa),
293         available_(r12),
294         current_scratch_scope_(NULL),
295         pool_manager_(4 /*header_size*/,
296                       4 /*alignment*/,
297                       4 /*buffer_alignment*/),
298         generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE),
299         pool_end_(NULL) {
300 #ifdef VIXL_DEBUG
301     SetAllowMacroInstructions(  // NOLINT(clang-analyzer-optin.cplusplus.VirtualCall)
302         true);
303 #endif
304   }
305 
GenerateSimulatorCode()306   bool GenerateSimulatorCode() const { return generate_simulator_code_; }
307 
AllowMacroInstructions()308   virtual bool AllowMacroInstructions() const VIXL_OVERRIDE {
309     return allow_macro_instructions_;
310   }
311 
312   void FinalizeCode(FinalizeOption option = kUnreachable) {
313     EmitLiteralPool(option == kUnreachable
314                         ? PoolManager<int32_t>::kNoBranchRequired
315                         : PoolManager<int32_t>::kBranchRequired);
316     Assembler::FinalizeCode();
317   }
318 
GetScratchRegisterList()319   RegisterList* GetScratchRegisterList() { return &available_; }
GetScratchVRegisterList()320   VRegisterList* GetScratchVRegisterList() { return &available_vfp_; }
321 
322   // Get or set the current (most-deeply-nested) UseScratchRegisterScope.
SetCurrentScratchRegisterScope(UseScratchRegisterScope * scope)323   void SetCurrentScratchRegisterScope(UseScratchRegisterScope* scope) {
324     current_scratch_scope_ = scope;
325   }
GetCurrentScratchRegisterScope()326   UseScratchRegisterScope* GetCurrentScratchRegisterScope() {
327     return current_scratch_scope_;
328   }
329 
330   // Given an address calculation (Register + immediate), generate code to
331   // partially compute the address. The returned MemOperand will perform any
332   // remaining computation in a subsequent load or store instruction.
333   //
334   // The offset provided should be the offset that would be used in a load or
335   // store instruction (if it had sufficient range). This only matters where
336   // base.Is(pc), since load and store instructions align the pc before
337   // dereferencing it.
338   //
339   // TODO: Improve the handling of negative offsets. They are not implemented
340   // precisely for now because they only have a marginal benefit for the
341   // existing uses (in delegates).
342   MemOperand MemOperandComputationHelper(Condition cond,
343                                          Register scratch,
344                                          Register base,
345                                          uint32_t offset,
346                                          uint32_t extra_offset_mask = 0);
347 
348   MemOperand MemOperandComputationHelper(Register scratch,
349                                          Register base,
350                                          uint32_t offset,
351                                          uint32_t extra_offset_mask = 0) {
352     return MemOperandComputationHelper(al,
353                                        scratch,
354                                        base,
355                                        offset,
356                                        extra_offset_mask);
357   }
358   MemOperand MemOperandComputationHelper(Condition cond,
359                                          Register scratch,
360                                          Location* location,
361                                          uint32_t extra_offset_mask = 0) {
362     // Check for buffer space _before_ calculating the offset, in case we
363     // generate a pool that affects the offset calculation.
364     CodeBufferCheckScope scope(this, 4 * kMaxInstructionSizeInBytes);
365     Label::Offset offset =
366         location->GetLocation() -
367         AlignDown(GetCursorOffset() + GetArchitectureStatePCOffset(), 4);
368     return MemOperandComputationHelper(cond,
369                                        scratch,
370                                        pc,
371                                        offset,
372                                        extra_offset_mask);
373   }
374   MemOperand MemOperandComputationHelper(Register scratch,
375                                          Location* location,
376                                          uint32_t extra_offset_mask = 0) {
377     return MemOperandComputationHelper(al,
378                                        scratch,
379                                        location,
380                                        extra_offset_mask);
381   }
382 
383   // Determine the appropriate mask to pass into MemOperandComputationHelper.
384   uint32_t GetOffsetMask(InstructionType type, AddrMode addrmode);
385 
386   // State and type helpers.
IsModifiedImmediate(uint32_t imm)387   bool IsModifiedImmediate(uint32_t imm) {
388     return IsUsingT32() ? ImmediateT32::IsImmediateT32(imm)
389                         : ImmediateA32::IsImmediateA32(imm);
390   }
391 
Bind(Label * label)392   void Bind(Label* label) {
393     VIXL_ASSERT(allow_macro_instructions_);
394     BindHelper(label);
395   }
396 
BindHelper(Label * label)397   virtual void BindHelper(Label* label) VIXL_OVERRIDE {
398     // Assert that we have the correct buffer alignment.
399     if (IsUsingT32()) {
400       VIXL_ASSERT(GetBuffer()->Is16bitAligned());
401     } else {
402       VIXL_ASSERT(GetBuffer()->Is32bitAligned());
403     }
404     // If we need to add padding, check if we have to emit the pool.
405     const int32_t pc = GetCursorOffset();
406     if (label->Needs16BitPadding(pc)) {
407       const int kPaddingBytes = 2;
408       if (pool_manager_.MustEmit(pc, kPaddingBytes)) {
409         int32_t new_pc = pool_manager_.Emit(this, pc, kPaddingBytes);
410         USE(new_pc);
411         VIXL_ASSERT(new_pc == GetCursorOffset());
412       }
413     }
414     pool_manager_.Bind(this, label, GetCursorOffset());
415   }
416 
RegisterLiteralReference(RawLiteral * literal)417   void RegisterLiteralReference(RawLiteral* literal) {
418     if (literal->IsManuallyPlaced()) return;
419     RegisterForwardReference(literal);
420   }
421 
RegisterForwardReference(Location * location)422   void RegisterForwardReference(Location* location) {
423     if (location->IsBound()) return;
424     VIXL_ASSERT(location->HasForwardReferences());
425     const Location::ForwardRef& reference = location->GetLastForwardReference();
426     pool_manager_.AddObjectReference(&reference, location);
427   }
428 
429   void CheckEmitPoolForInstruction(const ReferenceInfo* info,
430                                    Location* location,
431                                    Condition* cond = NULL) {
432     int size = info->size;
433     int32_t pc = GetCursorOffset();
434     // If we need to emit a branch over the instruction, take this into account.
435     if ((cond != NULL) && NeedBranch(cond)) {
436       size += kBranchSize;
437       pc += kBranchSize;
438     }
439     int32_t from = pc;
440     from += IsUsingT32() ? kT32PcDelta : kA32PcDelta;
441     if (info->pc_needs_aligning) from = AlignDown(from, 4);
442     int32_t min = from + info->min_offset;
443     int32_t max = from + info->max_offset;
444     ForwardReference<int32_t> temp_ref(pc,
445                                        info->size,
446                                        min,
447                                        max,
448                                        info->alignment);
449     if (pool_manager_.MustEmit(GetCursorOffset(), size, &temp_ref, location)) {
450       int32_t new_pc = pool_manager_.Emit(this,
451                                           GetCursorOffset(),
452                                           info->size,
453                                           &temp_ref,
454                                           location);
455       USE(new_pc);
456       VIXL_ASSERT(new_pc == GetCursorOffset());
457     }
458   }
459 
Place(RawLiteral * literal)460   void Place(RawLiteral* literal) {
461     VIXL_ASSERT(allow_macro_instructions_);
462     VIXL_ASSERT(literal->IsManuallyPlaced());
463     // Check if we need to emit the pools. Take the alignment of the literal
464     // into account, as well as potential 16-bit padding needed to reach the
465     // minimum accessible location.
466     int alignment = literal->GetMaxAlignment();
467     int32_t pc = GetCursorOffset();
468     int total_size = AlignUp(pc, alignment) - pc + literal->GetSize();
469     if (literal->Needs16BitPadding(pc)) total_size += 2;
470     if (pool_manager_.MustEmit(pc, total_size)) {
471       int32_t new_pc = pool_manager_.Emit(this, pc, total_size);
472       USE(new_pc);
473       VIXL_ASSERT(new_pc == GetCursorOffset());
474     }
475     pool_manager_.Bind(this, literal, GetCursorOffset());
476     literal->EmitPoolObject(this);
477     // Align the buffer, to be ready to generate instructions right after
478     // this.
479     GetBuffer()->Align();
480   }
481 
482   void EmitLiteralPool(PoolManager<int32_t>::EmitOption option =
483                            PoolManager<int32_t>::kBranchRequired) {
484     VIXL_ASSERT(!ArePoolsBlocked());
485     int32_t new_pc =
486         pool_manager_.Emit(this, GetCursorOffset(), 0, NULL, NULL, option);
487     VIXL_ASSERT(new_pc == GetCursorOffset());
488     USE(new_pc);
489   }
490 
EnsureEmitFor(uint32_t size)491   void EnsureEmitFor(uint32_t size) {
492     EnsureEmitPoolsFor(size);
493     VIXL_ASSERT(GetBuffer()->HasSpaceFor(size) || GetBuffer()->IsManaged());
494     GetBuffer()->EnsureSpaceFor(size);
495   }
496 
AliasesAvailableScratchRegister(Register reg)497   bool AliasesAvailableScratchRegister(Register reg) {
498     return GetScratchRegisterList()->Includes(reg);
499   }
500 
AliasesAvailableScratchRegister(RegisterOrAPSR_nzcv reg)501   bool AliasesAvailableScratchRegister(RegisterOrAPSR_nzcv reg) {
502     if (reg.IsAPSR_nzcv()) return false;
503     return GetScratchRegisterList()->Includes(reg.AsRegister());
504   }
505 
AliasesAvailableScratchRegister(VRegister reg)506   bool AliasesAvailableScratchRegister(VRegister reg) {
507     return GetScratchVRegisterList()->IncludesAliasOf(reg);
508   }
509 
AliasesAvailableScratchRegister(const Operand & operand)510   bool AliasesAvailableScratchRegister(const Operand& operand) {
511     if (operand.IsImmediate()) return false;
512     return AliasesAvailableScratchRegister(operand.GetBaseRegister()) ||
513            (operand.IsRegisterShiftedRegister() &&
514             AliasesAvailableScratchRegister(operand.GetShiftRegister()));
515   }
516 
AliasesAvailableScratchRegister(const NeonOperand & operand)517   bool AliasesAvailableScratchRegister(const NeonOperand& operand) {
518     if (operand.IsImmediate()) return false;
519     return AliasesAvailableScratchRegister(operand.GetRegister());
520   }
521 
AliasesAvailableScratchRegister(SRegisterList list)522   bool AliasesAvailableScratchRegister(SRegisterList list) {
523     for (int n = 0; n < list.GetLength(); n++) {
524       if (AliasesAvailableScratchRegister(list.GetSRegister(n))) return true;
525     }
526     return false;
527   }
528 
AliasesAvailableScratchRegister(DRegisterList list)529   bool AliasesAvailableScratchRegister(DRegisterList list) {
530     for (int n = 0; n < list.GetLength(); n++) {
531       if (AliasesAvailableScratchRegister(list.GetDRegister(n))) return true;
532     }
533     return false;
534   }
535 
AliasesAvailableScratchRegister(NeonRegisterList list)536   bool AliasesAvailableScratchRegister(NeonRegisterList list) {
537     for (int n = 0; n < list.GetLength(); n++) {
538       if (AliasesAvailableScratchRegister(list.GetDRegister(n))) return true;
539     }
540     return false;
541   }
542 
AliasesAvailableScratchRegister(RegisterList list)543   bool AliasesAvailableScratchRegister(RegisterList list) {
544     return GetScratchRegisterList()->Overlaps(list);
545   }
546 
AliasesAvailableScratchRegister(const MemOperand & operand)547   bool AliasesAvailableScratchRegister(const MemOperand& operand) {
548     return AliasesAvailableScratchRegister(operand.GetBaseRegister()) ||
549            (operand.IsShiftedRegister() &&
550             AliasesAvailableScratchRegister(operand.GetOffsetRegister()));
551   }
552 
553   // Adr with a literal already constructed. Add the literal to the pool if it
554   // is not already done.
Adr(Condition cond,Register rd,RawLiteral * literal)555   void Adr(Condition cond, Register rd, RawLiteral* literal) {
556     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
557     VIXL_ASSERT(allow_macro_instructions_);
558     VIXL_ASSERT(OutsideITBlock());
559     MacroEmissionCheckScope::PoolPolicy pool_policy =
560         MacroEmissionCheckScope::kBlockPools;
561     if (!literal->IsBound()) {
562       const ReferenceInfo* info;
563       bool can_encode = adr_info(cond, Best, rd, literal, &info);
564       VIXL_CHECK(can_encode);
565       CheckEmitPoolForInstruction(info, literal, &cond);
566       // We have already checked for pool emission.
567       pool_policy = MacroEmissionCheckScope::kIgnorePools;
568     }
569     MacroEmissionCheckScope guard(this, pool_policy);
570     ITScope it_scope(this, &cond, guard);
571     adr(cond, Best, rd, literal);
572     RegisterLiteralReference(literal);
573   }
Adr(Register rd,RawLiteral * literal)574   void Adr(Register rd, RawLiteral* literal) { Adr(al, rd, literal); }
575 
576   // Loads with literals already constructed. Add the literal to the pool
577   // if it is not already done.
Ldr(Condition cond,Register rt,RawLiteral * literal)578   void Ldr(Condition cond, Register rt, RawLiteral* literal) {
579     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
580     VIXL_ASSERT(allow_macro_instructions_);
581     VIXL_ASSERT(OutsideITBlock());
582     MacroEmissionCheckScope::PoolPolicy pool_policy =
583         MacroEmissionCheckScope::kBlockPools;
584     if (!literal->IsBound()) {
585       const ReferenceInfo* info;
586       bool can_encode = ldr_info(cond, Best, rt, literal, &info);
587       VIXL_CHECK(can_encode);
588       CheckEmitPoolForInstruction(info, literal, &cond);
589       // We have already checked for pool emission.
590       pool_policy = MacroEmissionCheckScope::kIgnorePools;
591     }
592     MacroEmissionCheckScope guard(this, pool_policy);
593     ITScope it_scope(this, &cond, guard);
594     ldr(cond, rt, literal);
595     RegisterLiteralReference(literal);
596   }
Ldr(Register rt,RawLiteral * literal)597   void Ldr(Register rt, RawLiteral* literal) { Ldr(al, rt, literal); }
598 
Ldrb(Condition cond,Register rt,RawLiteral * literal)599   void Ldrb(Condition cond, Register rt, RawLiteral* literal) {
600     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
601     VIXL_ASSERT(allow_macro_instructions_);
602     VIXL_ASSERT(OutsideITBlock());
603     MacroEmissionCheckScope::PoolPolicy pool_policy =
604         MacroEmissionCheckScope::kBlockPools;
605     if (!literal->IsBound()) {
606       const ReferenceInfo* info;
607       bool can_encode = ldrb_info(cond, rt, literal, &info);
608       VIXL_CHECK(can_encode);
609       CheckEmitPoolForInstruction(info, literal, &cond);
610       // We have already checked for pool emission.
611       pool_policy = MacroEmissionCheckScope::kIgnorePools;
612     }
613     MacroEmissionCheckScope guard(this, pool_policy);
614     ITScope it_scope(this, &cond, guard);
615     ldrb(cond, rt, literal);
616     RegisterLiteralReference(literal);
617   }
Ldrb(Register rt,RawLiteral * literal)618   void Ldrb(Register rt, RawLiteral* literal) { Ldrb(al, rt, literal); }
619 
Ldrd(Condition cond,Register rt,Register rt2,RawLiteral * literal)620   void Ldrd(Condition cond, Register rt, Register rt2, RawLiteral* literal) {
621     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
622     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
623     VIXL_ASSERT(allow_macro_instructions_);
624     VIXL_ASSERT(OutsideITBlock());
625     MacroEmissionCheckScope::PoolPolicy pool_policy =
626         MacroEmissionCheckScope::kBlockPools;
627     if (!literal->IsBound()) {
628       const ReferenceInfo* info;
629       bool can_encode = ldrd_info(cond, rt, rt2, literal, &info);
630       VIXL_CHECK(can_encode);
631       CheckEmitPoolForInstruction(info, literal, &cond);
632       // We have already checked for pool emission.
633       pool_policy = MacroEmissionCheckScope::kIgnorePools;
634     }
635     MacroEmissionCheckScope guard(this, pool_policy);
636     ITScope it_scope(this, &cond, guard);
637     ldrd(cond, rt, rt2, literal);
638     RegisterLiteralReference(literal);
639   }
Ldrd(Register rt,Register rt2,RawLiteral * literal)640   void Ldrd(Register rt, Register rt2, RawLiteral* literal) {
641     Ldrd(al, rt, rt2, literal);
642   }
643 
Ldrh(Condition cond,Register rt,RawLiteral * literal)644   void Ldrh(Condition cond, Register rt, RawLiteral* literal) {
645     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
646     VIXL_ASSERT(allow_macro_instructions_);
647     VIXL_ASSERT(OutsideITBlock());
648     MacroEmissionCheckScope::PoolPolicy pool_policy =
649         MacroEmissionCheckScope::kBlockPools;
650     if (!literal->IsBound()) {
651       const ReferenceInfo* info;
652       bool can_encode = ldrh_info(cond, rt, literal, &info);
653       VIXL_CHECK(can_encode);
654       CheckEmitPoolForInstruction(info, literal, &cond);
655       // We have already checked for pool emission.
656       pool_policy = MacroEmissionCheckScope::kIgnorePools;
657     }
658     MacroEmissionCheckScope guard(this, pool_policy);
659     ITScope it_scope(this, &cond, guard);
660     ldrh(cond, rt, literal);
661     RegisterLiteralReference(literal);
662   }
Ldrh(Register rt,RawLiteral * literal)663   void Ldrh(Register rt, RawLiteral* literal) { Ldrh(al, rt, literal); }
664 
Ldrsb(Condition cond,Register rt,RawLiteral * literal)665   void Ldrsb(Condition cond, Register rt, RawLiteral* literal) {
666     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
667     VIXL_ASSERT(allow_macro_instructions_);
668     VIXL_ASSERT(OutsideITBlock());
669     MacroEmissionCheckScope::PoolPolicy pool_policy =
670         MacroEmissionCheckScope::kBlockPools;
671     if (!literal->IsBound()) {
672       const ReferenceInfo* info;
673       bool can_encode = ldrsb_info(cond, rt, literal, &info);
674       VIXL_CHECK(can_encode);
675       CheckEmitPoolForInstruction(info, literal, &cond);
676       // We have already checked for pool emission.
677       pool_policy = MacroEmissionCheckScope::kIgnorePools;
678     }
679     MacroEmissionCheckScope guard(this, pool_policy);
680     ITScope it_scope(this, &cond, guard);
681     ldrsb(cond, rt, literal);
682     RegisterLiteralReference(literal);
683   }
Ldrsb(Register rt,RawLiteral * literal)684   void Ldrsb(Register rt, RawLiteral* literal) { Ldrsb(al, rt, literal); }
685 
Ldrsh(Condition cond,Register rt,RawLiteral * literal)686   void Ldrsh(Condition cond, Register rt, RawLiteral* literal) {
687     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
688     VIXL_ASSERT(allow_macro_instructions_);
689     VIXL_ASSERT(OutsideITBlock());
690     MacroEmissionCheckScope::PoolPolicy pool_policy =
691         MacroEmissionCheckScope::kBlockPools;
692     if (!literal->IsBound()) {
693       const ReferenceInfo* info;
694       bool can_encode = ldrsh_info(cond, rt, literal, &info);
695       VIXL_CHECK(can_encode);
696       CheckEmitPoolForInstruction(info, literal, &cond);
697       // We have already checked for pool emission.
698       pool_policy = MacroEmissionCheckScope::kIgnorePools;
699     }
700     MacroEmissionCheckScope guard(this, pool_policy);
701     ITScope it_scope(this, &cond, guard);
702     ldrsh(cond, rt, literal);
703     RegisterLiteralReference(literal);
704   }
Ldrsh(Register rt,RawLiteral * literal)705   void Ldrsh(Register rt, RawLiteral* literal) { Ldrsh(al, rt, literal); }
706 
Vldr(Condition cond,DataType dt,DRegister rd,RawLiteral * literal)707   void Vldr(Condition cond, DataType dt, DRegister rd, RawLiteral* literal) {
708     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
709     VIXL_ASSERT(allow_macro_instructions_);
710     VIXL_ASSERT(OutsideITBlock());
711     MacroEmissionCheckScope::PoolPolicy pool_policy =
712         MacroEmissionCheckScope::kBlockPools;
713     if (!literal->IsBound()) {
714       const ReferenceInfo* info;
715       bool can_encode = vldr_info(cond, dt, rd, literal, &info);
716       VIXL_CHECK(can_encode);
717       CheckEmitPoolForInstruction(info, literal, &cond);
718       // We have already checked for pool emission.
719       pool_policy = MacroEmissionCheckScope::kIgnorePools;
720     }
721     MacroEmissionCheckScope guard(this, pool_policy);
722     ITScope it_scope(this, &cond, guard);
723     vldr(cond, dt, rd, literal);
724     RegisterLiteralReference(literal);
725   }
Vldr(DataType dt,DRegister rd,RawLiteral * literal)726   void Vldr(DataType dt, DRegister rd, RawLiteral* literal) {
727     Vldr(al, dt, rd, literal);
728   }
Vldr(Condition cond,DRegister rd,RawLiteral * literal)729   void Vldr(Condition cond, DRegister rd, RawLiteral* literal) {
730     Vldr(cond, Untyped64, rd, literal);
731   }
Vldr(DRegister rd,RawLiteral * literal)732   void Vldr(DRegister rd, RawLiteral* literal) {
733     Vldr(al, Untyped64, rd, literal);
734   }
735 
Vldr(Condition cond,DataType dt,SRegister rd,RawLiteral * literal)736   void Vldr(Condition cond, DataType dt, SRegister rd, RawLiteral* literal) {
737     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
738     VIXL_ASSERT(allow_macro_instructions_);
739     VIXL_ASSERT(OutsideITBlock());
740     MacroEmissionCheckScope::PoolPolicy pool_policy =
741         MacroEmissionCheckScope::kBlockPools;
742     if (!literal->IsBound()) {
743       const ReferenceInfo* info;
744       bool can_encode = vldr_info(cond, dt, rd, literal, &info);
745       VIXL_CHECK(can_encode);
746       CheckEmitPoolForInstruction(info, literal, &cond);
747       // We have already checked for pool emission.
748       pool_policy = MacroEmissionCheckScope::kIgnorePools;
749     }
750     MacroEmissionCheckScope guard(this, pool_policy);
751     ITScope it_scope(this, &cond, guard);
752     vldr(cond, dt, rd, literal);
753     RegisterLiteralReference(literal);
754   }
Vldr(DataType dt,SRegister rd,RawLiteral * literal)755   void Vldr(DataType dt, SRegister rd, RawLiteral* literal) {
756     Vldr(al, dt, rd, literal);
757   }
Vldr(Condition cond,SRegister rd,RawLiteral * literal)758   void Vldr(Condition cond, SRegister rd, RawLiteral* literal) {
759     Vldr(cond, Untyped32, rd, literal);
760   }
Vldr(SRegister rd,RawLiteral * literal)761   void Vldr(SRegister rd, RawLiteral* literal) {
762     Vldr(al, Untyped32, rd, literal);
763   }
764 
765   // Generic Ldr(register, data)
Ldr(Condition cond,Register rt,uint32_t v)766   void Ldr(Condition cond, Register rt, uint32_t v) {
767     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
768     VIXL_ASSERT(allow_macro_instructions_);
769     VIXL_ASSERT(OutsideITBlock());
770     RawLiteral* literal =
771         new Literal<uint32_t>(v, RawLiteral::kDeletedOnPlacementByPool);
772     Ldr(cond, rt, literal);
773   }
774   template <typename T>
Ldr(Register rt,T v)775   void Ldr(Register rt, T v) {
776     Ldr(al, rt, v);
777   }
778 
779   // Generic Ldrd(rt, rt2, data)
Ldrd(Condition cond,Register rt,Register rt2,uint64_t v)780   void Ldrd(Condition cond, Register rt, Register rt2, uint64_t v) {
781     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
782     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
783     VIXL_ASSERT(allow_macro_instructions_);
784     VIXL_ASSERT(OutsideITBlock());
785     RawLiteral* literal =
786         new Literal<uint64_t>(v, RawLiteral::kDeletedOnPlacementByPool);
787     Ldrd(cond, rt, rt2, literal);
788   }
789   template <typename T>
Ldrd(Register rt,Register rt2,T v)790   void Ldrd(Register rt, Register rt2, T v) {
791     Ldrd(al, rt, rt2, v);
792   }
793 
Vldr(Condition cond,SRegister rd,float v)794   void Vldr(Condition cond, SRegister rd, float v) {
795     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
796     VIXL_ASSERT(allow_macro_instructions_);
797     VIXL_ASSERT(OutsideITBlock());
798     RawLiteral* literal =
799         new Literal<float>(v, RawLiteral::kDeletedOnPlacementByPool);
800     Vldr(cond, rd, literal);
801   }
Vldr(SRegister rd,float v)802   void Vldr(SRegister rd, float v) { Vldr(al, rd, v); }
803 
Vldr(Condition cond,DRegister rd,double v)804   void Vldr(Condition cond, DRegister rd, double v) {
805     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
806     VIXL_ASSERT(allow_macro_instructions_);
807     VIXL_ASSERT(OutsideITBlock());
808     RawLiteral* literal =
809         new Literal<double>(v, RawLiteral::kDeletedOnPlacementByPool);
810     Vldr(cond, rd, literal);
811   }
Vldr(DRegister rd,double v)812   void Vldr(DRegister rd, double v) { Vldr(al, rd, v); }
813 
Vmov(Condition cond,DRegister rt,double v)814   void Vmov(Condition cond, DRegister rt, double v) { Vmov(cond, F64, rt, v); }
Vmov(DRegister rt,double v)815   void Vmov(DRegister rt, double v) { Vmov(al, F64, rt, v); }
Vmov(Condition cond,SRegister rt,float v)816   void Vmov(Condition cond, SRegister rt, float v) { Vmov(cond, F32, rt, v); }
Vmov(SRegister rt,float v)817   void Vmov(SRegister rt, float v) { Vmov(al, F32, rt, v); }
818 
819   // Claim memory on the stack.
820   // Note that the Claim, Drop, and Peek helpers below ensure that offsets used
821   // are multiples of 32 bits to help maintain 32-bit SP alignment.
822   // We could `Align{Up,Down}(size, 4)`, but that's potentially problematic:
823   //     Claim(3)
824   //     Claim(1)
825   //     Drop(4)
826   // would seem correct, when in fact:
827   //    Claim(3) -> sp = sp - 4
828   //    Claim(1) -> sp = sp - 4
829   //    Drop(4)  -> sp = sp + 4
830   //
Claim(int32_t size)831   void Claim(int32_t size) {
832     if (size == 0) return;
833     // The stack must be kept 32bit aligned.
834     VIXL_ASSERT((size > 0) && ((size % 4) == 0));
835     Sub(sp, sp, size);
836   }
837   // Release memory on the stack
Drop(int32_t size)838   void Drop(int32_t size) {
839     if (size == 0) return;
840     // The stack must be kept 32bit aligned.
841     VIXL_ASSERT((size > 0) && ((size % 4) == 0));
842     Add(sp, sp, size);
843   }
Peek(Register dst,int32_t offset)844   void Peek(Register dst, int32_t offset) {
845     VIXL_ASSERT((offset >= 0) && ((offset % 4) == 0));
846     Ldr(dst, MemOperand(sp, offset));
847   }
Poke(Register src,int32_t offset)848   void Poke(Register src, int32_t offset) {
849     VIXL_ASSERT((offset >= 0) && ((offset % 4) == 0));
850     Str(src, MemOperand(sp, offset));
851   }
852   void Printf(const char* format,
853               CPURegister reg1 = NoReg,
854               CPURegister reg2 = NoReg,
855               CPURegister reg3 = NoReg,
856               CPURegister reg4 = NoReg);
857   // Functions used by Printf for generation.
858   void PushRegister(CPURegister reg);
859   void PreparePrintfArgument(CPURegister reg,
860                              int* core_count,
861                              int* vfp_count,
862                              uint32_t* printf_type);
863   // Handlers for cases not handled by the assembler.
864   // ADD, MOVT, MOVW, SUB, SXTB16, TEQ, UXTB16
865   virtual void Delegate(InstructionType type,
866                         InstructionCondROp instruction,
867                         Condition cond,
868                         Register rn,
869                         const Operand& operand) VIXL_OVERRIDE;
870   // CMN, CMP, MOV, MOVS, MVN, MVNS, SXTB, SXTH, TST, UXTB, UXTH
871   virtual void Delegate(InstructionType type,
872                         InstructionCondSizeROp instruction,
873                         Condition cond,
874                         EncodingSize size,
875                         Register rn,
876                         const Operand& operand) VIXL_OVERRIDE;
877   // ADDW, ORN, ORNS, PKHBT, PKHTB, RSC, RSCS, SUBW, SXTAB, SXTAB16, SXTAH,
878   // UXTAB, UXTAB16, UXTAH
879   virtual void Delegate(InstructionType type,
880                         InstructionCondRROp instruction,
881                         Condition cond,
882                         Register rd,
883                         Register rn,
884                         const Operand& operand) VIXL_OVERRIDE;
885   // ADC, ADCS, ADD, ADDS, AND, ANDS, ASR, ASRS, BIC, BICS, EOR, EORS, LSL,
886   // LSLS, LSR, LSRS, ORR, ORRS, ROR, RORS, RSB, RSBS, SBC, SBCS, SUB, SUBS
887   virtual void Delegate(InstructionType type,
888                         InstructionCondSizeRL instruction,
889                         Condition cond,
890                         EncodingSize size,
891                         Register rd,
892                         Location* location) VIXL_OVERRIDE;
893   bool GenerateSplitInstruction(InstructionCondSizeRROp instruction,
894                                 Condition cond,
895                                 Register rd,
896                                 Register rn,
897                                 uint32_t imm,
898                                 uint32_t mask);
899   virtual void Delegate(InstructionType type,
900                         InstructionCondSizeRROp instruction,
901                         Condition cond,
902                         EncodingSize size,
903                         Register rd,
904                         Register rn,
905                         const Operand& operand) VIXL_OVERRIDE;
906   // CBNZ, CBZ
907   virtual void Delegate(InstructionType type,
908                         InstructionRL instruction,
909                         Register rn,
910                         Location* location) VIXL_OVERRIDE;
911   // VMOV
912   virtual void Delegate(InstructionType type,
913                         InstructionCondDtSSop instruction,
914                         Condition cond,
915                         DataType dt,
916                         SRegister rd,
917                         const SOperand& operand) VIXL_OVERRIDE;
918   // VMOV, VMVN
919   virtual void Delegate(InstructionType type,
920                         InstructionCondDtDDop instruction,
921                         Condition cond,
922                         DataType dt,
923                         DRegister rd,
924                         const DOperand& operand) VIXL_OVERRIDE;
925   // VMOV, VMVN
926   virtual void Delegate(InstructionType type,
927                         InstructionCondDtQQop instruction,
928                         Condition cond,
929                         DataType dt,
930                         QRegister rd,
931                         const QOperand& operand) VIXL_OVERRIDE;
932   // LDR, LDRB, LDRH, LDRSB, LDRSH, STR, STRB, STRH
933   virtual void Delegate(InstructionType type,
934                         InstructionCondSizeRMop instruction,
935                         Condition cond,
936                         EncodingSize size,
937                         Register rd,
938                         const MemOperand& operand) VIXL_OVERRIDE;
939   // LDAEXD, LDRD, LDREXD, STLEX, STLEXB, STLEXH, STRD, STREX, STREXB, STREXH
940   virtual void Delegate(InstructionType type,
941                         InstructionCondRL instruction,
942                         Condition cond,
943                         Register rt,
944                         Location* location) VIXL_OVERRIDE;
945   virtual void Delegate(InstructionType type,
946                         InstructionCondRRL instruction,
947                         Condition cond,
948                         Register rt,
949                         Register rt2,
950                         Location* location) VIXL_OVERRIDE;
951   virtual void Delegate(InstructionType type,
952                         InstructionCondRRMop instruction,
953                         Condition cond,
954                         Register rt,
955                         Register rt2,
956                         const MemOperand& operand) VIXL_OVERRIDE;
957   // VLDR, VSTR
958   virtual void Delegate(InstructionType type,
959                         InstructionCondDtSMop instruction,
960                         Condition cond,
961                         DataType dt,
962                         SRegister rd,
963                         const MemOperand& operand) VIXL_OVERRIDE;
964   // VLDR, VSTR
965   virtual void Delegate(InstructionType type,
966                         InstructionCondDtDMop instruction,
967                         Condition cond,
968                         DataType dt,
969                         DRegister rd,
970                         const MemOperand& operand) VIXL_OVERRIDE;
971   // MSR
972   virtual void Delegate(InstructionType type,
973                         InstructionCondMsrOp instruction,
974                         Condition cond,
975                         MaskedSpecialRegister spec_reg,
976                         const Operand& operand) VIXL_OVERRIDE;
977   virtual void Delegate(InstructionType type,
978                         InstructionCondDtDL instruction,
979                         Condition cond,
980                         DataType dt,
981                         DRegister rd,
982                         Location* location) VIXL_OVERRIDE;
983   virtual void Delegate(InstructionType type,
984                         InstructionCondDtSL instruction,
985                         Condition cond,
986                         DataType dt,
987                         SRegister rd,
988                         Location* location) VIXL_OVERRIDE;
989 
990   // Start of generated code.
991 
Adc(Condition cond,Register rd,Register rn,const Operand & operand)992   void Adc(Condition cond, Register rd, Register rn, const Operand& operand) {
993     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
994     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
995     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
996     VIXL_ASSERT(allow_macro_instructions_);
997     VIXL_ASSERT(OutsideITBlock());
998     MacroEmissionCheckScope guard(this);
999     bool can_use_it =
1000         // ADC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1001         operand.IsPlainRegister() && rn.IsLow() && rd.Is(rn) &&
1002         operand.GetBaseRegister().IsLow();
1003     ITScope it_scope(this, &cond, guard, can_use_it);
1004     adc(cond, rd, rn, operand);
1005   }
Adc(Register rd,Register rn,const Operand & operand)1006   void Adc(Register rd, Register rn, const Operand& operand) {
1007     Adc(al, rd, rn, operand);
1008   }
Adc(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1009   void Adc(FlagsUpdate flags,
1010            Condition cond,
1011            Register rd,
1012            Register rn,
1013            const Operand& operand) {
1014     switch (flags) {
1015       case LeaveFlags:
1016         Adc(cond, rd, rn, operand);
1017         break;
1018       case SetFlags:
1019         Adcs(cond, rd, rn, operand);
1020         break;
1021       case DontCare:
1022         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1023                                    rn.Is(rd) && operand.IsPlainRegister() &&
1024                                    operand.GetBaseRegister().IsLow();
1025         if (setflags_is_smaller) {
1026           Adcs(cond, rd, rn, operand);
1027         } else {
1028           Adc(cond, rd, rn, operand);
1029         }
1030         break;
1031     }
1032   }
Adc(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1033   void Adc(FlagsUpdate flags,
1034            Register rd,
1035            Register rn,
1036            const Operand& operand) {
1037     Adc(flags, al, rd, rn, operand);
1038   }
1039 
Adcs(Condition cond,Register rd,Register rn,const Operand & operand)1040   void Adcs(Condition cond, Register rd, Register rn, const Operand& operand) {
1041     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1042     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1043     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1044     VIXL_ASSERT(allow_macro_instructions_);
1045     VIXL_ASSERT(OutsideITBlock());
1046     MacroEmissionCheckScope guard(this);
1047     ITScope it_scope(this, &cond, guard);
1048     adcs(cond, rd, rn, operand);
1049   }
Adcs(Register rd,Register rn,const Operand & operand)1050   void Adcs(Register rd, Register rn, const Operand& operand) {
1051     Adcs(al, rd, rn, operand);
1052   }
1053 
Add(Condition cond,Register rd,Register rn,const Operand & operand)1054   void Add(Condition cond, Register rd, Register rn, const Operand& operand) {
1055     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1056     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1057     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1058     VIXL_ASSERT(allow_macro_instructions_);
1059     VIXL_ASSERT(OutsideITBlock());
1060     MacroEmissionCheckScope guard(this);
1061     if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) {
1062       uint32_t immediate = operand.GetImmediate();
1063       if (immediate == 0) {
1064         return;
1065       }
1066     }
1067     bool can_use_it =
1068         // ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
1069         (operand.IsImmediate() && (operand.GetImmediate() <= 7) && rn.IsLow() &&
1070          rd.IsLow()) ||
1071         // ADD<c>{<q>} {<Rdn>,} <Rdn>, #<imm8> ; T2
1072         (operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
1073          rd.IsLow() && rn.Is(rd)) ||
1074         // ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1
1075         (operand.IsImmediate() && (operand.GetImmediate() <= 1020) &&
1076          ((operand.GetImmediate() & 0x3) == 0) && rd.IsLow() && rn.IsSP()) ||
1077         // ADD<c>{<q>} <Rd>, <Rn>, <Rm>
1078         (operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
1079          operand.GetBaseRegister().IsLow()) ||
1080         // ADD<c>{<q>} <Rdn>, <Rm> ; T2
1081         (operand.IsPlainRegister() && !rd.IsPC() && rn.Is(rd) &&
1082          !operand.GetBaseRegister().IsSP() &&
1083          !operand.GetBaseRegister().IsPC()) ||
1084         // ADD{<c>}{<q>} {<Rdm>,} SP, <Rdm> ; T1
1085         (operand.IsPlainRegister() && !rd.IsPC() && rn.IsSP() &&
1086          operand.GetBaseRegister().Is(rd));
1087     ITScope it_scope(this, &cond, guard, can_use_it);
1088     add(cond, rd, rn, operand);
1089   }
Add(Register rd,Register rn,const Operand & operand)1090   void Add(Register rd, Register rn, const Operand& operand) {
1091     Add(al, rd, rn, operand);
1092   }
Add(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1093   void Add(FlagsUpdate flags,
1094            Condition cond,
1095            Register rd,
1096            Register rn,
1097            const Operand& operand) {
1098     switch (flags) {
1099       case LeaveFlags:
1100         Add(cond, rd, rn, operand);
1101         break;
1102       case SetFlags:
1103         Adds(cond, rd, rn, operand);
1104         break;
1105       case DontCare:
1106         bool setflags_is_smaller =
1107             IsUsingT32() && cond.Is(al) &&
1108             ((operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
1109               !rd.Is(rn) && operand.GetBaseRegister().IsLow()) ||
1110              (operand.IsImmediate() &&
1111               ((rd.IsLow() && rn.IsLow() && (operand.GetImmediate() < 8)) ||
1112                (rd.IsLow() && rn.Is(rd) && (operand.GetImmediate() < 256)))));
1113         if (setflags_is_smaller) {
1114           Adds(cond, rd, rn, operand);
1115         } else {
1116           bool changed_op_is_smaller =
1117               operand.IsImmediate() && (operand.GetSignedImmediate() < 0) &&
1118               ((rd.IsLow() && rn.IsLow() &&
1119                 (operand.GetSignedImmediate() >= -7)) ||
1120                (rd.IsLow() && rn.Is(rd) &&
1121                 (operand.GetSignedImmediate() >= -255)));
1122           if (changed_op_is_smaller) {
1123             Subs(cond, rd, rn, -operand.GetSignedImmediate());
1124           } else {
1125             Add(cond, rd, rn, operand);
1126           }
1127         }
1128         break;
1129     }
1130   }
Add(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1131   void Add(FlagsUpdate flags,
1132            Register rd,
1133            Register rn,
1134            const Operand& operand) {
1135     Add(flags, al, rd, rn, operand);
1136   }
1137 
Adds(Condition cond,Register rd,Register rn,const Operand & operand)1138   void Adds(Condition cond, Register rd, Register rn, const Operand& operand) {
1139     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1140     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1141     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1142     VIXL_ASSERT(allow_macro_instructions_);
1143     VIXL_ASSERT(OutsideITBlock());
1144     MacroEmissionCheckScope guard(this);
1145     ITScope it_scope(this, &cond, guard);
1146     adds(cond, rd, rn, operand);
1147   }
Adds(Register rd,Register rn,const Operand & operand)1148   void Adds(Register rd, Register rn, const Operand& operand) {
1149     Adds(al, rd, rn, operand);
1150   }
1151 
And(Condition cond,Register rd,Register rn,const Operand & operand)1152   void And(Condition cond, Register rd, Register rn, const Operand& operand) {
1153     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1154     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1155     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1156     VIXL_ASSERT(allow_macro_instructions_);
1157     VIXL_ASSERT(OutsideITBlock());
1158     MacroEmissionCheckScope guard(this);
1159     if (rd.Is(rn) && operand.IsPlainRegister() &&
1160         rd.Is(operand.GetBaseRegister())) {
1161       return;
1162     }
1163     if (cond.Is(al) && operand.IsImmediate()) {
1164       uint32_t immediate = operand.GetImmediate();
1165       if (immediate == 0) {
1166         mov(rd, 0);
1167         return;
1168       }
1169       if ((immediate == 0xffffffff) && rd.Is(rn)) {
1170         return;
1171       }
1172     }
1173     bool can_use_it =
1174         // AND<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1175         operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
1176         operand.GetBaseRegister().IsLow();
1177     ITScope it_scope(this, &cond, guard, can_use_it);
1178     and_(cond, rd, rn, operand);
1179   }
And(Register rd,Register rn,const Operand & operand)1180   void And(Register rd, Register rn, const Operand& operand) {
1181     And(al, rd, rn, operand);
1182   }
And(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1183   void And(FlagsUpdate flags,
1184            Condition cond,
1185            Register rd,
1186            Register rn,
1187            const Operand& operand) {
1188     switch (flags) {
1189       case LeaveFlags:
1190         And(cond, rd, rn, operand);
1191         break;
1192       case SetFlags:
1193         Ands(cond, rd, rn, operand);
1194         break;
1195       case DontCare:
1196         if (operand.IsPlainRegister() && rd.Is(rn) &&
1197             rd.Is(operand.GetBaseRegister())) {
1198           return;
1199         }
1200         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1201                                    rn.Is(rd) && operand.IsPlainRegister() &&
1202                                    operand.GetBaseRegister().IsLow();
1203         if (setflags_is_smaller) {
1204           Ands(cond, rd, rn, operand);
1205         } else {
1206           And(cond, rd, rn, operand);
1207         }
1208         break;
1209     }
1210   }
And(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1211   void And(FlagsUpdate flags,
1212            Register rd,
1213            Register rn,
1214            const Operand& operand) {
1215     And(flags, al, rd, rn, operand);
1216   }
1217 
Ands(Condition cond,Register rd,Register rn,const Operand & operand)1218   void Ands(Condition cond, Register rd, Register rn, const Operand& operand) {
1219     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1220     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1221     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1222     VIXL_ASSERT(allow_macro_instructions_);
1223     VIXL_ASSERT(OutsideITBlock());
1224     MacroEmissionCheckScope guard(this);
1225     ITScope it_scope(this, &cond, guard);
1226     ands(cond, rd, rn, operand);
1227   }
Ands(Register rd,Register rn,const Operand & operand)1228   void Ands(Register rd, Register rn, const Operand& operand) {
1229     Ands(al, rd, rn, operand);
1230   }
1231 
Asr(Condition cond,Register rd,Register rm,const Operand & operand)1232   void Asr(Condition cond, Register rd, Register rm, const Operand& operand) {
1233     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1234     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1235     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1236     VIXL_ASSERT(allow_macro_instructions_);
1237     VIXL_ASSERT(OutsideITBlock());
1238     MacroEmissionCheckScope guard(this);
1239     bool can_use_it =
1240         // ASR<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
1241         (operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
1242          (operand.GetImmediate() <= 32) && rd.IsLow() && rm.IsLow()) ||
1243         // ASR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
1244         (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
1245          operand.GetBaseRegister().IsLow());
1246     ITScope it_scope(this, &cond, guard, can_use_it);
1247     asr(cond, rd, rm, operand);
1248   }
Asr(Register rd,Register rm,const Operand & operand)1249   void Asr(Register rd, Register rm, const Operand& operand) {
1250     Asr(al, rd, rm, operand);
1251   }
Asr(FlagsUpdate flags,Condition cond,Register rd,Register rm,const Operand & operand)1252   void Asr(FlagsUpdate flags,
1253            Condition cond,
1254            Register rd,
1255            Register rm,
1256            const Operand& operand) {
1257     switch (flags) {
1258       case LeaveFlags:
1259         Asr(cond, rd, rm, operand);
1260         break;
1261       case SetFlags:
1262         Asrs(cond, rd, rm, operand);
1263         break;
1264       case DontCare:
1265         bool setflags_is_smaller =
1266             IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() &&
1267             ((operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
1268               (operand.GetImmediate() <= 32)) ||
1269              (operand.IsPlainRegister() && rd.Is(rm)));
1270         if (setflags_is_smaller) {
1271           Asrs(cond, rd, rm, operand);
1272         } else {
1273           Asr(cond, rd, rm, operand);
1274         }
1275         break;
1276     }
1277   }
Asr(FlagsUpdate flags,Register rd,Register rm,const Operand & operand)1278   void Asr(FlagsUpdate flags,
1279            Register rd,
1280            Register rm,
1281            const Operand& operand) {
1282     Asr(flags, al, rd, rm, operand);
1283   }
1284 
Asrs(Condition cond,Register rd,Register rm,const Operand & operand)1285   void Asrs(Condition cond, Register rd, Register rm, const Operand& operand) {
1286     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1287     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1288     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1289     VIXL_ASSERT(allow_macro_instructions_);
1290     VIXL_ASSERT(OutsideITBlock());
1291     MacroEmissionCheckScope guard(this);
1292     ITScope it_scope(this, &cond, guard);
1293     asrs(cond, rd, rm, operand);
1294   }
Asrs(Register rd,Register rm,const Operand & operand)1295   void Asrs(Register rd, Register rm, const Operand& operand) {
1296     Asrs(al, rd, rm, operand);
1297   }
1298 
1299   void B(Condition cond, Label* label, BranchHint hint = kBranchWithoutHint) {
1300     VIXL_ASSERT(allow_macro_instructions_);
1301     VIXL_ASSERT(OutsideITBlock());
1302     EncodingSize size = Best;
1303     MacroEmissionCheckScope::PoolPolicy pool_policy =
1304         MacroEmissionCheckScope::kBlockPools;
1305     if (!label->IsBound()) {
1306       if (hint == kNear) size = Narrow;
1307       const ReferenceInfo* info;
1308       bool can_encode = b_info(cond, size, label, &info);
1309       VIXL_CHECK(can_encode);
1310       CheckEmitPoolForInstruction(info, label, &cond);
1311       // We have already checked for pool emission.
1312       pool_policy = MacroEmissionCheckScope::kIgnorePools;
1313     }
1314     MacroEmissionCheckScope guard(this, pool_policy);
1315     b(cond, size, label);
1316     RegisterForwardReference(label);
1317   }
1318   void B(Label* label, BranchHint hint = kBranchWithoutHint) {
1319     B(al, label, hint);
1320   }
BPreferNear(Condition cond,Label * label)1321   void BPreferNear(Condition cond, Label* label) { B(cond, label, kNear); }
BPreferNear(Label * label)1322   void BPreferNear(Label* label) { B(al, label, kNear); }
1323 
Bfc(Condition cond,Register rd,uint32_t lsb,uint32_t width)1324   void Bfc(Condition cond, Register rd, uint32_t lsb, uint32_t width) {
1325     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1326     VIXL_ASSERT(allow_macro_instructions_);
1327     VIXL_ASSERT(OutsideITBlock());
1328     MacroEmissionCheckScope guard(this);
1329     ITScope it_scope(this, &cond, guard);
1330     bfc(cond, rd, lsb, width);
1331   }
Bfc(Register rd,uint32_t lsb,uint32_t width)1332   void Bfc(Register rd, uint32_t lsb, uint32_t width) {
1333     Bfc(al, rd, lsb, width);
1334   }
1335 
Bfi(Condition cond,Register rd,Register rn,uint32_t lsb,uint32_t width)1336   void Bfi(
1337       Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
1338     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1339     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1340     VIXL_ASSERT(allow_macro_instructions_);
1341     VIXL_ASSERT(OutsideITBlock());
1342     MacroEmissionCheckScope guard(this);
1343     ITScope it_scope(this, &cond, guard);
1344     bfi(cond, rd, rn, lsb, width);
1345   }
Bfi(Register rd,Register rn,uint32_t lsb,uint32_t width)1346   void Bfi(Register rd, Register rn, uint32_t lsb, uint32_t width) {
1347     Bfi(al, rd, rn, lsb, width);
1348   }
1349 
Bic(Condition cond,Register rd,Register rn,const Operand & operand)1350   void Bic(Condition cond, Register rd, Register rn, const Operand& operand) {
1351     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1352     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1353     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1354     VIXL_ASSERT(allow_macro_instructions_);
1355     VIXL_ASSERT(OutsideITBlock());
1356     MacroEmissionCheckScope guard(this);
1357     if (cond.Is(al) && operand.IsImmediate()) {
1358       uint32_t immediate = operand.GetImmediate();
1359       if ((immediate == 0) && rd.Is(rn)) {
1360         return;
1361       }
1362       if (immediate == 0xffffffff) {
1363         mov(rd, 0);
1364         return;
1365       }
1366     }
1367     bool can_use_it =
1368         // BIC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1369         operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
1370         operand.GetBaseRegister().IsLow();
1371     ITScope it_scope(this, &cond, guard, can_use_it);
1372     bic(cond, rd, rn, operand);
1373   }
Bic(Register rd,Register rn,const Operand & operand)1374   void Bic(Register rd, Register rn, const Operand& operand) {
1375     Bic(al, rd, rn, operand);
1376   }
Bic(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1377   void Bic(FlagsUpdate flags,
1378            Condition cond,
1379            Register rd,
1380            Register rn,
1381            const Operand& operand) {
1382     switch (flags) {
1383       case LeaveFlags:
1384         Bic(cond, rd, rn, operand);
1385         break;
1386       case SetFlags:
1387         Bics(cond, rd, rn, operand);
1388         break;
1389       case DontCare:
1390         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1391                                    rn.Is(rd) && operand.IsPlainRegister() &&
1392                                    operand.GetBaseRegister().IsLow();
1393         if (setflags_is_smaller) {
1394           Bics(cond, rd, rn, operand);
1395         } else {
1396           Bic(cond, rd, rn, operand);
1397         }
1398         break;
1399     }
1400   }
Bic(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1401   void Bic(FlagsUpdate flags,
1402            Register rd,
1403            Register rn,
1404            const Operand& operand) {
1405     Bic(flags, al, rd, rn, operand);
1406   }
1407 
Bics(Condition cond,Register rd,Register rn,const Operand & operand)1408   void Bics(Condition cond, Register rd, Register rn, const Operand& operand) {
1409     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1410     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1411     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1412     VIXL_ASSERT(allow_macro_instructions_);
1413     VIXL_ASSERT(OutsideITBlock());
1414     MacroEmissionCheckScope guard(this);
1415     ITScope it_scope(this, &cond, guard);
1416     bics(cond, rd, rn, operand);
1417   }
Bics(Register rd,Register rn,const Operand & operand)1418   void Bics(Register rd, Register rn, const Operand& operand) {
1419     Bics(al, rd, rn, operand);
1420   }
1421 
Bkpt(Condition cond,uint32_t imm)1422   void Bkpt(Condition cond, uint32_t imm) {
1423     VIXL_ASSERT(allow_macro_instructions_);
1424     VIXL_ASSERT(OutsideITBlock());
1425     MacroEmissionCheckScope guard(this);
1426     ITScope it_scope(this, &cond, guard);
1427     bkpt(cond, imm);
1428   }
Bkpt(uint32_t imm)1429   void Bkpt(uint32_t imm) { Bkpt(al, imm); }
1430 
Bl(Condition cond,Label * label)1431   void Bl(Condition cond, Label* label) {
1432     VIXL_ASSERT(allow_macro_instructions_);
1433     VIXL_ASSERT(OutsideITBlock());
1434     MacroEmissionCheckScope::PoolPolicy pool_policy =
1435         MacroEmissionCheckScope::kBlockPools;
1436     if (!label->IsBound()) {
1437       const ReferenceInfo* info;
1438       bool can_encode = bl_info(cond, label, &info);
1439       VIXL_CHECK(can_encode);
1440       CheckEmitPoolForInstruction(info, label, &cond);
1441       // We have already checked for pool emission.
1442       pool_policy = MacroEmissionCheckScope::kIgnorePools;
1443     }
1444     MacroEmissionCheckScope guard(this, pool_policy);
1445     ITScope it_scope(this, &cond, guard);
1446     bl(cond, label);
1447     RegisterForwardReference(label);
1448   }
Bl(Label * label)1449   void Bl(Label* label) { Bl(al, label); }
1450 
Blx(Condition cond,Label * label)1451   void Blx(Condition cond, Label* label) {
1452     VIXL_ASSERT(allow_macro_instructions_);
1453     VIXL_ASSERT(OutsideITBlock());
1454     MacroEmissionCheckScope::PoolPolicy pool_policy =
1455         MacroEmissionCheckScope::kBlockPools;
1456     if (!label->IsBound()) {
1457       const ReferenceInfo* info;
1458       bool can_encode = blx_info(cond, label, &info);
1459       VIXL_CHECK(can_encode);
1460       CheckEmitPoolForInstruction(info, label, &cond);
1461       // We have already checked for pool emission.
1462       pool_policy = MacroEmissionCheckScope::kIgnorePools;
1463     }
1464     MacroEmissionCheckScope guard(this, pool_policy);
1465     ITScope it_scope(this, &cond, guard);
1466     blx(cond, label);
1467     RegisterForwardReference(label);
1468   }
Blx(Label * label)1469   void Blx(Label* label) { Blx(al, label); }
1470 
Blx(Condition cond,Register rm)1471   void Blx(Condition cond, Register rm) {
1472     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1473     VIXL_ASSERT(allow_macro_instructions_);
1474     VIXL_ASSERT(OutsideITBlock());
1475     MacroEmissionCheckScope guard(this);
1476     bool can_use_it =
1477         // BLX{<c>}{<q>} <Rm> ; T1
1478         !rm.IsPC();
1479     ITScope it_scope(this, &cond, guard, can_use_it);
1480     blx(cond, rm);
1481   }
Blx(Register rm)1482   void Blx(Register rm) { Blx(al, rm); }
1483 
Bx(Condition cond,Register rm)1484   void Bx(Condition cond, Register rm) {
1485     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1486     VIXL_ASSERT(allow_macro_instructions_);
1487     VIXL_ASSERT(OutsideITBlock());
1488     MacroEmissionCheckScope guard(this);
1489     bool can_use_it =
1490         // BX{<c>}{<q>} <Rm> ; T1
1491         !rm.IsPC();
1492     ITScope it_scope(this, &cond, guard, can_use_it);
1493     bx(cond, rm);
1494   }
Bx(Register rm)1495   void Bx(Register rm) { Bx(al, rm); }
1496 
Bxj(Condition cond,Register rm)1497   void Bxj(Condition cond, Register rm) {
1498     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1499     VIXL_ASSERT(allow_macro_instructions_);
1500     VIXL_ASSERT(OutsideITBlock());
1501     MacroEmissionCheckScope guard(this);
1502     ITScope it_scope(this, &cond, guard);
1503     bxj(cond, rm);
1504   }
Bxj(Register rm)1505   void Bxj(Register rm) { Bxj(al, rm); }
1506 
Cbnz(Register rn,Label * label)1507   void Cbnz(Register rn, Label* label) {
1508     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1509     VIXL_ASSERT(allow_macro_instructions_);
1510     VIXL_ASSERT(OutsideITBlock());
1511     MacroEmissionCheckScope::PoolPolicy pool_policy =
1512         MacroEmissionCheckScope::kBlockPools;
1513     if (!label->IsBound()) {
1514       const ReferenceInfo* info;
1515       bool can_encode = cbnz_info(rn, label, &info);
1516       VIXL_CHECK(can_encode);
1517       CheckEmitPoolForInstruction(info, label);
1518       // We have already checked for pool emission.
1519       pool_policy = MacroEmissionCheckScope::kIgnorePools;
1520     }
1521     MacroEmissionCheckScope guard(this, pool_policy);
1522     cbnz(rn, label);
1523     RegisterForwardReference(label);
1524   }
1525 
Cbz(Register rn,Label * label)1526   void Cbz(Register rn, Label* label) {
1527     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1528     VIXL_ASSERT(allow_macro_instructions_);
1529     VIXL_ASSERT(OutsideITBlock());
1530     MacroEmissionCheckScope::PoolPolicy pool_policy =
1531         MacroEmissionCheckScope::kBlockPools;
1532     if (!label->IsBound()) {
1533       const ReferenceInfo* info;
1534       bool can_encode = cbz_info(rn, label, &info);
1535       VIXL_CHECK(can_encode);
1536       CheckEmitPoolForInstruction(info, label);
1537       // We have already checked for pool emission.
1538       pool_policy = MacroEmissionCheckScope::kIgnorePools;
1539     }
1540     MacroEmissionCheckScope guard(this, pool_policy);
1541     cbz(rn, label);
1542     RegisterForwardReference(label);
1543   }
1544 
Clrex(Condition cond)1545   void Clrex(Condition cond) {
1546     VIXL_ASSERT(allow_macro_instructions_);
1547     VIXL_ASSERT(OutsideITBlock());
1548     MacroEmissionCheckScope guard(this);
1549     ITScope it_scope(this, &cond, guard);
1550     clrex(cond);
1551   }
Clrex()1552   void Clrex() { Clrex(al); }
1553 
Clz(Condition cond,Register rd,Register rm)1554   void Clz(Condition cond, Register rd, Register rm) {
1555     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1556     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1557     VIXL_ASSERT(allow_macro_instructions_);
1558     VIXL_ASSERT(OutsideITBlock());
1559     MacroEmissionCheckScope guard(this);
1560     ITScope it_scope(this, &cond, guard);
1561     clz(cond, rd, rm);
1562   }
Clz(Register rd,Register rm)1563   void Clz(Register rd, Register rm) { Clz(al, rd, rm); }
1564 
Cmn(Condition cond,Register rn,const Operand & operand)1565   void Cmn(Condition cond, Register rn, const Operand& operand) {
1566     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1567     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1568     VIXL_ASSERT(allow_macro_instructions_);
1569     VIXL_ASSERT(OutsideITBlock());
1570     MacroEmissionCheckScope guard(this);
1571     bool can_use_it =
1572         // CMN{<c>}{<q>} <Rn>, <Rm> ; T1
1573         operand.IsPlainRegister() && rn.IsLow() &&
1574         operand.GetBaseRegister().IsLow();
1575     ITScope it_scope(this, &cond, guard, can_use_it);
1576     cmn(cond, rn, operand);
1577   }
Cmn(Register rn,const Operand & operand)1578   void Cmn(Register rn, const Operand& operand) { Cmn(al, rn, operand); }
1579 
Cmp(Condition cond,Register rn,const Operand & operand)1580   void Cmp(Condition cond, Register rn, const Operand& operand) {
1581     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1582     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1583     VIXL_ASSERT(allow_macro_instructions_);
1584     VIXL_ASSERT(OutsideITBlock());
1585     MacroEmissionCheckScope guard(this);
1586     bool can_use_it =
1587         // CMP{<c>}{<q>} <Rn>, #<imm8> ; T1
1588         (operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
1589          rn.IsLow()) ||
1590         // CMP{<c>}{<q>} <Rn>, <Rm> ; T1 T2
1591         (operand.IsPlainRegister() && !rn.IsPC() &&
1592          !operand.GetBaseRegister().IsPC());
1593     ITScope it_scope(this, &cond, guard, can_use_it);
1594     cmp(cond, rn, operand);
1595   }
Cmp(Register rn,const Operand & operand)1596   void Cmp(Register rn, const Operand& operand) { Cmp(al, rn, operand); }
1597 
Crc32b(Condition cond,Register rd,Register rn,Register rm)1598   void Crc32b(Condition cond, Register rd, Register rn, Register rm) {
1599     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1600     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1601     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1602     VIXL_ASSERT(allow_macro_instructions_);
1603     VIXL_ASSERT(OutsideITBlock());
1604     MacroEmissionCheckScope guard(this);
1605     ITScope it_scope(this, &cond, guard);
1606     crc32b(cond, rd, rn, rm);
1607   }
Crc32b(Register rd,Register rn,Register rm)1608   void Crc32b(Register rd, Register rn, Register rm) { Crc32b(al, rd, rn, rm); }
1609 
Crc32cb(Condition cond,Register rd,Register rn,Register rm)1610   void Crc32cb(Condition cond, Register rd, Register rn, Register rm) {
1611     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1612     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1613     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1614     VIXL_ASSERT(allow_macro_instructions_);
1615     VIXL_ASSERT(OutsideITBlock());
1616     MacroEmissionCheckScope guard(this);
1617     ITScope it_scope(this, &cond, guard);
1618     crc32cb(cond, rd, rn, rm);
1619   }
Crc32cb(Register rd,Register rn,Register rm)1620   void Crc32cb(Register rd, Register rn, Register rm) {
1621     Crc32cb(al, rd, rn, rm);
1622   }
1623 
Crc32ch(Condition cond,Register rd,Register rn,Register rm)1624   void Crc32ch(Condition cond, Register rd, Register rn, Register rm) {
1625     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1626     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1627     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1628     VIXL_ASSERT(allow_macro_instructions_);
1629     VIXL_ASSERT(OutsideITBlock());
1630     MacroEmissionCheckScope guard(this);
1631     ITScope it_scope(this, &cond, guard);
1632     crc32ch(cond, rd, rn, rm);
1633   }
Crc32ch(Register rd,Register rn,Register rm)1634   void Crc32ch(Register rd, Register rn, Register rm) {
1635     Crc32ch(al, rd, rn, rm);
1636   }
1637 
Crc32cw(Condition cond,Register rd,Register rn,Register rm)1638   void Crc32cw(Condition cond, Register rd, Register rn, Register rm) {
1639     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1640     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1641     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1642     VIXL_ASSERT(allow_macro_instructions_);
1643     VIXL_ASSERT(OutsideITBlock());
1644     MacroEmissionCheckScope guard(this);
1645     ITScope it_scope(this, &cond, guard);
1646     crc32cw(cond, rd, rn, rm);
1647   }
Crc32cw(Register rd,Register rn,Register rm)1648   void Crc32cw(Register rd, Register rn, Register rm) {
1649     Crc32cw(al, rd, rn, rm);
1650   }
1651 
Crc32h(Condition cond,Register rd,Register rn,Register rm)1652   void Crc32h(Condition cond, Register rd, Register rn, Register rm) {
1653     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1654     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1655     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1656     VIXL_ASSERT(allow_macro_instructions_);
1657     VIXL_ASSERT(OutsideITBlock());
1658     MacroEmissionCheckScope guard(this);
1659     ITScope it_scope(this, &cond, guard);
1660     crc32h(cond, rd, rn, rm);
1661   }
Crc32h(Register rd,Register rn,Register rm)1662   void Crc32h(Register rd, Register rn, Register rm) { Crc32h(al, rd, rn, rm); }
1663 
Crc32w(Condition cond,Register rd,Register rn,Register rm)1664   void Crc32w(Condition cond, Register rd, Register rn, Register rm) {
1665     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1666     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1667     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1668     VIXL_ASSERT(allow_macro_instructions_);
1669     VIXL_ASSERT(OutsideITBlock());
1670     MacroEmissionCheckScope guard(this);
1671     ITScope it_scope(this, &cond, guard);
1672     crc32w(cond, rd, rn, rm);
1673   }
Crc32w(Register rd,Register rn,Register rm)1674   void Crc32w(Register rd, Register rn, Register rm) { Crc32w(al, rd, rn, rm); }
1675 
Dmb(Condition cond,MemoryBarrier option)1676   void Dmb(Condition cond, MemoryBarrier option) {
1677     VIXL_ASSERT(allow_macro_instructions_);
1678     VIXL_ASSERT(OutsideITBlock());
1679     MacroEmissionCheckScope guard(this);
1680     ITScope it_scope(this, &cond, guard);
1681     dmb(cond, option);
1682   }
Dmb(MemoryBarrier option)1683   void Dmb(MemoryBarrier option) { Dmb(al, option); }
1684 
Dsb(Condition cond,MemoryBarrier option)1685   void Dsb(Condition cond, MemoryBarrier option) {
1686     VIXL_ASSERT(allow_macro_instructions_);
1687     VIXL_ASSERT(OutsideITBlock());
1688     MacroEmissionCheckScope guard(this);
1689     ITScope it_scope(this, &cond, guard);
1690     dsb(cond, option);
1691   }
Dsb(MemoryBarrier option)1692   void Dsb(MemoryBarrier option) { Dsb(al, option); }
1693 
Eor(Condition cond,Register rd,Register rn,const Operand & operand)1694   void Eor(Condition cond, Register rd, Register rn, const Operand& operand) {
1695     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1696     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1697     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1698     VIXL_ASSERT(allow_macro_instructions_);
1699     VIXL_ASSERT(OutsideITBlock());
1700     MacroEmissionCheckScope guard(this);
1701     if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) {
1702       uint32_t immediate = operand.GetImmediate();
1703       if (immediate == 0) {
1704         return;
1705       }
1706       if (immediate == 0xffffffff) {
1707         mvn(rd, rn);
1708         return;
1709       }
1710     }
1711     bool can_use_it =
1712         // EOR<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1713         operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
1714         operand.GetBaseRegister().IsLow();
1715     ITScope it_scope(this, &cond, guard, can_use_it);
1716     eor(cond, rd, rn, operand);
1717   }
Eor(Register rd,Register rn,const Operand & operand)1718   void Eor(Register rd, Register rn, const Operand& operand) {
1719     Eor(al, rd, rn, operand);
1720   }
Eor(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1721   void Eor(FlagsUpdate flags,
1722            Condition cond,
1723            Register rd,
1724            Register rn,
1725            const Operand& operand) {
1726     switch (flags) {
1727       case LeaveFlags:
1728         Eor(cond, rd, rn, operand);
1729         break;
1730       case SetFlags:
1731         Eors(cond, rd, rn, operand);
1732         break;
1733       case DontCare:
1734         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1735                                    rn.Is(rd) && operand.IsPlainRegister() &&
1736                                    operand.GetBaseRegister().IsLow();
1737         if (setflags_is_smaller) {
1738           Eors(cond, rd, rn, operand);
1739         } else {
1740           Eor(cond, rd, rn, operand);
1741         }
1742         break;
1743     }
1744   }
Eor(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1745   void Eor(FlagsUpdate flags,
1746            Register rd,
1747            Register rn,
1748            const Operand& operand) {
1749     Eor(flags, al, rd, rn, operand);
1750   }
1751 
Eors(Condition cond,Register rd,Register rn,const Operand & operand)1752   void Eors(Condition cond, Register rd, Register rn, const Operand& operand) {
1753     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1754     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1755     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1756     VIXL_ASSERT(allow_macro_instructions_);
1757     VIXL_ASSERT(OutsideITBlock());
1758     MacroEmissionCheckScope guard(this);
1759     ITScope it_scope(this, &cond, guard);
1760     eors(cond, rd, rn, operand);
1761   }
Eors(Register rd,Register rn,const Operand & operand)1762   void Eors(Register rd, Register rn, const Operand& operand) {
1763     Eors(al, rd, rn, operand);
1764   }
1765 
Fldmdbx(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1766   void Fldmdbx(Condition cond,
1767                Register rn,
1768                WriteBack write_back,
1769                DRegisterList dreglist) {
1770     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1771     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
1772     VIXL_ASSERT(allow_macro_instructions_);
1773     VIXL_ASSERT(OutsideITBlock());
1774     MacroEmissionCheckScope guard(this);
1775     ITScope it_scope(this, &cond, guard);
1776     fldmdbx(cond, rn, write_back, dreglist);
1777   }
Fldmdbx(Register rn,WriteBack write_back,DRegisterList dreglist)1778   void Fldmdbx(Register rn, WriteBack write_back, DRegisterList dreglist) {
1779     Fldmdbx(al, rn, write_back, dreglist);
1780   }
1781 
Fldmiax(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1782   void Fldmiax(Condition cond,
1783                Register rn,
1784                WriteBack write_back,
1785                DRegisterList dreglist) {
1786     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1787     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
1788     VIXL_ASSERT(allow_macro_instructions_);
1789     VIXL_ASSERT(OutsideITBlock());
1790     MacroEmissionCheckScope guard(this);
1791     ITScope it_scope(this, &cond, guard);
1792     fldmiax(cond, rn, write_back, dreglist);
1793   }
Fldmiax(Register rn,WriteBack write_back,DRegisterList dreglist)1794   void Fldmiax(Register rn, WriteBack write_back, DRegisterList dreglist) {
1795     Fldmiax(al, rn, write_back, dreglist);
1796   }
1797 
Fstmdbx(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1798   void Fstmdbx(Condition cond,
1799                Register rn,
1800                WriteBack write_back,
1801                DRegisterList dreglist) {
1802     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1803     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
1804     VIXL_ASSERT(allow_macro_instructions_);
1805     VIXL_ASSERT(OutsideITBlock());
1806     MacroEmissionCheckScope guard(this);
1807     ITScope it_scope(this, &cond, guard);
1808     fstmdbx(cond, rn, write_back, dreglist);
1809   }
Fstmdbx(Register rn,WriteBack write_back,DRegisterList dreglist)1810   void Fstmdbx(Register rn, WriteBack write_back, DRegisterList dreglist) {
1811     Fstmdbx(al, rn, write_back, dreglist);
1812   }
1813 
Fstmiax(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1814   void Fstmiax(Condition cond,
1815                Register rn,
1816                WriteBack write_back,
1817                DRegisterList dreglist) {
1818     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1819     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
1820     VIXL_ASSERT(allow_macro_instructions_);
1821     VIXL_ASSERT(OutsideITBlock());
1822     MacroEmissionCheckScope guard(this);
1823     ITScope it_scope(this, &cond, guard);
1824     fstmiax(cond, rn, write_back, dreglist);
1825   }
Fstmiax(Register rn,WriteBack write_back,DRegisterList dreglist)1826   void Fstmiax(Register rn, WriteBack write_back, DRegisterList dreglist) {
1827     Fstmiax(al, rn, write_back, dreglist);
1828   }
1829 
Hlt(Condition cond,uint32_t imm)1830   void Hlt(Condition cond, uint32_t imm) {
1831     VIXL_ASSERT(allow_macro_instructions_);
1832     VIXL_ASSERT(OutsideITBlock());
1833     MacroEmissionCheckScope guard(this);
1834     ITScope it_scope(this, &cond, guard);
1835     hlt(cond, imm);
1836   }
Hlt(uint32_t imm)1837   void Hlt(uint32_t imm) { Hlt(al, imm); }
1838 
Hvc(Condition cond,uint32_t imm)1839   void Hvc(Condition cond, uint32_t imm) {
1840     VIXL_ASSERT(allow_macro_instructions_);
1841     VIXL_ASSERT(OutsideITBlock());
1842     MacroEmissionCheckScope guard(this);
1843     ITScope it_scope(this, &cond, guard);
1844     hvc(cond, imm);
1845   }
Hvc(uint32_t imm)1846   void Hvc(uint32_t imm) { Hvc(al, imm); }
1847 
Isb(Condition cond,MemoryBarrier option)1848   void Isb(Condition cond, MemoryBarrier option) {
1849     VIXL_ASSERT(allow_macro_instructions_);
1850     VIXL_ASSERT(OutsideITBlock());
1851     MacroEmissionCheckScope guard(this);
1852     ITScope it_scope(this, &cond, guard);
1853     isb(cond, option);
1854   }
Isb(MemoryBarrier option)1855   void Isb(MemoryBarrier option) { Isb(al, option); }
1856 
Lda(Condition cond,Register rt,const MemOperand & operand)1857   void Lda(Condition cond, Register rt, const MemOperand& operand) {
1858     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1859     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1860     VIXL_ASSERT(allow_macro_instructions_);
1861     VIXL_ASSERT(OutsideITBlock());
1862     MacroEmissionCheckScope guard(this);
1863     ITScope it_scope(this, &cond, guard);
1864     lda(cond, rt, operand);
1865   }
Lda(Register rt,const MemOperand & operand)1866   void Lda(Register rt, const MemOperand& operand) { Lda(al, rt, operand); }
1867 
Ldab(Condition cond,Register rt,const MemOperand & operand)1868   void Ldab(Condition cond, Register rt, const MemOperand& operand) {
1869     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1870     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1871     VIXL_ASSERT(allow_macro_instructions_);
1872     VIXL_ASSERT(OutsideITBlock());
1873     MacroEmissionCheckScope guard(this);
1874     ITScope it_scope(this, &cond, guard);
1875     ldab(cond, rt, operand);
1876   }
Ldab(Register rt,const MemOperand & operand)1877   void Ldab(Register rt, const MemOperand& operand) { Ldab(al, rt, operand); }
1878 
Ldaex(Condition cond,Register rt,const MemOperand & operand)1879   void Ldaex(Condition cond, Register rt, const MemOperand& operand) {
1880     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1881     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1882     VIXL_ASSERT(allow_macro_instructions_);
1883     VIXL_ASSERT(OutsideITBlock());
1884     MacroEmissionCheckScope guard(this);
1885     ITScope it_scope(this, &cond, guard);
1886     ldaex(cond, rt, operand);
1887   }
Ldaex(Register rt,const MemOperand & operand)1888   void Ldaex(Register rt, const MemOperand& operand) { Ldaex(al, rt, operand); }
1889 
Ldaexb(Condition cond,Register rt,const MemOperand & operand)1890   void Ldaexb(Condition cond, Register rt, const MemOperand& operand) {
1891     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1892     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1893     VIXL_ASSERT(allow_macro_instructions_);
1894     VIXL_ASSERT(OutsideITBlock());
1895     MacroEmissionCheckScope guard(this);
1896     ITScope it_scope(this, &cond, guard);
1897     ldaexb(cond, rt, operand);
1898   }
Ldaexb(Register rt,const MemOperand & operand)1899   void Ldaexb(Register rt, const MemOperand& operand) {
1900     Ldaexb(al, rt, operand);
1901   }
1902 
Ldaexd(Condition cond,Register rt,Register rt2,const MemOperand & operand)1903   void Ldaexd(Condition cond,
1904               Register rt,
1905               Register rt2,
1906               const MemOperand& operand) {
1907     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1908     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
1909     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1910     VIXL_ASSERT(allow_macro_instructions_);
1911     VIXL_ASSERT(OutsideITBlock());
1912     MacroEmissionCheckScope guard(this);
1913     ITScope it_scope(this, &cond, guard);
1914     ldaexd(cond, rt, rt2, operand);
1915   }
Ldaexd(Register rt,Register rt2,const MemOperand & operand)1916   void Ldaexd(Register rt, Register rt2, const MemOperand& operand) {
1917     Ldaexd(al, rt, rt2, operand);
1918   }
1919 
Ldaexh(Condition cond,Register rt,const MemOperand & operand)1920   void Ldaexh(Condition cond, Register rt, const MemOperand& operand) {
1921     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1922     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1923     VIXL_ASSERT(allow_macro_instructions_);
1924     VIXL_ASSERT(OutsideITBlock());
1925     MacroEmissionCheckScope guard(this);
1926     ITScope it_scope(this, &cond, guard);
1927     ldaexh(cond, rt, operand);
1928   }
Ldaexh(Register rt,const MemOperand & operand)1929   void Ldaexh(Register rt, const MemOperand& operand) {
1930     Ldaexh(al, rt, operand);
1931   }
1932 
Ldah(Condition cond,Register rt,const MemOperand & operand)1933   void Ldah(Condition cond, Register rt, const MemOperand& operand) {
1934     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1935     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1936     VIXL_ASSERT(allow_macro_instructions_);
1937     VIXL_ASSERT(OutsideITBlock());
1938     MacroEmissionCheckScope guard(this);
1939     ITScope it_scope(this, &cond, guard);
1940     ldah(cond, rt, operand);
1941   }
Ldah(Register rt,const MemOperand & operand)1942   void Ldah(Register rt, const MemOperand& operand) { Ldah(al, rt, operand); }
1943 
Ldm(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1944   void Ldm(Condition cond,
1945            Register rn,
1946            WriteBack write_back,
1947            RegisterList registers) {
1948     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1949     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
1950     VIXL_ASSERT(allow_macro_instructions_);
1951     VIXL_ASSERT(OutsideITBlock());
1952     MacroEmissionCheckScope guard(this);
1953     ITScope it_scope(this, &cond, guard);
1954     ldm(cond, rn, write_back, registers);
1955   }
Ldm(Register rn,WriteBack write_back,RegisterList registers)1956   void Ldm(Register rn, WriteBack write_back, RegisterList registers) {
1957     Ldm(al, rn, write_back, registers);
1958   }
1959 
Ldmda(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1960   void Ldmda(Condition cond,
1961              Register rn,
1962              WriteBack write_back,
1963              RegisterList registers) {
1964     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1965     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
1966     VIXL_ASSERT(allow_macro_instructions_);
1967     VIXL_ASSERT(OutsideITBlock());
1968     MacroEmissionCheckScope guard(this);
1969     ITScope it_scope(this, &cond, guard);
1970     ldmda(cond, rn, write_back, registers);
1971   }
Ldmda(Register rn,WriteBack write_back,RegisterList registers)1972   void Ldmda(Register rn, WriteBack write_back, RegisterList registers) {
1973     Ldmda(al, rn, write_back, registers);
1974   }
1975 
Ldmdb(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1976   void Ldmdb(Condition cond,
1977              Register rn,
1978              WriteBack write_back,
1979              RegisterList registers) {
1980     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1981     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
1982     VIXL_ASSERT(allow_macro_instructions_);
1983     VIXL_ASSERT(OutsideITBlock());
1984     MacroEmissionCheckScope guard(this);
1985     ITScope it_scope(this, &cond, guard);
1986     ldmdb(cond, rn, write_back, registers);
1987   }
Ldmdb(Register rn,WriteBack write_back,RegisterList registers)1988   void Ldmdb(Register rn, WriteBack write_back, RegisterList registers) {
1989     Ldmdb(al, rn, write_back, registers);
1990   }
1991 
Ldmea(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1992   void Ldmea(Condition cond,
1993              Register rn,
1994              WriteBack write_back,
1995              RegisterList registers) {
1996     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1997     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
1998     VIXL_ASSERT(allow_macro_instructions_);
1999     VIXL_ASSERT(OutsideITBlock());
2000     MacroEmissionCheckScope guard(this);
2001     ITScope it_scope(this, &cond, guard);
2002     ldmea(cond, rn, write_back, registers);
2003   }
Ldmea(Register rn,WriteBack write_back,RegisterList registers)2004   void Ldmea(Register rn, WriteBack write_back, RegisterList registers) {
2005     Ldmea(al, rn, write_back, registers);
2006   }
2007 
Ldmed(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2008   void Ldmed(Condition cond,
2009              Register rn,
2010              WriteBack write_back,
2011              RegisterList registers) {
2012     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2013     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2014     VIXL_ASSERT(allow_macro_instructions_);
2015     VIXL_ASSERT(OutsideITBlock());
2016     MacroEmissionCheckScope guard(this);
2017     ITScope it_scope(this, &cond, guard);
2018     ldmed(cond, rn, write_back, registers);
2019   }
Ldmed(Register rn,WriteBack write_back,RegisterList registers)2020   void Ldmed(Register rn, WriteBack write_back, RegisterList registers) {
2021     Ldmed(al, rn, write_back, registers);
2022   }
2023 
Ldmfa(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2024   void Ldmfa(Condition cond,
2025              Register rn,
2026              WriteBack write_back,
2027              RegisterList registers) {
2028     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2029     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2030     VIXL_ASSERT(allow_macro_instructions_);
2031     VIXL_ASSERT(OutsideITBlock());
2032     MacroEmissionCheckScope guard(this);
2033     ITScope it_scope(this, &cond, guard);
2034     ldmfa(cond, rn, write_back, registers);
2035   }
Ldmfa(Register rn,WriteBack write_back,RegisterList registers)2036   void Ldmfa(Register rn, WriteBack write_back, RegisterList registers) {
2037     Ldmfa(al, rn, write_back, registers);
2038   }
2039 
Ldmfd(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2040   void Ldmfd(Condition cond,
2041              Register rn,
2042              WriteBack write_back,
2043              RegisterList registers) {
2044     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2045     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2046     VIXL_ASSERT(allow_macro_instructions_);
2047     VIXL_ASSERT(OutsideITBlock());
2048     MacroEmissionCheckScope guard(this);
2049     ITScope it_scope(this, &cond, guard);
2050     ldmfd(cond, rn, write_back, registers);
2051   }
Ldmfd(Register rn,WriteBack write_back,RegisterList registers)2052   void Ldmfd(Register rn, WriteBack write_back, RegisterList registers) {
2053     Ldmfd(al, rn, write_back, registers);
2054   }
2055 
Ldmib(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2056   void Ldmib(Condition cond,
2057              Register rn,
2058              WriteBack write_back,
2059              RegisterList registers) {
2060     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2061     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2062     VIXL_ASSERT(allow_macro_instructions_);
2063     VIXL_ASSERT(OutsideITBlock());
2064     MacroEmissionCheckScope guard(this);
2065     ITScope it_scope(this, &cond, guard);
2066     ldmib(cond, rn, write_back, registers);
2067   }
Ldmib(Register rn,WriteBack write_back,RegisterList registers)2068   void Ldmib(Register rn, WriteBack write_back, RegisterList registers) {
2069     Ldmib(al, rn, write_back, registers);
2070   }
2071 
Ldr(Condition cond,Register rt,const MemOperand & operand)2072   void Ldr(Condition cond, Register rt, const MemOperand& operand) {
2073     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2074     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2075     VIXL_ASSERT(allow_macro_instructions_);
2076     VIXL_ASSERT(OutsideITBlock());
2077     MacroEmissionCheckScope guard(this);
2078     bool can_use_it =
2079         // LDR{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
2080         (operand.IsImmediate() && rt.IsLow() &&
2081          operand.GetBaseRegister().IsLow() &&
2082          operand.IsOffsetImmediateWithinRange(0, 124, 4) &&
2083          (operand.GetAddrMode() == Offset)) ||
2084         // LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
2085         (operand.IsImmediate() && rt.IsLow() &&
2086          operand.GetBaseRegister().IsSP() &&
2087          operand.IsOffsetImmediateWithinRange(0, 1020, 4) &&
2088          (operand.GetAddrMode() == Offset)) ||
2089         // LDR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2090         (operand.IsPlainRegister() && rt.IsLow() &&
2091          operand.GetBaseRegister().IsLow() &&
2092          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2093          (operand.GetAddrMode() == Offset));
2094     ITScope it_scope(this, &cond, guard, can_use_it);
2095     ldr(cond, rt, operand);
2096   }
Ldr(Register rt,const MemOperand & operand)2097   void Ldr(Register rt, const MemOperand& operand) { Ldr(al, rt, operand); }
2098 
2099 
Ldrb(Condition cond,Register rt,const MemOperand & operand)2100   void Ldrb(Condition cond, Register rt, const MemOperand& operand) {
2101     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2102     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2103     VIXL_ASSERT(allow_macro_instructions_);
2104     VIXL_ASSERT(OutsideITBlock());
2105     MacroEmissionCheckScope guard(this);
2106     bool can_use_it =
2107         // LDRB{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
2108         (operand.IsImmediate() && rt.IsLow() &&
2109          operand.GetBaseRegister().IsLow() &&
2110          operand.IsOffsetImmediateWithinRange(0, 31) &&
2111          (operand.GetAddrMode() == Offset)) ||
2112         // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2113         (operand.IsPlainRegister() && rt.IsLow() &&
2114          operand.GetBaseRegister().IsLow() &&
2115          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2116          (operand.GetAddrMode() == Offset));
2117     ITScope it_scope(this, &cond, guard, can_use_it);
2118     ldrb(cond, rt, operand);
2119   }
Ldrb(Register rt,const MemOperand & operand)2120   void Ldrb(Register rt, const MemOperand& operand) { Ldrb(al, rt, operand); }
2121 
2122 
Ldrd(Condition cond,Register rt,Register rt2,const MemOperand & operand)2123   void Ldrd(Condition cond,
2124             Register rt,
2125             Register rt2,
2126             const MemOperand& operand) {
2127     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2128     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
2129     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2130     VIXL_ASSERT(allow_macro_instructions_);
2131     VIXL_ASSERT(OutsideITBlock());
2132     MacroEmissionCheckScope guard(this);
2133     ITScope it_scope(this, &cond, guard);
2134     ldrd(cond, rt, rt2, operand);
2135   }
Ldrd(Register rt,Register rt2,const MemOperand & operand)2136   void Ldrd(Register rt, Register rt2, const MemOperand& operand) {
2137     Ldrd(al, rt, rt2, operand);
2138   }
2139 
2140 
Ldrex(Condition cond,Register rt,const MemOperand & operand)2141   void Ldrex(Condition cond, Register rt, const MemOperand& operand) {
2142     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2143     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2144     VIXL_ASSERT(allow_macro_instructions_);
2145     VIXL_ASSERT(OutsideITBlock());
2146     MacroEmissionCheckScope guard(this);
2147     ITScope it_scope(this, &cond, guard);
2148     ldrex(cond, rt, operand);
2149   }
Ldrex(Register rt,const MemOperand & operand)2150   void Ldrex(Register rt, const MemOperand& operand) { Ldrex(al, rt, operand); }
2151 
Ldrexb(Condition cond,Register rt,const MemOperand & operand)2152   void Ldrexb(Condition cond, Register rt, const MemOperand& operand) {
2153     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2154     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2155     VIXL_ASSERT(allow_macro_instructions_);
2156     VIXL_ASSERT(OutsideITBlock());
2157     MacroEmissionCheckScope guard(this);
2158     ITScope it_scope(this, &cond, guard);
2159     ldrexb(cond, rt, operand);
2160   }
Ldrexb(Register rt,const MemOperand & operand)2161   void Ldrexb(Register rt, const MemOperand& operand) {
2162     Ldrexb(al, rt, operand);
2163   }
2164 
Ldrexd(Condition cond,Register rt,Register rt2,const MemOperand & operand)2165   void Ldrexd(Condition cond,
2166               Register rt,
2167               Register rt2,
2168               const MemOperand& operand) {
2169     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2170     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
2171     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2172     VIXL_ASSERT(allow_macro_instructions_);
2173     VIXL_ASSERT(OutsideITBlock());
2174     MacroEmissionCheckScope guard(this);
2175     ITScope it_scope(this, &cond, guard);
2176     ldrexd(cond, rt, rt2, operand);
2177   }
Ldrexd(Register rt,Register rt2,const MemOperand & operand)2178   void Ldrexd(Register rt, Register rt2, const MemOperand& operand) {
2179     Ldrexd(al, rt, rt2, operand);
2180   }
2181 
Ldrexh(Condition cond,Register rt,const MemOperand & operand)2182   void Ldrexh(Condition cond, Register rt, const MemOperand& operand) {
2183     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2184     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2185     VIXL_ASSERT(allow_macro_instructions_);
2186     VIXL_ASSERT(OutsideITBlock());
2187     MacroEmissionCheckScope guard(this);
2188     ITScope it_scope(this, &cond, guard);
2189     ldrexh(cond, rt, operand);
2190   }
Ldrexh(Register rt,const MemOperand & operand)2191   void Ldrexh(Register rt, const MemOperand& operand) {
2192     Ldrexh(al, rt, operand);
2193   }
2194 
Ldrh(Condition cond,Register rt,const MemOperand & operand)2195   void Ldrh(Condition cond, Register rt, const MemOperand& operand) {
2196     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2197     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2198     VIXL_ASSERT(allow_macro_instructions_);
2199     VIXL_ASSERT(OutsideITBlock());
2200     MacroEmissionCheckScope guard(this);
2201     bool can_use_it =
2202         // LDRH{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
2203         (operand.IsImmediate() && rt.IsLow() &&
2204          operand.GetBaseRegister().IsLow() &&
2205          operand.IsOffsetImmediateWithinRange(0, 62, 2) &&
2206          (operand.GetAddrMode() == Offset)) ||
2207         // LDRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2208         (operand.IsPlainRegister() && rt.IsLow() &&
2209          operand.GetBaseRegister().IsLow() &&
2210          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2211          (operand.GetAddrMode() == Offset));
2212     ITScope it_scope(this, &cond, guard, can_use_it);
2213     ldrh(cond, rt, operand);
2214   }
Ldrh(Register rt,const MemOperand & operand)2215   void Ldrh(Register rt, const MemOperand& operand) { Ldrh(al, rt, operand); }
2216 
2217 
Ldrsb(Condition cond,Register rt,const MemOperand & operand)2218   void Ldrsb(Condition cond, Register rt, const MemOperand& operand) {
2219     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2220     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2221     VIXL_ASSERT(allow_macro_instructions_);
2222     VIXL_ASSERT(OutsideITBlock());
2223     MacroEmissionCheckScope guard(this);
2224     bool can_use_it =
2225         // LDRSB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2226         operand.IsPlainRegister() && rt.IsLow() &&
2227         operand.GetBaseRegister().IsLow() &&
2228         operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2229         (operand.GetAddrMode() == Offset);
2230     ITScope it_scope(this, &cond, guard, can_use_it);
2231     ldrsb(cond, rt, operand);
2232   }
Ldrsb(Register rt,const MemOperand & operand)2233   void Ldrsb(Register rt, const MemOperand& operand) { Ldrsb(al, rt, operand); }
2234 
2235 
Ldrsh(Condition cond,Register rt,const MemOperand & operand)2236   void Ldrsh(Condition cond, Register rt, const MemOperand& operand) {
2237     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2238     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2239     VIXL_ASSERT(allow_macro_instructions_);
2240     VIXL_ASSERT(OutsideITBlock());
2241     MacroEmissionCheckScope guard(this);
2242     bool can_use_it =
2243         // LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2244         operand.IsPlainRegister() && rt.IsLow() &&
2245         operand.GetBaseRegister().IsLow() &&
2246         operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2247         (operand.GetAddrMode() == Offset);
2248     ITScope it_scope(this, &cond, guard, can_use_it);
2249     ldrsh(cond, rt, operand);
2250   }
Ldrsh(Register rt,const MemOperand & operand)2251   void Ldrsh(Register rt, const MemOperand& operand) { Ldrsh(al, rt, operand); }
2252 
2253 
Lsl(Condition cond,Register rd,Register rm,const Operand & operand)2254   void Lsl(Condition cond, Register rd, Register rm, const Operand& operand) {
2255     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2256     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2257     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2258     VIXL_ASSERT(allow_macro_instructions_);
2259     VIXL_ASSERT(OutsideITBlock());
2260     MacroEmissionCheckScope guard(this);
2261     bool can_use_it =
2262         // LSL<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
2263         (operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2264          (operand.GetImmediate() <= 31) && rd.IsLow() && rm.IsLow()) ||
2265         // LSL<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
2266         (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
2267          operand.GetBaseRegister().IsLow());
2268     ITScope it_scope(this, &cond, guard, can_use_it);
2269     lsl(cond, rd, rm, operand);
2270   }
Lsl(Register rd,Register rm,const Operand & operand)2271   void Lsl(Register rd, Register rm, const Operand& operand) {
2272     Lsl(al, rd, rm, operand);
2273   }
Lsl(FlagsUpdate flags,Condition cond,Register rd,Register rm,const Operand & operand)2274   void Lsl(FlagsUpdate flags,
2275            Condition cond,
2276            Register rd,
2277            Register rm,
2278            const Operand& operand) {
2279     switch (flags) {
2280       case LeaveFlags:
2281         Lsl(cond, rd, rm, operand);
2282         break;
2283       case SetFlags:
2284         Lsls(cond, rd, rm, operand);
2285         break;
2286       case DontCare:
2287         bool setflags_is_smaller =
2288             IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() &&
2289             ((operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2290               (operand.GetImmediate() < 32)) ||
2291              (operand.IsPlainRegister() && rd.Is(rm)));
2292         if (setflags_is_smaller) {
2293           Lsls(cond, rd, rm, operand);
2294         } else {
2295           Lsl(cond, rd, rm, operand);
2296         }
2297         break;
2298     }
2299   }
Lsl(FlagsUpdate flags,Register rd,Register rm,const Operand & operand)2300   void Lsl(FlagsUpdate flags,
2301            Register rd,
2302            Register rm,
2303            const Operand& operand) {
2304     Lsl(flags, al, rd, rm, operand);
2305   }
2306 
Lsls(Condition cond,Register rd,Register rm,const Operand & operand)2307   void Lsls(Condition cond, Register rd, Register rm, const Operand& operand) {
2308     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2309     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2310     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2311     VIXL_ASSERT(allow_macro_instructions_);
2312     VIXL_ASSERT(OutsideITBlock());
2313     MacroEmissionCheckScope guard(this);
2314     ITScope it_scope(this, &cond, guard);
2315     lsls(cond, rd, rm, operand);
2316   }
Lsls(Register rd,Register rm,const Operand & operand)2317   void Lsls(Register rd, Register rm, const Operand& operand) {
2318     Lsls(al, rd, rm, operand);
2319   }
2320 
Lsr(Condition cond,Register rd,Register rm,const Operand & operand)2321   void Lsr(Condition cond, Register rd, Register rm, const Operand& operand) {
2322     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2323     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2324     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2325     VIXL_ASSERT(allow_macro_instructions_);
2326     VIXL_ASSERT(OutsideITBlock());
2327     MacroEmissionCheckScope guard(this);
2328     bool can_use_it =
2329         // LSR<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
2330         (operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2331          (operand.GetImmediate() <= 32) && rd.IsLow() && rm.IsLow()) ||
2332         // LSR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
2333         (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
2334          operand.GetBaseRegister().IsLow());
2335     ITScope it_scope(this, &cond, guard, can_use_it);
2336     lsr(cond, rd, rm, operand);
2337   }
Lsr(Register rd,Register rm,const Operand & operand)2338   void Lsr(Register rd, Register rm, const Operand& operand) {
2339     Lsr(al, rd, rm, operand);
2340   }
Lsr(FlagsUpdate flags,Condition cond,Register rd,Register rm,const Operand & operand)2341   void Lsr(FlagsUpdate flags,
2342            Condition cond,
2343            Register rd,
2344            Register rm,
2345            const Operand& operand) {
2346     switch (flags) {
2347       case LeaveFlags:
2348         Lsr(cond, rd, rm, operand);
2349         break;
2350       case SetFlags:
2351         Lsrs(cond, rd, rm, operand);
2352         break;
2353       case DontCare:
2354         bool setflags_is_smaller =
2355             IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() &&
2356             ((operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2357               (operand.GetImmediate() <= 32)) ||
2358              (operand.IsPlainRegister() && rd.Is(rm)));
2359         if (setflags_is_smaller) {
2360           Lsrs(cond, rd, rm, operand);
2361         } else {
2362           Lsr(cond, rd, rm, operand);
2363         }
2364         break;
2365     }
2366   }
Lsr(FlagsUpdate flags,Register rd,Register rm,const Operand & operand)2367   void Lsr(FlagsUpdate flags,
2368            Register rd,
2369            Register rm,
2370            const Operand& operand) {
2371     Lsr(flags, al, rd, rm, operand);
2372   }
2373 
Lsrs(Condition cond,Register rd,Register rm,const Operand & operand)2374   void Lsrs(Condition cond, Register rd, Register rm, const Operand& operand) {
2375     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2376     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2377     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2378     VIXL_ASSERT(allow_macro_instructions_);
2379     VIXL_ASSERT(OutsideITBlock());
2380     MacroEmissionCheckScope guard(this);
2381     ITScope it_scope(this, &cond, guard);
2382     lsrs(cond, rd, rm, operand);
2383   }
Lsrs(Register rd,Register rm,const Operand & operand)2384   void Lsrs(Register rd, Register rm, const Operand& operand) {
2385     Lsrs(al, rd, rm, operand);
2386   }
2387 
Mla(Condition cond,Register rd,Register rn,Register rm,Register ra)2388   void Mla(Condition cond, Register rd, Register rn, Register rm, Register ra) {
2389     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2390     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2391     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2392     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
2393     VIXL_ASSERT(allow_macro_instructions_);
2394     VIXL_ASSERT(OutsideITBlock());
2395     MacroEmissionCheckScope guard(this);
2396     ITScope it_scope(this, &cond, guard);
2397     mla(cond, rd, rn, rm, ra);
2398   }
Mla(Register rd,Register rn,Register rm,Register ra)2399   void Mla(Register rd, Register rn, Register rm, Register ra) {
2400     Mla(al, rd, rn, rm, ra);
2401   }
Mla(FlagsUpdate flags,Condition cond,Register rd,Register rn,Register rm,Register ra)2402   void Mla(FlagsUpdate flags,
2403            Condition cond,
2404            Register rd,
2405            Register rn,
2406            Register rm,
2407            Register ra) {
2408     switch (flags) {
2409       case LeaveFlags:
2410         Mla(cond, rd, rn, rm, ra);
2411         break;
2412       case SetFlags:
2413         Mlas(cond, rd, rn, rm, ra);
2414         break;
2415       case DontCare:
2416         Mla(cond, rd, rn, rm, ra);
2417         break;
2418     }
2419   }
Mla(FlagsUpdate flags,Register rd,Register rn,Register rm,Register ra)2420   void Mla(
2421       FlagsUpdate flags, Register rd, Register rn, Register rm, Register ra) {
2422     Mla(flags, al, rd, rn, rm, ra);
2423   }
2424 
Mlas(Condition cond,Register rd,Register rn,Register rm,Register ra)2425   void Mlas(
2426       Condition cond, Register rd, Register rn, Register rm, Register ra) {
2427     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2428     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2429     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2430     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
2431     VIXL_ASSERT(allow_macro_instructions_);
2432     VIXL_ASSERT(OutsideITBlock());
2433     MacroEmissionCheckScope guard(this);
2434     ITScope it_scope(this, &cond, guard);
2435     mlas(cond, rd, rn, rm, ra);
2436   }
Mlas(Register rd,Register rn,Register rm,Register ra)2437   void Mlas(Register rd, Register rn, Register rm, Register ra) {
2438     Mlas(al, rd, rn, rm, ra);
2439   }
2440 
Mls(Condition cond,Register rd,Register rn,Register rm,Register ra)2441   void Mls(Condition cond, Register rd, Register rn, Register rm, Register ra) {
2442     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2443     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2444     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2445     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
2446     VIXL_ASSERT(allow_macro_instructions_);
2447     VIXL_ASSERT(OutsideITBlock());
2448     MacroEmissionCheckScope guard(this);
2449     ITScope it_scope(this, &cond, guard);
2450     mls(cond, rd, rn, rm, ra);
2451   }
Mls(Register rd,Register rn,Register rm,Register ra)2452   void Mls(Register rd, Register rn, Register rm, Register ra) {
2453     Mls(al, rd, rn, rm, ra);
2454   }
2455 
Mov(Condition cond,Register rd,const Operand & operand)2456   void Mov(Condition cond, Register rd, const Operand& operand) {
2457     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2458     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2459     VIXL_ASSERT(allow_macro_instructions_);
2460     VIXL_ASSERT(OutsideITBlock());
2461     MacroEmissionCheckScope guard(this);
2462     if (operand.IsPlainRegister() && rd.Is(operand.GetBaseRegister())) {
2463       return;
2464     }
2465     bool can_use_it =
2466         // MOV<c>{<q>} <Rd>, #<imm8> ; T1
2467         (operand.IsImmediate() && rd.IsLow() &&
2468          (operand.GetImmediate() <= 255)) ||
2469         // MOV{<c>}{<q>} <Rd>, <Rm> ; T1
2470         (operand.IsPlainRegister() && !rd.IsPC() &&
2471          !operand.GetBaseRegister().IsPC()) ||
2472         // MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount>} ; T2
2473         (operand.IsImmediateShiftedRegister() && rd.IsLow() &&
2474          operand.GetBaseRegister().IsLow() &&
2475          (operand.GetShift().Is(LSL) || operand.GetShift().Is(LSR) ||
2476           operand.GetShift().Is(ASR))) ||
2477         // MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
2478         // MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
2479         // MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
2480         // MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
2481         (operand.IsRegisterShiftedRegister() &&
2482          rd.Is(operand.GetBaseRegister()) && rd.IsLow() &&
2483          (operand.GetShift().Is(LSL) || operand.GetShift().Is(LSR) ||
2484           operand.GetShift().Is(ASR) || operand.GetShift().Is(ROR)) &&
2485          operand.GetShiftRegister().IsLow());
2486     ITScope it_scope(this, &cond, guard, can_use_it);
2487     mov(cond, rd, operand);
2488   }
Mov(Register rd,const Operand & operand)2489   void Mov(Register rd, const Operand& operand) { Mov(al, rd, operand); }
Mov(FlagsUpdate flags,Condition cond,Register rd,const Operand & operand)2490   void Mov(FlagsUpdate flags,
2491            Condition cond,
2492            Register rd,
2493            const Operand& operand) {
2494     switch (flags) {
2495       case LeaveFlags:
2496         Mov(cond, rd, operand);
2497         break;
2498       case SetFlags:
2499         Movs(cond, rd, operand);
2500         break;
2501       case DontCare:
2502         if (operand.IsPlainRegister() && rd.Is(operand.GetBaseRegister())) {
2503           return;
2504         }
2505         bool setflags_is_smaller =
2506             IsUsingT32() && cond.Is(al) &&
2507             ((operand.IsImmediateShiftedRegister() && rd.IsLow() &&
2508               operand.GetBaseRegister().IsLow() &&
2509               (operand.GetShiftAmount() >= 1) &&
2510               (((operand.GetShiftAmount() <= 32) &&
2511                 ((operand.GetShift().IsLSR() || operand.GetShift().IsASR()))) ||
2512                ((operand.GetShiftAmount() < 32) &&
2513                 operand.GetShift().IsLSL()))) ||
2514              (operand.IsRegisterShiftedRegister() && rd.IsLow() &&
2515               operand.GetBaseRegister().Is(rd) &&
2516               operand.GetShiftRegister().IsLow() &&
2517               (operand.GetShift().IsLSL() || operand.GetShift().IsLSR() ||
2518                operand.GetShift().IsASR() || operand.GetShift().IsROR())) ||
2519              (operand.IsImmediate() && rd.IsLow() &&
2520               (operand.GetImmediate() < 256)));
2521         if (setflags_is_smaller) {
2522           Movs(cond, rd, operand);
2523         } else {
2524           Mov(cond, rd, operand);
2525         }
2526         break;
2527     }
2528   }
Mov(FlagsUpdate flags,Register rd,const Operand & operand)2529   void Mov(FlagsUpdate flags, Register rd, const Operand& operand) {
2530     Mov(flags, al, rd, operand);
2531   }
2532 
Movs(Condition cond,Register rd,const Operand & operand)2533   void Movs(Condition cond, Register rd, const Operand& operand) {
2534     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2535     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2536     VIXL_ASSERT(allow_macro_instructions_);
2537     VIXL_ASSERT(OutsideITBlock());
2538     MacroEmissionCheckScope guard(this);
2539     ITScope it_scope(this, &cond, guard);
2540     movs(cond, rd, operand);
2541   }
Movs(Register rd,const Operand & operand)2542   void Movs(Register rd, const Operand& operand) { Movs(al, rd, operand); }
2543 
Movt(Condition cond,Register rd,const Operand & operand)2544   void Movt(Condition cond, Register rd, const Operand& operand) {
2545     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2546     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2547     VIXL_ASSERT(allow_macro_instructions_);
2548     VIXL_ASSERT(OutsideITBlock());
2549     MacroEmissionCheckScope guard(this);
2550     ITScope it_scope(this, &cond, guard);
2551     movt(cond, rd, operand);
2552   }
Movt(Register rd,const Operand & operand)2553   void Movt(Register rd, const Operand& operand) { Movt(al, rd, operand); }
2554 
Mrs(Condition cond,Register rd,SpecialRegister spec_reg)2555   void Mrs(Condition cond, Register rd, SpecialRegister spec_reg) {
2556     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2557     VIXL_ASSERT(allow_macro_instructions_);
2558     VIXL_ASSERT(OutsideITBlock());
2559     MacroEmissionCheckScope guard(this);
2560     ITScope it_scope(this, &cond, guard);
2561     mrs(cond, rd, spec_reg);
2562   }
Mrs(Register rd,SpecialRegister spec_reg)2563   void Mrs(Register rd, SpecialRegister spec_reg) { Mrs(al, rd, spec_reg); }
2564 
Msr(Condition cond,MaskedSpecialRegister spec_reg,const Operand & operand)2565   void Msr(Condition cond,
2566            MaskedSpecialRegister spec_reg,
2567            const Operand& operand) {
2568     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2569     VIXL_ASSERT(allow_macro_instructions_);
2570     VIXL_ASSERT(OutsideITBlock());
2571     MacroEmissionCheckScope guard(this);
2572     ITScope it_scope(this, &cond, guard);
2573     msr(cond, spec_reg, operand);
2574   }
Msr(MaskedSpecialRegister spec_reg,const Operand & operand)2575   void Msr(MaskedSpecialRegister spec_reg, const Operand& operand) {
2576     Msr(al, spec_reg, operand);
2577   }
2578 
Mul(Condition cond,Register rd,Register rn,Register rm)2579   void Mul(Condition cond, Register rd, Register rn, Register rm) {
2580     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2581     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2582     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2583     VIXL_ASSERT(allow_macro_instructions_);
2584     VIXL_ASSERT(OutsideITBlock());
2585     MacroEmissionCheckScope guard(this);
2586     bool can_use_it =
2587         // MUL<c>{<q>} <Rdm>, <Rn>{, <Rdm>} ; T1
2588         rd.Is(rm) && rn.IsLow() && rm.IsLow();
2589     ITScope it_scope(this, &cond, guard, can_use_it);
2590     mul(cond, rd, rn, rm);
2591   }
Mul(Register rd,Register rn,Register rm)2592   void Mul(Register rd, Register rn, Register rm) { Mul(al, rd, rn, rm); }
Mul(FlagsUpdate flags,Condition cond,Register rd,Register rn,Register rm)2593   void Mul(FlagsUpdate flags,
2594            Condition cond,
2595            Register rd,
2596            Register rn,
2597            Register rm) {
2598     switch (flags) {
2599       case LeaveFlags:
2600         Mul(cond, rd, rn, rm);
2601         break;
2602       case SetFlags:
2603         Muls(cond, rd, rn, rm);
2604         break;
2605       case DontCare:
2606         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
2607                                    rn.IsLow() && rm.Is(rd);
2608         if (setflags_is_smaller) {
2609           Muls(cond, rd, rn, rm);
2610         } else {
2611           Mul(cond, rd, rn, rm);
2612         }
2613         break;
2614     }
2615   }
Mul(FlagsUpdate flags,Register rd,Register rn,Register rm)2616   void Mul(FlagsUpdate flags, Register rd, Register rn, Register rm) {
2617     Mul(flags, al, rd, rn, rm);
2618   }
2619 
Muls(Condition cond,Register rd,Register rn,Register rm)2620   void Muls(Condition cond, Register rd, Register rn, Register rm) {
2621     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2622     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2623     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2624     VIXL_ASSERT(allow_macro_instructions_);
2625     VIXL_ASSERT(OutsideITBlock());
2626     MacroEmissionCheckScope guard(this);
2627     ITScope it_scope(this, &cond, guard);
2628     muls(cond, rd, rn, rm);
2629   }
Muls(Register rd,Register rn,Register rm)2630   void Muls(Register rd, Register rn, Register rm) { Muls(al, rd, rn, rm); }
2631 
Mvn(Condition cond,Register rd,const Operand & operand)2632   void Mvn(Condition cond, Register rd, const Operand& operand) {
2633     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2634     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2635     VIXL_ASSERT(allow_macro_instructions_);
2636     VIXL_ASSERT(OutsideITBlock());
2637     MacroEmissionCheckScope guard(this);
2638     bool can_use_it =
2639         // MVN<c>{<q>} <Rd>, <Rm> ; T1
2640         operand.IsPlainRegister() && rd.IsLow() &&
2641         operand.GetBaseRegister().IsLow();
2642     ITScope it_scope(this, &cond, guard, can_use_it);
2643     mvn(cond, rd, operand);
2644   }
Mvn(Register rd,const Operand & operand)2645   void Mvn(Register rd, const Operand& operand) { Mvn(al, rd, operand); }
Mvn(FlagsUpdate flags,Condition cond,Register rd,const Operand & operand)2646   void Mvn(FlagsUpdate flags,
2647            Condition cond,
2648            Register rd,
2649            const Operand& operand) {
2650     switch (flags) {
2651       case LeaveFlags:
2652         Mvn(cond, rd, operand);
2653         break;
2654       case SetFlags:
2655         Mvns(cond, rd, operand);
2656         break;
2657       case DontCare:
2658         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
2659                                    operand.IsPlainRegister() &&
2660                                    operand.GetBaseRegister().IsLow();
2661         if (setflags_is_smaller) {
2662           Mvns(cond, rd, operand);
2663         } else {
2664           Mvn(cond, rd, operand);
2665         }
2666         break;
2667     }
2668   }
Mvn(FlagsUpdate flags,Register rd,const Operand & operand)2669   void Mvn(FlagsUpdate flags, Register rd, const Operand& operand) {
2670     Mvn(flags, al, rd, operand);
2671   }
2672 
Mvns(Condition cond,Register rd,const Operand & operand)2673   void Mvns(Condition cond, Register rd, const Operand& operand) {
2674     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2675     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2676     VIXL_ASSERT(allow_macro_instructions_);
2677     VIXL_ASSERT(OutsideITBlock());
2678     MacroEmissionCheckScope guard(this);
2679     ITScope it_scope(this, &cond, guard);
2680     mvns(cond, rd, operand);
2681   }
Mvns(Register rd,const Operand & operand)2682   void Mvns(Register rd, const Operand& operand) { Mvns(al, rd, operand); }
2683 
Nop(Condition cond)2684   void Nop(Condition cond) {
2685     VIXL_ASSERT(allow_macro_instructions_);
2686     VIXL_ASSERT(OutsideITBlock());
2687     MacroEmissionCheckScope guard(this);
2688     ITScope it_scope(this, &cond, guard);
2689     nop(cond);
2690   }
Nop()2691   void Nop() { Nop(al); }
2692 
Orn(Condition cond,Register rd,Register rn,const Operand & operand)2693   void Orn(Condition cond, Register rd, Register rn, const Operand& operand) {
2694     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2695     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2696     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2697     VIXL_ASSERT(allow_macro_instructions_);
2698     VIXL_ASSERT(OutsideITBlock());
2699     MacroEmissionCheckScope guard(this);
2700     if (cond.Is(al) && operand.IsImmediate()) {
2701       uint32_t immediate = operand.GetImmediate();
2702       if (immediate == 0) {
2703         mvn(rd, 0);
2704         return;
2705       }
2706       if ((immediate == 0xffffffff) && rd.Is(rn)) {
2707         return;
2708       }
2709     }
2710     ITScope it_scope(this, &cond, guard);
2711     orn(cond, rd, rn, operand);
2712   }
Orn(Register rd,Register rn,const Operand & operand)2713   void Orn(Register rd, Register rn, const Operand& operand) {
2714     Orn(al, rd, rn, operand);
2715   }
Orn(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)2716   void Orn(FlagsUpdate flags,
2717            Condition cond,
2718            Register rd,
2719            Register rn,
2720            const Operand& operand) {
2721     switch (flags) {
2722       case LeaveFlags:
2723         Orn(cond, rd, rn, operand);
2724         break;
2725       case SetFlags:
2726         Orns(cond, rd, rn, operand);
2727         break;
2728       case DontCare:
2729         Orn(cond, rd, rn, operand);
2730         break;
2731     }
2732   }
Orn(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)2733   void Orn(FlagsUpdate flags,
2734            Register rd,
2735            Register rn,
2736            const Operand& operand) {
2737     Orn(flags, al, rd, rn, operand);
2738   }
2739 
Orns(Condition cond,Register rd,Register rn,const Operand & operand)2740   void Orns(Condition cond, Register rd, Register rn, const Operand& operand) {
2741     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2742     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2743     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2744     VIXL_ASSERT(allow_macro_instructions_);
2745     VIXL_ASSERT(OutsideITBlock());
2746     MacroEmissionCheckScope guard(this);
2747     ITScope it_scope(this, &cond, guard);
2748     orns(cond, rd, rn, operand);
2749   }
Orns(Register rd,Register rn,const Operand & operand)2750   void Orns(Register rd, Register rn, const Operand& operand) {
2751     Orns(al, rd, rn, operand);
2752   }
2753 
Orr(Condition cond,Register rd,Register rn,const Operand & operand)2754   void Orr(Condition cond, Register rd, Register rn, const Operand& operand) {
2755     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2756     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2757     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2758     VIXL_ASSERT(allow_macro_instructions_);
2759     VIXL_ASSERT(OutsideITBlock());
2760     MacroEmissionCheckScope guard(this);
2761     if (rd.Is(rn) && operand.IsPlainRegister() &&
2762         rd.Is(operand.GetBaseRegister())) {
2763       return;
2764     }
2765     if (cond.Is(al) && operand.IsImmediate()) {
2766       uint32_t immediate = operand.GetImmediate();
2767       if ((immediate == 0) && rd.Is(rn)) {
2768         return;
2769       }
2770       if (immediate == 0xffffffff) {
2771         mvn(rd, 0);
2772         return;
2773       }
2774     }
2775     bool can_use_it =
2776         // ORR<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
2777         operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
2778         operand.GetBaseRegister().IsLow();
2779     ITScope it_scope(this, &cond, guard, can_use_it);
2780     orr(cond, rd, rn, operand);
2781   }
Orr(Register rd,Register rn,const Operand & operand)2782   void Orr(Register rd, Register rn, const Operand& operand) {
2783     Orr(al, rd, rn, operand);
2784   }
Orr(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)2785   void Orr(FlagsUpdate flags,
2786            Condition cond,
2787            Register rd,
2788            Register rn,
2789            const Operand& operand) {
2790     switch (flags) {
2791       case LeaveFlags:
2792         Orr(cond, rd, rn, operand);
2793         break;
2794       case SetFlags:
2795         Orrs(cond, rd, rn, operand);
2796         break;
2797       case DontCare:
2798         if (operand.IsPlainRegister() && rd.Is(rn) &&
2799             rd.Is(operand.GetBaseRegister())) {
2800           return;
2801         }
2802         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
2803                                    rn.Is(rd) && operand.IsPlainRegister() &&
2804                                    operand.GetBaseRegister().IsLow();
2805         if (setflags_is_smaller) {
2806           Orrs(cond, rd, rn, operand);
2807         } else {
2808           Orr(cond, rd, rn, operand);
2809         }
2810         break;
2811     }
2812   }
Orr(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)2813   void Orr(FlagsUpdate flags,
2814            Register rd,
2815            Register rn,
2816            const Operand& operand) {
2817     Orr(flags, al, rd, rn, operand);
2818   }
2819 
Orrs(Condition cond,Register rd,Register rn,const Operand & operand)2820   void Orrs(Condition cond, Register rd, Register rn, const Operand& operand) {
2821     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2822     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2823     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2824     VIXL_ASSERT(allow_macro_instructions_);
2825     VIXL_ASSERT(OutsideITBlock());
2826     MacroEmissionCheckScope guard(this);
2827     ITScope it_scope(this, &cond, guard);
2828     orrs(cond, rd, rn, operand);
2829   }
Orrs(Register rd,Register rn,const Operand & operand)2830   void Orrs(Register rd, Register rn, const Operand& operand) {
2831     Orrs(al, rd, rn, operand);
2832   }
2833 
Pkhbt(Condition cond,Register rd,Register rn,const Operand & operand)2834   void Pkhbt(Condition cond, Register rd, Register rn, const Operand& operand) {
2835     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2836     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2837     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2838     VIXL_ASSERT(allow_macro_instructions_);
2839     VIXL_ASSERT(OutsideITBlock());
2840     MacroEmissionCheckScope guard(this);
2841     ITScope it_scope(this, &cond, guard);
2842     pkhbt(cond, rd, rn, operand);
2843   }
Pkhbt(Register rd,Register rn,const Operand & operand)2844   void Pkhbt(Register rd, Register rn, const Operand& operand) {
2845     Pkhbt(al, rd, rn, operand);
2846   }
2847 
Pkhtb(Condition cond,Register rd,Register rn,const Operand & operand)2848   void Pkhtb(Condition cond, Register rd, Register rn, const Operand& operand) {
2849     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2850     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2851     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2852     VIXL_ASSERT(allow_macro_instructions_);
2853     VIXL_ASSERT(OutsideITBlock());
2854     MacroEmissionCheckScope guard(this);
2855     ITScope it_scope(this, &cond, guard);
2856     pkhtb(cond, rd, rn, operand);
2857   }
Pkhtb(Register rd,Register rn,const Operand & operand)2858   void Pkhtb(Register rd, Register rn, const Operand& operand) {
2859     Pkhtb(al, rd, rn, operand);
2860   }
2861 
2862 
Pld(Condition cond,const MemOperand & operand)2863   void Pld(Condition cond, const MemOperand& operand) {
2864     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2865     VIXL_ASSERT(allow_macro_instructions_);
2866     VIXL_ASSERT(OutsideITBlock());
2867     MacroEmissionCheckScope guard(this);
2868     ITScope it_scope(this, &cond, guard);
2869     pld(cond, operand);
2870   }
Pld(const MemOperand & operand)2871   void Pld(const MemOperand& operand) { Pld(al, operand); }
2872 
Pldw(Condition cond,const MemOperand & operand)2873   void Pldw(Condition cond, const MemOperand& operand) {
2874     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2875     VIXL_ASSERT(allow_macro_instructions_);
2876     VIXL_ASSERT(OutsideITBlock());
2877     MacroEmissionCheckScope guard(this);
2878     ITScope it_scope(this, &cond, guard);
2879     pldw(cond, operand);
2880   }
Pldw(const MemOperand & operand)2881   void Pldw(const MemOperand& operand) { Pldw(al, operand); }
2882 
Pli(Condition cond,const MemOperand & operand)2883   void Pli(Condition cond, const MemOperand& operand) {
2884     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2885     VIXL_ASSERT(allow_macro_instructions_);
2886     VIXL_ASSERT(OutsideITBlock());
2887     MacroEmissionCheckScope guard(this);
2888     ITScope it_scope(this, &cond, guard);
2889     pli(cond, operand);
2890   }
Pli(const MemOperand & operand)2891   void Pli(const MemOperand& operand) { Pli(al, operand); }
2892 
2893 
Pop(Condition cond,RegisterList registers)2894   void Pop(Condition cond, RegisterList registers) {
2895     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2896     VIXL_ASSERT(allow_macro_instructions_);
2897     VIXL_ASSERT(OutsideITBlock());
2898     MacroEmissionCheckScope guard(this);
2899     ITScope it_scope(this, &cond, guard);
2900     pop(cond, registers);
2901   }
Pop(RegisterList registers)2902   void Pop(RegisterList registers) { Pop(al, registers); }
2903 
Pop(Condition cond,Register rt)2904   void Pop(Condition cond, Register rt) {
2905     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2906     VIXL_ASSERT(allow_macro_instructions_);
2907     VIXL_ASSERT(OutsideITBlock());
2908     MacroEmissionCheckScope guard(this);
2909     ITScope it_scope(this, &cond, guard);
2910     pop(cond, rt);
2911   }
Pop(Register rt)2912   void Pop(Register rt) { Pop(al, rt); }
2913 
Push(Condition cond,RegisterList registers)2914   void Push(Condition cond, RegisterList registers) {
2915     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2916     VIXL_ASSERT(allow_macro_instructions_);
2917     VIXL_ASSERT(OutsideITBlock());
2918     MacroEmissionCheckScope guard(this);
2919     ITScope it_scope(this, &cond, guard);
2920     push(cond, registers);
2921   }
Push(RegisterList registers)2922   void Push(RegisterList registers) { Push(al, registers); }
2923 
Push(Condition cond,Register rt)2924   void Push(Condition cond, Register rt) {
2925     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2926     VIXL_ASSERT(allow_macro_instructions_);
2927     VIXL_ASSERT(OutsideITBlock());
2928     MacroEmissionCheckScope guard(this);
2929     ITScope it_scope(this, &cond, guard);
2930     push(cond, rt);
2931   }
Push(Register rt)2932   void Push(Register rt) { Push(al, rt); }
2933 
Qadd(Condition cond,Register rd,Register rm,Register rn)2934   void Qadd(Condition cond, Register rd, Register rm, Register rn) {
2935     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2936     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2937     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2938     VIXL_ASSERT(allow_macro_instructions_);
2939     VIXL_ASSERT(OutsideITBlock());
2940     MacroEmissionCheckScope guard(this);
2941     ITScope it_scope(this, &cond, guard);
2942     qadd(cond, rd, rm, rn);
2943   }
Qadd(Register rd,Register rm,Register rn)2944   void Qadd(Register rd, Register rm, Register rn) { Qadd(al, rd, rm, rn); }
2945 
Qadd16(Condition cond,Register rd,Register rn,Register rm)2946   void Qadd16(Condition cond, Register rd, Register rn, Register rm) {
2947     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2948     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2949     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2950     VIXL_ASSERT(allow_macro_instructions_);
2951     VIXL_ASSERT(OutsideITBlock());
2952     MacroEmissionCheckScope guard(this);
2953     ITScope it_scope(this, &cond, guard);
2954     qadd16(cond, rd, rn, rm);
2955   }
Qadd16(Register rd,Register rn,Register rm)2956   void Qadd16(Register rd, Register rn, Register rm) { Qadd16(al, rd, rn, rm); }
2957 
Qadd8(Condition cond,Register rd,Register rn,Register rm)2958   void Qadd8(Condition cond, Register rd, Register rn, Register rm) {
2959     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2960     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2961     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2962     VIXL_ASSERT(allow_macro_instructions_);
2963     VIXL_ASSERT(OutsideITBlock());
2964     MacroEmissionCheckScope guard(this);
2965     ITScope it_scope(this, &cond, guard);
2966     qadd8(cond, rd, rn, rm);
2967   }
Qadd8(Register rd,Register rn,Register rm)2968   void Qadd8(Register rd, Register rn, Register rm) { Qadd8(al, rd, rn, rm); }
2969 
Qasx(Condition cond,Register rd,Register rn,Register rm)2970   void Qasx(Condition cond, Register rd, Register rn, Register rm) {
2971     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2972     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2973     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2974     VIXL_ASSERT(allow_macro_instructions_);
2975     VIXL_ASSERT(OutsideITBlock());
2976     MacroEmissionCheckScope guard(this);
2977     ITScope it_scope(this, &cond, guard);
2978     qasx(cond, rd, rn, rm);
2979   }
Qasx(Register rd,Register rn,Register rm)2980   void Qasx(Register rd, Register rn, Register rm) { Qasx(al, rd, rn, rm); }
2981 
Qdadd(Condition cond,Register rd,Register rm,Register rn)2982   void Qdadd(Condition cond, Register rd, Register rm, Register rn) {
2983     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2984     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2985     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2986     VIXL_ASSERT(allow_macro_instructions_);
2987     VIXL_ASSERT(OutsideITBlock());
2988     MacroEmissionCheckScope guard(this);
2989     ITScope it_scope(this, &cond, guard);
2990     qdadd(cond, rd, rm, rn);
2991   }
Qdadd(Register rd,Register rm,Register rn)2992   void Qdadd(Register rd, Register rm, Register rn) { Qdadd(al, rd, rm, rn); }
2993 
Qdsub(Condition cond,Register rd,Register rm,Register rn)2994   void Qdsub(Condition cond, Register rd, Register rm, Register rn) {
2995     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2996     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2997     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2998     VIXL_ASSERT(allow_macro_instructions_);
2999     VIXL_ASSERT(OutsideITBlock());
3000     MacroEmissionCheckScope guard(this);
3001     ITScope it_scope(this, &cond, guard);
3002     qdsub(cond, rd, rm, rn);
3003   }
Qdsub(Register rd,Register rm,Register rn)3004   void Qdsub(Register rd, Register rm, Register rn) { Qdsub(al, rd, rm, rn); }
3005 
Qsax(Condition cond,Register rd,Register rn,Register rm)3006   void Qsax(Condition cond, Register rd, Register rn, Register rm) {
3007     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3008     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3009     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3010     VIXL_ASSERT(allow_macro_instructions_);
3011     VIXL_ASSERT(OutsideITBlock());
3012     MacroEmissionCheckScope guard(this);
3013     ITScope it_scope(this, &cond, guard);
3014     qsax(cond, rd, rn, rm);
3015   }
Qsax(Register rd,Register rn,Register rm)3016   void Qsax(Register rd, Register rn, Register rm) { Qsax(al, rd, rn, rm); }
3017 
Qsub(Condition cond,Register rd,Register rm,Register rn)3018   void Qsub(Condition cond, Register rd, Register rm, Register rn) {
3019     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3020     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3021     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3022     VIXL_ASSERT(allow_macro_instructions_);
3023     VIXL_ASSERT(OutsideITBlock());
3024     MacroEmissionCheckScope guard(this);
3025     ITScope it_scope(this, &cond, guard);
3026     qsub(cond, rd, rm, rn);
3027   }
Qsub(Register rd,Register rm,Register rn)3028   void Qsub(Register rd, Register rm, Register rn) { Qsub(al, rd, rm, rn); }
3029 
Qsub16(Condition cond,Register rd,Register rn,Register rm)3030   void Qsub16(Condition cond, Register rd, Register rn, Register rm) {
3031     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3032     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3033     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3034     VIXL_ASSERT(allow_macro_instructions_);
3035     VIXL_ASSERT(OutsideITBlock());
3036     MacroEmissionCheckScope guard(this);
3037     ITScope it_scope(this, &cond, guard);
3038     qsub16(cond, rd, rn, rm);
3039   }
Qsub16(Register rd,Register rn,Register rm)3040   void Qsub16(Register rd, Register rn, Register rm) { Qsub16(al, rd, rn, rm); }
3041 
Qsub8(Condition cond,Register rd,Register rn,Register rm)3042   void Qsub8(Condition cond, Register rd, Register rn, Register rm) {
3043     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3044     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3045     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3046     VIXL_ASSERT(allow_macro_instructions_);
3047     VIXL_ASSERT(OutsideITBlock());
3048     MacroEmissionCheckScope guard(this);
3049     ITScope it_scope(this, &cond, guard);
3050     qsub8(cond, rd, rn, rm);
3051   }
Qsub8(Register rd,Register rn,Register rm)3052   void Qsub8(Register rd, Register rn, Register rm) { Qsub8(al, rd, rn, rm); }
3053 
Rbit(Condition cond,Register rd,Register rm)3054   void Rbit(Condition cond, Register rd, Register rm) {
3055     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3056     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3057     VIXL_ASSERT(allow_macro_instructions_);
3058     VIXL_ASSERT(OutsideITBlock());
3059     MacroEmissionCheckScope guard(this);
3060     ITScope it_scope(this, &cond, guard);
3061     rbit(cond, rd, rm);
3062   }
Rbit(Register rd,Register rm)3063   void Rbit(Register rd, Register rm) { Rbit(al, rd, rm); }
3064 
Rev(Condition cond,Register rd,Register rm)3065   void Rev(Condition cond, Register rd, Register rm) {
3066     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3067     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3068     VIXL_ASSERT(allow_macro_instructions_);
3069     VIXL_ASSERT(OutsideITBlock());
3070     MacroEmissionCheckScope guard(this);
3071     ITScope it_scope(this, &cond, guard);
3072     rev(cond, rd, rm);
3073   }
Rev(Register rd,Register rm)3074   void Rev(Register rd, Register rm) { Rev(al, rd, rm); }
3075 
Rev16(Condition cond,Register rd,Register rm)3076   void Rev16(Condition cond, Register rd, Register rm) {
3077     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3078     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3079     VIXL_ASSERT(allow_macro_instructions_);
3080     VIXL_ASSERT(OutsideITBlock());
3081     MacroEmissionCheckScope guard(this);
3082     ITScope it_scope(this, &cond, guard);
3083     rev16(cond, rd, rm);
3084   }
Rev16(Register rd,Register rm)3085   void Rev16(Register rd, Register rm) { Rev16(al, rd, rm); }
3086 
Revsh(Condition cond,Register rd,Register rm)3087   void Revsh(Condition cond, Register rd, Register rm) {
3088     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3089     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3090     VIXL_ASSERT(allow_macro_instructions_);
3091     VIXL_ASSERT(OutsideITBlock());
3092     MacroEmissionCheckScope guard(this);
3093     ITScope it_scope(this, &cond, guard);
3094     revsh(cond, rd, rm);
3095   }
Revsh(Register rd,Register rm)3096   void Revsh(Register rd, Register rm) { Revsh(al, rd, rm); }
3097 
Ror(Condition cond,Register rd,Register rm,const Operand & operand)3098   void Ror(Condition cond, Register rd, Register rm, const Operand& operand) {
3099     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3100     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3101     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3102     VIXL_ASSERT(allow_macro_instructions_);
3103     VIXL_ASSERT(OutsideITBlock());
3104     MacroEmissionCheckScope guard(this);
3105     bool can_use_it =
3106         // ROR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
3107         operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
3108         operand.GetBaseRegister().IsLow();
3109     ITScope it_scope(this, &cond, guard, can_use_it);
3110     ror(cond, rd, rm, operand);
3111   }
Ror(Register rd,Register rm,const Operand & operand)3112   void Ror(Register rd, Register rm, const Operand& operand) {
3113     Ror(al, rd, rm, operand);
3114   }
Ror(FlagsUpdate flags,Condition cond,Register rd,Register rm,const Operand & operand)3115   void Ror(FlagsUpdate flags,
3116            Condition cond,
3117            Register rd,
3118            Register rm,
3119            const Operand& operand) {
3120     switch (flags) {
3121       case LeaveFlags:
3122         Ror(cond, rd, rm, operand);
3123         break;
3124       case SetFlags:
3125         Rors(cond, rd, rm, operand);
3126         break;
3127       case DontCare:
3128         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3129                                    rm.IsLow() && operand.IsPlainRegister() &&
3130                                    rd.Is(rm);
3131         if (setflags_is_smaller) {
3132           Rors(cond, rd, rm, operand);
3133         } else {
3134           Ror(cond, rd, rm, operand);
3135         }
3136         break;
3137     }
3138   }
Ror(FlagsUpdate flags,Register rd,Register rm,const Operand & operand)3139   void Ror(FlagsUpdate flags,
3140            Register rd,
3141            Register rm,
3142            const Operand& operand) {
3143     Ror(flags, al, rd, rm, operand);
3144   }
3145 
Rors(Condition cond,Register rd,Register rm,const Operand & operand)3146   void Rors(Condition cond, Register rd, Register rm, const Operand& operand) {
3147     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3148     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3149     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3150     VIXL_ASSERT(allow_macro_instructions_);
3151     VIXL_ASSERT(OutsideITBlock());
3152     MacroEmissionCheckScope guard(this);
3153     ITScope it_scope(this, &cond, guard);
3154     rors(cond, rd, rm, operand);
3155   }
Rors(Register rd,Register rm,const Operand & operand)3156   void Rors(Register rd, Register rm, const Operand& operand) {
3157     Rors(al, rd, rm, operand);
3158   }
3159 
Rrx(Condition cond,Register rd,Register rm)3160   void Rrx(Condition cond, Register rd, Register rm) {
3161     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3162     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3163     VIXL_ASSERT(allow_macro_instructions_);
3164     VIXL_ASSERT(OutsideITBlock());
3165     MacroEmissionCheckScope guard(this);
3166     ITScope it_scope(this, &cond, guard);
3167     rrx(cond, rd, rm);
3168   }
Rrx(Register rd,Register rm)3169   void Rrx(Register rd, Register rm) { Rrx(al, rd, rm); }
Rrx(FlagsUpdate flags,Condition cond,Register rd,Register rm)3170   void Rrx(FlagsUpdate flags, Condition cond, Register rd, Register rm) {
3171     switch (flags) {
3172       case LeaveFlags:
3173         Rrx(cond, rd, rm);
3174         break;
3175       case SetFlags:
3176         Rrxs(cond, rd, rm);
3177         break;
3178       case DontCare:
3179         Rrx(cond, rd, rm);
3180         break;
3181     }
3182   }
Rrx(FlagsUpdate flags,Register rd,Register rm)3183   void Rrx(FlagsUpdate flags, Register rd, Register rm) {
3184     Rrx(flags, al, rd, rm);
3185   }
3186 
Rrxs(Condition cond,Register rd,Register rm)3187   void Rrxs(Condition cond, Register rd, Register rm) {
3188     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3189     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3190     VIXL_ASSERT(allow_macro_instructions_);
3191     VIXL_ASSERT(OutsideITBlock());
3192     MacroEmissionCheckScope guard(this);
3193     ITScope it_scope(this, &cond, guard);
3194     rrxs(cond, rd, rm);
3195   }
Rrxs(Register rd,Register rm)3196   void Rrxs(Register rd, Register rm) { Rrxs(al, rd, rm); }
3197 
Rsb(Condition cond,Register rd,Register rn,const Operand & operand)3198   void Rsb(Condition cond, Register rd, Register rn, const Operand& operand) {
3199     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3200     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3201     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3202     VIXL_ASSERT(allow_macro_instructions_);
3203     VIXL_ASSERT(OutsideITBlock());
3204     MacroEmissionCheckScope guard(this);
3205     bool can_use_it =
3206         // RSB<c>{<q>} {<Rd>, }<Rn>, #0 ; T1
3207         operand.IsImmediate() && rd.IsLow() && rn.IsLow() &&
3208         (operand.GetImmediate() == 0);
3209     ITScope it_scope(this, &cond, guard, can_use_it);
3210     rsb(cond, rd, rn, operand);
3211   }
Rsb(Register rd,Register rn,const Operand & operand)3212   void Rsb(Register rd, Register rn, const Operand& operand) {
3213     Rsb(al, rd, rn, operand);
3214   }
Rsb(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)3215   void Rsb(FlagsUpdate flags,
3216            Condition cond,
3217            Register rd,
3218            Register rn,
3219            const Operand& operand) {
3220     switch (flags) {
3221       case LeaveFlags:
3222         Rsb(cond, rd, rn, operand);
3223         break;
3224       case SetFlags:
3225         Rsbs(cond, rd, rn, operand);
3226         break;
3227       case DontCare:
3228         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3229                                    rn.IsLow() && operand.IsImmediate() &&
3230                                    (operand.GetImmediate() == 0);
3231         if (setflags_is_smaller) {
3232           Rsbs(cond, rd, rn, operand);
3233         } else {
3234           Rsb(cond, rd, rn, operand);
3235         }
3236         break;
3237     }
3238   }
Rsb(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)3239   void Rsb(FlagsUpdate flags,
3240            Register rd,
3241            Register rn,
3242            const Operand& operand) {
3243     Rsb(flags, al, rd, rn, operand);
3244   }
3245 
Rsbs(Condition cond,Register rd,Register rn,const Operand & operand)3246   void Rsbs(Condition cond, Register rd, Register rn, const Operand& operand) {
3247     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3248     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3249     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3250     VIXL_ASSERT(allow_macro_instructions_);
3251     VIXL_ASSERT(OutsideITBlock());
3252     MacroEmissionCheckScope guard(this);
3253     ITScope it_scope(this, &cond, guard);
3254     rsbs(cond, rd, rn, operand);
3255   }
Rsbs(Register rd,Register rn,const Operand & operand)3256   void Rsbs(Register rd, Register rn, const Operand& operand) {
3257     Rsbs(al, rd, rn, operand);
3258   }
3259 
Rsc(Condition cond,Register rd,Register rn,const Operand & operand)3260   void Rsc(Condition cond, Register rd, Register rn, const Operand& operand) {
3261     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3262     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3263     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3264     VIXL_ASSERT(allow_macro_instructions_);
3265     VIXL_ASSERT(OutsideITBlock());
3266     MacroEmissionCheckScope guard(this);
3267     ITScope it_scope(this, &cond, guard);
3268     rsc(cond, rd, rn, operand);
3269   }
Rsc(Register rd,Register rn,const Operand & operand)3270   void Rsc(Register rd, Register rn, const Operand& operand) {
3271     Rsc(al, rd, rn, operand);
3272   }
Rsc(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)3273   void Rsc(FlagsUpdate flags,
3274            Condition cond,
3275            Register rd,
3276            Register rn,
3277            const Operand& operand) {
3278     switch (flags) {
3279       case LeaveFlags:
3280         Rsc(cond, rd, rn, operand);
3281         break;
3282       case SetFlags:
3283         Rscs(cond, rd, rn, operand);
3284         break;
3285       case DontCare:
3286         Rsc(cond, rd, rn, operand);
3287         break;
3288     }
3289   }
Rsc(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)3290   void Rsc(FlagsUpdate flags,
3291            Register rd,
3292            Register rn,
3293            const Operand& operand) {
3294     Rsc(flags, al, rd, rn, operand);
3295   }
3296 
Rscs(Condition cond,Register rd,Register rn,const Operand & operand)3297   void Rscs(Condition cond, Register rd, Register rn, const Operand& operand) {
3298     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3299     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3300     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3301     VIXL_ASSERT(allow_macro_instructions_);
3302     VIXL_ASSERT(OutsideITBlock());
3303     MacroEmissionCheckScope guard(this);
3304     ITScope it_scope(this, &cond, guard);
3305     rscs(cond, rd, rn, operand);
3306   }
Rscs(Register rd,Register rn,const Operand & operand)3307   void Rscs(Register rd, Register rn, const Operand& operand) {
3308     Rscs(al, rd, rn, operand);
3309   }
3310 
Sadd16(Condition cond,Register rd,Register rn,Register rm)3311   void Sadd16(Condition cond, Register rd, Register rn, Register rm) {
3312     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3313     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3314     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3315     VIXL_ASSERT(allow_macro_instructions_);
3316     VIXL_ASSERT(OutsideITBlock());
3317     MacroEmissionCheckScope guard(this);
3318     ITScope it_scope(this, &cond, guard);
3319     sadd16(cond, rd, rn, rm);
3320   }
Sadd16(Register rd,Register rn,Register rm)3321   void Sadd16(Register rd, Register rn, Register rm) { Sadd16(al, rd, rn, rm); }
3322 
Sadd8(Condition cond,Register rd,Register rn,Register rm)3323   void Sadd8(Condition cond, Register rd, Register rn, Register rm) {
3324     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3325     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3326     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3327     VIXL_ASSERT(allow_macro_instructions_);
3328     VIXL_ASSERT(OutsideITBlock());
3329     MacroEmissionCheckScope guard(this);
3330     ITScope it_scope(this, &cond, guard);
3331     sadd8(cond, rd, rn, rm);
3332   }
Sadd8(Register rd,Register rn,Register rm)3333   void Sadd8(Register rd, Register rn, Register rm) { Sadd8(al, rd, rn, rm); }
3334 
Sasx(Condition cond,Register rd,Register rn,Register rm)3335   void Sasx(Condition cond, Register rd, Register rn, Register rm) {
3336     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3337     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3338     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3339     VIXL_ASSERT(allow_macro_instructions_);
3340     VIXL_ASSERT(OutsideITBlock());
3341     MacroEmissionCheckScope guard(this);
3342     ITScope it_scope(this, &cond, guard);
3343     sasx(cond, rd, rn, rm);
3344   }
Sasx(Register rd,Register rn,Register rm)3345   void Sasx(Register rd, Register rn, Register rm) { Sasx(al, rd, rn, rm); }
3346 
Sbc(Condition cond,Register rd,Register rn,const Operand & operand)3347   void Sbc(Condition cond, Register rd, Register rn, const Operand& operand) {
3348     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3349     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3350     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3351     VIXL_ASSERT(allow_macro_instructions_);
3352     VIXL_ASSERT(OutsideITBlock());
3353     MacroEmissionCheckScope guard(this);
3354     bool can_use_it =
3355         // SBC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
3356         operand.IsPlainRegister() && rn.IsLow() && rd.Is(rn) &&
3357         operand.GetBaseRegister().IsLow();
3358     ITScope it_scope(this, &cond, guard, can_use_it);
3359     sbc(cond, rd, rn, operand);
3360   }
Sbc(Register rd,Register rn,const Operand & operand)3361   void Sbc(Register rd, Register rn, const Operand& operand) {
3362     Sbc(al, rd, rn, operand);
3363   }
Sbc(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)3364   void Sbc(FlagsUpdate flags,
3365            Condition cond,
3366            Register rd,
3367            Register rn,
3368            const Operand& operand) {
3369     switch (flags) {
3370       case LeaveFlags:
3371         Sbc(cond, rd, rn, operand);
3372         break;
3373       case SetFlags:
3374         Sbcs(cond, rd, rn, operand);
3375         break;
3376       case DontCare:
3377         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3378                                    rn.Is(rd) && operand.IsPlainRegister() &&
3379                                    operand.GetBaseRegister().IsLow();
3380         if (setflags_is_smaller) {
3381           Sbcs(cond, rd, rn, operand);
3382         } else {
3383           Sbc(cond, rd, rn, operand);
3384         }
3385         break;
3386     }
3387   }
Sbc(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)3388   void Sbc(FlagsUpdate flags,
3389            Register rd,
3390            Register rn,
3391            const Operand& operand) {
3392     Sbc(flags, al, rd, rn, operand);
3393   }
3394 
Sbcs(Condition cond,Register rd,Register rn,const Operand & operand)3395   void Sbcs(Condition cond, Register rd, Register rn, const Operand& operand) {
3396     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3397     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3398     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3399     VIXL_ASSERT(allow_macro_instructions_);
3400     VIXL_ASSERT(OutsideITBlock());
3401     MacroEmissionCheckScope guard(this);
3402     ITScope it_scope(this, &cond, guard);
3403     sbcs(cond, rd, rn, operand);
3404   }
Sbcs(Register rd,Register rn,const Operand & operand)3405   void Sbcs(Register rd, Register rn, const Operand& operand) {
3406     Sbcs(al, rd, rn, operand);
3407   }
3408 
Sbfx(Condition cond,Register rd,Register rn,uint32_t lsb,uint32_t width)3409   void Sbfx(
3410       Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
3411     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3412     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3413     VIXL_ASSERT(allow_macro_instructions_);
3414     VIXL_ASSERT(OutsideITBlock());
3415     MacroEmissionCheckScope guard(this);
3416     ITScope it_scope(this, &cond, guard);
3417     sbfx(cond, rd, rn, lsb, width);
3418   }
Sbfx(Register rd,Register rn,uint32_t lsb,uint32_t width)3419   void Sbfx(Register rd, Register rn, uint32_t lsb, uint32_t width) {
3420     Sbfx(al, rd, rn, lsb, width);
3421   }
3422 
Sdiv(Condition cond,Register rd,Register rn,Register rm)3423   void Sdiv(Condition cond, Register rd, Register rn, Register rm) {
3424     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3425     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3426     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3427     VIXL_ASSERT(allow_macro_instructions_);
3428     VIXL_ASSERT(OutsideITBlock());
3429     MacroEmissionCheckScope guard(this);
3430     ITScope it_scope(this, &cond, guard);
3431     sdiv(cond, rd, rn, rm);
3432   }
Sdiv(Register rd,Register rn,Register rm)3433   void Sdiv(Register rd, Register rn, Register rm) { Sdiv(al, rd, rn, rm); }
3434 
Sel(Condition cond,Register rd,Register rn,Register rm)3435   void Sel(Condition cond, Register rd, Register rn, Register rm) {
3436     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3437     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3438     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3439     VIXL_ASSERT(allow_macro_instructions_);
3440     VIXL_ASSERT(OutsideITBlock());
3441     MacroEmissionCheckScope guard(this);
3442     ITScope it_scope(this, &cond, guard);
3443     sel(cond, rd, rn, rm);
3444   }
Sel(Register rd,Register rn,Register rm)3445   void Sel(Register rd, Register rn, Register rm) { Sel(al, rd, rn, rm); }
3446 
Shadd16(Condition cond,Register rd,Register rn,Register rm)3447   void Shadd16(Condition cond, Register rd, Register rn, Register rm) {
3448     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3449     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3450     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3451     VIXL_ASSERT(allow_macro_instructions_);
3452     VIXL_ASSERT(OutsideITBlock());
3453     MacroEmissionCheckScope guard(this);
3454     ITScope it_scope(this, &cond, guard);
3455     shadd16(cond, rd, rn, rm);
3456   }
Shadd16(Register rd,Register rn,Register rm)3457   void Shadd16(Register rd, Register rn, Register rm) {
3458     Shadd16(al, rd, rn, rm);
3459   }
3460 
Shadd8(Condition cond,Register rd,Register rn,Register rm)3461   void Shadd8(Condition cond, Register rd, Register rn, Register rm) {
3462     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3463     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3464     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3465     VIXL_ASSERT(allow_macro_instructions_);
3466     VIXL_ASSERT(OutsideITBlock());
3467     MacroEmissionCheckScope guard(this);
3468     ITScope it_scope(this, &cond, guard);
3469     shadd8(cond, rd, rn, rm);
3470   }
Shadd8(Register rd,Register rn,Register rm)3471   void Shadd8(Register rd, Register rn, Register rm) { Shadd8(al, rd, rn, rm); }
3472 
Shasx(Condition cond,Register rd,Register rn,Register rm)3473   void Shasx(Condition cond, Register rd, Register rn, Register rm) {
3474     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3475     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3476     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3477     VIXL_ASSERT(allow_macro_instructions_);
3478     VIXL_ASSERT(OutsideITBlock());
3479     MacroEmissionCheckScope guard(this);
3480     ITScope it_scope(this, &cond, guard);
3481     shasx(cond, rd, rn, rm);
3482   }
Shasx(Register rd,Register rn,Register rm)3483   void Shasx(Register rd, Register rn, Register rm) { Shasx(al, rd, rn, rm); }
3484 
Shsax(Condition cond,Register rd,Register rn,Register rm)3485   void Shsax(Condition cond, Register rd, Register rn, Register rm) {
3486     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3487     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3488     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3489     VIXL_ASSERT(allow_macro_instructions_);
3490     VIXL_ASSERT(OutsideITBlock());
3491     MacroEmissionCheckScope guard(this);
3492     ITScope it_scope(this, &cond, guard);
3493     shsax(cond, rd, rn, rm);
3494   }
Shsax(Register rd,Register rn,Register rm)3495   void Shsax(Register rd, Register rn, Register rm) { Shsax(al, rd, rn, rm); }
3496 
Shsub16(Condition cond,Register rd,Register rn,Register rm)3497   void Shsub16(Condition cond, Register rd, Register rn, Register rm) {
3498     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3499     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3500     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3501     VIXL_ASSERT(allow_macro_instructions_);
3502     VIXL_ASSERT(OutsideITBlock());
3503     MacroEmissionCheckScope guard(this);
3504     ITScope it_scope(this, &cond, guard);
3505     shsub16(cond, rd, rn, rm);
3506   }
Shsub16(Register rd,Register rn,Register rm)3507   void Shsub16(Register rd, Register rn, Register rm) {
3508     Shsub16(al, rd, rn, rm);
3509   }
3510 
Shsub8(Condition cond,Register rd,Register rn,Register rm)3511   void Shsub8(Condition cond, Register rd, Register rn, Register rm) {
3512     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3513     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3514     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3515     VIXL_ASSERT(allow_macro_instructions_);
3516     VIXL_ASSERT(OutsideITBlock());
3517     MacroEmissionCheckScope guard(this);
3518     ITScope it_scope(this, &cond, guard);
3519     shsub8(cond, rd, rn, rm);
3520   }
Shsub8(Register rd,Register rn,Register rm)3521   void Shsub8(Register rd, Register rn, Register rm) { Shsub8(al, rd, rn, rm); }
3522 
Smlabb(Condition cond,Register rd,Register rn,Register rm,Register ra)3523   void Smlabb(
3524       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3525     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3526     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3527     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3528     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3529     VIXL_ASSERT(allow_macro_instructions_);
3530     VIXL_ASSERT(OutsideITBlock());
3531     MacroEmissionCheckScope guard(this);
3532     ITScope it_scope(this, &cond, guard);
3533     smlabb(cond, rd, rn, rm, ra);
3534   }
Smlabb(Register rd,Register rn,Register rm,Register ra)3535   void Smlabb(Register rd, Register rn, Register rm, Register ra) {
3536     Smlabb(al, rd, rn, rm, ra);
3537   }
3538 
Smlabt(Condition cond,Register rd,Register rn,Register rm,Register ra)3539   void Smlabt(
3540       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3541     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3542     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3543     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3544     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3545     VIXL_ASSERT(allow_macro_instructions_);
3546     VIXL_ASSERT(OutsideITBlock());
3547     MacroEmissionCheckScope guard(this);
3548     ITScope it_scope(this, &cond, guard);
3549     smlabt(cond, rd, rn, rm, ra);
3550   }
Smlabt(Register rd,Register rn,Register rm,Register ra)3551   void Smlabt(Register rd, Register rn, Register rm, Register ra) {
3552     Smlabt(al, rd, rn, rm, ra);
3553   }
3554 
Smlad(Condition cond,Register rd,Register rn,Register rm,Register ra)3555   void Smlad(
3556       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3557     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3558     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3559     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3560     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3561     VIXL_ASSERT(allow_macro_instructions_);
3562     VIXL_ASSERT(OutsideITBlock());
3563     MacroEmissionCheckScope guard(this);
3564     ITScope it_scope(this, &cond, guard);
3565     smlad(cond, rd, rn, rm, ra);
3566   }
Smlad(Register rd,Register rn,Register rm,Register ra)3567   void Smlad(Register rd, Register rn, Register rm, Register ra) {
3568     Smlad(al, rd, rn, rm, ra);
3569   }
3570 
Smladx(Condition cond,Register rd,Register rn,Register rm,Register ra)3571   void Smladx(
3572       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3573     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3574     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3575     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3576     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3577     VIXL_ASSERT(allow_macro_instructions_);
3578     VIXL_ASSERT(OutsideITBlock());
3579     MacroEmissionCheckScope guard(this);
3580     ITScope it_scope(this, &cond, guard);
3581     smladx(cond, rd, rn, rm, ra);
3582   }
Smladx(Register rd,Register rn,Register rm,Register ra)3583   void Smladx(Register rd, Register rn, Register rm, Register ra) {
3584     Smladx(al, rd, rn, rm, ra);
3585   }
3586 
Smlal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3587   void Smlal(
3588       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3589     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3590     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3591     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3592     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3593     VIXL_ASSERT(allow_macro_instructions_);
3594     VIXL_ASSERT(OutsideITBlock());
3595     MacroEmissionCheckScope guard(this);
3596     ITScope it_scope(this, &cond, guard);
3597     smlal(cond, rdlo, rdhi, rn, rm);
3598   }
Smlal(Register rdlo,Register rdhi,Register rn,Register rm)3599   void Smlal(Register rdlo, Register rdhi, Register rn, Register rm) {
3600     Smlal(al, rdlo, rdhi, rn, rm);
3601   }
3602 
Smlalbb(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3603   void Smlalbb(
3604       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3605     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3606     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3607     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3608     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3609     VIXL_ASSERT(allow_macro_instructions_);
3610     VIXL_ASSERT(OutsideITBlock());
3611     MacroEmissionCheckScope guard(this);
3612     ITScope it_scope(this, &cond, guard);
3613     smlalbb(cond, rdlo, rdhi, rn, rm);
3614   }
Smlalbb(Register rdlo,Register rdhi,Register rn,Register rm)3615   void Smlalbb(Register rdlo, Register rdhi, Register rn, Register rm) {
3616     Smlalbb(al, rdlo, rdhi, rn, rm);
3617   }
3618 
Smlalbt(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3619   void Smlalbt(
3620       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3621     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3622     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3623     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3624     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3625     VIXL_ASSERT(allow_macro_instructions_);
3626     VIXL_ASSERT(OutsideITBlock());
3627     MacroEmissionCheckScope guard(this);
3628     ITScope it_scope(this, &cond, guard);
3629     smlalbt(cond, rdlo, rdhi, rn, rm);
3630   }
Smlalbt(Register rdlo,Register rdhi,Register rn,Register rm)3631   void Smlalbt(Register rdlo, Register rdhi, Register rn, Register rm) {
3632     Smlalbt(al, rdlo, rdhi, rn, rm);
3633   }
3634 
Smlald(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3635   void Smlald(
3636       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3637     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3638     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3639     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3640     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3641     VIXL_ASSERT(allow_macro_instructions_);
3642     VIXL_ASSERT(OutsideITBlock());
3643     MacroEmissionCheckScope guard(this);
3644     ITScope it_scope(this, &cond, guard);
3645     smlald(cond, rdlo, rdhi, rn, rm);
3646   }
Smlald(Register rdlo,Register rdhi,Register rn,Register rm)3647   void Smlald(Register rdlo, Register rdhi, Register rn, Register rm) {
3648     Smlald(al, rdlo, rdhi, rn, rm);
3649   }
3650 
Smlaldx(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3651   void Smlaldx(
3652       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3653     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3654     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3655     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3656     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3657     VIXL_ASSERT(allow_macro_instructions_);
3658     VIXL_ASSERT(OutsideITBlock());
3659     MacroEmissionCheckScope guard(this);
3660     ITScope it_scope(this, &cond, guard);
3661     smlaldx(cond, rdlo, rdhi, rn, rm);
3662   }
Smlaldx(Register rdlo,Register rdhi,Register rn,Register rm)3663   void Smlaldx(Register rdlo, Register rdhi, Register rn, Register rm) {
3664     Smlaldx(al, rdlo, rdhi, rn, rm);
3665   }
3666 
Smlals(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3667   void Smlals(
3668       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3669     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3670     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3671     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3672     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3673     VIXL_ASSERT(allow_macro_instructions_);
3674     VIXL_ASSERT(OutsideITBlock());
3675     MacroEmissionCheckScope guard(this);
3676     ITScope it_scope(this, &cond, guard);
3677     smlals(cond, rdlo, rdhi, rn, rm);
3678   }
Smlals(Register rdlo,Register rdhi,Register rn,Register rm)3679   void Smlals(Register rdlo, Register rdhi, Register rn, Register rm) {
3680     Smlals(al, rdlo, rdhi, rn, rm);
3681   }
3682 
Smlaltb(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3683   void Smlaltb(
3684       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3685     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3686     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3687     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3688     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3689     VIXL_ASSERT(allow_macro_instructions_);
3690     VIXL_ASSERT(OutsideITBlock());
3691     MacroEmissionCheckScope guard(this);
3692     ITScope it_scope(this, &cond, guard);
3693     smlaltb(cond, rdlo, rdhi, rn, rm);
3694   }
Smlaltb(Register rdlo,Register rdhi,Register rn,Register rm)3695   void Smlaltb(Register rdlo, Register rdhi, Register rn, Register rm) {
3696     Smlaltb(al, rdlo, rdhi, rn, rm);
3697   }
3698 
Smlaltt(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3699   void Smlaltt(
3700       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3701     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3702     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3703     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3704     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3705     VIXL_ASSERT(allow_macro_instructions_);
3706     VIXL_ASSERT(OutsideITBlock());
3707     MacroEmissionCheckScope guard(this);
3708     ITScope it_scope(this, &cond, guard);
3709     smlaltt(cond, rdlo, rdhi, rn, rm);
3710   }
Smlaltt(Register rdlo,Register rdhi,Register rn,Register rm)3711   void Smlaltt(Register rdlo, Register rdhi, Register rn, Register rm) {
3712     Smlaltt(al, rdlo, rdhi, rn, rm);
3713   }
3714 
Smlatb(Condition cond,Register rd,Register rn,Register rm,Register ra)3715   void Smlatb(
3716       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3717     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3718     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3719     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3720     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3721     VIXL_ASSERT(allow_macro_instructions_);
3722     VIXL_ASSERT(OutsideITBlock());
3723     MacroEmissionCheckScope guard(this);
3724     ITScope it_scope(this, &cond, guard);
3725     smlatb(cond, rd, rn, rm, ra);
3726   }
Smlatb(Register rd,Register rn,Register rm,Register ra)3727   void Smlatb(Register rd, Register rn, Register rm, Register ra) {
3728     Smlatb(al, rd, rn, rm, ra);
3729   }
3730 
Smlatt(Condition cond,Register rd,Register rn,Register rm,Register ra)3731   void Smlatt(
3732       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3733     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3734     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3735     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3736     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3737     VIXL_ASSERT(allow_macro_instructions_);
3738     VIXL_ASSERT(OutsideITBlock());
3739     MacroEmissionCheckScope guard(this);
3740     ITScope it_scope(this, &cond, guard);
3741     smlatt(cond, rd, rn, rm, ra);
3742   }
Smlatt(Register rd,Register rn,Register rm,Register ra)3743   void Smlatt(Register rd, Register rn, Register rm, Register ra) {
3744     Smlatt(al, rd, rn, rm, ra);
3745   }
3746 
Smlawb(Condition cond,Register rd,Register rn,Register rm,Register ra)3747   void Smlawb(
3748       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3749     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3750     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3751     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3752     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3753     VIXL_ASSERT(allow_macro_instructions_);
3754     VIXL_ASSERT(OutsideITBlock());
3755     MacroEmissionCheckScope guard(this);
3756     ITScope it_scope(this, &cond, guard);
3757     smlawb(cond, rd, rn, rm, ra);
3758   }
Smlawb(Register rd,Register rn,Register rm,Register ra)3759   void Smlawb(Register rd, Register rn, Register rm, Register ra) {
3760     Smlawb(al, rd, rn, rm, ra);
3761   }
3762 
Smlawt(Condition cond,Register rd,Register rn,Register rm,Register ra)3763   void Smlawt(
3764       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3765     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3766     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3767     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3768     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3769     VIXL_ASSERT(allow_macro_instructions_);
3770     VIXL_ASSERT(OutsideITBlock());
3771     MacroEmissionCheckScope guard(this);
3772     ITScope it_scope(this, &cond, guard);
3773     smlawt(cond, rd, rn, rm, ra);
3774   }
Smlawt(Register rd,Register rn,Register rm,Register ra)3775   void Smlawt(Register rd, Register rn, Register rm, Register ra) {
3776     Smlawt(al, rd, rn, rm, ra);
3777   }
3778 
Smlsd(Condition cond,Register rd,Register rn,Register rm,Register ra)3779   void Smlsd(
3780       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3781     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3782     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3783     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3784     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3785     VIXL_ASSERT(allow_macro_instructions_);
3786     VIXL_ASSERT(OutsideITBlock());
3787     MacroEmissionCheckScope guard(this);
3788     ITScope it_scope(this, &cond, guard);
3789     smlsd(cond, rd, rn, rm, ra);
3790   }
Smlsd(Register rd,Register rn,Register rm,Register ra)3791   void Smlsd(Register rd, Register rn, Register rm, Register ra) {
3792     Smlsd(al, rd, rn, rm, ra);
3793   }
3794 
Smlsdx(Condition cond,Register rd,Register rn,Register rm,Register ra)3795   void Smlsdx(
3796       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3797     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3798     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3799     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3800     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3801     VIXL_ASSERT(allow_macro_instructions_);
3802     VIXL_ASSERT(OutsideITBlock());
3803     MacroEmissionCheckScope guard(this);
3804     ITScope it_scope(this, &cond, guard);
3805     smlsdx(cond, rd, rn, rm, ra);
3806   }
Smlsdx(Register rd,Register rn,Register rm,Register ra)3807   void Smlsdx(Register rd, Register rn, Register rm, Register ra) {
3808     Smlsdx(al, rd, rn, rm, ra);
3809   }
3810 
Smlsld(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3811   void Smlsld(
3812       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3813     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3814     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3815     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3816     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3817     VIXL_ASSERT(allow_macro_instructions_);
3818     VIXL_ASSERT(OutsideITBlock());
3819     MacroEmissionCheckScope guard(this);
3820     ITScope it_scope(this, &cond, guard);
3821     smlsld(cond, rdlo, rdhi, rn, rm);
3822   }
Smlsld(Register rdlo,Register rdhi,Register rn,Register rm)3823   void Smlsld(Register rdlo, Register rdhi, Register rn, Register rm) {
3824     Smlsld(al, rdlo, rdhi, rn, rm);
3825   }
3826 
Smlsldx(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3827   void Smlsldx(
3828       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3829     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3830     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3831     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3832     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3833     VIXL_ASSERT(allow_macro_instructions_);
3834     VIXL_ASSERT(OutsideITBlock());
3835     MacroEmissionCheckScope guard(this);
3836     ITScope it_scope(this, &cond, guard);
3837     smlsldx(cond, rdlo, rdhi, rn, rm);
3838   }
Smlsldx(Register rdlo,Register rdhi,Register rn,Register rm)3839   void Smlsldx(Register rdlo, Register rdhi, Register rn, Register rm) {
3840     Smlsldx(al, rdlo, rdhi, rn, rm);
3841   }
3842 
Smmla(Condition cond,Register rd,Register rn,Register rm,Register ra)3843   void Smmla(
3844       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3845     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3846     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3847     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3848     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3849     VIXL_ASSERT(allow_macro_instructions_);
3850     VIXL_ASSERT(OutsideITBlock());
3851     MacroEmissionCheckScope guard(this);
3852     ITScope it_scope(this, &cond, guard);
3853     smmla(cond, rd, rn, rm, ra);
3854   }
Smmla(Register rd,Register rn,Register rm,Register ra)3855   void Smmla(Register rd, Register rn, Register rm, Register ra) {
3856     Smmla(al, rd, rn, rm, ra);
3857   }
3858 
Smmlar(Condition cond,Register rd,Register rn,Register rm,Register ra)3859   void Smmlar(
3860       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3861     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3862     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3863     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3864     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3865     VIXL_ASSERT(allow_macro_instructions_);
3866     VIXL_ASSERT(OutsideITBlock());
3867     MacroEmissionCheckScope guard(this);
3868     ITScope it_scope(this, &cond, guard);
3869     smmlar(cond, rd, rn, rm, ra);
3870   }
Smmlar(Register rd,Register rn,Register rm,Register ra)3871   void Smmlar(Register rd, Register rn, Register rm, Register ra) {
3872     Smmlar(al, rd, rn, rm, ra);
3873   }
3874 
Smmls(Condition cond,Register rd,Register rn,Register rm,Register ra)3875   void Smmls(
3876       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3877     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3878     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3879     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3880     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3881     VIXL_ASSERT(allow_macro_instructions_);
3882     VIXL_ASSERT(OutsideITBlock());
3883     MacroEmissionCheckScope guard(this);
3884     ITScope it_scope(this, &cond, guard);
3885     smmls(cond, rd, rn, rm, ra);
3886   }
Smmls(Register rd,Register rn,Register rm,Register ra)3887   void Smmls(Register rd, Register rn, Register rm, Register ra) {
3888     Smmls(al, rd, rn, rm, ra);
3889   }
3890 
Smmlsr(Condition cond,Register rd,Register rn,Register rm,Register ra)3891   void Smmlsr(
3892       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3893     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3894     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3895     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3896     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3897     VIXL_ASSERT(allow_macro_instructions_);
3898     VIXL_ASSERT(OutsideITBlock());
3899     MacroEmissionCheckScope guard(this);
3900     ITScope it_scope(this, &cond, guard);
3901     smmlsr(cond, rd, rn, rm, ra);
3902   }
Smmlsr(Register rd,Register rn,Register rm,Register ra)3903   void Smmlsr(Register rd, Register rn, Register rm, Register ra) {
3904     Smmlsr(al, rd, rn, rm, ra);
3905   }
3906 
Smmul(Condition cond,Register rd,Register rn,Register rm)3907   void Smmul(Condition cond, Register rd, Register rn, Register rm) {
3908     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3909     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3910     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3911     VIXL_ASSERT(allow_macro_instructions_);
3912     VIXL_ASSERT(OutsideITBlock());
3913     MacroEmissionCheckScope guard(this);
3914     ITScope it_scope(this, &cond, guard);
3915     smmul(cond, rd, rn, rm);
3916   }
Smmul(Register rd,Register rn,Register rm)3917   void Smmul(Register rd, Register rn, Register rm) { Smmul(al, rd, rn, rm); }
3918 
Smmulr(Condition cond,Register rd,Register rn,Register rm)3919   void Smmulr(Condition cond, Register rd, Register rn, Register rm) {
3920     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3921     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3922     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3923     VIXL_ASSERT(allow_macro_instructions_);
3924     VIXL_ASSERT(OutsideITBlock());
3925     MacroEmissionCheckScope guard(this);
3926     ITScope it_scope(this, &cond, guard);
3927     smmulr(cond, rd, rn, rm);
3928   }
Smmulr(Register rd,Register rn,Register rm)3929   void Smmulr(Register rd, Register rn, Register rm) { Smmulr(al, rd, rn, rm); }
3930 
Smuad(Condition cond,Register rd,Register rn,Register rm)3931   void Smuad(Condition cond, Register rd, Register rn, Register rm) {
3932     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3933     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3934     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3935     VIXL_ASSERT(allow_macro_instructions_);
3936     VIXL_ASSERT(OutsideITBlock());
3937     MacroEmissionCheckScope guard(this);
3938     ITScope it_scope(this, &cond, guard);
3939     smuad(cond, rd, rn, rm);
3940   }
Smuad(Register rd,Register rn,Register rm)3941   void Smuad(Register rd, Register rn, Register rm) { Smuad(al, rd, rn, rm); }
3942 
Smuadx(Condition cond,Register rd,Register rn,Register rm)3943   void Smuadx(Condition cond, Register rd, Register rn, Register rm) {
3944     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3945     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3946     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3947     VIXL_ASSERT(allow_macro_instructions_);
3948     VIXL_ASSERT(OutsideITBlock());
3949     MacroEmissionCheckScope guard(this);
3950     ITScope it_scope(this, &cond, guard);
3951     smuadx(cond, rd, rn, rm);
3952   }
Smuadx(Register rd,Register rn,Register rm)3953   void Smuadx(Register rd, Register rn, Register rm) { Smuadx(al, rd, rn, rm); }
3954 
Smulbb(Condition cond,Register rd,Register rn,Register rm)3955   void Smulbb(Condition cond, Register rd, Register rn, Register rm) {
3956     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3957     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3958     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3959     VIXL_ASSERT(allow_macro_instructions_);
3960     VIXL_ASSERT(OutsideITBlock());
3961     MacroEmissionCheckScope guard(this);
3962     ITScope it_scope(this, &cond, guard);
3963     smulbb(cond, rd, rn, rm);
3964   }
Smulbb(Register rd,Register rn,Register rm)3965   void Smulbb(Register rd, Register rn, Register rm) { Smulbb(al, rd, rn, rm); }
3966 
Smulbt(Condition cond,Register rd,Register rn,Register rm)3967   void Smulbt(Condition cond, Register rd, Register rn, Register rm) {
3968     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3969     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3970     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3971     VIXL_ASSERT(allow_macro_instructions_);
3972     VIXL_ASSERT(OutsideITBlock());
3973     MacroEmissionCheckScope guard(this);
3974     ITScope it_scope(this, &cond, guard);
3975     smulbt(cond, rd, rn, rm);
3976   }
Smulbt(Register rd,Register rn,Register rm)3977   void Smulbt(Register rd, Register rn, Register rm) { Smulbt(al, rd, rn, rm); }
3978 
Smull(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3979   void Smull(
3980       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3981     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3982     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3983     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3984     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3985     VIXL_ASSERT(allow_macro_instructions_);
3986     VIXL_ASSERT(OutsideITBlock());
3987     MacroEmissionCheckScope guard(this);
3988     ITScope it_scope(this, &cond, guard);
3989     smull(cond, rdlo, rdhi, rn, rm);
3990   }
Smull(Register rdlo,Register rdhi,Register rn,Register rm)3991   void Smull(Register rdlo, Register rdhi, Register rn, Register rm) {
3992     Smull(al, rdlo, rdhi, rn, rm);
3993   }
Smull(FlagsUpdate flags,Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3994   void Smull(FlagsUpdate flags,
3995              Condition cond,
3996              Register rdlo,
3997              Register rdhi,
3998              Register rn,
3999              Register rm) {
4000     switch (flags) {
4001       case LeaveFlags:
4002         Smull(cond, rdlo, rdhi, rn, rm);
4003         break;
4004       case SetFlags:
4005         Smulls(cond, rdlo, rdhi, rn, rm);
4006         break;
4007       case DontCare:
4008         Smull(cond, rdlo, rdhi, rn, rm);
4009         break;
4010     }
4011   }
Smull(FlagsUpdate flags,Register rdlo,Register rdhi,Register rn,Register rm)4012   void Smull(FlagsUpdate flags,
4013              Register rdlo,
4014              Register rdhi,
4015              Register rn,
4016              Register rm) {
4017     Smull(flags, al, rdlo, rdhi, rn, rm);
4018   }
4019 
Smulls(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4020   void Smulls(
4021       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4022     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4023     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4024     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4025     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4026     VIXL_ASSERT(allow_macro_instructions_);
4027     VIXL_ASSERT(OutsideITBlock());
4028     MacroEmissionCheckScope guard(this);
4029     ITScope it_scope(this, &cond, guard);
4030     smulls(cond, rdlo, rdhi, rn, rm);
4031   }
Smulls(Register rdlo,Register rdhi,Register rn,Register rm)4032   void Smulls(Register rdlo, Register rdhi, Register rn, Register rm) {
4033     Smulls(al, rdlo, rdhi, rn, rm);
4034   }
4035 
Smultb(Condition cond,Register rd,Register rn,Register rm)4036   void Smultb(Condition cond, Register rd, Register rn, Register rm) {
4037     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4038     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4039     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4040     VIXL_ASSERT(allow_macro_instructions_);
4041     VIXL_ASSERT(OutsideITBlock());
4042     MacroEmissionCheckScope guard(this);
4043     ITScope it_scope(this, &cond, guard);
4044     smultb(cond, rd, rn, rm);
4045   }
Smultb(Register rd,Register rn,Register rm)4046   void Smultb(Register rd, Register rn, Register rm) { Smultb(al, rd, rn, rm); }
4047 
Smultt(Condition cond,Register rd,Register rn,Register rm)4048   void Smultt(Condition cond, Register rd, Register rn, Register rm) {
4049     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4050     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4051     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4052     VIXL_ASSERT(allow_macro_instructions_);
4053     VIXL_ASSERT(OutsideITBlock());
4054     MacroEmissionCheckScope guard(this);
4055     ITScope it_scope(this, &cond, guard);
4056     smultt(cond, rd, rn, rm);
4057   }
Smultt(Register rd,Register rn,Register rm)4058   void Smultt(Register rd, Register rn, Register rm) { Smultt(al, rd, rn, rm); }
4059 
Smulwb(Condition cond,Register rd,Register rn,Register rm)4060   void Smulwb(Condition cond, Register rd, Register rn, Register rm) {
4061     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4062     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4063     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4064     VIXL_ASSERT(allow_macro_instructions_);
4065     VIXL_ASSERT(OutsideITBlock());
4066     MacroEmissionCheckScope guard(this);
4067     ITScope it_scope(this, &cond, guard);
4068     smulwb(cond, rd, rn, rm);
4069   }
Smulwb(Register rd,Register rn,Register rm)4070   void Smulwb(Register rd, Register rn, Register rm) { Smulwb(al, rd, rn, rm); }
4071 
Smulwt(Condition cond,Register rd,Register rn,Register rm)4072   void Smulwt(Condition cond, Register rd, Register rn, Register rm) {
4073     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4074     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4075     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4076     VIXL_ASSERT(allow_macro_instructions_);
4077     VIXL_ASSERT(OutsideITBlock());
4078     MacroEmissionCheckScope guard(this);
4079     ITScope it_scope(this, &cond, guard);
4080     smulwt(cond, rd, rn, rm);
4081   }
Smulwt(Register rd,Register rn,Register rm)4082   void Smulwt(Register rd, Register rn, Register rm) { Smulwt(al, rd, rn, rm); }
4083 
Smusd(Condition cond,Register rd,Register rn,Register rm)4084   void Smusd(Condition cond, Register rd, Register rn, Register rm) {
4085     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4086     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4087     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4088     VIXL_ASSERT(allow_macro_instructions_);
4089     VIXL_ASSERT(OutsideITBlock());
4090     MacroEmissionCheckScope guard(this);
4091     ITScope it_scope(this, &cond, guard);
4092     smusd(cond, rd, rn, rm);
4093   }
Smusd(Register rd,Register rn,Register rm)4094   void Smusd(Register rd, Register rn, Register rm) { Smusd(al, rd, rn, rm); }
4095 
Smusdx(Condition cond,Register rd,Register rn,Register rm)4096   void Smusdx(Condition cond, Register rd, Register rn, Register rm) {
4097     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4098     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4099     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4100     VIXL_ASSERT(allow_macro_instructions_);
4101     VIXL_ASSERT(OutsideITBlock());
4102     MacroEmissionCheckScope guard(this);
4103     ITScope it_scope(this, &cond, guard);
4104     smusdx(cond, rd, rn, rm);
4105   }
Smusdx(Register rd,Register rn,Register rm)4106   void Smusdx(Register rd, Register rn, Register rm) { Smusdx(al, rd, rn, rm); }
4107 
Ssat(Condition cond,Register rd,uint32_t imm,const Operand & operand)4108   void Ssat(Condition cond, Register rd, uint32_t imm, const Operand& operand) {
4109     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4110     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4111     VIXL_ASSERT(allow_macro_instructions_);
4112     VIXL_ASSERT(OutsideITBlock());
4113     MacroEmissionCheckScope guard(this);
4114     ITScope it_scope(this, &cond, guard);
4115     ssat(cond, rd, imm, operand);
4116   }
Ssat(Register rd,uint32_t imm,const Operand & operand)4117   void Ssat(Register rd, uint32_t imm, const Operand& operand) {
4118     Ssat(al, rd, imm, operand);
4119   }
4120 
Ssat16(Condition cond,Register rd,uint32_t imm,Register rn)4121   void Ssat16(Condition cond, Register rd, uint32_t imm, Register rn) {
4122     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4123     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4124     VIXL_ASSERT(allow_macro_instructions_);
4125     VIXL_ASSERT(OutsideITBlock());
4126     MacroEmissionCheckScope guard(this);
4127     ITScope it_scope(this, &cond, guard);
4128     ssat16(cond, rd, imm, rn);
4129   }
Ssat16(Register rd,uint32_t imm,Register rn)4130   void Ssat16(Register rd, uint32_t imm, Register rn) {
4131     Ssat16(al, rd, imm, rn);
4132   }
4133 
Ssax(Condition cond,Register rd,Register rn,Register rm)4134   void Ssax(Condition cond, Register rd, Register rn, Register rm) {
4135     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4136     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4137     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4138     VIXL_ASSERT(allow_macro_instructions_);
4139     VIXL_ASSERT(OutsideITBlock());
4140     MacroEmissionCheckScope guard(this);
4141     ITScope it_scope(this, &cond, guard);
4142     ssax(cond, rd, rn, rm);
4143   }
Ssax(Register rd,Register rn,Register rm)4144   void Ssax(Register rd, Register rn, Register rm) { Ssax(al, rd, rn, rm); }
4145 
Ssub16(Condition cond,Register rd,Register rn,Register rm)4146   void Ssub16(Condition cond, Register rd, Register rn, Register rm) {
4147     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4148     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4149     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4150     VIXL_ASSERT(allow_macro_instructions_);
4151     VIXL_ASSERT(OutsideITBlock());
4152     MacroEmissionCheckScope guard(this);
4153     ITScope it_scope(this, &cond, guard);
4154     ssub16(cond, rd, rn, rm);
4155   }
Ssub16(Register rd,Register rn,Register rm)4156   void Ssub16(Register rd, Register rn, Register rm) { Ssub16(al, rd, rn, rm); }
4157 
Ssub8(Condition cond,Register rd,Register rn,Register rm)4158   void Ssub8(Condition cond, Register rd, Register rn, Register rm) {
4159     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4160     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4161     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4162     VIXL_ASSERT(allow_macro_instructions_);
4163     VIXL_ASSERT(OutsideITBlock());
4164     MacroEmissionCheckScope guard(this);
4165     ITScope it_scope(this, &cond, guard);
4166     ssub8(cond, rd, rn, rm);
4167   }
Ssub8(Register rd,Register rn,Register rm)4168   void Ssub8(Register rd, Register rn, Register rm) { Ssub8(al, rd, rn, rm); }
4169 
Stl(Condition cond,Register rt,const MemOperand & operand)4170   void Stl(Condition cond, Register rt, const MemOperand& operand) {
4171     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4172     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4173     VIXL_ASSERT(allow_macro_instructions_);
4174     VIXL_ASSERT(OutsideITBlock());
4175     MacroEmissionCheckScope guard(this);
4176     ITScope it_scope(this, &cond, guard);
4177     stl(cond, rt, operand);
4178   }
Stl(Register rt,const MemOperand & operand)4179   void Stl(Register rt, const MemOperand& operand) { Stl(al, rt, operand); }
4180 
Stlb(Condition cond,Register rt,const MemOperand & operand)4181   void Stlb(Condition cond, Register rt, const MemOperand& operand) {
4182     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4183     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4184     VIXL_ASSERT(allow_macro_instructions_);
4185     VIXL_ASSERT(OutsideITBlock());
4186     MacroEmissionCheckScope guard(this);
4187     ITScope it_scope(this, &cond, guard);
4188     stlb(cond, rt, operand);
4189   }
Stlb(Register rt,const MemOperand & operand)4190   void Stlb(Register rt, const MemOperand& operand) { Stlb(al, rt, operand); }
4191 
Stlex(Condition cond,Register rd,Register rt,const MemOperand & operand)4192   void Stlex(Condition cond,
4193              Register rd,
4194              Register rt,
4195              const MemOperand& operand) {
4196     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4197     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4198     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4199     VIXL_ASSERT(allow_macro_instructions_);
4200     VIXL_ASSERT(OutsideITBlock());
4201     MacroEmissionCheckScope guard(this);
4202     ITScope it_scope(this, &cond, guard);
4203     stlex(cond, rd, rt, operand);
4204   }
Stlex(Register rd,Register rt,const MemOperand & operand)4205   void Stlex(Register rd, Register rt, const MemOperand& operand) {
4206     Stlex(al, rd, rt, operand);
4207   }
4208 
Stlexb(Condition cond,Register rd,Register rt,const MemOperand & operand)4209   void Stlexb(Condition cond,
4210               Register rd,
4211               Register rt,
4212               const MemOperand& operand) {
4213     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4214     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4215     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4216     VIXL_ASSERT(allow_macro_instructions_);
4217     VIXL_ASSERT(OutsideITBlock());
4218     MacroEmissionCheckScope guard(this);
4219     ITScope it_scope(this, &cond, guard);
4220     stlexb(cond, rd, rt, operand);
4221   }
Stlexb(Register rd,Register rt,const MemOperand & operand)4222   void Stlexb(Register rd, Register rt, const MemOperand& operand) {
4223     Stlexb(al, rd, rt, operand);
4224   }
4225 
Stlexd(Condition cond,Register rd,Register rt,Register rt2,const MemOperand & operand)4226   void Stlexd(Condition cond,
4227               Register rd,
4228               Register rt,
4229               Register rt2,
4230               const MemOperand& operand) {
4231     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4232     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4233     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
4234     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4235     VIXL_ASSERT(allow_macro_instructions_);
4236     VIXL_ASSERT(OutsideITBlock());
4237     MacroEmissionCheckScope guard(this);
4238     ITScope it_scope(this, &cond, guard);
4239     stlexd(cond, rd, rt, rt2, operand);
4240   }
Stlexd(Register rd,Register rt,Register rt2,const MemOperand & operand)4241   void Stlexd(Register rd,
4242               Register rt,
4243               Register rt2,
4244               const MemOperand& operand) {
4245     Stlexd(al, rd, rt, rt2, operand);
4246   }
4247 
Stlexh(Condition cond,Register rd,Register rt,const MemOperand & operand)4248   void Stlexh(Condition cond,
4249               Register rd,
4250               Register rt,
4251               const MemOperand& operand) {
4252     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4253     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4254     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4255     VIXL_ASSERT(allow_macro_instructions_);
4256     VIXL_ASSERT(OutsideITBlock());
4257     MacroEmissionCheckScope guard(this);
4258     ITScope it_scope(this, &cond, guard);
4259     stlexh(cond, rd, rt, operand);
4260   }
Stlexh(Register rd,Register rt,const MemOperand & operand)4261   void Stlexh(Register rd, Register rt, const MemOperand& operand) {
4262     Stlexh(al, rd, rt, operand);
4263   }
4264 
Stlh(Condition cond,Register rt,const MemOperand & operand)4265   void Stlh(Condition cond, Register rt, const MemOperand& operand) {
4266     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4267     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4268     VIXL_ASSERT(allow_macro_instructions_);
4269     VIXL_ASSERT(OutsideITBlock());
4270     MacroEmissionCheckScope guard(this);
4271     ITScope it_scope(this, &cond, guard);
4272     stlh(cond, rt, operand);
4273   }
Stlh(Register rt,const MemOperand & operand)4274   void Stlh(Register rt, const MemOperand& operand) { Stlh(al, rt, operand); }
4275 
Stm(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4276   void Stm(Condition cond,
4277            Register rn,
4278            WriteBack write_back,
4279            RegisterList registers) {
4280     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4281     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4282     VIXL_ASSERT(allow_macro_instructions_);
4283     VIXL_ASSERT(OutsideITBlock());
4284     MacroEmissionCheckScope guard(this);
4285     ITScope it_scope(this, &cond, guard);
4286     stm(cond, rn, write_back, registers);
4287   }
Stm(Register rn,WriteBack write_back,RegisterList registers)4288   void Stm(Register rn, WriteBack write_back, RegisterList registers) {
4289     Stm(al, rn, write_back, registers);
4290   }
4291 
Stmda(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4292   void Stmda(Condition cond,
4293              Register rn,
4294              WriteBack write_back,
4295              RegisterList registers) {
4296     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4297     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4298     VIXL_ASSERT(allow_macro_instructions_);
4299     VIXL_ASSERT(OutsideITBlock());
4300     MacroEmissionCheckScope guard(this);
4301     ITScope it_scope(this, &cond, guard);
4302     stmda(cond, rn, write_back, registers);
4303   }
Stmda(Register rn,WriteBack write_back,RegisterList registers)4304   void Stmda(Register rn, WriteBack write_back, RegisterList registers) {
4305     Stmda(al, rn, write_back, registers);
4306   }
4307 
Stmdb(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4308   void Stmdb(Condition cond,
4309              Register rn,
4310              WriteBack write_back,
4311              RegisterList registers) {
4312     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4313     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4314     VIXL_ASSERT(allow_macro_instructions_);
4315     VIXL_ASSERT(OutsideITBlock());
4316     MacroEmissionCheckScope guard(this);
4317     ITScope it_scope(this, &cond, guard);
4318     stmdb(cond, rn, write_back, registers);
4319   }
Stmdb(Register rn,WriteBack write_back,RegisterList registers)4320   void Stmdb(Register rn, WriteBack write_back, RegisterList registers) {
4321     Stmdb(al, rn, write_back, registers);
4322   }
4323 
Stmea(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4324   void Stmea(Condition cond,
4325              Register rn,
4326              WriteBack write_back,
4327              RegisterList registers) {
4328     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4329     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4330     VIXL_ASSERT(allow_macro_instructions_);
4331     VIXL_ASSERT(OutsideITBlock());
4332     MacroEmissionCheckScope guard(this);
4333     ITScope it_scope(this, &cond, guard);
4334     stmea(cond, rn, write_back, registers);
4335   }
Stmea(Register rn,WriteBack write_back,RegisterList registers)4336   void Stmea(Register rn, WriteBack write_back, RegisterList registers) {
4337     Stmea(al, rn, write_back, registers);
4338   }
4339 
Stmed(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4340   void Stmed(Condition cond,
4341              Register rn,
4342              WriteBack write_back,
4343              RegisterList registers) {
4344     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4345     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4346     VIXL_ASSERT(allow_macro_instructions_);
4347     VIXL_ASSERT(OutsideITBlock());
4348     MacroEmissionCheckScope guard(this);
4349     ITScope it_scope(this, &cond, guard);
4350     stmed(cond, rn, write_back, registers);
4351   }
Stmed(Register rn,WriteBack write_back,RegisterList registers)4352   void Stmed(Register rn, WriteBack write_back, RegisterList registers) {
4353     Stmed(al, rn, write_back, registers);
4354   }
4355 
Stmfa(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4356   void Stmfa(Condition cond,
4357              Register rn,
4358              WriteBack write_back,
4359              RegisterList registers) {
4360     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4361     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4362     VIXL_ASSERT(allow_macro_instructions_);
4363     VIXL_ASSERT(OutsideITBlock());
4364     MacroEmissionCheckScope guard(this);
4365     ITScope it_scope(this, &cond, guard);
4366     stmfa(cond, rn, write_back, registers);
4367   }
Stmfa(Register rn,WriteBack write_back,RegisterList registers)4368   void Stmfa(Register rn, WriteBack write_back, RegisterList registers) {
4369     Stmfa(al, rn, write_back, registers);
4370   }
4371 
Stmfd(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4372   void Stmfd(Condition cond,
4373              Register rn,
4374              WriteBack write_back,
4375              RegisterList registers) {
4376     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4377     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4378     VIXL_ASSERT(allow_macro_instructions_);
4379     VIXL_ASSERT(OutsideITBlock());
4380     MacroEmissionCheckScope guard(this);
4381     ITScope it_scope(this, &cond, guard);
4382     stmfd(cond, rn, write_back, registers);
4383   }
Stmfd(Register rn,WriteBack write_back,RegisterList registers)4384   void Stmfd(Register rn, WriteBack write_back, RegisterList registers) {
4385     Stmfd(al, rn, write_back, registers);
4386   }
4387 
Stmib(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4388   void Stmib(Condition cond,
4389              Register rn,
4390              WriteBack write_back,
4391              RegisterList registers) {
4392     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4393     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4394     VIXL_ASSERT(allow_macro_instructions_);
4395     VIXL_ASSERT(OutsideITBlock());
4396     MacroEmissionCheckScope guard(this);
4397     ITScope it_scope(this, &cond, guard);
4398     stmib(cond, rn, write_back, registers);
4399   }
Stmib(Register rn,WriteBack write_back,RegisterList registers)4400   void Stmib(Register rn, WriteBack write_back, RegisterList registers) {
4401     Stmib(al, rn, write_back, registers);
4402   }
4403 
Str(Condition cond,Register rt,const MemOperand & operand)4404   void Str(Condition cond, Register rt, const MemOperand& operand) {
4405     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4406     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4407     VIXL_ASSERT(allow_macro_instructions_);
4408     VIXL_ASSERT(OutsideITBlock());
4409     MacroEmissionCheckScope guard(this);
4410     bool can_use_it =
4411         // STR{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
4412         (operand.IsImmediate() && rt.IsLow() &&
4413          operand.GetBaseRegister().IsLow() &&
4414          operand.IsOffsetImmediateWithinRange(0, 124, 4) &&
4415          (operand.GetAddrMode() == Offset)) ||
4416         // STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
4417         (operand.IsImmediate() && rt.IsLow() &&
4418          operand.GetBaseRegister().IsSP() &&
4419          operand.IsOffsetImmediateWithinRange(0, 1020, 4) &&
4420          (operand.GetAddrMode() == Offset)) ||
4421         // STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
4422         (operand.IsPlainRegister() && rt.IsLow() &&
4423          operand.GetBaseRegister().IsLow() &&
4424          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
4425          (operand.GetAddrMode() == Offset));
4426     ITScope it_scope(this, &cond, guard, can_use_it);
4427     str(cond, rt, operand);
4428   }
Str(Register rt,const MemOperand & operand)4429   void Str(Register rt, const MemOperand& operand) { Str(al, rt, operand); }
4430 
Strb(Condition cond,Register rt,const MemOperand & operand)4431   void Strb(Condition cond, Register rt, const MemOperand& operand) {
4432     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4433     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4434     VIXL_ASSERT(allow_macro_instructions_);
4435     VIXL_ASSERT(OutsideITBlock());
4436     MacroEmissionCheckScope guard(this);
4437     bool can_use_it =
4438         // STRB{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
4439         (operand.IsImmediate() && rt.IsLow() &&
4440          operand.GetBaseRegister().IsLow() &&
4441          operand.IsOffsetImmediateWithinRange(0, 31) &&
4442          (operand.GetAddrMode() == Offset)) ||
4443         // STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
4444         (operand.IsPlainRegister() && rt.IsLow() &&
4445          operand.GetBaseRegister().IsLow() &&
4446          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
4447          (operand.GetAddrMode() == Offset));
4448     ITScope it_scope(this, &cond, guard, can_use_it);
4449     strb(cond, rt, operand);
4450   }
Strb(Register rt,const MemOperand & operand)4451   void Strb(Register rt, const MemOperand& operand) { Strb(al, rt, operand); }
4452 
Strd(Condition cond,Register rt,Register rt2,const MemOperand & operand)4453   void Strd(Condition cond,
4454             Register rt,
4455             Register rt2,
4456             const MemOperand& operand) {
4457     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4458     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
4459     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4460     VIXL_ASSERT(allow_macro_instructions_);
4461     VIXL_ASSERT(OutsideITBlock());
4462     MacroEmissionCheckScope guard(this);
4463     ITScope it_scope(this, &cond, guard);
4464     strd(cond, rt, rt2, operand);
4465   }
Strd(Register rt,Register rt2,const MemOperand & operand)4466   void Strd(Register rt, Register rt2, const MemOperand& operand) {
4467     Strd(al, rt, rt2, operand);
4468   }
4469 
Strex(Condition cond,Register rd,Register rt,const MemOperand & operand)4470   void Strex(Condition cond,
4471              Register rd,
4472              Register rt,
4473              const MemOperand& operand) {
4474     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4475     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4476     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4477     VIXL_ASSERT(allow_macro_instructions_);
4478     VIXL_ASSERT(OutsideITBlock());
4479     MacroEmissionCheckScope guard(this);
4480     ITScope it_scope(this, &cond, guard);
4481     strex(cond, rd, rt, operand);
4482   }
Strex(Register rd,Register rt,const MemOperand & operand)4483   void Strex(Register rd, Register rt, const MemOperand& operand) {
4484     Strex(al, rd, rt, operand);
4485   }
4486 
Strexb(Condition cond,Register rd,Register rt,const MemOperand & operand)4487   void Strexb(Condition cond,
4488               Register rd,
4489               Register rt,
4490               const MemOperand& operand) {
4491     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4492     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4493     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4494     VIXL_ASSERT(allow_macro_instructions_);
4495     VIXL_ASSERT(OutsideITBlock());
4496     MacroEmissionCheckScope guard(this);
4497     ITScope it_scope(this, &cond, guard);
4498     strexb(cond, rd, rt, operand);
4499   }
Strexb(Register rd,Register rt,const MemOperand & operand)4500   void Strexb(Register rd, Register rt, const MemOperand& operand) {
4501     Strexb(al, rd, rt, operand);
4502   }
4503 
Strexd(Condition cond,Register rd,Register rt,Register rt2,const MemOperand & operand)4504   void Strexd(Condition cond,
4505               Register rd,
4506               Register rt,
4507               Register rt2,
4508               const MemOperand& operand) {
4509     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4510     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4511     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
4512     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4513     VIXL_ASSERT(allow_macro_instructions_);
4514     VIXL_ASSERT(OutsideITBlock());
4515     MacroEmissionCheckScope guard(this);
4516     ITScope it_scope(this, &cond, guard);
4517     strexd(cond, rd, rt, rt2, operand);
4518   }
Strexd(Register rd,Register rt,Register rt2,const MemOperand & operand)4519   void Strexd(Register rd,
4520               Register rt,
4521               Register rt2,
4522               const MemOperand& operand) {
4523     Strexd(al, rd, rt, rt2, operand);
4524   }
4525 
Strexh(Condition cond,Register rd,Register rt,const MemOperand & operand)4526   void Strexh(Condition cond,
4527               Register rd,
4528               Register rt,
4529               const MemOperand& operand) {
4530     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4531     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4532     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4533     VIXL_ASSERT(allow_macro_instructions_);
4534     VIXL_ASSERT(OutsideITBlock());
4535     MacroEmissionCheckScope guard(this);
4536     ITScope it_scope(this, &cond, guard);
4537     strexh(cond, rd, rt, operand);
4538   }
Strexh(Register rd,Register rt,const MemOperand & operand)4539   void Strexh(Register rd, Register rt, const MemOperand& operand) {
4540     Strexh(al, rd, rt, operand);
4541   }
4542 
Strh(Condition cond,Register rt,const MemOperand & operand)4543   void Strh(Condition cond, Register rt, const MemOperand& operand) {
4544     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4545     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4546     VIXL_ASSERT(allow_macro_instructions_);
4547     VIXL_ASSERT(OutsideITBlock());
4548     MacroEmissionCheckScope guard(this);
4549     bool can_use_it =
4550         // STRH{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
4551         (operand.IsImmediate() && rt.IsLow() &&
4552          operand.GetBaseRegister().IsLow() &&
4553          operand.IsOffsetImmediateWithinRange(0, 62, 2) &&
4554          (operand.GetAddrMode() == Offset)) ||
4555         // STRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
4556         (operand.IsPlainRegister() && rt.IsLow() &&
4557          operand.GetBaseRegister().IsLow() &&
4558          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
4559          (operand.GetAddrMode() == Offset));
4560     ITScope it_scope(this, &cond, guard, can_use_it);
4561     strh(cond, rt, operand);
4562   }
Strh(Register rt,const MemOperand & operand)4563   void Strh(Register rt, const MemOperand& operand) { Strh(al, rt, operand); }
4564 
Sub(Condition cond,Register rd,Register rn,const Operand & operand)4565   void Sub(Condition cond, Register rd, Register rn, const Operand& operand) {
4566     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4567     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4568     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4569     VIXL_ASSERT(allow_macro_instructions_);
4570     VIXL_ASSERT(OutsideITBlock());
4571     MacroEmissionCheckScope guard(this);
4572     if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) {
4573       uint32_t immediate = operand.GetImmediate();
4574       if (immediate == 0) {
4575         return;
4576       }
4577     }
4578     bool can_use_it =
4579         // SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
4580         (operand.IsImmediate() && (operand.GetImmediate() <= 7) && rn.IsLow() &&
4581          rd.IsLow()) ||
4582         // SUB<c>{<q>} {<Rdn>,} <Rdn>, #<imm8> ; T2
4583         (operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
4584          rd.IsLow() && rn.Is(rd)) ||
4585         // SUB<c>{<q>} <Rd>, <Rn>, <Rm>
4586         (operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
4587          operand.GetBaseRegister().IsLow());
4588     ITScope it_scope(this, &cond, guard, can_use_it);
4589     sub(cond, rd, rn, operand);
4590   }
Sub(Register rd,Register rn,const Operand & operand)4591   void Sub(Register rd, Register rn, const Operand& operand) {
4592     Sub(al, rd, rn, operand);
4593   }
Sub(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)4594   void Sub(FlagsUpdate flags,
4595            Condition cond,
4596            Register rd,
4597            Register rn,
4598            const Operand& operand) {
4599     switch (flags) {
4600       case LeaveFlags:
4601         Sub(cond, rd, rn, operand);
4602         break;
4603       case SetFlags:
4604         Subs(cond, rd, rn, operand);
4605         break;
4606       case DontCare:
4607         bool setflags_is_smaller =
4608             IsUsingT32() && cond.Is(al) &&
4609             ((operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
4610               operand.GetBaseRegister().IsLow()) ||
4611              (operand.IsImmediate() &&
4612               ((rd.IsLow() && rn.IsLow() && (operand.GetImmediate() < 8)) ||
4613                (rd.IsLow() && rn.Is(rd) && (operand.GetImmediate() < 256)))));
4614         if (setflags_is_smaller) {
4615           Subs(cond, rd, rn, operand);
4616         } else {
4617           bool changed_op_is_smaller =
4618               operand.IsImmediate() && (operand.GetSignedImmediate() < 0) &&
4619               ((rd.IsLow() && rn.IsLow() &&
4620                 (operand.GetSignedImmediate() >= -7)) ||
4621                (rd.IsLow() && rn.Is(rd) &&
4622                 (operand.GetSignedImmediate() >= -255)));
4623           if (changed_op_is_smaller) {
4624             Adds(cond, rd, rn, -operand.GetSignedImmediate());
4625           } else {
4626             Sub(cond, rd, rn, operand);
4627           }
4628         }
4629         break;
4630     }
4631   }
Sub(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)4632   void Sub(FlagsUpdate flags,
4633            Register rd,
4634            Register rn,
4635            const Operand& operand) {
4636     Sub(flags, al, rd, rn, operand);
4637   }
4638 
Subs(Condition cond,Register rd,Register rn,const Operand & operand)4639   void Subs(Condition cond, Register rd, Register rn, const Operand& operand) {
4640     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4641     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4642     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4643     VIXL_ASSERT(allow_macro_instructions_);
4644     VIXL_ASSERT(OutsideITBlock());
4645     MacroEmissionCheckScope guard(this);
4646     ITScope it_scope(this, &cond, guard);
4647     subs(cond, rd, rn, operand);
4648   }
Subs(Register rd,Register rn,const Operand & operand)4649   void Subs(Register rd, Register rn, const Operand& operand) {
4650     Subs(al, rd, rn, operand);
4651   }
4652 
Svc(Condition cond,uint32_t imm)4653   void Svc(Condition cond, uint32_t imm) {
4654     VIXL_ASSERT(allow_macro_instructions_);
4655     VIXL_ASSERT(OutsideITBlock());
4656     MacroEmissionCheckScope guard(this);
4657     ITScope it_scope(this, &cond, guard);
4658     svc(cond, imm);
4659   }
Svc(uint32_t imm)4660   void Svc(uint32_t imm) { Svc(al, imm); }
4661 
Sxtab(Condition cond,Register rd,Register rn,const Operand & operand)4662   void Sxtab(Condition cond, Register rd, Register rn, const Operand& operand) {
4663     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4664     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4665     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4666     VIXL_ASSERT(allow_macro_instructions_);
4667     VIXL_ASSERT(OutsideITBlock());
4668     MacroEmissionCheckScope guard(this);
4669     ITScope it_scope(this, &cond, guard);
4670     sxtab(cond, rd, rn, operand);
4671   }
Sxtab(Register rd,Register rn,const Operand & operand)4672   void Sxtab(Register rd, Register rn, const Operand& operand) {
4673     Sxtab(al, rd, rn, operand);
4674   }
4675 
Sxtab16(Condition cond,Register rd,Register rn,const Operand & operand)4676   void Sxtab16(Condition cond,
4677                Register rd,
4678                Register rn,
4679                const Operand& operand) {
4680     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4681     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4682     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4683     VIXL_ASSERT(allow_macro_instructions_);
4684     VIXL_ASSERT(OutsideITBlock());
4685     MacroEmissionCheckScope guard(this);
4686     ITScope it_scope(this, &cond, guard);
4687     sxtab16(cond, rd, rn, operand);
4688   }
Sxtab16(Register rd,Register rn,const Operand & operand)4689   void Sxtab16(Register rd, Register rn, const Operand& operand) {
4690     Sxtab16(al, rd, rn, operand);
4691   }
4692 
Sxtah(Condition cond,Register rd,Register rn,const Operand & operand)4693   void Sxtah(Condition cond, Register rd, Register rn, const Operand& operand) {
4694     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4695     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4696     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4697     VIXL_ASSERT(allow_macro_instructions_);
4698     VIXL_ASSERT(OutsideITBlock());
4699     MacroEmissionCheckScope guard(this);
4700     ITScope it_scope(this, &cond, guard);
4701     sxtah(cond, rd, rn, operand);
4702   }
Sxtah(Register rd,Register rn,const Operand & operand)4703   void Sxtah(Register rd, Register rn, const Operand& operand) {
4704     Sxtah(al, rd, rn, operand);
4705   }
4706 
Sxtb(Condition cond,Register rd,const Operand & operand)4707   void Sxtb(Condition cond, Register rd, const Operand& operand) {
4708     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4709     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4710     VIXL_ASSERT(allow_macro_instructions_);
4711     VIXL_ASSERT(OutsideITBlock());
4712     MacroEmissionCheckScope guard(this);
4713     ITScope it_scope(this, &cond, guard);
4714     sxtb(cond, rd, operand);
4715   }
Sxtb(Register rd,const Operand & operand)4716   void Sxtb(Register rd, const Operand& operand) { Sxtb(al, rd, operand); }
4717 
Sxtb16(Condition cond,Register rd,const Operand & operand)4718   void Sxtb16(Condition cond, Register rd, const Operand& operand) {
4719     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4720     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4721     VIXL_ASSERT(allow_macro_instructions_);
4722     VIXL_ASSERT(OutsideITBlock());
4723     MacroEmissionCheckScope guard(this);
4724     ITScope it_scope(this, &cond, guard);
4725     sxtb16(cond, rd, operand);
4726   }
Sxtb16(Register rd,const Operand & operand)4727   void Sxtb16(Register rd, const Operand& operand) { Sxtb16(al, rd, operand); }
4728 
Sxth(Condition cond,Register rd,const Operand & operand)4729   void Sxth(Condition cond, Register rd, const Operand& operand) {
4730     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4731     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4732     VIXL_ASSERT(allow_macro_instructions_);
4733     VIXL_ASSERT(OutsideITBlock());
4734     MacroEmissionCheckScope guard(this);
4735     ITScope it_scope(this, &cond, guard);
4736     sxth(cond, rd, operand);
4737   }
Sxth(Register rd,const Operand & operand)4738   void Sxth(Register rd, const Operand& operand) { Sxth(al, rd, operand); }
4739 
Teq(Condition cond,Register rn,const Operand & operand)4740   void Teq(Condition cond, Register rn, const Operand& operand) {
4741     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4742     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4743     VIXL_ASSERT(allow_macro_instructions_);
4744     VIXL_ASSERT(OutsideITBlock());
4745     MacroEmissionCheckScope guard(this);
4746     ITScope it_scope(this, &cond, guard);
4747     teq(cond, rn, operand);
4748   }
Teq(Register rn,const Operand & operand)4749   void Teq(Register rn, const Operand& operand) { Teq(al, rn, operand); }
4750 
Tst(Condition cond,Register rn,const Operand & operand)4751   void Tst(Condition cond, Register rn, const Operand& operand) {
4752     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4753     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4754     VIXL_ASSERT(allow_macro_instructions_);
4755     VIXL_ASSERT(OutsideITBlock());
4756     MacroEmissionCheckScope guard(this);
4757     bool can_use_it =
4758         // TST{<c>}{<q>} <Rn>, <Rm> ; T1
4759         operand.IsPlainRegister() && rn.IsLow() &&
4760         operand.GetBaseRegister().IsLow();
4761     ITScope it_scope(this, &cond, guard, can_use_it);
4762     tst(cond, rn, operand);
4763   }
Tst(Register rn,const Operand & operand)4764   void Tst(Register rn, const Operand& operand) { Tst(al, rn, operand); }
4765 
Uadd16(Condition cond,Register rd,Register rn,Register rm)4766   void Uadd16(Condition cond, Register rd, Register rn, Register rm) {
4767     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4768     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4769     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4770     VIXL_ASSERT(allow_macro_instructions_);
4771     VIXL_ASSERT(OutsideITBlock());
4772     MacroEmissionCheckScope guard(this);
4773     ITScope it_scope(this, &cond, guard);
4774     uadd16(cond, rd, rn, rm);
4775   }
Uadd16(Register rd,Register rn,Register rm)4776   void Uadd16(Register rd, Register rn, Register rm) { Uadd16(al, rd, rn, rm); }
4777 
Uadd8(Condition cond,Register rd,Register rn,Register rm)4778   void Uadd8(Condition cond, Register rd, Register rn, Register rm) {
4779     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4780     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4781     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4782     VIXL_ASSERT(allow_macro_instructions_);
4783     VIXL_ASSERT(OutsideITBlock());
4784     MacroEmissionCheckScope guard(this);
4785     ITScope it_scope(this, &cond, guard);
4786     uadd8(cond, rd, rn, rm);
4787   }
Uadd8(Register rd,Register rn,Register rm)4788   void Uadd8(Register rd, Register rn, Register rm) { Uadd8(al, rd, rn, rm); }
4789 
Uasx(Condition cond,Register rd,Register rn,Register rm)4790   void Uasx(Condition cond, Register rd, Register rn, Register rm) {
4791     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4792     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4793     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4794     VIXL_ASSERT(allow_macro_instructions_);
4795     VIXL_ASSERT(OutsideITBlock());
4796     MacroEmissionCheckScope guard(this);
4797     ITScope it_scope(this, &cond, guard);
4798     uasx(cond, rd, rn, rm);
4799   }
Uasx(Register rd,Register rn,Register rm)4800   void Uasx(Register rd, Register rn, Register rm) { Uasx(al, rd, rn, rm); }
4801 
Ubfx(Condition cond,Register rd,Register rn,uint32_t lsb,uint32_t width)4802   void Ubfx(
4803       Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
4804     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4805     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4806     VIXL_ASSERT(allow_macro_instructions_);
4807     VIXL_ASSERT(OutsideITBlock());
4808     MacroEmissionCheckScope guard(this);
4809     ITScope it_scope(this, &cond, guard);
4810     ubfx(cond, rd, rn, lsb, width);
4811   }
Ubfx(Register rd,Register rn,uint32_t lsb,uint32_t width)4812   void Ubfx(Register rd, Register rn, uint32_t lsb, uint32_t width) {
4813     Ubfx(al, rd, rn, lsb, width);
4814   }
4815 
Udf(Condition cond,uint32_t imm)4816   void Udf(Condition cond, uint32_t imm) {
4817     VIXL_ASSERT(allow_macro_instructions_);
4818     VIXL_ASSERT(OutsideITBlock());
4819     MacroEmissionCheckScope guard(this);
4820     ITScope it_scope(this, &cond, guard);
4821     udf(cond, imm);
4822   }
Udf(uint32_t imm)4823   void Udf(uint32_t imm) { Udf(al, imm); }
4824 
Udiv(Condition cond,Register rd,Register rn,Register rm)4825   void Udiv(Condition cond, Register rd, Register rn, Register rm) {
4826     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4827     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4828     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4829     VIXL_ASSERT(allow_macro_instructions_);
4830     VIXL_ASSERT(OutsideITBlock());
4831     MacroEmissionCheckScope guard(this);
4832     ITScope it_scope(this, &cond, guard);
4833     udiv(cond, rd, rn, rm);
4834   }
Udiv(Register rd,Register rn,Register rm)4835   void Udiv(Register rd, Register rn, Register rm) { Udiv(al, rd, rn, rm); }
4836 
Uhadd16(Condition cond,Register rd,Register rn,Register rm)4837   void Uhadd16(Condition cond, Register rd, Register rn, Register rm) {
4838     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4839     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4840     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4841     VIXL_ASSERT(allow_macro_instructions_);
4842     VIXL_ASSERT(OutsideITBlock());
4843     MacroEmissionCheckScope guard(this);
4844     ITScope it_scope(this, &cond, guard);
4845     uhadd16(cond, rd, rn, rm);
4846   }
Uhadd16(Register rd,Register rn,Register rm)4847   void Uhadd16(Register rd, Register rn, Register rm) {
4848     Uhadd16(al, rd, rn, rm);
4849   }
4850 
Uhadd8(Condition cond,Register rd,Register rn,Register rm)4851   void Uhadd8(Condition cond, Register rd, Register rn, Register rm) {
4852     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4853     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4854     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4855     VIXL_ASSERT(allow_macro_instructions_);
4856     VIXL_ASSERT(OutsideITBlock());
4857     MacroEmissionCheckScope guard(this);
4858     ITScope it_scope(this, &cond, guard);
4859     uhadd8(cond, rd, rn, rm);
4860   }
Uhadd8(Register rd,Register rn,Register rm)4861   void Uhadd8(Register rd, Register rn, Register rm) { Uhadd8(al, rd, rn, rm); }
4862 
Uhasx(Condition cond,Register rd,Register rn,Register rm)4863   void Uhasx(Condition cond, Register rd, Register rn, Register rm) {
4864     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4865     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4866     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4867     VIXL_ASSERT(allow_macro_instructions_);
4868     VIXL_ASSERT(OutsideITBlock());
4869     MacroEmissionCheckScope guard(this);
4870     ITScope it_scope(this, &cond, guard);
4871     uhasx(cond, rd, rn, rm);
4872   }
Uhasx(Register rd,Register rn,Register rm)4873   void Uhasx(Register rd, Register rn, Register rm) { Uhasx(al, rd, rn, rm); }
4874 
Uhsax(Condition cond,Register rd,Register rn,Register rm)4875   void Uhsax(Condition cond, Register rd, Register rn, Register rm) {
4876     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4877     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4878     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4879     VIXL_ASSERT(allow_macro_instructions_);
4880     VIXL_ASSERT(OutsideITBlock());
4881     MacroEmissionCheckScope guard(this);
4882     ITScope it_scope(this, &cond, guard);
4883     uhsax(cond, rd, rn, rm);
4884   }
Uhsax(Register rd,Register rn,Register rm)4885   void Uhsax(Register rd, Register rn, Register rm) { Uhsax(al, rd, rn, rm); }
4886 
Uhsub16(Condition cond,Register rd,Register rn,Register rm)4887   void Uhsub16(Condition cond, Register rd, Register rn, Register rm) {
4888     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4889     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4890     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4891     VIXL_ASSERT(allow_macro_instructions_);
4892     VIXL_ASSERT(OutsideITBlock());
4893     MacroEmissionCheckScope guard(this);
4894     ITScope it_scope(this, &cond, guard);
4895     uhsub16(cond, rd, rn, rm);
4896   }
Uhsub16(Register rd,Register rn,Register rm)4897   void Uhsub16(Register rd, Register rn, Register rm) {
4898     Uhsub16(al, rd, rn, rm);
4899   }
4900 
Uhsub8(Condition cond,Register rd,Register rn,Register rm)4901   void Uhsub8(Condition cond, Register rd, Register rn, Register rm) {
4902     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4903     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4904     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4905     VIXL_ASSERT(allow_macro_instructions_);
4906     VIXL_ASSERT(OutsideITBlock());
4907     MacroEmissionCheckScope guard(this);
4908     ITScope it_scope(this, &cond, guard);
4909     uhsub8(cond, rd, rn, rm);
4910   }
Uhsub8(Register rd,Register rn,Register rm)4911   void Uhsub8(Register rd, Register rn, Register rm) { Uhsub8(al, rd, rn, rm); }
4912 
Umaal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4913   void Umaal(
4914       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4915     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4916     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4917     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4918     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4919     VIXL_ASSERT(allow_macro_instructions_);
4920     VIXL_ASSERT(OutsideITBlock());
4921     MacroEmissionCheckScope guard(this);
4922     ITScope it_scope(this, &cond, guard);
4923     umaal(cond, rdlo, rdhi, rn, rm);
4924   }
Umaal(Register rdlo,Register rdhi,Register rn,Register rm)4925   void Umaal(Register rdlo, Register rdhi, Register rn, Register rm) {
4926     Umaal(al, rdlo, rdhi, rn, rm);
4927   }
4928 
Umlal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4929   void Umlal(
4930       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4931     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4932     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4933     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4934     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4935     VIXL_ASSERT(allow_macro_instructions_);
4936     VIXL_ASSERT(OutsideITBlock());
4937     MacroEmissionCheckScope guard(this);
4938     ITScope it_scope(this, &cond, guard);
4939     umlal(cond, rdlo, rdhi, rn, rm);
4940   }
Umlal(Register rdlo,Register rdhi,Register rn,Register rm)4941   void Umlal(Register rdlo, Register rdhi, Register rn, Register rm) {
4942     Umlal(al, rdlo, rdhi, rn, rm);
4943   }
Umlal(FlagsUpdate flags,Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4944   void Umlal(FlagsUpdate flags,
4945              Condition cond,
4946              Register rdlo,
4947              Register rdhi,
4948              Register rn,
4949              Register rm) {
4950     switch (flags) {
4951       case LeaveFlags:
4952         Umlal(cond, rdlo, rdhi, rn, rm);
4953         break;
4954       case SetFlags:
4955         Umlals(cond, rdlo, rdhi, rn, rm);
4956         break;
4957       case DontCare:
4958         Umlal(cond, rdlo, rdhi, rn, rm);
4959         break;
4960     }
4961   }
Umlal(FlagsUpdate flags,Register rdlo,Register rdhi,Register rn,Register rm)4962   void Umlal(FlagsUpdate flags,
4963              Register rdlo,
4964              Register rdhi,
4965              Register rn,
4966              Register rm) {
4967     Umlal(flags, al, rdlo, rdhi, rn, rm);
4968   }
4969 
Umlals(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4970   void Umlals(
4971       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4972     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4973     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4974     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4975     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4976     VIXL_ASSERT(allow_macro_instructions_);
4977     VIXL_ASSERT(OutsideITBlock());
4978     MacroEmissionCheckScope guard(this);
4979     ITScope it_scope(this, &cond, guard);
4980     umlals(cond, rdlo, rdhi, rn, rm);
4981   }
Umlals(Register rdlo,Register rdhi,Register rn,Register rm)4982   void Umlals(Register rdlo, Register rdhi, Register rn, Register rm) {
4983     Umlals(al, rdlo, rdhi, rn, rm);
4984   }
4985 
Umull(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4986   void Umull(
4987       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4988     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4989     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4990     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4991     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4992     VIXL_ASSERT(allow_macro_instructions_);
4993     VIXL_ASSERT(OutsideITBlock());
4994     MacroEmissionCheckScope guard(this);
4995     ITScope it_scope(this, &cond, guard);
4996     umull(cond, rdlo, rdhi, rn, rm);
4997   }
Umull(Register rdlo,Register rdhi,Register rn,Register rm)4998   void Umull(Register rdlo, Register rdhi, Register rn, Register rm) {
4999     Umull(al, rdlo, rdhi, rn, rm);
5000   }
Umull(FlagsUpdate flags,Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)5001   void Umull(FlagsUpdate flags,
5002              Condition cond,
5003              Register rdlo,
5004              Register rdhi,
5005              Register rn,
5006              Register rm) {
5007     switch (flags) {
5008       case LeaveFlags:
5009         Umull(cond, rdlo, rdhi, rn, rm);
5010         break;
5011       case SetFlags:
5012         Umulls(cond, rdlo, rdhi, rn, rm);
5013         break;
5014       case DontCare:
5015         Umull(cond, rdlo, rdhi, rn, rm);
5016         break;
5017     }
5018   }
Umull(FlagsUpdate flags,Register rdlo,Register rdhi,Register rn,Register rm)5019   void Umull(FlagsUpdate flags,
5020              Register rdlo,
5021              Register rdhi,
5022              Register rn,
5023              Register rm) {
5024     Umull(flags, al, rdlo, rdhi, rn, rm);
5025   }
5026 
Umulls(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)5027   void Umulls(
5028       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
5029     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
5030     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
5031     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5032     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5033     VIXL_ASSERT(allow_macro_instructions_);
5034     VIXL_ASSERT(OutsideITBlock());
5035     MacroEmissionCheckScope guard(this);
5036     ITScope it_scope(this, &cond, guard);
5037     umulls(cond, rdlo, rdhi, rn, rm);
5038   }
Umulls(Register rdlo,Register rdhi,Register rn,Register rm)5039   void Umulls(Register rdlo, Register rdhi, Register rn, Register rm) {
5040     Umulls(al, rdlo, rdhi, rn, rm);
5041   }
5042 
Uqadd16(Condition cond,Register rd,Register rn,Register rm)5043   void Uqadd16(Condition cond, Register rd, Register rn, Register rm) {
5044     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5045     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5046     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5047     VIXL_ASSERT(allow_macro_instructions_);
5048     VIXL_ASSERT(OutsideITBlock());
5049     MacroEmissionCheckScope guard(this);
5050     ITScope it_scope(this, &cond, guard);
5051     uqadd16(cond, rd, rn, rm);
5052   }
Uqadd16(Register rd,Register rn,Register rm)5053   void Uqadd16(Register rd, Register rn, Register rm) {
5054     Uqadd16(al, rd, rn, rm);
5055   }
5056 
Uqadd8(Condition cond,Register rd,Register rn,Register rm)5057   void Uqadd8(Condition cond, Register rd, Register rn, Register rm) {
5058     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5059     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5060     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5061     VIXL_ASSERT(allow_macro_instructions_);
5062     VIXL_ASSERT(OutsideITBlock());
5063     MacroEmissionCheckScope guard(this);
5064     ITScope it_scope(this, &cond, guard);
5065     uqadd8(cond, rd, rn, rm);
5066   }
Uqadd8(Register rd,Register rn,Register rm)5067   void Uqadd8(Register rd, Register rn, Register rm) { Uqadd8(al, rd, rn, rm); }
5068 
Uqasx(Condition cond,Register rd,Register rn,Register rm)5069   void Uqasx(Condition cond, Register rd, Register rn, Register rm) {
5070     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5071     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5072     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5073     VIXL_ASSERT(allow_macro_instructions_);
5074     VIXL_ASSERT(OutsideITBlock());
5075     MacroEmissionCheckScope guard(this);
5076     ITScope it_scope(this, &cond, guard);
5077     uqasx(cond, rd, rn, rm);
5078   }
Uqasx(Register rd,Register rn,Register rm)5079   void Uqasx(Register rd, Register rn, Register rm) { Uqasx(al, rd, rn, rm); }
5080 
Uqsax(Condition cond,Register rd,Register rn,Register rm)5081   void Uqsax(Condition cond, Register rd, Register rn, Register rm) {
5082     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5083     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5084     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5085     VIXL_ASSERT(allow_macro_instructions_);
5086     VIXL_ASSERT(OutsideITBlock());
5087     MacroEmissionCheckScope guard(this);
5088     ITScope it_scope(this, &cond, guard);
5089     uqsax(cond, rd, rn, rm);
5090   }
Uqsax(Register rd,Register rn,Register rm)5091   void Uqsax(Register rd, Register rn, Register rm) { Uqsax(al, rd, rn, rm); }
5092 
Uqsub16(Condition cond,Register rd,Register rn,Register rm)5093   void Uqsub16(Condition cond, Register rd, Register rn, Register rm) {
5094     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5095     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5096     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5097     VIXL_ASSERT(allow_macro_instructions_);
5098     VIXL_ASSERT(OutsideITBlock());
5099     MacroEmissionCheckScope guard(this);
5100     ITScope it_scope(this, &cond, guard);
5101     uqsub16(cond, rd, rn, rm);
5102   }
Uqsub16(Register rd,Register rn,Register rm)5103   void Uqsub16(Register rd, Register rn, Register rm) {
5104     Uqsub16(al, rd, rn, rm);
5105   }
5106 
Uqsub8(Condition cond,Register rd,Register rn,Register rm)5107   void Uqsub8(Condition cond, Register rd, Register rn, Register rm) {
5108     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5109     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5110     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5111     VIXL_ASSERT(allow_macro_instructions_);
5112     VIXL_ASSERT(OutsideITBlock());
5113     MacroEmissionCheckScope guard(this);
5114     ITScope it_scope(this, &cond, guard);
5115     uqsub8(cond, rd, rn, rm);
5116   }
Uqsub8(Register rd,Register rn,Register rm)5117   void Uqsub8(Register rd, Register rn, Register rm) { Uqsub8(al, rd, rn, rm); }
5118 
Usad8(Condition cond,Register rd,Register rn,Register rm)5119   void Usad8(Condition cond, Register rd, Register rn, Register rm) {
5120     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5121     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5122     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5123     VIXL_ASSERT(allow_macro_instructions_);
5124     VIXL_ASSERT(OutsideITBlock());
5125     MacroEmissionCheckScope guard(this);
5126     ITScope it_scope(this, &cond, guard);
5127     usad8(cond, rd, rn, rm);
5128   }
Usad8(Register rd,Register rn,Register rm)5129   void Usad8(Register rd, Register rn, Register rm) { Usad8(al, rd, rn, rm); }
5130 
Usada8(Condition cond,Register rd,Register rn,Register rm,Register ra)5131   void Usada8(
5132       Condition cond, Register rd, Register rn, Register rm, Register ra) {
5133     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5134     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5135     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5136     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
5137     VIXL_ASSERT(allow_macro_instructions_);
5138     VIXL_ASSERT(OutsideITBlock());
5139     MacroEmissionCheckScope guard(this);
5140     ITScope it_scope(this, &cond, guard);
5141     usada8(cond, rd, rn, rm, ra);
5142   }
Usada8(Register rd,Register rn,Register rm,Register ra)5143   void Usada8(Register rd, Register rn, Register rm, Register ra) {
5144     Usada8(al, rd, rn, rm, ra);
5145   }
5146 
Usat(Condition cond,Register rd,uint32_t imm,const Operand & operand)5147   void Usat(Condition cond, Register rd, uint32_t imm, const Operand& operand) {
5148     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5149     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5150     VIXL_ASSERT(allow_macro_instructions_);
5151     VIXL_ASSERT(OutsideITBlock());
5152     MacroEmissionCheckScope guard(this);
5153     ITScope it_scope(this, &cond, guard);
5154     usat(cond, rd, imm, operand);
5155   }
Usat(Register rd,uint32_t imm,const Operand & operand)5156   void Usat(Register rd, uint32_t imm, const Operand& operand) {
5157     Usat(al, rd, imm, operand);
5158   }
5159 
Usat16(Condition cond,Register rd,uint32_t imm,Register rn)5160   void Usat16(Condition cond, Register rd, uint32_t imm, Register rn) {
5161     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5162     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5163     VIXL_ASSERT(allow_macro_instructions_);
5164     VIXL_ASSERT(OutsideITBlock());
5165     MacroEmissionCheckScope guard(this);
5166     ITScope it_scope(this, &cond, guard);
5167     usat16(cond, rd, imm, rn);
5168   }
Usat16(Register rd,uint32_t imm,Register rn)5169   void Usat16(Register rd, uint32_t imm, Register rn) {
5170     Usat16(al, rd, imm, rn);
5171   }
5172 
Usax(Condition cond,Register rd,Register rn,Register rm)5173   void Usax(Condition cond, Register rd, Register rn, Register rm) {
5174     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5175     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5176     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5177     VIXL_ASSERT(allow_macro_instructions_);
5178     VIXL_ASSERT(OutsideITBlock());
5179     MacroEmissionCheckScope guard(this);
5180     ITScope it_scope(this, &cond, guard);
5181     usax(cond, rd, rn, rm);
5182   }
Usax(Register rd,Register rn,Register rm)5183   void Usax(Register rd, Register rn, Register rm) { Usax(al, rd, rn, rm); }
5184 
Usub16(Condition cond,Register rd,Register rn,Register rm)5185   void Usub16(Condition cond, Register rd, Register rn, Register rm) {
5186     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5187     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5188     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5189     VIXL_ASSERT(allow_macro_instructions_);
5190     VIXL_ASSERT(OutsideITBlock());
5191     MacroEmissionCheckScope guard(this);
5192     ITScope it_scope(this, &cond, guard);
5193     usub16(cond, rd, rn, rm);
5194   }
Usub16(Register rd,Register rn,Register rm)5195   void Usub16(Register rd, Register rn, Register rm) { Usub16(al, rd, rn, rm); }
5196 
Usub8(Condition cond,Register rd,Register rn,Register rm)5197   void Usub8(Condition cond, Register rd, Register rn, Register rm) {
5198     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5199     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5200     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5201     VIXL_ASSERT(allow_macro_instructions_);
5202     VIXL_ASSERT(OutsideITBlock());
5203     MacroEmissionCheckScope guard(this);
5204     ITScope it_scope(this, &cond, guard);
5205     usub8(cond, rd, rn, rm);
5206   }
Usub8(Register rd,Register rn,Register rm)5207   void Usub8(Register rd, Register rn, Register rm) { Usub8(al, rd, rn, rm); }
5208 
Uxtab(Condition cond,Register rd,Register rn,const Operand & operand)5209   void Uxtab(Condition cond, Register rd, Register rn, const Operand& operand) {
5210     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5211     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5212     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5213     VIXL_ASSERT(allow_macro_instructions_);
5214     VIXL_ASSERT(OutsideITBlock());
5215     MacroEmissionCheckScope guard(this);
5216     ITScope it_scope(this, &cond, guard);
5217     uxtab(cond, rd, rn, operand);
5218   }
Uxtab(Register rd,Register rn,const Operand & operand)5219   void Uxtab(Register rd, Register rn, const Operand& operand) {
5220     Uxtab(al, rd, rn, operand);
5221   }
5222 
Uxtab16(Condition cond,Register rd,Register rn,const Operand & operand)5223   void Uxtab16(Condition cond,
5224                Register rd,
5225                Register rn,
5226                const Operand& operand) {
5227     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5228     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5229     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5230     VIXL_ASSERT(allow_macro_instructions_);
5231     VIXL_ASSERT(OutsideITBlock());
5232     MacroEmissionCheckScope guard(this);
5233     ITScope it_scope(this, &cond, guard);
5234     uxtab16(cond, rd, rn, operand);
5235   }
Uxtab16(Register rd,Register rn,const Operand & operand)5236   void Uxtab16(Register rd, Register rn, const Operand& operand) {
5237     Uxtab16(al, rd, rn, operand);
5238   }
5239 
Uxtah(Condition cond,Register rd,Register rn,const Operand & operand)5240   void Uxtah(Condition cond, Register rd, Register rn, const Operand& operand) {
5241     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5242     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5243     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5244     VIXL_ASSERT(allow_macro_instructions_);
5245     VIXL_ASSERT(OutsideITBlock());
5246     MacroEmissionCheckScope guard(this);
5247     ITScope it_scope(this, &cond, guard);
5248     uxtah(cond, rd, rn, operand);
5249   }
Uxtah(Register rd,Register rn,const Operand & operand)5250   void Uxtah(Register rd, Register rn, const Operand& operand) {
5251     Uxtah(al, rd, rn, operand);
5252   }
5253 
Uxtb(Condition cond,Register rd,const Operand & operand)5254   void Uxtb(Condition cond, Register rd, const Operand& operand) {
5255     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5256     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5257     VIXL_ASSERT(allow_macro_instructions_);
5258     VIXL_ASSERT(OutsideITBlock());
5259     MacroEmissionCheckScope guard(this);
5260     ITScope it_scope(this, &cond, guard);
5261     uxtb(cond, rd, operand);
5262   }
Uxtb(Register rd,const Operand & operand)5263   void Uxtb(Register rd, const Operand& operand) { Uxtb(al, rd, operand); }
5264 
Uxtb16(Condition cond,Register rd,const Operand & operand)5265   void Uxtb16(Condition cond, Register rd, const Operand& operand) {
5266     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5267     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5268     VIXL_ASSERT(allow_macro_instructions_);
5269     VIXL_ASSERT(OutsideITBlock());
5270     MacroEmissionCheckScope guard(this);
5271     ITScope it_scope(this, &cond, guard);
5272     uxtb16(cond, rd, operand);
5273   }
Uxtb16(Register rd,const Operand & operand)5274   void Uxtb16(Register rd, const Operand& operand) { Uxtb16(al, rd, operand); }
5275 
Uxth(Condition cond,Register rd,const Operand & operand)5276   void Uxth(Condition cond, Register rd, const Operand& operand) {
5277     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5278     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5279     VIXL_ASSERT(allow_macro_instructions_);
5280     VIXL_ASSERT(OutsideITBlock());
5281     MacroEmissionCheckScope guard(this);
5282     ITScope it_scope(this, &cond, guard);
5283     uxth(cond, rd, operand);
5284   }
Uxth(Register rd,const Operand & operand)5285   void Uxth(Register rd, const Operand& operand) { Uxth(al, rd, operand); }
5286 
Vaba(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5287   void Vaba(
5288       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5289     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5290     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5291     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5292     VIXL_ASSERT(allow_macro_instructions_);
5293     VIXL_ASSERT(OutsideITBlock());
5294     MacroEmissionCheckScope guard(this);
5295     ITScope it_scope(this, &cond, guard);
5296     vaba(cond, dt, rd, rn, rm);
5297   }
Vaba(DataType dt,DRegister rd,DRegister rn,DRegister rm)5298   void Vaba(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5299     Vaba(al, dt, rd, rn, rm);
5300   }
5301 
Vaba(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5302   void Vaba(
5303       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5304     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5305     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5306     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5307     VIXL_ASSERT(allow_macro_instructions_);
5308     VIXL_ASSERT(OutsideITBlock());
5309     MacroEmissionCheckScope guard(this);
5310     ITScope it_scope(this, &cond, guard);
5311     vaba(cond, dt, rd, rn, rm);
5312   }
Vaba(DataType dt,QRegister rd,QRegister rn,QRegister rm)5313   void Vaba(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5314     Vaba(al, dt, rd, rn, rm);
5315   }
5316 
Vabal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5317   void Vabal(
5318       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5319     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5320     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5321     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5322     VIXL_ASSERT(allow_macro_instructions_);
5323     VIXL_ASSERT(OutsideITBlock());
5324     MacroEmissionCheckScope guard(this);
5325     ITScope it_scope(this, &cond, guard);
5326     vabal(cond, dt, rd, rn, rm);
5327   }
Vabal(DataType dt,QRegister rd,DRegister rn,DRegister rm)5328   void Vabal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5329     Vabal(al, dt, rd, rn, rm);
5330   }
5331 
Vabd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5332   void Vabd(
5333       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5334     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5335     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5336     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5337     VIXL_ASSERT(allow_macro_instructions_);
5338     VIXL_ASSERT(OutsideITBlock());
5339     MacroEmissionCheckScope guard(this);
5340     ITScope it_scope(this, &cond, guard);
5341     vabd(cond, dt, rd, rn, rm);
5342   }
Vabd(DataType dt,DRegister rd,DRegister rn,DRegister rm)5343   void Vabd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5344     Vabd(al, dt, rd, rn, rm);
5345   }
5346 
Vabd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5347   void Vabd(
5348       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5349     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5350     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5351     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5352     VIXL_ASSERT(allow_macro_instructions_);
5353     VIXL_ASSERT(OutsideITBlock());
5354     MacroEmissionCheckScope guard(this);
5355     ITScope it_scope(this, &cond, guard);
5356     vabd(cond, dt, rd, rn, rm);
5357   }
Vabd(DataType dt,QRegister rd,QRegister rn,QRegister rm)5358   void Vabd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5359     Vabd(al, dt, rd, rn, rm);
5360   }
5361 
Vabdl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5362   void Vabdl(
5363       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5364     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5365     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5366     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5367     VIXL_ASSERT(allow_macro_instructions_);
5368     VIXL_ASSERT(OutsideITBlock());
5369     MacroEmissionCheckScope guard(this);
5370     ITScope it_scope(this, &cond, guard);
5371     vabdl(cond, dt, rd, rn, rm);
5372   }
Vabdl(DataType dt,QRegister rd,DRegister rn,DRegister rm)5373   void Vabdl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5374     Vabdl(al, dt, rd, rn, rm);
5375   }
5376 
Vabs(Condition cond,DataType dt,DRegister rd,DRegister rm)5377   void Vabs(Condition cond, DataType dt, DRegister rd, DRegister rm) {
5378     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5379     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5380     VIXL_ASSERT(allow_macro_instructions_);
5381     VIXL_ASSERT(OutsideITBlock());
5382     MacroEmissionCheckScope guard(this);
5383     ITScope it_scope(this, &cond, guard);
5384     vabs(cond, dt, rd, rm);
5385   }
Vabs(DataType dt,DRegister rd,DRegister rm)5386   void Vabs(DataType dt, DRegister rd, DRegister rm) { Vabs(al, dt, rd, rm); }
5387 
Vabs(Condition cond,DataType dt,QRegister rd,QRegister rm)5388   void Vabs(Condition cond, DataType dt, QRegister rd, QRegister rm) {
5389     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5390     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5391     VIXL_ASSERT(allow_macro_instructions_);
5392     VIXL_ASSERT(OutsideITBlock());
5393     MacroEmissionCheckScope guard(this);
5394     ITScope it_scope(this, &cond, guard);
5395     vabs(cond, dt, rd, rm);
5396   }
Vabs(DataType dt,QRegister rd,QRegister rm)5397   void Vabs(DataType dt, QRegister rd, QRegister rm) { Vabs(al, dt, rd, rm); }
5398 
Vabs(Condition cond,DataType dt,SRegister rd,SRegister rm)5399   void Vabs(Condition cond, DataType dt, SRegister rd, SRegister rm) {
5400     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5401     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5402     VIXL_ASSERT(allow_macro_instructions_);
5403     VIXL_ASSERT(OutsideITBlock());
5404     MacroEmissionCheckScope guard(this);
5405     ITScope it_scope(this, &cond, guard);
5406     vabs(cond, dt, rd, rm);
5407   }
Vabs(DataType dt,SRegister rd,SRegister rm)5408   void Vabs(DataType dt, SRegister rd, SRegister rm) { Vabs(al, dt, rd, rm); }
5409 
Vacge(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5410   void Vacge(
5411       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5412     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5413     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5414     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5415     VIXL_ASSERT(allow_macro_instructions_);
5416     VIXL_ASSERT(OutsideITBlock());
5417     MacroEmissionCheckScope guard(this);
5418     ITScope it_scope(this, &cond, guard);
5419     vacge(cond, dt, rd, rn, rm);
5420   }
Vacge(DataType dt,DRegister rd,DRegister rn,DRegister rm)5421   void Vacge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5422     Vacge(al, dt, rd, rn, rm);
5423   }
5424 
Vacge(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5425   void Vacge(
5426       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5427     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5428     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5429     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5430     VIXL_ASSERT(allow_macro_instructions_);
5431     VIXL_ASSERT(OutsideITBlock());
5432     MacroEmissionCheckScope guard(this);
5433     ITScope it_scope(this, &cond, guard);
5434     vacge(cond, dt, rd, rn, rm);
5435   }
Vacge(DataType dt,QRegister rd,QRegister rn,QRegister rm)5436   void Vacge(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5437     Vacge(al, dt, rd, rn, rm);
5438   }
5439 
Vacgt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5440   void Vacgt(
5441       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5442     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5443     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5444     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5445     VIXL_ASSERT(allow_macro_instructions_);
5446     VIXL_ASSERT(OutsideITBlock());
5447     MacroEmissionCheckScope guard(this);
5448     ITScope it_scope(this, &cond, guard);
5449     vacgt(cond, dt, rd, rn, rm);
5450   }
Vacgt(DataType dt,DRegister rd,DRegister rn,DRegister rm)5451   void Vacgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5452     Vacgt(al, dt, rd, rn, rm);
5453   }
5454 
Vacgt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5455   void Vacgt(
5456       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5457     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5458     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5459     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5460     VIXL_ASSERT(allow_macro_instructions_);
5461     VIXL_ASSERT(OutsideITBlock());
5462     MacroEmissionCheckScope guard(this);
5463     ITScope it_scope(this, &cond, guard);
5464     vacgt(cond, dt, rd, rn, rm);
5465   }
Vacgt(DataType dt,QRegister rd,QRegister rn,QRegister rm)5466   void Vacgt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5467     Vacgt(al, dt, rd, rn, rm);
5468   }
5469 
Vacle(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5470   void Vacle(
5471       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5472     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5473     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5474     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5475     VIXL_ASSERT(allow_macro_instructions_);
5476     VIXL_ASSERT(OutsideITBlock());
5477     MacroEmissionCheckScope guard(this);
5478     ITScope it_scope(this, &cond, guard);
5479     vacle(cond, dt, rd, rn, rm);
5480   }
Vacle(DataType dt,DRegister rd,DRegister rn,DRegister rm)5481   void Vacle(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5482     Vacle(al, dt, rd, rn, rm);
5483   }
5484 
Vacle(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5485   void Vacle(
5486       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5487     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5488     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5489     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5490     VIXL_ASSERT(allow_macro_instructions_);
5491     VIXL_ASSERT(OutsideITBlock());
5492     MacroEmissionCheckScope guard(this);
5493     ITScope it_scope(this, &cond, guard);
5494     vacle(cond, dt, rd, rn, rm);
5495   }
Vacle(DataType dt,QRegister rd,QRegister rn,QRegister rm)5496   void Vacle(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5497     Vacle(al, dt, rd, rn, rm);
5498   }
5499 
Vaclt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5500   void Vaclt(
5501       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5502     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5503     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5504     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5505     VIXL_ASSERT(allow_macro_instructions_);
5506     VIXL_ASSERT(OutsideITBlock());
5507     MacroEmissionCheckScope guard(this);
5508     ITScope it_scope(this, &cond, guard);
5509     vaclt(cond, dt, rd, rn, rm);
5510   }
Vaclt(DataType dt,DRegister rd,DRegister rn,DRegister rm)5511   void Vaclt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5512     Vaclt(al, dt, rd, rn, rm);
5513   }
5514 
Vaclt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5515   void Vaclt(
5516       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5517     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5518     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5519     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5520     VIXL_ASSERT(allow_macro_instructions_);
5521     VIXL_ASSERT(OutsideITBlock());
5522     MacroEmissionCheckScope guard(this);
5523     ITScope it_scope(this, &cond, guard);
5524     vaclt(cond, dt, rd, rn, rm);
5525   }
Vaclt(DataType dt,QRegister rd,QRegister rn,QRegister rm)5526   void Vaclt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5527     Vaclt(al, dt, rd, rn, rm);
5528   }
5529 
Vadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5530   void Vadd(
5531       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5532     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5533     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5534     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5535     VIXL_ASSERT(allow_macro_instructions_);
5536     VIXL_ASSERT(OutsideITBlock());
5537     MacroEmissionCheckScope guard(this);
5538     ITScope it_scope(this, &cond, guard);
5539     vadd(cond, dt, rd, rn, rm);
5540   }
Vadd(DataType dt,DRegister rd,DRegister rn,DRegister rm)5541   void Vadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5542     Vadd(al, dt, rd, rn, rm);
5543   }
5544 
Vadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5545   void Vadd(
5546       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5547     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5548     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5549     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5550     VIXL_ASSERT(allow_macro_instructions_);
5551     VIXL_ASSERT(OutsideITBlock());
5552     MacroEmissionCheckScope guard(this);
5553     ITScope it_scope(this, &cond, guard);
5554     vadd(cond, dt, rd, rn, rm);
5555   }
Vadd(DataType dt,QRegister rd,QRegister rn,QRegister rm)5556   void Vadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5557     Vadd(al, dt, rd, rn, rm);
5558   }
5559 
Vadd(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)5560   void Vadd(
5561       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5562     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5563     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5564     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5565     VIXL_ASSERT(allow_macro_instructions_);
5566     VIXL_ASSERT(OutsideITBlock());
5567     MacroEmissionCheckScope guard(this);
5568     ITScope it_scope(this, &cond, guard);
5569     vadd(cond, dt, rd, rn, rm);
5570   }
Vadd(DataType dt,SRegister rd,SRegister rn,SRegister rm)5571   void Vadd(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5572     Vadd(al, dt, rd, rn, rm);
5573   }
5574 
Vaddhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)5575   void Vaddhn(
5576       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
5577     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5578     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5579     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5580     VIXL_ASSERT(allow_macro_instructions_);
5581     VIXL_ASSERT(OutsideITBlock());
5582     MacroEmissionCheckScope guard(this);
5583     ITScope it_scope(this, &cond, guard);
5584     vaddhn(cond, dt, rd, rn, rm);
5585   }
Vaddhn(DataType dt,DRegister rd,QRegister rn,QRegister rm)5586   void Vaddhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
5587     Vaddhn(al, dt, rd, rn, rm);
5588   }
5589 
Vaddl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5590   void Vaddl(
5591       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5592     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5593     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5594     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5595     VIXL_ASSERT(allow_macro_instructions_);
5596     VIXL_ASSERT(OutsideITBlock());
5597     MacroEmissionCheckScope guard(this);
5598     ITScope it_scope(this, &cond, guard);
5599     vaddl(cond, dt, rd, rn, rm);
5600   }
Vaddl(DataType dt,QRegister rd,DRegister rn,DRegister rm)5601   void Vaddl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5602     Vaddl(al, dt, rd, rn, rm);
5603   }
5604 
Vaddw(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegister rm)5605   void Vaddw(
5606       Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
5607     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5608     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5609     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5610     VIXL_ASSERT(allow_macro_instructions_);
5611     VIXL_ASSERT(OutsideITBlock());
5612     MacroEmissionCheckScope guard(this);
5613     ITScope it_scope(this, &cond, guard);
5614     vaddw(cond, dt, rd, rn, rm);
5615   }
Vaddw(DataType dt,QRegister rd,QRegister rn,DRegister rm)5616   void Vaddw(DataType dt, QRegister rd, QRegister rn, DRegister rm) {
5617     Vaddw(al, dt, rd, rn, rm);
5618   }
5619 
Vand(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5620   void Vand(Condition cond,
5621             DataType dt,
5622             DRegister rd,
5623             DRegister rn,
5624             const DOperand& operand) {
5625     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5626     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5627     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5628     VIXL_ASSERT(allow_macro_instructions_);
5629     VIXL_ASSERT(OutsideITBlock());
5630     MacroEmissionCheckScope guard(this);
5631     ITScope it_scope(this, &cond, guard);
5632     vand(cond, dt, rd, rn, operand);
5633   }
Vand(DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5634   void Vand(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
5635     Vand(al, dt, rd, rn, operand);
5636   }
5637 
Vand(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5638   void Vand(Condition cond,
5639             DataType dt,
5640             QRegister rd,
5641             QRegister rn,
5642             const QOperand& operand) {
5643     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5644     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5645     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5646     VIXL_ASSERT(allow_macro_instructions_);
5647     VIXL_ASSERT(OutsideITBlock());
5648     MacroEmissionCheckScope guard(this);
5649     ITScope it_scope(this, &cond, guard);
5650     vand(cond, dt, rd, rn, operand);
5651   }
Vand(DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5652   void Vand(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
5653     Vand(al, dt, rd, rn, operand);
5654   }
5655 
Vbic(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5656   void Vbic(Condition cond,
5657             DataType dt,
5658             DRegister rd,
5659             DRegister rn,
5660             const DOperand& operand) {
5661     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5662     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5663     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5664     VIXL_ASSERT(allow_macro_instructions_);
5665     VIXL_ASSERT(OutsideITBlock());
5666     MacroEmissionCheckScope guard(this);
5667     ITScope it_scope(this, &cond, guard);
5668     vbic(cond, dt, rd, rn, operand);
5669   }
Vbic(DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5670   void Vbic(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
5671     Vbic(al, dt, rd, rn, operand);
5672   }
5673 
Vbic(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5674   void Vbic(Condition cond,
5675             DataType dt,
5676             QRegister rd,
5677             QRegister rn,
5678             const QOperand& operand) {
5679     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5680     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5681     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5682     VIXL_ASSERT(allow_macro_instructions_);
5683     VIXL_ASSERT(OutsideITBlock());
5684     MacroEmissionCheckScope guard(this);
5685     ITScope it_scope(this, &cond, guard);
5686     vbic(cond, dt, rd, rn, operand);
5687   }
Vbic(DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5688   void Vbic(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
5689     Vbic(al, dt, rd, rn, operand);
5690   }
5691 
Vbif(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5692   void Vbif(
5693       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5694     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5695     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5696     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5697     VIXL_ASSERT(allow_macro_instructions_);
5698     VIXL_ASSERT(OutsideITBlock());
5699     MacroEmissionCheckScope guard(this);
5700     ITScope it_scope(this, &cond, guard);
5701     vbif(cond, dt, rd, rn, rm);
5702   }
Vbif(DataType dt,DRegister rd,DRegister rn,DRegister rm)5703   void Vbif(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5704     Vbif(al, dt, rd, rn, rm);
5705   }
Vbif(Condition cond,DRegister rd,DRegister rn,DRegister rm)5706   void Vbif(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
5707     Vbif(cond, kDataTypeValueNone, rd, rn, rm);
5708   }
Vbif(DRegister rd,DRegister rn,DRegister rm)5709   void Vbif(DRegister rd, DRegister rn, DRegister rm) {
5710     Vbif(al, kDataTypeValueNone, rd, rn, rm);
5711   }
5712 
Vbif(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5713   void Vbif(
5714       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5715     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5716     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5717     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5718     VIXL_ASSERT(allow_macro_instructions_);
5719     VIXL_ASSERT(OutsideITBlock());
5720     MacroEmissionCheckScope guard(this);
5721     ITScope it_scope(this, &cond, guard);
5722     vbif(cond, dt, rd, rn, rm);
5723   }
Vbif(DataType dt,QRegister rd,QRegister rn,QRegister rm)5724   void Vbif(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5725     Vbif(al, dt, rd, rn, rm);
5726   }
Vbif(Condition cond,QRegister rd,QRegister rn,QRegister rm)5727   void Vbif(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
5728     Vbif(cond, kDataTypeValueNone, rd, rn, rm);
5729   }
Vbif(QRegister rd,QRegister rn,QRegister rm)5730   void Vbif(QRegister rd, QRegister rn, QRegister rm) {
5731     Vbif(al, kDataTypeValueNone, rd, rn, rm);
5732   }
5733 
Vbit(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5734   void Vbit(
5735       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5736     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5737     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5738     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5739     VIXL_ASSERT(allow_macro_instructions_);
5740     VIXL_ASSERT(OutsideITBlock());
5741     MacroEmissionCheckScope guard(this);
5742     ITScope it_scope(this, &cond, guard);
5743     vbit(cond, dt, rd, rn, rm);
5744   }
Vbit(DataType dt,DRegister rd,DRegister rn,DRegister rm)5745   void Vbit(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5746     Vbit(al, dt, rd, rn, rm);
5747   }
Vbit(Condition cond,DRegister rd,DRegister rn,DRegister rm)5748   void Vbit(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
5749     Vbit(cond, kDataTypeValueNone, rd, rn, rm);
5750   }
Vbit(DRegister rd,DRegister rn,DRegister rm)5751   void Vbit(DRegister rd, DRegister rn, DRegister rm) {
5752     Vbit(al, kDataTypeValueNone, rd, rn, rm);
5753   }
5754 
Vbit(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5755   void Vbit(
5756       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5757     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5758     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5759     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5760     VIXL_ASSERT(allow_macro_instructions_);
5761     VIXL_ASSERT(OutsideITBlock());
5762     MacroEmissionCheckScope guard(this);
5763     ITScope it_scope(this, &cond, guard);
5764     vbit(cond, dt, rd, rn, rm);
5765   }
Vbit(DataType dt,QRegister rd,QRegister rn,QRegister rm)5766   void Vbit(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5767     Vbit(al, dt, rd, rn, rm);
5768   }
Vbit(Condition cond,QRegister rd,QRegister rn,QRegister rm)5769   void Vbit(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
5770     Vbit(cond, kDataTypeValueNone, rd, rn, rm);
5771   }
Vbit(QRegister rd,QRegister rn,QRegister rm)5772   void Vbit(QRegister rd, QRegister rn, QRegister rm) {
5773     Vbit(al, kDataTypeValueNone, rd, rn, rm);
5774   }
5775 
Vbsl(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5776   void Vbsl(
5777       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5778     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5779     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5780     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5781     VIXL_ASSERT(allow_macro_instructions_);
5782     VIXL_ASSERT(OutsideITBlock());
5783     MacroEmissionCheckScope guard(this);
5784     ITScope it_scope(this, &cond, guard);
5785     vbsl(cond, dt, rd, rn, rm);
5786   }
Vbsl(DataType dt,DRegister rd,DRegister rn,DRegister rm)5787   void Vbsl(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5788     Vbsl(al, dt, rd, rn, rm);
5789   }
Vbsl(Condition cond,DRegister rd,DRegister rn,DRegister rm)5790   void Vbsl(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
5791     Vbsl(cond, kDataTypeValueNone, rd, rn, rm);
5792   }
Vbsl(DRegister rd,DRegister rn,DRegister rm)5793   void Vbsl(DRegister rd, DRegister rn, DRegister rm) {
5794     Vbsl(al, kDataTypeValueNone, rd, rn, rm);
5795   }
5796 
Vbsl(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5797   void Vbsl(
5798       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5799     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5800     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5801     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5802     VIXL_ASSERT(allow_macro_instructions_);
5803     VIXL_ASSERT(OutsideITBlock());
5804     MacroEmissionCheckScope guard(this);
5805     ITScope it_scope(this, &cond, guard);
5806     vbsl(cond, dt, rd, rn, rm);
5807   }
Vbsl(DataType dt,QRegister rd,QRegister rn,QRegister rm)5808   void Vbsl(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5809     Vbsl(al, dt, rd, rn, rm);
5810   }
Vbsl(Condition cond,QRegister rd,QRegister rn,QRegister rm)5811   void Vbsl(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
5812     Vbsl(cond, kDataTypeValueNone, rd, rn, rm);
5813   }
Vbsl(QRegister rd,QRegister rn,QRegister rm)5814   void Vbsl(QRegister rd, QRegister rn, QRegister rm) {
5815     Vbsl(al, kDataTypeValueNone, rd, rn, rm);
5816   }
5817 
Vceq(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5818   void Vceq(Condition cond,
5819             DataType dt,
5820             DRegister rd,
5821             DRegister rm,
5822             const DOperand& operand) {
5823     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5824     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5825     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5826     VIXL_ASSERT(allow_macro_instructions_);
5827     VIXL_ASSERT(OutsideITBlock());
5828     MacroEmissionCheckScope guard(this);
5829     ITScope it_scope(this, &cond, guard);
5830     vceq(cond, dt, rd, rm, operand);
5831   }
Vceq(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5832   void Vceq(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
5833     Vceq(al, dt, rd, rm, operand);
5834   }
5835 
Vceq(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5836   void Vceq(Condition cond,
5837             DataType dt,
5838             QRegister rd,
5839             QRegister rm,
5840             const QOperand& operand) {
5841     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5842     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5843     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5844     VIXL_ASSERT(allow_macro_instructions_);
5845     VIXL_ASSERT(OutsideITBlock());
5846     MacroEmissionCheckScope guard(this);
5847     ITScope it_scope(this, &cond, guard);
5848     vceq(cond, dt, rd, rm, operand);
5849   }
Vceq(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5850   void Vceq(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
5851     Vceq(al, dt, rd, rm, operand);
5852   }
5853 
Vceq(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5854   void Vceq(
5855       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5856     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5857     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5858     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5859     VIXL_ASSERT(allow_macro_instructions_);
5860     VIXL_ASSERT(OutsideITBlock());
5861     MacroEmissionCheckScope guard(this);
5862     ITScope it_scope(this, &cond, guard);
5863     vceq(cond, dt, rd, rn, rm);
5864   }
Vceq(DataType dt,DRegister rd,DRegister rn,DRegister rm)5865   void Vceq(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5866     Vceq(al, dt, rd, rn, rm);
5867   }
5868 
Vceq(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5869   void Vceq(
5870       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5871     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5872     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5873     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5874     VIXL_ASSERT(allow_macro_instructions_);
5875     VIXL_ASSERT(OutsideITBlock());
5876     MacroEmissionCheckScope guard(this);
5877     ITScope it_scope(this, &cond, guard);
5878     vceq(cond, dt, rd, rn, rm);
5879   }
Vceq(DataType dt,QRegister rd,QRegister rn,QRegister rm)5880   void Vceq(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5881     Vceq(al, dt, rd, rn, rm);
5882   }
5883 
Vcge(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5884   void Vcge(Condition cond,
5885             DataType dt,
5886             DRegister rd,
5887             DRegister rm,
5888             const DOperand& operand) {
5889     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5890     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5891     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5892     VIXL_ASSERT(allow_macro_instructions_);
5893     VIXL_ASSERT(OutsideITBlock());
5894     MacroEmissionCheckScope guard(this);
5895     ITScope it_scope(this, &cond, guard);
5896     vcge(cond, dt, rd, rm, operand);
5897   }
Vcge(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5898   void Vcge(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
5899     Vcge(al, dt, rd, rm, operand);
5900   }
5901 
Vcge(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5902   void Vcge(Condition cond,
5903             DataType dt,
5904             QRegister rd,
5905             QRegister rm,
5906             const QOperand& operand) {
5907     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5908     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5909     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5910     VIXL_ASSERT(allow_macro_instructions_);
5911     VIXL_ASSERT(OutsideITBlock());
5912     MacroEmissionCheckScope guard(this);
5913     ITScope it_scope(this, &cond, guard);
5914     vcge(cond, dt, rd, rm, operand);
5915   }
Vcge(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5916   void Vcge(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
5917     Vcge(al, dt, rd, rm, operand);
5918   }
5919 
Vcge(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5920   void Vcge(
5921       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5922     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5923     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5924     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5925     VIXL_ASSERT(allow_macro_instructions_);
5926     VIXL_ASSERT(OutsideITBlock());
5927     MacroEmissionCheckScope guard(this);
5928     ITScope it_scope(this, &cond, guard);
5929     vcge(cond, dt, rd, rn, rm);
5930   }
Vcge(DataType dt,DRegister rd,DRegister rn,DRegister rm)5931   void Vcge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5932     Vcge(al, dt, rd, rn, rm);
5933   }
5934 
Vcge(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5935   void Vcge(
5936       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5937     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5938     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5939     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5940     VIXL_ASSERT(allow_macro_instructions_);
5941     VIXL_ASSERT(OutsideITBlock());
5942     MacroEmissionCheckScope guard(this);
5943     ITScope it_scope(this, &cond, guard);
5944     vcge(cond, dt, rd, rn, rm);
5945   }
Vcge(DataType dt,QRegister rd,QRegister rn,QRegister rm)5946   void Vcge(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5947     Vcge(al, dt, rd, rn, rm);
5948   }
5949 
Vcgt(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5950   void Vcgt(Condition cond,
5951             DataType dt,
5952             DRegister rd,
5953             DRegister rm,
5954             const DOperand& operand) {
5955     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5956     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5957     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5958     VIXL_ASSERT(allow_macro_instructions_);
5959     VIXL_ASSERT(OutsideITBlock());
5960     MacroEmissionCheckScope guard(this);
5961     ITScope it_scope(this, &cond, guard);
5962     vcgt(cond, dt, rd, rm, operand);
5963   }
Vcgt(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5964   void Vcgt(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
5965     Vcgt(al, dt, rd, rm, operand);
5966   }
5967 
Vcgt(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5968   void Vcgt(Condition cond,
5969             DataType dt,
5970             QRegister rd,
5971             QRegister rm,
5972             const QOperand& operand) {
5973     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5974     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5975     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5976     VIXL_ASSERT(allow_macro_instructions_);
5977     VIXL_ASSERT(OutsideITBlock());
5978     MacroEmissionCheckScope guard(this);
5979     ITScope it_scope(this, &cond, guard);
5980     vcgt(cond, dt, rd, rm, operand);
5981   }
Vcgt(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5982   void Vcgt(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
5983     Vcgt(al, dt, rd, rm, operand);
5984   }
5985 
Vcgt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5986   void Vcgt(
5987       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5988     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5989     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5990     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5991     VIXL_ASSERT(allow_macro_instructions_);
5992     VIXL_ASSERT(OutsideITBlock());
5993     MacroEmissionCheckScope guard(this);
5994     ITScope it_scope(this, &cond, guard);
5995     vcgt(cond, dt, rd, rn, rm);
5996   }
Vcgt(DataType dt,DRegister rd,DRegister rn,DRegister rm)5997   void Vcgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5998     Vcgt(al, dt, rd, rn, rm);
5999   }
6000 
Vcgt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6001   void Vcgt(
6002       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6003     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6004     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6005     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6006     VIXL_ASSERT(allow_macro_instructions_);
6007     VIXL_ASSERT(OutsideITBlock());
6008     MacroEmissionCheckScope guard(this);
6009     ITScope it_scope(this, &cond, guard);
6010     vcgt(cond, dt, rd, rn, rm);
6011   }
Vcgt(DataType dt,QRegister rd,QRegister rn,QRegister rm)6012   void Vcgt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6013     Vcgt(al, dt, rd, rn, rm);
6014   }
6015 
Vcle(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6016   void Vcle(Condition cond,
6017             DataType dt,
6018             DRegister rd,
6019             DRegister rm,
6020             const DOperand& operand) {
6021     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6022     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6023     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6024     VIXL_ASSERT(allow_macro_instructions_);
6025     VIXL_ASSERT(OutsideITBlock());
6026     MacroEmissionCheckScope guard(this);
6027     ITScope it_scope(this, &cond, guard);
6028     vcle(cond, dt, rd, rm, operand);
6029   }
Vcle(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6030   void Vcle(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
6031     Vcle(al, dt, rd, rm, operand);
6032   }
6033 
Vcle(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6034   void Vcle(Condition cond,
6035             DataType dt,
6036             QRegister rd,
6037             QRegister rm,
6038             const QOperand& operand) {
6039     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6040     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6041     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6042     VIXL_ASSERT(allow_macro_instructions_);
6043     VIXL_ASSERT(OutsideITBlock());
6044     MacroEmissionCheckScope guard(this);
6045     ITScope it_scope(this, &cond, guard);
6046     vcle(cond, dt, rd, rm, operand);
6047   }
Vcle(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6048   void Vcle(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
6049     Vcle(al, dt, rd, rm, operand);
6050   }
6051 
Vcle(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6052   void Vcle(
6053       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6054     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6055     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6056     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6057     VIXL_ASSERT(allow_macro_instructions_);
6058     VIXL_ASSERT(OutsideITBlock());
6059     MacroEmissionCheckScope guard(this);
6060     ITScope it_scope(this, &cond, guard);
6061     vcle(cond, dt, rd, rn, rm);
6062   }
Vcle(DataType dt,DRegister rd,DRegister rn,DRegister rm)6063   void Vcle(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6064     Vcle(al, dt, rd, rn, rm);
6065   }
6066 
Vcle(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6067   void Vcle(
6068       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6069     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6070     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6071     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6072     VIXL_ASSERT(allow_macro_instructions_);
6073     VIXL_ASSERT(OutsideITBlock());
6074     MacroEmissionCheckScope guard(this);
6075     ITScope it_scope(this, &cond, guard);
6076     vcle(cond, dt, rd, rn, rm);
6077   }
Vcle(DataType dt,QRegister rd,QRegister rn,QRegister rm)6078   void Vcle(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6079     Vcle(al, dt, rd, rn, rm);
6080   }
6081 
Vcls(Condition cond,DataType dt,DRegister rd,DRegister rm)6082   void Vcls(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6083     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6084     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6085     VIXL_ASSERT(allow_macro_instructions_);
6086     VIXL_ASSERT(OutsideITBlock());
6087     MacroEmissionCheckScope guard(this);
6088     ITScope it_scope(this, &cond, guard);
6089     vcls(cond, dt, rd, rm);
6090   }
Vcls(DataType dt,DRegister rd,DRegister rm)6091   void Vcls(DataType dt, DRegister rd, DRegister rm) { Vcls(al, dt, rd, rm); }
6092 
Vcls(Condition cond,DataType dt,QRegister rd,QRegister rm)6093   void Vcls(Condition cond, DataType dt, QRegister rd, QRegister rm) {
6094     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6095     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6096     VIXL_ASSERT(allow_macro_instructions_);
6097     VIXL_ASSERT(OutsideITBlock());
6098     MacroEmissionCheckScope guard(this);
6099     ITScope it_scope(this, &cond, guard);
6100     vcls(cond, dt, rd, rm);
6101   }
Vcls(DataType dt,QRegister rd,QRegister rm)6102   void Vcls(DataType dt, QRegister rd, QRegister rm) { Vcls(al, dt, rd, rm); }
6103 
Vclt(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6104   void Vclt(Condition cond,
6105             DataType dt,
6106             DRegister rd,
6107             DRegister rm,
6108             const DOperand& operand) {
6109     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6110     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6111     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6112     VIXL_ASSERT(allow_macro_instructions_);
6113     VIXL_ASSERT(OutsideITBlock());
6114     MacroEmissionCheckScope guard(this);
6115     ITScope it_scope(this, &cond, guard);
6116     vclt(cond, dt, rd, rm, operand);
6117   }
Vclt(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6118   void Vclt(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
6119     Vclt(al, dt, rd, rm, operand);
6120   }
6121 
Vclt(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6122   void Vclt(Condition cond,
6123             DataType dt,
6124             QRegister rd,
6125             QRegister rm,
6126             const QOperand& operand) {
6127     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6128     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6129     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6130     VIXL_ASSERT(allow_macro_instructions_);
6131     VIXL_ASSERT(OutsideITBlock());
6132     MacroEmissionCheckScope guard(this);
6133     ITScope it_scope(this, &cond, guard);
6134     vclt(cond, dt, rd, rm, operand);
6135   }
Vclt(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6136   void Vclt(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
6137     Vclt(al, dt, rd, rm, operand);
6138   }
6139 
Vclt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6140   void Vclt(
6141       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6142     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6143     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6144     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6145     VIXL_ASSERT(allow_macro_instructions_);
6146     VIXL_ASSERT(OutsideITBlock());
6147     MacroEmissionCheckScope guard(this);
6148     ITScope it_scope(this, &cond, guard);
6149     vclt(cond, dt, rd, rn, rm);
6150   }
Vclt(DataType dt,DRegister rd,DRegister rn,DRegister rm)6151   void Vclt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6152     Vclt(al, dt, rd, rn, rm);
6153   }
6154 
Vclt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6155   void Vclt(
6156       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6157     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6158     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6159     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6160     VIXL_ASSERT(allow_macro_instructions_);
6161     VIXL_ASSERT(OutsideITBlock());
6162     MacroEmissionCheckScope guard(this);
6163     ITScope it_scope(this, &cond, guard);
6164     vclt(cond, dt, rd, rn, rm);
6165   }
Vclt(DataType dt,QRegister rd,QRegister rn,QRegister rm)6166   void Vclt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6167     Vclt(al, dt, rd, rn, rm);
6168   }
6169 
Vclz(Condition cond,DataType dt,DRegister rd,DRegister rm)6170   void Vclz(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6171     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6172     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6173     VIXL_ASSERT(allow_macro_instructions_);
6174     VIXL_ASSERT(OutsideITBlock());
6175     MacroEmissionCheckScope guard(this);
6176     ITScope it_scope(this, &cond, guard);
6177     vclz(cond, dt, rd, rm);
6178   }
Vclz(DataType dt,DRegister rd,DRegister rm)6179   void Vclz(DataType dt, DRegister rd, DRegister rm) { Vclz(al, dt, rd, rm); }
6180 
Vclz(Condition cond,DataType dt,QRegister rd,QRegister rm)6181   void Vclz(Condition cond, DataType dt, QRegister rd, QRegister rm) {
6182     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6183     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6184     VIXL_ASSERT(allow_macro_instructions_);
6185     VIXL_ASSERT(OutsideITBlock());
6186     MacroEmissionCheckScope guard(this);
6187     ITScope it_scope(this, &cond, guard);
6188     vclz(cond, dt, rd, rm);
6189   }
Vclz(DataType dt,QRegister rd,QRegister rm)6190   void Vclz(DataType dt, QRegister rd, QRegister rm) { Vclz(al, dt, rd, rm); }
6191 
Vcmp(Condition cond,DataType dt,SRegister rd,const SOperand & operand)6192   void Vcmp(Condition cond,
6193             DataType dt,
6194             SRegister rd,
6195             const SOperand& operand) {
6196     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6197     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6198     VIXL_ASSERT(allow_macro_instructions_);
6199     VIXL_ASSERT(OutsideITBlock());
6200     MacroEmissionCheckScope guard(this);
6201     ITScope it_scope(this, &cond, guard);
6202     vcmp(cond, dt, rd, operand);
6203   }
Vcmp(DataType dt,SRegister rd,const SOperand & operand)6204   void Vcmp(DataType dt, SRegister rd, const SOperand& operand) {
6205     Vcmp(al, dt, rd, operand);
6206   }
6207 
Vcmp(Condition cond,DataType dt,DRegister rd,const DOperand & operand)6208   void Vcmp(Condition cond,
6209             DataType dt,
6210             DRegister rd,
6211             const DOperand& operand) {
6212     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6213     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6214     VIXL_ASSERT(allow_macro_instructions_);
6215     VIXL_ASSERT(OutsideITBlock());
6216     MacroEmissionCheckScope guard(this);
6217     ITScope it_scope(this, &cond, guard);
6218     vcmp(cond, dt, rd, operand);
6219   }
Vcmp(DataType dt,DRegister rd,const DOperand & operand)6220   void Vcmp(DataType dt, DRegister rd, const DOperand& operand) {
6221     Vcmp(al, dt, rd, operand);
6222   }
6223 
Vcmpe(Condition cond,DataType dt,SRegister rd,const SOperand & operand)6224   void Vcmpe(Condition cond,
6225              DataType dt,
6226              SRegister rd,
6227              const SOperand& operand) {
6228     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6229     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6230     VIXL_ASSERT(allow_macro_instructions_);
6231     VIXL_ASSERT(OutsideITBlock());
6232     MacroEmissionCheckScope guard(this);
6233     ITScope it_scope(this, &cond, guard);
6234     vcmpe(cond, dt, rd, operand);
6235   }
Vcmpe(DataType dt,SRegister rd,const SOperand & operand)6236   void Vcmpe(DataType dt, SRegister rd, const SOperand& operand) {
6237     Vcmpe(al, dt, rd, operand);
6238   }
6239 
Vcmpe(Condition cond,DataType dt,DRegister rd,const DOperand & operand)6240   void Vcmpe(Condition cond,
6241              DataType dt,
6242              DRegister rd,
6243              const DOperand& operand) {
6244     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6245     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6246     VIXL_ASSERT(allow_macro_instructions_);
6247     VIXL_ASSERT(OutsideITBlock());
6248     MacroEmissionCheckScope guard(this);
6249     ITScope it_scope(this, &cond, guard);
6250     vcmpe(cond, dt, rd, operand);
6251   }
Vcmpe(DataType dt,DRegister rd,const DOperand & operand)6252   void Vcmpe(DataType dt, DRegister rd, const DOperand& operand) {
6253     Vcmpe(al, dt, rd, operand);
6254   }
6255 
Vcnt(Condition cond,DataType dt,DRegister rd,DRegister rm)6256   void Vcnt(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6257     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6258     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6259     VIXL_ASSERT(allow_macro_instructions_);
6260     VIXL_ASSERT(OutsideITBlock());
6261     MacroEmissionCheckScope guard(this);
6262     ITScope it_scope(this, &cond, guard);
6263     vcnt(cond, dt, rd, rm);
6264   }
Vcnt(DataType dt,DRegister rd,DRegister rm)6265   void Vcnt(DataType dt, DRegister rd, DRegister rm) { Vcnt(al, dt, rd, rm); }
6266 
Vcnt(Condition cond,DataType dt,QRegister rd,QRegister rm)6267   void Vcnt(Condition cond, DataType dt, QRegister rd, QRegister rm) {
6268     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6269     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6270     VIXL_ASSERT(allow_macro_instructions_);
6271     VIXL_ASSERT(OutsideITBlock());
6272     MacroEmissionCheckScope guard(this);
6273     ITScope it_scope(this, &cond, guard);
6274     vcnt(cond, dt, rd, rm);
6275   }
Vcnt(DataType dt,QRegister rd,QRegister rm)6276   void Vcnt(DataType dt, QRegister rd, QRegister rm) { Vcnt(al, dt, rd, rm); }
6277 
Vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,SRegister rm)6278   void Vcvt(
6279       Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6280     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6281     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6282     VIXL_ASSERT(allow_macro_instructions_);
6283     VIXL_ASSERT(OutsideITBlock());
6284     MacroEmissionCheckScope guard(this);
6285     ITScope it_scope(this, &cond, guard);
6286     vcvt(cond, dt1, dt2, rd, rm);
6287   }
Vcvt(DataType dt1,DataType dt2,DRegister rd,SRegister rm)6288   void Vcvt(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6289     Vcvt(al, dt1, dt2, rd, rm);
6290   }
6291 
Vcvt(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)6292   void Vcvt(
6293       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6294     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6295     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6296     VIXL_ASSERT(allow_macro_instructions_);
6297     VIXL_ASSERT(OutsideITBlock());
6298     MacroEmissionCheckScope guard(this);
6299     ITScope it_scope(this, &cond, guard);
6300     vcvt(cond, dt1, dt2, rd, rm);
6301   }
Vcvt(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6302   void Vcvt(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6303     Vcvt(al, dt1, dt2, rd, rm);
6304   }
6305 
Vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm,int32_t fbits)6306   void Vcvt(Condition cond,
6307             DataType dt1,
6308             DataType dt2,
6309             DRegister rd,
6310             DRegister rm,
6311             int32_t fbits) {
6312     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6313     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6314     VIXL_ASSERT(allow_macro_instructions_);
6315     VIXL_ASSERT(OutsideITBlock());
6316     MacroEmissionCheckScope guard(this);
6317     ITScope it_scope(this, &cond, guard);
6318     vcvt(cond, dt1, dt2, rd, rm, fbits);
6319   }
Vcvt(DataType dt1,DataType dt2,DRegister rd,DRegister rm,int32_t fbits)6320   void Vcvt(
6321       DataType dt1, DataType dt2, DRegister rd, DRegister rm, int32_t fbits) {
6322     Vcvt(al, dt1, dt2, rd, rm, fbits);
6323   }
6324 
Vcvt(Condition cond,DataType dt1,DataType dt2,QRegister rd,QRegister rm,int32_t fbits)6325   void Vcvt(Condition cond,
6326             DataType dt1,
6327             DataType dt2,
6328             QRegister rd,
6329             QRegister rm,
6330             int32_t fbits) {
6331     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6332     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6333     VIXL_ASSERT(allow_macro_instructions_);
6334     VIXL_ASSERT(OutsideITBlock());
6335     MacroEmissionCheckScope guard(this);
6336     ITScope it_scope(this, &cond, guard);
6337     vcvt(cond, dt1, dt2, rd, rm, fbits);
6338   }
Vcvt(DataType dt1,DataType dt2,QRegister rd,QRegister rm,int32_t fbits)6339   void Vcvt(
6340       DataType dt1, DataType dt2, QRegister rd, QRegister rm, int32_t fbits) {
6341     Vcvt(al, dt1, dt2, rd, rm, fbits);
6342   }
6343 
Vcvt(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm,int32_t fbits)6344   void Vcvt(Condition cond,
6345             DataType dt1,
6346             DataType dt2,
6347             SRegister rd,
6348             SRegister rm,
6349             int32_t fbits) {
6350     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6351     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6352     VIXL_ASSERT(allow_macro_instructions_);
6353     VIXL_ASSERT(OutsideITBlock());
6354     MacroEmissionCheckScope guard(this);
6355     ITScope it_scope(this, &cond, guard);
6356     vcvt(cond, dt1, dt2, rd, rm, fbits);
6357   }
Vcvt(DataType dt1,DataType dt2,SRegister rd,SRegister rm,int32_t fbits)6358   void Vcvt(
6359       DataType dt1, DataType dt2, SRegister rd, SRegister rm, int32_t fbits) {
6360     Vcvt(al, dt1, dt2, rd, rm, fbits);
6361   }
6362 
Vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)6363   void Vcvt(
6364       Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6365     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6366     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6367     VIXL_ASSERT(allow_macro_instructions_);
6368     VIXL_ASSERT(OutsideITBlock());
6369     MacroEmissionCheckScope guard(this);
6370     ITScope it_scope(this, &cond, guard);
6371     vcvt(cond, dt1, dt2, rd, rm);
6372   }
Vcvt(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6373   void Vcvt(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6374     Vcvt(al, dt1, dt2, rd, rm);
6375   }
6376 
Vcvt(Condition cond,DataType dt1,DataType dt2,QRegister rd,QRegister rm)6377   void Vcvt(
6378       Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6379     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6380     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6381     VIXL_ASSERT(allow_macro_instructions_);
6382     VIXL_ASSERT(OutsideITBlock());
6383     MacroEmissionCheckScope guard(this);
6384     ITScope it_scope(this, &cond, guard);
6385     vcvt(cond, dt1, dt2, rd, rm);
6386   }
Vcvt(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6387   void Vcvt(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6388     Vcvt(al, dt1, dt2, rd, rm);
6389   }
6390 
Vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,QRegister rm)6391   void Vcvt(
6392       Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
6393     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6394     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6395     VIXL_ASSERT(allow_macro_instructions_);
6396     VIXL_ASSERT(OutsideITBlock());
6397     MacroEmissionCheckScope guard(this);
6398     ITScope it_scope(this, &cond, guard);
6399     vcvt(cond, dt1, dt2, rd, rm);
6400   }
Vcvt(DataType dt1,DataType dt2,DRegister rd,QRegister rm)6401   void Vcvt(DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
6402     Vcvt(al, dt1, dt2, rd, rm);
6403   }
6404 
Vcvt(Condition cond,DataType dt1,DataType dt2,QRegister rd,DRegister rm)6405   void Vcvt(
6406       Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
6407     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6408     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6409     VIXL_ASSERT(allow_macro_instructions_);
6410     VIXL_ASSERT(OutsideITBlock());
6411     MacroEmissionCheckScope guard(this);
6412     ITScope it_scope(this, &cond, guard);
6413     vcvt(cond, dt1, dt2, rd, rm);
6414   }
Vcvt(DataType dt1,DataType dt2,QRegister rd,DRegister rm)6415   void Vcvt(DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
6416     Vcvt(al, dt1, dt2, rd, rm);
6417   }
6418 
Vcvt(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6419   void Vcvt(
6420       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6421     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6422     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6423     VIXL_ASSERT(allow_macro_instructions_);
6424     VIXL_ASSERT(OutsideITBlock());
6425     MacroEmissionCheckScope guard(this);
6426     ITScope it_scope(this, &cond, guard);
6427     vcvt(cond, dt1, dt2, rd, rm);
6428   }
Vcvt(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6429   void Vcvt(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6430     Vcvt(al, dt1, dt2, rd, rm);
6431   }
6432 
Vcvta(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6433   void Vcvta(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6434     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6435     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6436     VIXL_ASSERT(allow_macro_instructions_);
6437     VIXL_ASSERT(OutsideITBlock());
6438     MacroEmissionCheckScope guard(this);
6439     vcvta(dt1, dt2, rd, rm);
6440   }
6441 
Vcvta(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6442   void Vcvta(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6443     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6444     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6445     VIXL_ASSERT(allow_macro_instructions_);
6446     VIXL_ASSERT(OutsideITBlock());
6447     MacroEmissionCheckScope guard(this);
6448     vcvta(dt1, dt2, rd, rm);
6449   }
6450 
Vcvta(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6451   void Vcvta(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6452     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6453     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6454     VIXL_ASSERT(allow_macro_instructions_);
6455     VIXL_ASSERT(OutsideITBlock());
6456     MacroEmissionCheckScope guard(this);
6457     vcvta(dt1, dt2, rd, rm);
6458   }
6459 
Vcvta(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6460   void Vcvta(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6461     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6462     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6463     VIXL_ASSERT(allow_macro_instructions_);
6464     VIXL_ASSERT(OutsideITBlock());
6465     MacroEmissionCheckScope guard(this);
6466     vcvta(dt1, dt2, rd, rm);
6467   }
6468 
Vcvtb(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6469   void Vcvtb(
6470       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6471     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6472     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6473     VIXL_ASSERT(allow_macro_instructions_);
6474     VIXL_ASSERT(OutsideITBlock());
6475     MacroEmissionCheckScope guard(this);
6476     ITScope it_scope(this, &cond, guard);
6477     vcvtb(cond, dt1, dt2, rd, rm);
6478   }
Vcvtb(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6479   void Vcvtb(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6480     Vcvtb(al, dt1, dt2, rd, rm);
6481   }
6482 
Vcvtb(Condition cond,DataType dt1,DataType dt2,DRegister rd,SRegister rm)6483   void Vcvtb(
6484       Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6485     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6486     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6487     VIXL_ASSERT(allow_macro_instructions_);
6488     VIXL_ASSERT(OutsideITBlock());
6489     MacroEmissionCheckScope guard(this);
6490     ITScope it_scope(this, &cond, guard);
6491     vcvtb(cond, dt1, dt2, rd, rm);
6492   }
Vcvtb(DataType dt1,DataType dt2,DRegister rd,SRegister rm)6493   void Vcvtb(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6494     Vcvtb(al, dt1, dt2, rd, rm);
6495   }
6496 
Vcvtb(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)6497   void Vcvtb(
6498       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6499     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6500     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6501     VIXL_ASSERT(allow_macro_instructions_);
6502     VIXL_ASSERT(OutsideITBlock());
6503     MacroEmissionCheckScope guard(this);
6504     ITScope it_scope(this, &cond, guard);
6505     vcvtb(cond, dt1, dt2, rd, rm);
6506   }
Vcvtb(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6507   void Vcvtb(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6508     Vcvtb(al, dt1, dt2, rd, rm);
6509   }
6510 
Vcvtm(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6511   void Vcvtm(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6512     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6513     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6514     VIXL_ASSERT(allow_macro_instructions_);
6515     VIXL_ASSERT(OutsideITBlock());
6516     MacroEmissionCheckScope guard(this);
6517     vcvtm(dt1, dt2, rd, rm);
6518   }
6519 
Vcvtm(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6520   void Vcvtm(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6521     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6522     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6523     VIXL_ASSERT(allow_macro_instructions_);
6524     VIXL_ASSERT(OutsideITBlock());
6525     MacroEmissionCheckScope guard(this);
6526     vcvtm(dt1, dt2, rd, rm);
6527   }
6528 
Vcvtm(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6529   void Vcvtm(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6530     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6531     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6532     VIXL_ASSERT(allow_macro_instructions_);
6533     VIXL_ASSERT(OutsideITBlock());
6534     MacroEmissionCheckScope guard(this);
6535     vcvtm(dt1, dt2, rd, rm);
6536   }
6537 
Vcvtm(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6538   void Vcvtm(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6539     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6540     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6541     VIXL_ASSERT(allow_macro_instructions_);
6542     VIXL_ASSERT(OutsideITBlock());
6543     MacroEmissionCheckScope guard(this);
6544     vcvtm(dt1, dt2, rd, rm);
6545   }
6546 
Vcvtn(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6547   void Vcvtn(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6548     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6549     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6550     VIXL_ASSERT(allow_macro_instructions_);
6551     VIXL_ASSERT(OutsideITBlock());
6552     MacroEmissionCheckScope guard(this);
6553     vcvtn(dt1, dt2, rd, rm);
6554   }
6555 
Vcvtn(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6556   void Vcvtn(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6557     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6558     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6559     VIXL_ASSERT(allow_macro_instructions_);
6560     VIXL_ASSERT(OutsideITBlock());
6561     MacroEmissionCheckScope guard(this);
6562     vcvtn(dt1, dt2, rd, rm);
6563   }
6564 
Vcvtn(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6565   void Vcvtn(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6566     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6567     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6568     VIXL_ASSERT(allow_macro_instructions_);
6569     VIXL_ASSERT(OutsideITBlock());
6570     MacroEmissionCheckScope guard(this);
6571     vcvtn(dt1, dt2, rd, rm);
6572   }
6573 
Vcvtn(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6574   void Vcvtn(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6575     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6576     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6577     VIXL_ASSERT(allow_macro_instructions_);
6578     VIXL_ASSERT(OutsideITBlock());
6579     MacroEmissionCheckScope guard(this);
6580     vcvtn(dt1, dt2, rd, rm);
6581   }
6582 
Vcvtp(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6583   void Vcvtp(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6584     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6585     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6586     VIXL_ASSERT(allow_macro_instructions_);
6587     VIXL_ASSERT(OutsideITBlock());
6588     MacroEmissionCheckScope guard(this);
6589     vcvtp(dt1, dt2, rd, rm);
6590   }
6591 
Vcvtp(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6592   void Vcvtp(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6593     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6594     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6595     VIXL_ASSERT(allow_macro_instructions_);
6596     VIXL_ASSERT(OutsideITBlock());
6597     MacroEmissionCheckScope guard(this);
6598     vcvtp(dt1, dt2, rd, rm);
6599   }
6600 
Vcvtp(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6601   void Vcvtp(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6602     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6603     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6604     VIXL_ASSERT(allow_macro_instructions_);
6605     VIXL_ASSERT(OutsideITBlock());
6606     MacroEmissionCheckScope guard(this);
6607     vcvtp(dt1, dt2, rd, rm);
6608   }
6609 
Vcvtp(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6610   void Vcvtp(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6611     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6612     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6613     VIXL_ASSERT(allow_macro_instructions_);
6614     VIXL_ASSERT(OutsideITBlock());
6615     MacroEmissionCheckScope guard(this);
6616     vcvtp(dt1, dt2, rd, rm);
6617   }
6618 
Vcvtr(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6619   void Vcvtr(
6620       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6621     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6622     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6623     VIXL_ASSERT(allow_macro_instructions_);
6624     VIXL_ASSERT(OutsideITBlock());
6625     MacroEmissionCheckScope guard(this);
6626     ITScope it_scope(this, &cond, guard);
6627     vcvtr(cond, dt1, dt2, rd, rm);
6628   }
Vcvtr(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6629   void Vcvtr(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6630     Vcvtr(al, dt1, dt2, rd, rm);
6631   }
6632 
Vcvtr(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)6633   void Vcvtr(
6634       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6635     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6636     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6637     VIXL_ASSERT(allow_macro_instructions_);
6638     VIXL_ASSERT(OutsideITBlock());
6639     MacroEmissionCheckScope guard(this);
6640     ITScope it_scope(this, &cond, guard);
6641     vcvtr(cond, dt1, dt2, rd, rm);
6642   }
Vcvtr(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6643   void Vcvtr(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6644     Vcvtr(al, dt1, dt2, rd, rm);
6645   }
6646 
Vcvtt(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6647   void Vcvtt(
6648       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6649     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6650     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6651     VIXL_ASSERT(allow_macro_instructions_);
6652     VIXL_ASSERT(OutsideITBlock());
6653     MacroEmissionCheckScope guard(this);
6654     ITScope it_scope(this, &cond, guard);
6655     vcvtt(cond, dt1, dt2, rd, rm);
6656   }
Vcvtt(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6657   void Vcvtt(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6658     Vcvtt(al, dt1, dt2, rd, rm);
6659   }
6660 
Vcvtt(Condition cond,DataType dt1,DataType dt2,DRegister rd,SRegister rm)6661   void Vcvtt(
6662       Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6663     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6664     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6665     VIXL_ASSERT(allow_macro_instructions_);
6666     VIXL_ASSERT(OutsideITBlock());
6667     MacroEmissionCheckScope guard(this);
6668     ITScope it_scope(this, &cond, guard);
6669     vcvtt(cond, dt1, dt2, rd, rm);
6670   }
Vcvtt(DataType dt1,DataType dt2,DRegister rd,SRegister rm)6671   void Vcvtt(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6672     Vcvtt(al, dt1, dt2, rd, rm);
6673   }
6674 
Vcvtt(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)6675   void Vcvtt(
6676       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6677     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6678     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6679     VIXL_ASSERT(allow_macro_instructions_);
6680     VIXL_ASSERT(OutsideITBlock());
6681     MacroEmissionCheckScope guard(this);
6682     ITScope it_scope(this, &cond, guard);
6683     vcvtt(cond, dt1, dt2, rd, rm);
6684   }
Vcvtt(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6685   void Vcvtt(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6686     Vcvtt(al, dt1, dt2, rd, rm);
6687   }
6688 
Vdiv(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6689   void Vdiv(
6690       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6691     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6692     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6693     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6694     VIXL_ASSERT(allow_macro_instructions_);
6695     VIXL_ASSERT(OutsideITBlock());
6696     MacroEmissionCheckScope guard(this);
6697     ITScope it_scope(this, &cond, guard);
6698     vdiv(cond, dt, rd, rn, rm);
6699   }
Vdiv(DataType dt,SRegister rd,SRegister rn,SRegister rm)6700   void Vdiv(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6701     Vdiv(al, dt, rd, rn, rm);
6702   }
6703 
Vdiv(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6704   void Vdiv(
6705       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6706     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6707     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6708     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6709     VIXL_ASSERT(allow_macro_instructions_);
6710     VIXL_ASSERT(OutsideITBlock());
6711     MacroEmissionCheckScope guard(this);
6712     ITScope it_scope(this, &cond, guard);
6713     vdiv(cond, dt, rd, rn, rm);
6714   }
Vdiv(DataType dt,DRegister rd,DRegister rn,DRegister rm)6715   void Vdiv(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6716     Vdiv(al, dt, rd, rn, rm);
6717   }
6718 
Vdup(Condition cond,DataType dt,QRegister rd,Register rt)6719   void Vdup(Condition cond, DataType dt, QRegister rd, Register rt) {
6720     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6721     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
6722     VIXL_ASSERT(allow_macro_instructions_);
6723     VIXL_ASSERT(OutsideITBlock());
6724     MacroEmissionCheckScope guard(this);
6725     ITScope it_scope(this, &cond, guard);
6726     vdup(cond, dt, rd, rt);
6727   }
Vdup(DataType dt,QRegister rd,Register rt)6728   void Vdup(DataType dt, QRegister rd, Register rt) { Vdup(al, dt, rd, rt); }
6729 
Vdup(Condition cond,DataType dt,DRegister rd,Register rt)6730   void Vdup(Condition cond, DataType dt, DRegister rd, Register rt) {
6731     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6732     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
6733     VIXL_ASSERT(allow_macro_instructions_);
6734     VIXL_ASSERT(OutsideITBlock());
6735     MacroEmissionCheckScope guard(this);
6736     ITScope it_scope(this, &cond, guard);
6737     vdup(cond, dt, rd, rt);
6738   }
Vdup(DataType dt,DRegister rd,Register rt)6739   void Vdup(DataType dt, DRegister rd, Register rt) { Vdup(al, dt, rd, rt); }
6740 
Vdup(Condition cond,DataType dt,DRegister rd,DRegisterLane rm)6741   void Vdup(Condition cond, DataType dt, DRegister rd, DRegisterLane rm) {
6742     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6743     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6744     VIXL_ASSERT(allow_macro_instructions_);
6745     VIXL_ASSERT(OutsideITBlock());
6746     MacroEmissionCheckScope guard(this);
6747     ITScope it_scope(this, &cond, guard);
6748     vdup(cond, dt, rd, rm);
6749   }
Vdup(DataType dt,DRegister rd,DRegisterLane rm)6750   void Vdup(DataType dt, DRegister rd, DRegisterLane rm) {
6751     Vdup(al, dt, rd, rm);
6752   }
6753 
Vdup(Condition cond,DataType dt,QRegister rd,DRegisterLane rm)6754   void Vdup(Condition cond, DataType dt, QRegister rd, DRegisterLane rm) {
6755     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6756     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6757     VIXL_ASSERT(allow_macro_instructions_);
6758     VIXL_ASSERT(OutsideITBlock());
6759     MacroEmissionCheckScope guard(this);
6760     ITScope it_scope(this, &cond, guard);
6761     vdup(cond, dt, rd, rm);
6762   }
Vdup(DataType dt,QRegister rd,DRegisterLane rm)6763   void Vdup(DataType dt, QRegister rd, DRegisterLane rm) {
6764     Vdup(al, dt, rd, rm);
6765   }
6766 
Veor(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6767   void Veor(
6768       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6769     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6770     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6771     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6772     VIXL_ASSERT(allow_macro_instructions_);
6773     VIXL_ASSERT(OutsideITBlock());
6774     MacroEmissionCheckScope guard(this);
6775     ITScope it_scope(this, &cond, guard);
6776     veor(cond, dt, rd, rn, rm);
6777   }
Veor(DataType dt,DRegister rd,DRegister rn,DRegister rm)6778   void Veor(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6779     Veor(al, dt, rd, rn, rm);
6780   }
Veor(Condition cond,DRegister rd,DRegister rn,DRegister rm)6781   void Veor(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
6782     Veor(cond, kDataTypeValueNone, rd, rn, rm);
6783   }
Veor(DRegister rd,DRegister rn,DRegister rm)6784   void Veor(DRegister rd, DRegister rn, DRegister rm) {
6785     Veor(al, kDataTypeValueNone, rd, rn, rm);
6786   }
6787 
Veor(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6788   void Veor(
6789       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6790     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6791     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6792     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6793     VIXL_ASSERT(allow_macro_instructions_);
6794     VIXL_ASSERT(OutsideITBlock());
6795     MacroEmissionCheckScope guard(this);
6796     ITScope it_scope(this, &cond, guard);
6797     veor(cond, dt, rd, rn, rm);
6798   }
Veor(DataType dt,QRegister rd,QRegister rn,QRegister rm)6799   void Veor(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6800     Veor(al, dt, rd, rn, rm);
6801   }
Veor(Condition cond,QRegister rd,QRegister rn,QRegister rm)6802   void Veor(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
6803     Veor(cond, kDataTypeValueNone, rd, rn, rm);
6804   }
Veor(QRegister rd,QRegister rn,QRegister rm)6805   void Veor(QRegister rd, QRegister rn, QRegister rm) {
6806     Veor(al, kDataTypeValueNone, rd, rn, rm);
6807   }
6808 
Vext(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm,const DOperand & operand)6809   void Vext(Condition cond,
6810             DataType dt,
6811             DRegister rd,
6812             DRegister rn,
6813             DRegister rm,
6814             const DOperand& operand) {
6815     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6816     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6817     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6818     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6819     VIXL_ASSERT(allow_macro_instructions_);
6820     VIXL_ASSERT(OutsideITBlock());
6821     MacroEmissionCheckScope guard(this);
6822     ITScope it_scope(this, &cond, guard);
6823     vext(cond, dt, rd, rn, rm, operand);
6824   }
Vext(DataType dt,DRegister rd,DRegister rn,DRegister rm,const DOperand & operand)6825   void Vext(DataType dt,
6826             DRegister rd,
6827             DRegister rn,
6828             DRegister rm,
6829             const DOperand& operand) {
6830     Vext(al, dt, rd, rn, rm, operand);
6831   }
6832 
Vext(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm,const QOperand & operand)6833   void Vext(Condition cond,
6834             DataType dt,
6835             QRegister rd,
6836             QRegister rn,
6837             QRegister rm,
6838             const QOperand& operand) {
6839     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6840     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6841     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6842     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6843     VIXL_ASSERT(allow_macro_instructions_);
6844     VIXL_ASSERT(OutsideITBlock());
6845     MacroEmissionCheckScope guard(this);
6846     ITScope it_scope(this, &cond, guard);
6847     vext(cond, dt, rd, rn, rm, operand);
6848   }
Vext(DataType dt,QRegister rd,QRegister rn,QRegister rm,const QOperand & operand)6849   void Vext(DataType dt,
6850             QRegister rd,
6851             QRegister rn,
6852             QRegister rm,
6853             const QOperand& operand) {
6854     Vext(al, dt, rd, rn, rm, operand);
6855   }
6856 
Vfma(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6857   void Vfma(
6858       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6859     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6860     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6861     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6862     VIXL_ASSERT(allow_macro_instructions_);
6863     VIXL_ASSERT(OutsideITBlock());
6864     MacroEmissionCheckScope guard(this);
6865     ITScope it_scope(this, &cond, guard);
6866     vfma(cond, dt, rd, rn, rm);
6867   }
Vfma(DataType dt,DRegister rd,DRegister rn,DRegister rm)6868   void Vfma(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6869     Vfma(al, dt, rd, rn, rm);
6870   }
6871 
Vfma(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6872   void Vfma(
6873       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6874     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6875     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6876     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6877     VIXL_ASSERT(allow_macro_instructions_);
6878     VIXL_ASSERT(OutsideITBlock());
6879     MacroEmissionCheckScope guard(this);
6880     ITScope it_scope(this, &cond, guard);
6881     vfma(cond, dt, rd, rn, rm);
6882   }
Vfma(DataType dt,QRegister rd,QRegister rn,QRegister rm)6883   void Vfma(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6884     Vfma(al, dt, rd, rn, rm);
6885   }
6886 
Vfma(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6887   void Vfma(
6888       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6889     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6890     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6891     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6892     VIXL_ASSERT(allow_macro_instructions_);
6893     VIXL_ASSERT(OutsideITBlock());
6894     MacroEmissionCheckScope guard(this);
6895     ITScope it_scope(this, &cond, guard);
6896     vfma(cond, dt, rd, rn, rm);
6897   }
Vfma(DataType dt,SRegister rd,SRegister rn,SRegister rm)6898   void Vfma(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6899     Vfma(al, dt, rd, rn, rm);
6900   }
6901 
Vfms(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6902   void Vfms(
6903       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6904     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6905     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6906     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6907     VIXL_ASSERT(allow_macro_instructions_);
6908     VIXL_ASSERT(OutsideITBlock());
6909     MacroEmissionCheckScope guard(this);
6910     ITScope it_scope(this, &cond, guard);
6911     vfms(cond, dt, rd, rn, rm);
6912   }
Vfms(DataType dt,DRegister rd,DRegister rn,DRegister rm)6913   void Vfms(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6914     Vfms(al, dt, rd, rn, rm);
6915   }
6916 
Vfms(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6917   void Vfms(
6918       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6919     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6920     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6921     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6922     VIXL_ASSERT(allow_macro_instructions_);
6923     VIXL_ASSERT(OutsideITBlock());
6924     MacroEmissionCheckScope guard(this);
6925     ITScope it_scope(this, &cond, guard);
6926     vfms(cond, dt, rd, rn, rm);
6927   }
Vfms(DataType dt,QRegister rd,QRegister rn,QRegister rm)6928   void Vfms(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6929     Vfms(al, dt, rd, rn, rm);
6930   }
6931 
Vfms(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6932   void Vfms(
6933       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6934     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6935     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6936     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6937     VIXL_ASSERT(allow_macro_instructions_);
6938     VIXL_ASSERT(OutsideITBlock());
6939     MacroEmissionCheckScope guard(this);
6940     ITScope it_scope(this, &cond, guard);
6941     vfms(cond, dt, rd, rn, rm);
6942   }
Vfms(DataType dt,SRegister rd,SRegister rn,SRegister rm)6943   void Vfms(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6944     Vfms(al, dt, rd, rn, rm);
6945   }
6946 
Vfnma(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6947   void Vfnma(
6948       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6949     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6950     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6951     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6952     VIXL_ASSERT(allow_macro_instructions_);
6953     VIXL_ASSERT(OutsideITBlock());
6954     MacroEmissionCheckScope guard(this);
6955     ITScope it_scope(this, &cond, guard);
6956     vfnma(cond, dt, rd, rn, rm);
6957   }
Vfnma(DataType dt,SRegister rd,SRegister rn,SRegister rm)6958   void Vfnma(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6959     Vfnma(al, dt, rd, rn, rm);
6960   }
6961 
Vfnma(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6962   void Vfnma(
6963       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6964     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6965     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6966     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6967     VIXL_ASSERT(allow_macro_instructions_);
6968     VIXL_ASSERT(OutsideITBlock());
6969     MacroEmissionCheckScope guard(this);
6970     ITScope it_scope(this, &cond, guard);
6971     vfnma(cond, dt, rd, rn, rm);
6972   }
Vfnma(DataType dt,DRegister rd,DRegister rn,DRegister rm)6973   void Vfnma(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6974     Vfnma(al, dt, rd, rn, rm);
6975   }
6976 
Vfnms(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6977   void Vfnms(
6978       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6979     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6980     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6981     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6982     VIXL_ASSERT(allow_macro_instructions_);
6983     VIXL_ASSERT(OutsideITBlock());
6984     MacroEmissionCheckScope guard(this);
6985     ITScope it_scope(this, &cond, guard);
6986     vfnms(cond, dt, rd, rn, rm);
6987   }
Vfnms(DataType dt,SRegister rd,SRegister rn,SRegister rm)6988   void Vfnms(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6989     Vfnms(al, dt, rd, rn, rm);
6990   }
6991 
Vfnms(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6992   void Vfnms(
6993       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6994     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6995     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6996     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6997     VIXL_ASSERT(allow_macro_instructions_);
6998     VIXL_ASSERT(OutsideITBlock());
6999     MacroEmissionCheckScope guard(this);
7000     ITScope it_scope(this, &cond, guard);
7001     vfnms(cond, dt, rd, rn, rm);
7002   }
Vfnms(DataType dt,DRegister rd,DRegister rn,DRegister rm)7003   void Vfnms(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7004     Vfnms(al, dt, rd, rn, rm);
7005   }
7006 
Vhadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7007   void Vhadd(
7008       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7009     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7010     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7011     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7012     VIXL_ASSERT(allow_macro_instructions_);
7013     VIXL_ASSERT(OutsideITBlock());
7014     MacroEmissionCheckScope guard(this);
7015     ITScope it_scope(this, &cond, guard);
7016     vhadd(cond, dt, rd, rn, rm);
7017   }
Vhadd(DataType dt,DRegister rd,DRegister rn,DRegister rm)7018   void Vhadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7019     Vhadd(al, dt, rd, rn, rm);
7020   }
7021 
Vhadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7022   void Vhadd(
7023       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7024     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7025     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7026     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7027     VIXL_ASSERT(allow_macro_instructions_);
7028     VIXL_ASSERT(OutsideITBlock());
7029     MacroEmissionCheckScope guard(this);
7030     ITScope it_scope(this, &cond, guard);
7031     vhadd(cond, dt, rd, rn, rm);
7032   }
Vhadd(DataType dt,QRegister rd,QRegister rn,QRegister rm)7033   void Vhadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7034     Vhadd(al, dt, rd, rn, rm);
7035   }
7036 
Vhsub(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7037   void Vhsub(
7038       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7039     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7040     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7041     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7042     VIXL_ASSERT(allow_macro_instructions_);
7043     VIXL_ASSERT(OutsideITBlock());
7044     MacroEmissionCheckScope guard(this);
7045     ITScope it_scope(this, &cond, guard);
7046     vhsub(cond, dt, rd, rn, rm);
7047   }
Vhsub(DataType dt,DRegister rd,DRegister rn,DRegister rm)7048   void Vhsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7049     Vhsub(al, dt, rd, rn, rm);
7050   }
7051 
Vhsub(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7052   void Vhsub(
7053       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7054     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7055     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7056     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7057     VIXL_ASSERT(allow_macro_instructions_);
7058     VIXL_ASSERT(OutsideITBlock());
7059     MacroEmissionCheckScope guard(this);
7060     ITScope it_scope(this, &cond, guard);
7061     vhsub(cond, dt, rd, rn, rm);
7062   }
Vhsub(DataType dt,QRegister rd,QRegister rn,QRegister rm)7063   void Vhsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7064     Vhsub(al, dt, rd, rn, rm);
7065   }
7066 
Vld1(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7067   void Vld1(Condition cond,
7068             DataType dt,
7069             const NeonRegisterList& nreglist,
7070             const AlignedMemOperand& operand) {
7071     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7072     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7073     VIXL_ASSERT(allow_macro_instructions_);
7074     VIXL_ASSERT(OutsideITBlock());
7075     MacroEmissionCheckScope guard(this);
7076     ITScope it_scope(this, &cond, guard);
7077     vld1(cond, dt, nreglist, operand);
7078   }
Vld1(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7079   void Vld1(DataType dt,
7080             const NeonRegisterList& nreglist,
7081             const AlignedMemOperand& operand) {
7082     Vld1(al, dt, nreglist, operand);
7083   }
7084 
Vld2(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7085   void Vld2(Condition cond,
7086             DataType dt,
7087             const NeonRegisterList& nreglist,
7088             const AlignedMemOperand& operand) {
7089     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7090     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7091     VIXL_ASSERT(allow_macro_instructions_);
7092     VIXL_ASSERT(OutsideITBlock());
7093     MacroEmissionCheckScope guard(this);
7094     ITScope it_scope(this, &cond, guard);
7095     vld2(cond, dt, nreglist, operand);
7096   }
Vld2(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7097   void Vld2(DataType dt,
7098             const NeonRegisterList& nreglist,
7099             const AlignedMemOperand& operand) {
7100     Vld2(al, dt, nreglist, operand);
7101   }
7102 
Vld3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7103   void Vld3(Condition cond,
7104             DataType dt,
7105             const NeonRegisterList& nreglist,
7106             const AlignedMemOperand& operand) {
7107     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7108     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7109     VIXL_ASSERT(allow_macro_instructions_);
7110     VIXL_ASSERT(OutsideITBlock());
7111     MacroEmissionCheckScope guard(this);
7112     ITScope it_scope(this, &cond, guard);
7113     vld3(cond, dt, nreglist, operand);
7114   }
Vld3(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7115   void Vld3(DataType dt,
7116             const NeonRegisterList& nreglist,
7117             const AlignedMemOperand& operand) {
7118     Vld3(al, dt, nreglist, operand);
7119   }
7120 
Vld3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)7121   void Vld3(Condition cond,
7122             DataType dt,
7123             const NeonRegisterList& nreglist,
7124             const MemOperand& operand) {
7125     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7126     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7127     VIXL_ASSERT(allow_macro_instructions_);
7128     VIXL_ASSERT(OutsideITBlock());
7129     MacroEmissionCheckScope guard(this);
7130     ITScope it_scope(this, &cond, guard);
7131     vld3(cond, dt, nreglist, operand);
7132   }
Vld3(DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)7133   void Vld3(DataType dt,
7134             const NeonRegisterList& nreglist,
7135             const MemOperand& operand) {
7136     Vld3(al, dt, nreglist, operand);
7137   }
7138 
Vld4(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7139   void Vld4(Condition cond,
7140             DataType dt,
7141             const NeonRegisterList& nreglist,
7142             const AlignedMemOperand& operand) {
7143     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7144     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7145     VIXL_ASSERT(allow_macro_instructions_);
7146     VIXL_ASSERT(OutsideITBlock());
7147     MacroEmissionCheckScope guard(this);
7148     ITScope it_scope(this, &cond, guard);
7149     vld4(cond, dt, nreglist, operand);
7150   }
Vld4(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7151   void Vld4(DataType dt,
7152             const NeonRegisterList& nreglist,
7153             const AlignedMemOperand& operand) {
7154     Vld4(al, dt, nreglist, operand);
7155   }
7156 
Vldm(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7157   void Vldm(Condition cond,
7158             DataType dt,
7159             Register rn,
7160             WriteBack write_back,
7161             DRegisterList dreglist) {
7162     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7163     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
7164     VIXL_ASSERT(allow_macro_instructions_);
7165     VIXL_ASSERT(OutsideITBlock());
7166     MacroEmissionCheckScope guard(this);
7167     ITScope it_scope(this, &cond, guard);
7168     vldm(cond, dt, rn, write_back, dreglist);
7169   }
Vldm(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7170   void Vldm(DataType dt,
7171             Register rn,
7172             WriteBack write_back,
7173             DRegisterList dreglist) {
7174     Vldm(al, dt, rn, write_back, dreglist);
7175   }
Vldm(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)7176   void Vldm(Condition cond,
7177             Register rn,
7178             WriteBack write_back,
7179             DRegisterList dreglist) {
7180     Vldm(cond, kDataTypeValueNone, rn, write_back, dreglist);
7181   }
Vldm(Register rn,WriteBack write_back,DRegisterList dreglist)7182   void Vldm(Register rn, WriteBack write_back, DRegisterList dreglist) {
7183     Vldm(al, kDataTypeValueNone, rn, write_back, dreglist);
7184   }
7185 
Vldm(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7186   void Vldm(Condition cond,
7187             DataType dt,
7188             Register rn,
7189             WriteBack write_back,
7190             SRegisterList sreglist) {
7191     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7192     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
7193     VIXL_ASSERT(allow_macro_instructions_);
7194     VIXL_ASSERT(OutsideITBlock());
7195     MacroEmissionCheckScope guard(this);
7196     ITScope it_scope(this, &cond, guard);
7197     vldm(cond, dt, rn, write_back, sreglist);
7198   }
Vldm(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7199   void Vldm(DataType dt,
7200             Register rn,
7201             WriteBack write_back,
7202             SRegisterList sreglist) {
7203     Vldm(al, dt, rn, write_back, sreglist);
7204   }
Vldm(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)7205   void Vldm(Condition cond,
7206             Register rn,
7207             WriteBack write_back,
7208             SRegisterList sreglist) {
7209     Vldm(cond, kDataTypeValueNone, rn, write_back, sreglist);
7210   }
Vldm(Register rn,WriteBack write_back,SRegisterList sreglist)7211   void Vldm(Register rn, WriteBack write_back, SRegisterList sreglist) {
7212     Vldm(al, kDataTypeValueNone, rn, write_back, sreglist);
7213   }
7214 
Vldmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7215   void Vldmdb(Condition cond,
7216               DataType dt,
7217               Register rn,
7218               WriteBack write_back,
7219               DRegisterList dreglist) {
7220     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7221     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
7222     VIXL_ASSERT(allow_macro_instructions_);
7223     VIXL_ASSERT(OutsideITBlock());
7224     MacroEmissionCheckScope guard(this);
7225     ITScope it_scope(this, &cond, guard);
7226     vldmdb(cond, dt, rn, write_back, dreglist);
7227   }
Vldmdb(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7228   void Vldmdb(DataType dt,
7229               Register rn,
7230               WriteBack write_back,
7231               DRegisterList dreglist) {
7232     Vldmdb(al, dt, rn, write_back, dreglist);
7233   }
Vldmdb(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)7234   void Vldmdb(Condition cond,
7235               Register rn,
7236               WriteBack write_back,
7237               DRegisterList dreglist) {
7238     Vldmdb(cond, kDataTypeValueNone, rn, write_back, dreglist);
7239   }
Vldmdb(Register rn,WriteBack write_back,DRegisterList dreglist)7240   void Vldmdb(Register rn, WriteBack write_back, DRegisterList dreglist) {
7241     Vldmdb(al, kDataTypeValueNone, rn, write_back, dreglist);
7242   }
7243 
Vldmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7244   void Vldmdb(Condition cond,
7245               DataType dt,
7246               Register rn,
7247               WriteBack write_back,
7248               SRegisterList sreglist) {
7249     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7250     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
7251     VIXL_ASSERT(allow_macro_instructions_);
7252     VIXL_ASSERT(OutsideITBlock());
7253     MacroEmissionCheckScope guard(this);
7254     ITScope it_scope(this, &cond, guard);
7255     vldmdb(cond, dt, rn, write_back, sreglist);
7256   }
Vldmdb(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7257   void Vldmdb(DataType dt,
7258               Register rn,
7259               WriteBack write_back,
7260               SRegisterList sreglist) {
7261     Vldmdb(al, dt, rn, write_back, sreglist);
7262   }
Vldmdb(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)7263   void Vldmdb(Condition cond,
7264               Register rn,
7265               WriteBack write_back,
7266               SRegisterList sreglist) {
7267     Vldmdb(cond, kDataTypeValueNone, rn, write_back, sreglist);
7268   }
Vldmdb(Register rn,WriteBack write_back,SRegisterList sreglist)7269   void Vldmdb(Register rn, WriteBack write_back, SRegisterList sreglist) {
7270     Vldmdb(al, kDataTypeValueNone, rn, write_back, sreglist);
7271   }
7272 
Vldmia(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7273   void Vldmia(Condition cond,
7274               DataType dt,
7275               Register rn,
7276               WriteBack write_back,
7277               DRegisterList dreglist) {
7278     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7279     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
7280     VIXL_ASSERT(allow_macro_instructions_);
7281     VIXL_ASSERT(OutsideITBlock());
7282     MacroEmissionCheckScope guard(this);
7283     ITScope it_scope(this, &cond, guard);
7284     vldmia(cond, dt, rn, write_back, dreglist);
7285   }
Vldmia(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7286   void Vldmia(DataType dt,
7287               Register rn,
7288               WriteBack write_back,
7289               DRegisterList dreglist) {
7290     Vldmia(al, dt, rn, write_back, dreglist);
7291   }
Vldmia(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)7292   void Vldmia(Condition cond,
7293               Register rn,
7294               WriteBack write_back,
7295               DRegisterList dreglist) {
7296     Vldmia(cond, kDataTypeValueNone, rn, write_back, dreglist);
7297   }
Vldmia(Register rn,WriteBack write_back,DRegisterList dreglist)7298   void Vldmia(Register rn, WriteBack write_back, DRegisterList dreglist) {
7299     Vldmia(al, kDataTypeValueNone, rn, write_back, dreglist);
7300   }
7301 
Vldmia(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7302   void Vldmia(Condition cond,
7303               DataType dt,
7304               Register rn,
7305               WriteBack write_back,
7306               SRegisterList sreglist) {
7307     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7308     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
7309     VIXL_ASSERT(allow_macro_instructions_);
7310     VIXL_ASSERT(OutsideITBlock());
7311     MacroEmissionCheckScope guard(this);
7312     ITScope it_scope(this, &cond, guard);
7313     vldmia(cond, dt, rn, write_back, sreglist);
7314   }
Vldmia(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7315   void Vldmia(DataType dt,
7316               Register rn,
7317               WriteBack write_back,
7318               SRegisterList sreglist) {
7319     Vldmia(al, dt, rn, write_back, sreglist);
7320   }
Vldmia(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)7321   void Vldmia(Condition cond,
7322               Register rn,
7323               WriteBack write_back,
7324               SRegisterList sreglist) {
7325     Vldmia(cond, kDataTypeValueNone, rn, write_back, sreglist);
7326   }
Vldmia(Register rn,WriteBack write_back,SRegisterList sreglist)7327   void Vldmia(Register rn, WriteBack write_back, SRegisterList sreglist) {
7328     Vldmia(al, kDataTypeValueNone, rn, write_back, sreglist);
7329   }
7330 
7331 
Vldr(Condition cond,DataType dt,DRegister rd,const MemOperand & operand)7332   void Vldr(Condition cond,
7333             DataType dt,
7334             DRegister rd,
7335             const MemOperand& operand) {
7336     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7337     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7338     VIXL_ASSERT(allow_macro_instructions_);
7339     VIXL_ASSERT(OutsideITBlock());
7340     MacroEmissionCheckScope guard(this);
7341     ITScope it_scope(this, &cond, guard);
7342     vldr(cond, dt, rd, operand);
7343   }
Vldr(DataType dt,DRegister rd,const MemOperand & operand)7344   void Vldr(DataType dt, DRegister rd, const MemOperand& operand) {
7345     Vldr(al, dt, rd, operand);
7346   }
Vldr(Condition cond,DRegister rd,const MemOperand & operand)7347   void Vldr(Condition cond, DRegister rd, const MemOperand& operand) {
7348     Vldr(cond, Untyped64, rd, operand);
7349   }
Vldr(DRegister rd,const MemOperand & operand)7350   void Vldr(DRegister rd, const MemOperand& operand) {
7351     Vldr(al, Untyped64, rd, operand);
7352   }
7353 
7354 
Vldr(Condition cond,DataType dt,SRegister rd,const MemOperand & operand)7355   void Vldr(Condition cond,
7356             DataType dt,
7357             SRegister rd,
7358             const MemOperand& operand) {
7359     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7360     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7361     VIXL_ASSERT(allow_macro_instructions_);
7362     VIXL_ASSERT(OutsideITBlock());
7363     MacroEmissionCheckScope guard(this);
7364     ITScope it_scope(this, &cond, guard);
7365     vldr(cond, dt, rd, operand);
7366   }
Vldr(DataType dt,SRegister rd,const MemOperand & operand)7367   void Vldr(DataType dt, SRegister rd, const MemOperand& operand) {
7368     Vldr(al, dt, rd, operand);
7369   }
Vldr(Condition cond,SRegister rd,const MemOperand & operand)7370   void Vldr(Condition cond, SRegister rd, const MemOperand& operand) {
7371     Vldr(cond, Untyped32, rd, operand);
7372   }
Vldr(SRegister rd,const MemOperand & operand)7373   void Vldr(SRegister rd, const MemOperand& operand) {
7374     Vldr(al, Untyped32, rd, operand);
7375   }
7376 
Vmax(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7377   void Vmax(
7378       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7379     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7380     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7381     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7382     VIXL_ASSERT(allow_macro_instructions_);
7383     VIXL_ASSERT(OutsideITBlock());
7384     MacroEmissionCheckScope guard(this);
7385     ITScope it_scope(this, &cond, guard);
7386     vmax(cond, dt, rd, rn, rm);
7387   }
Vmax(DataType dt,DRegister rd,DRegister rn,DRegister rm)7388   void Vmax(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7389     Vmax(al, dt, rd, rn, rm);
7390   }
7391 
Vmax(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7392   void Vmax(
7393       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7394     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7395     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7396     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7397     VIXL_ASSERT(allow_macro_instructions_);
7398     VIXL_ASSERT(OutsideITBlock());
7399     MacroEmissionCheckScope guard(this);
7400     ITScope it_scope(this, &cond, guard);
7401     vmax(cond, dt, rd, rn, rm);
7402   }
Vmax(DataType dt,QRegister rd,QRegister rn,QRegister rm)7403   void Vmax(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7404     Vmax(al, dt, rd, rn, rm);
7405   }
7406 
Vmaxnm(DataType dt,DRegister rd,DRegister rn,DRegister rm)7407   void Vmaxnm(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7408     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7409     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7410     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7411     VIXL_ASSERT(allow_macro_instructions_);
7412     VIXL_ASSERT(OutsideITBlock());
7413     MacroEmissionCheckScope guard(this);
7414     vmaxnm(dt, rd, rn, rm);
7415   }
7416 
Vmaxnm(DataType dt,QRegister rd,QRegister rn,QRegister rm)7417   void Vmaxnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7418     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7419     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7420     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7421     VIXL_ASSERT(allow_macro_instructions_);
7422     VIXL_ASSERT(OutsideITBlock());
7423     MacroEmissionCheckScope guard(this);
7424     vmaxnm(dt, rd, rn, rm);
7425   }
7426 
Vmaxnm(DataType dt,SRegister rd,SRegister rn,SRegister rm)7427   void Vmaxnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7428     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7429     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7430     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7431     VIXL_ASSERT(allow_macro_instructions_);
7432     VIXL_ASSERT(OutsideITBlock());
7433     MacroEmissionCheckScope guard(this);
7434     vmaxnm(dt, rd, rn, rm);
7435   }
7436 
Vmin(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7437   void Vmin(
7438       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7439     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7440     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7441     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7442     VIXL_ASSERT(allow_macro_instructions_);
7443     VIXL_ASSERT(OutsideITBlock());
7444     MacroEmissionCheckScope guard(this);
7445     ITScope it_scope(this, &cond, guard);
7446     vmin(cond, dt, rd, rn, rm);
7447   }
Vmin(DataType dt,DRegister rd,DRegister rn,DRegister rm)7448   void Vmin(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7449     Vmin(al, dt, rd, rn, rm);
7450   }
7451 
Vmin(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7452   void Vmin(
7453       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7454     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7455     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7456     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7457     VIXL_ASSERT(allow_macro_instructions_);
7458     VIXL_ASSERT(OutsideITBlock());
7459     MacroEmissionCheckScope guard(this);
7460     ITScope it_scope(this, &cond, guard);
7461     vmin(cond, dt, rd, rn, rm);
7462   }
Vmin(DataType dt,QRegister rd,QRegister rn,QRegister rm)7463   void Vmin(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7464     Vmin(al, dt, rd, rn, rm);
7465   }
7466 
Vminnm(DataType dt,DRegister rd,DRegister rn,DRegister rm)7467   void Vminnm(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7468     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7469     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7470     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7471     VIXL_ASSERT(allow_macro_instructions_);
7472     VIXL_ASSERT(OutsideITBlock());
7473     MacroEmissionCheckScope guard(this);
7474     vminnm(dt, rd, rn, rm);
7475   }
7476 
Vminnm(DataType dt,QRegister rd,QRegister rn,QRegister rm)7477   void Vminnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7478     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7479     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7480     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7481     VIXL_ASSERT(allow_macro_instructions_);
7482     VIXL_ASSERT(OutsideITBlock());
7483     MacroEmissionCheckScope guard(this);
7484     vminnm(dt, rd, rn, rm);
7485   }
7486 
Vminnm(DataType dt,SRegister rd,SRegister rn,SRegister rm)7487   void Vminnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7488     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7489     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7490     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7491     VIXL_ASSERT(allow_macro_instructions_);
7492     VIXL_ASSERT(OutsideITBlock());
7493     MacroEmissionCheckScope guard(this);
7494     vminnm(dt, rd, rn, rm);
7495   }
7496 
Vmla(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)7497   void Vmla(Condition cond,
7498             DataType dt,
7499             DRegister rd,
7500             DRegister rn,
7501             DRegisterLane rm) {
7502     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7503     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7504     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7505     VIXL_ASSERT(allow_macro_instructions_);
7506     VIXL_ASSERT(OutsideITBlock());
7507     MacroEmissionCheckScope guard(this);
7508     ITScope it_scope(this, &cond, guard);
7509     vmla(cond, dt, rd, rn, rm);
7510   }
Vmla(DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)7511   void Vmla(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
7512     Vmla(al, dt, rd, rn, rm);
7513   }
7514 
Vmla(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)7515   void Vmla(Condition cond,
7516             DataType dt,
7517             QRegister rd,
7518             QRegister rn,
7519             DRegisterLane rm) {
7520     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7521     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7522     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7523     VIXL_ASSERT(allow_macro_instructions_);
7524     VIXL_ASSERT(OutsideITBlock());
7525     MacroEmissionCheckScope guard(this);
7526     ITScope it_scope(this, &cond, guard);
7527     vmla(cond, dt, rd, rn, rm);
7528   }
Vmla(DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)7529   void Vmla(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
7530     Vmla(al, dt, rd, rn, rm);
7531   }
7532 
Vmla(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7533   void Vmla(
7534       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7535     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7536     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7537     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7538     VIXL_ASSERT(allow_macro_instructions_);
7539     VIXL_ASSERT(OutsideITBlock());
7540     MacroEmissionCheckScope guard(this);
7541     ITScope it_scope(this, &cond, guard);
7542     vmla(cond, dt, rd, rn, rm);
7543   }
Vmla(DataType dt,DRegister rd,DRegister rn,DRegister rm)7544   void Vmla(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7545     Vmla(al, dt, rd, rn, rm);
7546   }
7547 
Vmla(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7548   void Vmla(
7549       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7550     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7551     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7552     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7553     VIXL_ASSERT(allow_macro_instructions_);
7554     VIXL_ASSERT(OutsideITBlock());
7555     MacroEmissionCheckScope guard(this);
7556     ITScope it_scope(this, &cond, guard);
7557     vmla(cond, dt, rd, rn, rm);
7558   }
Vmla(DataType dt,QRegister rd,QRegister rn,QRegister rm)7559   void Vmla(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7560     Vmla(al, dt, rd, rn, rm);
7561   }
7562 
Vmla(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)7563   void Vmla(
7564       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7565     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7566     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7567     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7568     VIXL_ASSERT(allow_macro_instructions_);
7569     VIXL_ASSERT(OutsideITBlock());
7570     MacroEmissionCheckScope guard(this);
7571     ITScope it_scope(this, &cond, guard);
7572     vmla(cond, dt, rd, rn, rm);
7573   }
Vmla(DataType dt,SRegister rd,SRegister rn,SRegister rm)7574   void Vmla(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7575     Vmla(al, dt, rd, rn, rm);
7576   }
7577 
Vmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)7578   void Vmlal(Condition cond,
7579              DataType dt,
7580              QRegister rd,
7581              DRegister rn,
7582              DRegisterLane rm) {
7583     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7584     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7585     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7586     VIXL_ASSERT(allow_macro_instructions_);
7587     VIXL_ASSERT(OutsideITBlock());
7588     MacroEmissionCheckScope guard(this);
7589     ITScope it_scope(this, &cond, guard);
7590     vmlal(cond, dt, rd, rn, rm);
7591   }
Vmlal(DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)7592   void Vmlal(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
7593     Vmlal(al, dt, rd, rn, rm);
7594   }
7595 
Vmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)7596   void Vmlal(
7597       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7598     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7599     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7600     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7601     VIXL_ASSERT(allow_macro_instructions_);
7602     VIXL_ASSERT(OutsideITBlock());
7603     MacroEmissionCheckScope guard(this);
7604     ITScope it_scope(this, &cond, guard);
7605     vmlal(cond, dt, rd, rn, rm);
7606   }
Vmlal(DataType dt,QRegister rd,DRegister rn,DRegister rm)7607   void Vmlal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7608     Vmlal(al, dt, rd, rn, rm);
7609   }
7610 
Vmls(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)7611   void Vmls(Condition cond,
7612             DataType dt,
7613             DRegister rd,
7614             DRegister rn,
7615             DRegisterLane rm) {
7616     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7617     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7618     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7619     VIXL_ASSERT(allow_macro_instructions_);
7620     VIXL_ASSERT(OutsideITBlock());
7621     MacroEmissionCheckScope guard(this);
7622     ITScope it_scope(this, &cond, guard);
7623     vmls(cond, dt, rd, rn, rm);
7624   }
Vmls(DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)7625   void Vmls(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
7626     Vmls(al, dt, rd, rn, rm);
7627   }
7628 
Vmls(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)7629   void Vmls(Condition cond,
7630             DataType dt,
7631             QRegister rd,
7632             QRegister rn,
7633             DRegisterLane rm) {
7634     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7635     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7636     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7637     VIXL_ASSERT(allow_macro_instructions_);
7638     VIXL_ASSERT(OutsideITBlock());
7639     MacroEmissionCheckScope guard(this);
7640     ITScope it_scope(this, &cond, guard);
7641     vmls(cond, dt, rd, rn, rm);
7642   }
Vmls(DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)7643   void Vmls(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
7644     Vmls(al, dt, rd, rn, rm);
7645   }
7646 
Vmls(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7647   void Vmls(
7648       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7649     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7650     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7651     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7652     VIXL_ASSERT(allow_macro_instructions_);
7653     VIXL_ASSERT(OutsideITBlock());
7654     MacroEmissionCheckScope guard(this);
7655     ITScope it_scope(this, &cond, guard);
7656     vmls(cond, dt, rd, rn, rm);
7657   }
Vmls(DataType dt,DRegister rd,DRegister rn,DRegister rm)7658   void Vmls(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7659     Vmls(al, dt, rd, rn, rm);
7660   }
7661 
Vmls(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7662   void Vmls(
7663       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7664     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7665     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7666     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7667     VIXL_ASSERT(allow_macro_instructions_);
7668     VIXL_ASSERT(OutsideITBlock());
7669     MacroEmissionCheckScope guard(this);
7670     ITScope it_scope(this, &cond, guard);
7671     vmls(cond, dt, rd, rn, rm);
7672   }
Vmls(DataType dt,QRegister rd,QRegister rn,QRegister rm)7673   void Vmls(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7674     Vmls(al, dt, rd, rn, rm);
7675   }
7676 
Vmls(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)7677   void Vmls(
7678       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7679     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7680     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7681     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7682     VIXL_ASSERT(allow_macro_instructions_);
7683     VIXL_ASSERT(OutsideITBlock());
7684     MacroEmissionCheckScope guard(this);
7685     ITScope it_scope(this, &cond, guard);
7686     vmls(cond, dt, rd, rn, rm);
7687   }
Vmls(DataType dt,SRegister rd,SRegister rn,SRegister rm)7688   void Vmls(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7689     Vmls(al, dt, rd, rn, rm);
7690   }
7691 
Vmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)7692   void Vmlsl(Condition cond,
7693              DataType dt,
7694              QRegister rd,
7695              DRegister rn,
7696              DRegisterLane rm) {
7697     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7698     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7699     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7700     VIXL_ASSERT(allow_macro_instructions_);
7701     VIXL_ASSERT(OutsideITBlock());
7702     MacroEmissionCheckScope guard(this);
7703     ITScope it_scope(this, &cond, guard);
7704     vmlsl(cond, dt, rd, rn, rm);
7705   }
Vmlsl(DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)7706   void Vmlsl(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
7707     Vmlsl(al, dt, rd, rn, rm);
7708   }
7709 
Vmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)7710   void Vmlsl(
7711       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7712     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7713     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7714     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7715     VIXL_ASSERT(allow_macro_instructions_);
7716     VIXL_ASSERT(OutsideITBlock());
7717     MacroEmissionCheckScope guard(this);
7718     ITScope it_scope(this, &cond, guard);
7719     vmlsl(cond, dt, rd, rn, rm);
7720   }
Vmlsl(DataType dt,QRegister rd,DRegister rn,DRegister rm)7721   void Vmlsl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7722     Vmlsl(al, dt, rd, rn, rm);
7723   }
7724 
Vmov(Condition cond,Register rt,SRegister rn)7725   void Vmov(Condition cond, Register rt, SRegister rn) {
7726     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7727     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7728     VIXL_ASSERT(allow_macro_instructions_);
7729     VIXL_ASSERT(OutsideITBlock());
7730     MacroEmissionCheckScope guard(this);
7731     ITScope it_scope(this, &cond, guard);
7732     vmov(cond, rt, rn);
7733   }
Vmov(Register rt,SRegister rn)7734   void Vmov(Register rt, SRegister rn) { Vmov(al, rt, rn); }
7735 
Vmov(Condition cond,SRegister rn,Register rt)7736   void Vmov(Condition cond, SRegister rn, Register rt) {
7737     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7738     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7739     VIXL_ASSERT(allow_macro_instructions_);
7740     VIXL_ASSERT(OutsideITBlock());
7741     MacroEmissionCheckScope guard(this);
7742     ITScope it_scope(this, &cond, guard);
7743     vmov(cond, rn, rt);
7744   }
Vmov(SRegister rn,Register rt)7745   void Vmov(SRegister rn, Register rt) { Vmov(al, rn, rt); }
7746 
Vmov(Condition cond,Register rt,Register rt2,DRegister rm)7747   void Vmov(Condition cond, Register rt, Register rt2, DRegister rm) {
7748     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7749     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7750     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7751     VIXL_ASSERT(allow_macro_instructions_);
7752     VIXL_ASSERT(OutsideITBlock());
7753     MacroEmissionCheckScope guard(this);
7754     ITScope it_scope(this, &cond, guard);
7755     vmov(cond, rt, rt2, rm);
7756   }
Vmov(Register rt,Register rt2,DRegister rm)7757   void Vmov(Register rt, Register rt2, DRegister rm) { Vmov(al, rt, rt2, rm); }
7758 
Vmov(Condition cond,DRegister rm,Register rt,Register rt2)7759   void Vmov(Condition cond, DRegister rm, Register rt, Register rt2) {
7760     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7761     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7762     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7763     VIXL_ASSERT(allow_macro_instructions_);
7764     VIXL_ASSERT(OutsideITBlock());
7765     MacroEmissionCheckScope guard(this);
7766     ITScope it_scope(this, &cond, guard);
7767     vmov(cond, rm, rt, rt2);
7768   }
Vmov(DRegister rm,Register rt,Register rt2)7769   void Vmov(DRegister rm, Register rt, Register rt2) { Vmov(al, rm, rt, rt2); }
7770 
Vmov(Condition cond,Register rt,Register rt2,SRegister rm,SRegister rm1)7771   void Vmov(
7772       Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) {
7773     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7774     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7775     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7776     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm1));
7777     VIXL_ASSERT(allow_macro_instructions_);
7778     VIXL_ASSERT(OutsideITBlock());
7779     MacroEmissionCheckScope guard(this);
7780     ITScope it_scope(this, &cond, guard);
7781     vmov(cond, rt, rt2, rm, rm1);
7782   }
Vmov(Register rt,Register rt2,SRegister rm,SRegister rm1)7783   void Vmov(Register rt, Register rt2, SRegister rm, SRegister rm1) {
7784     Vmov(al, rt, rt2, rm, rm1);
7785   }
7786 
Vmov(Condition cond,SRegister rm,SRegister rm1,Register rt,Register rt2)7787   void Vmov(
7788       Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) {
7789     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7790     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm1));
7791     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7792     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7793     VIXL_ASSERT(allow_macro_instructions_);
7794     VIXL_ASSERT(OutsideITBlock());
7795     MacroEmissionCheckScope guard(this);
7796     ITScope it_scope(this, &cond, guard);
7797     vmov(cond, rm, rm1, rt, rt2);
7798   }
Vmov(SRegister rm,SRegister rm1,Register rt,Register rt2)7799   void Vmov(SRegister rm, SRegister rm1, Register rt, Register rt2) {
7800     Vmov(al, rm, rm1, rt, rt2);
7801   }
7802 
Vmov(Condition cond,DataType dt,DRegisterLane rd,Register rt)7803   void Vmov(Condition cond, DataType dt, DRegisterLane rd, Register rt) {
7804     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7805     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7806     VIXL_ASSERT(allow_macro_instructions_);
7807     VIXL_ASSERT(OutsideITBlock());
7808     MacroEmissionCheckScope guard(this);
7809     ITScope it_scope(this, &cond, guard);
7810     vmov(cond, dt, rd, rt);
7811   }
Vmov(DataType dt,DRegisterLane rd,Register rt)7812   void Vmov(DataType dt, DRegisterLane rd, Register rt) {
7813     Vmov(al, dt, rd, rt);
7814   }
Vmov(Condition cond,DRegisterLane rd,Register rt)7815   void Vmov(Condition cond, DRegisterLane rd, Register rt) {
7816     Vmov(cond, kDataTypeValueNone, rd, rt);
7817   }
Vmov(DRegisterLane rd,Register rt)7818   void Vmov(DRegisterLane rd, Register rt) {
7819     Vmov(al, kDataTypeValueNone, rd, rt);
7820   }
7821 
Vmov(Condition cond,DataType dt,DRegister rd,const DOperand & operand)7822   void Vmov(Condition cond,
7823             DataType dt,
7824             DRegister rd,
7825             const DOperand& operand) {
7826     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7827     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7828     VIXL_ASSERT(allow_macro_instructions_);
7829     VIXL_ASSERT(OutsideITBlock());
7830     MacroEmissionCheckScope guard(this);
7831     ITScope it_scope(this, &cond, guard);
7832     vmov(cond, dt, rd, operand);
7833   }
Vmov(DataType dt,DRegister rd,const DOperand & operand)7834   void Vmov(DataType dt, DRegister rd, const DOperand& operand) {
7835     Vmov(al, dt, rd, operand);
7836   }
7837 
Vmov(Condition cond,DataType dt,QRegister rd,const QOperand & operand)7838   void Vmov(Condition cond,
7839             DataType dt,
7840             QRegister rd,
7841             const QOperand& operand) {
7842     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7843     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7844     VIXL_ASSERT(allow_macro_instructions_);
7845     VIXL_ASSERT(OutsideITBlock());
7846     MacroEmissionCheckScope guard(this);
7847     ITScope it_scope(this, &cond, guard);
7848     vmov(cond, dt, rd, operand);
7849   }
Vmov(DataType dt,QRegister rd,const QOperand & operand)7850   void Vmov(DataType dt, QRegister rd, const QOperand& operand) {
7851     Vmov(al, dt, rd, operand);
7852   }
7853 
Vmov(Condition cond,DataType dt,SRegister rd,const SOperand & operand)7854   void Vmov(Condition cond,
7855             DataType dt,
7856             SRegister rd,
7857             const SOperand& operand) {
7858     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7859     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7860     VIXL_ASSERT(allow_macro_instructions_);
7861     VIXL_ASSERT(OutsideITBlock());
7862     MacroEmissionCheckScope guard(this);
7863     ITScope it_scope(this, &cond, guard);
7864     vmov(cond, dt, rd, operand);
7865   }
Vmov(DataType dt,SRegister rd,const SOperand & operand)7866   void Vmov(DataType dt, SRegister rd, const SOperand& operand) {
7867     Vmov(al, dt, rd, operand);
7868   }
7869 
Vmov(Condition cond,DataType dt,Register rt,DRegisterLane rn)7870   void Vmov(Condition cond, DataType dt, Register rt, DRegisterLane rn) {
7871     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7872     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7873     VIXL_ASSERT(allow_macro_instructions_);
7874     VIXL_ASSERT(OutsideITBlock());
7875     MacroEmissionCheckScope guard(this);
7876     ITScope it_scope(this, &cond, guard);
7877     vmov(cond, dt, rt, rn);
7878   }
Vmov(DataType dt,Register rt,DRegisterLane rn)7879   void Vmov(DataType dt, Register rt, DRegisterLane rn) {
7880     Vmov(al, dt, rt, rn);
7881   }
Vmov(Condition cond,Register rt,DRegisterLane rn)7882   void Vmov(Condition cond, Register rt, DRegisterLane rn) {
7883     Vmov(cond, kDataTypeValueNone, rt, rn);
7884   }
Vmov(Register rt,DRegisterLane rn)7885   void Vmov(Register rt, DRegisterLane rn) {
7886     Vmov(al, kDataTypeValueNone, rt, rn);
7887   }
7888 
Vmovl(Condition cond,DataType dt,QRegister rd,DRegister rm)7889   void Vmovl(Condition cond, DataType dt, QRegister rd, DRegister rm) {
7890     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7891     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7892     VIXL_ASSERT(allow_macro_instructions_);
7893     VIXL_ASSERT(OutsideITBlock());
7894     MacroEmissionCheckScope guard(this);
7895     ITScope it_scope(this, &cond, guard);
7896     vmovl(cond, dt, rd, rm);
7897   }
Vmovl(DataType dt,QRegister rd,DRegister rm)7898   void Vmovl(DataType dt, QRegister rd, DRegister rm) { Vmovl(al, dt, rd, rm); }
7899 
Vmovn(Condition cond,DataType dt,DRegister rd,QRegister rm)7900   void Vmovn(Condition cond, DataType dt, DRegister rd, QRegister rm) {
7901     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7902     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7903     VIXL_ASSERT(allow_macro_instructions_);
7904     VIXL_ASSERT(OutsideITBlock());
7905     MacroEmissionCheckScope guard(this);
7906     ITScope it_scope(this, &cond, guard);
7907     vmovn(cond, dt, rd, rm);
7908   }
Vmovn(DataType dt,DRegister rd,QRegister rm)7909   void Vmovn(DataType dt, DRegister rd, QRegister rm) { Vmovn(al, dt, rd, rm); }
7910 
Vmrs(Condition cond,RegisterOrAPSR_nzcv rt,SpecialFPRegister spec_reg)7911   void Vmrs(Condition cond,
7912             RegisterOrAPSR_nzcv rt,
7913             SpecialFPRegister spec_reg) {
7914     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7915     VIXL_ASSERT(allow_macro_instructions_);
7916     VIXL_ASSERT(OutsideITBlock());
7917     MacroEmissionCheckScope guard(this);
7918     ITScope it_scope(this, &cond, guard);
7919     vmrs(cond, rt, spec_reg);
7920   }
Vmrs(RegisterOrAPSR_nzcv rt,SpecialFPRegister spec_reg)7921   void Vmrs(RegisterOrAPSR_nzcv rt, SpecialFPRegister spec_reg) {
7922     Vmrs(al, rt, spec_reg);
7923   }
7924 
Vmsr(Condition cond,SpecialFPRegister spec_reg,Register rt)7925   void Vmsr(Condition cond, SpecialFPRegister spec_reg, Register rt) {
7926     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7927     VIXL_ASSERT(allow_macro_instructions_);
7928     VIXL_ASSERT(OutsideITBlock());
7929     MacroEmissionCheckScope guard(this);
7930     ITScope it_scope(this, &cond, guard);
7931     vmsr(cond, spec_reg, rt);
7932   }
Vmsr(SpecialFPRegister spec_reg,Register rt)7933   void Vmsr(SpecialFPRegister spec_reg, Register rt) { Vmsr(al, spec_reg, rt); }
7934 
Vmul(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister dm,unsigned index)7935   void Vmul(Condition cond,
7936             DataType dt,
7937             DRegister rd,
7938             DRegister rn,
7939             DRegister dm,
7940             unsigned index) {
7941     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7942     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7943     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
7944     VIXL_ASSERT(allow_macro_instructions_);
7945     VIXL_ASSERT(OutsideITBlock());
7946     MacroEmissionCheckScope guard(this);
7947     ITScope it_scope(this, &cond, guard);
7948     vmul(cond, dt, rd, rn, dm, index);
7949   }
Vmul(DataType dt,DRegister rd,DRegister rn,DRegister dm,unsigned index)7950   void Vmul(
7951       DataType dt, DRegister rd, DRegister rn, DRegister dm, unsigned index) {
7952     Vmul(al, dt, rd, rn, dm, index);
7953   }
7954 
Vmul(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegister dm,unsigned index)7955   void Vmul(Condition cond,
7956             DataType dt,
7957             QRegister rd,
7958             QRegister rn,
7959             DRegister dm,
7960             unsigned index) {
7961     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7962     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7963     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
7964     VIXL_ASSERT(allow_macro_instructions_);
7965     VIXL_ASSERT(OutsideITBlock());
7966     MacroEmissionCheckScope guard(this);
7967     ITScope it_scope(this, &cond, guard);
7968     vmul(cond, dt, rd, rn, dm, index);
7969   }
Vmul(DataType dt,QRegister rd,QRegister rn,DRegister dm,unsigned index)7970   void Vmul(
7971       DataType dt, QRegister rd, QRegister rn, DRegister dm, unsigned index) {
7972     Vmul(al, dt, rd, rn, dm, index);
7973   }
7974 
Vmul(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7975   void Vmul(
7976       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7977     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7978     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7979     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7980     VIXL_ASSERT(allow_macro_instructions_);
7981     VIXL_ASSERT(OutsideITBlock());
7982     MacroEmissionCheckScope guard(this);
7983     ITScope it_scope(this, &cond, guard);
7984     vmul(cond, dt, rd, rn, rm);
7985   }
Vmul(DataType dt,DRegister rd,DRegister rn,DRegister rm)7986   void Vmul(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7987     Vmul(al, dt, rd, rn, rm);
7988   }
7989 
Vmul(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7990   void Vmul(
7991       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7992     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7993     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7994     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7995     VIXL_ASSERT(allow_macro_instructions_);
7996     VIXL_ASSERT(OutsideITBlock());
7997     MacroEmissionCheckScope guard(this);
7998     ITScope it_scope(this, &cond, guard);
7999     vmul(cond, dt, rd, rn, rm);
8000   }
Vmul(DataType dt,QRegister rd,QRegister rn,QRegister rm)8001   void Vmul(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8002     Vmul(al, dt, rd, rn, rm);
8003   }
8004 
Vmul(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)8005   void Vmul(
8006       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8007     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8008     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8009     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8010     VIXL_ASSERT(allow_macro_instructions_);
8011     VIXL_ASSERT(OutsideITBlock());
8012     MacroEmissionCheckScope guard(this);
8013     ITScope it_scope(this, &cond, guard);
8014     vmul(cond, dt, rd, rn, rm);
8015   }
Vmul(DataType dt,SRegister rd,SRegister rn,SRegister rm)8016   void Vmul(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8017     Vmul(al, dt, rd, rn, rm);
8018   }
8019 
Vmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8020   void Vmull(Condition cond,
8021              DataType dt,
8022              QRegister rd,
8023              DRegister rn,
8024              DRegister dm,
8025              unsigned index) {
8026     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8027     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8028     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8029     VIXL_ASSERT(allow_macro_instructions_);
8030     VIXL_ASSERT(OutsideITBlock());
8031     MacroEmissionCheckScope guard(this);
8032     ITScope it_scope(this, &cond, guard);
8033     vmull(cond, dt, rd, rn, dm, index);
8034   }
Vmull(DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8035   void Vmull(
8036       DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
8037     Vmull(al, dt, rd, rn, dm, index);
8038   }
8039 
Vmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)8040   void Vmull(
8041       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8042     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8043     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8044     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8045     VIXL_ASSERT(allow_macro_instructions_);
8046     VIXL_ASSERT(OutsideITBlock());
8047     MacroEmissionCheckScope guard(this);
8048     ITScope it_scope(this, &cond, guard);
8049     vmull(cond, dt, rd, rn, rm);
8050   }
Vmull(DataType dt,QRegister rd,DRegister rn,DRegister rm)8051   void Vmull(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8052     Vmull(al, dt, rd, rn, rm);
8053   }
8054 
Vmvn(Condition cond,DataType dt,DRegister rd,const DOperand & operand)8055   void Vmvn(Condition cond,
8056             DataType dt,
8057             DRegister rd,
8058             const DOperand& operand) {
8059     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8060     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8061     VIXL_ASSERT(allow_macro_instructions_);
8062     VIXL_ASSERT(OutsideITBlock());
8063     MacroEmissionCheckScope guard(this);
8064     ITScope it_scope(this, &cond, guard);
8065     vmvn(cond, dt, rd, operand);
8066   }
Vmvn(DataType dt,DRegister rd,const DOperand & operand)8067   void Vmvn(DataType dt, DRegister rd, const DOperand& operand) {
8068     Vmvn(al, dt, rd, operand);
8069   }
8070 
Vmvn(Condition cond,DataType dt,QRegister rd,const QOperand & operand)8071   void Vmvn(Condition cond,
8072             DataType dt,
8073             QRegister rd,
8074             const QOperand& operand) {
8075     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8076     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8077     VIXL_ASSERT(allow_macro_instructions_);
8078     VIXL_ASSERT(OutsideITBlock());
8079     MacroEmissionCheckScope guard(this);
8080     ITScope it_scope(this, &cond, guard);
8081     vmvn(cond, dt, rd, operand);
8082   }
Vmvn(DataType dt,QRegister rd,const QOperand & operand)8083   void Vmvn(DataType dt, QRegister rd, const QOperand& operand) {
8084     Vmvn(al, dt, rd, operand);
8085   }
8086 
Vneg(Condition cond,DataType dt,DRegister rd,DRegister rm)8087   void Vneg(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8088     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8089     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8090     VIXL_ASSERT(allow_macro_instructions_);
8091     VIXL_ASSERT(OutsideITBlock());
8092     MacroEmissionCheckScope guard(this);
8093     ITScope it_scope(this, &cond, guard);
8094     vneg(cond, dt, rd, rm);
8095   }
Vneg(DataType dt,DRegister rd,DRegister rm)8096   void Vneg(DataType dt, DRegister rd, DRegister rm) { Vneg(al, dt, rd, rm); }
8097 
Vneg(Condition cond,DataType dt,QRegister rd,QRegister rm)8098   void Vneg(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8099     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8100     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8101     VIXL_ASSERT(allow_macro_instructions_);
8102     VIXL_ASSERT(OutsideITBlock());
8103     MacroEmissionCheckScope guard(this);
8104     ITScope it_scope(this, &cond, guard);
8105     vneg(cond, dt, rd, rm);
8106   }
Vneg(DataType dt,QRegister rd,QRegister rm)8107   void Vneg(DataType dt, QRegister rd, QRegister rm) { Vneg(al, dt, rd, rm); }
8108 
Vneg(Condition cond,DataType dt,SRegister rd,SRegister rm)8109   void Vneg(Condition cond, DataType dt, SRegister rd, SRegister rm) {
8110     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8111     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8112     VIXL_ASSERT(allow_macro_instructions_);
8113     VIXL_ASSERT(OutsideITBlock());
8114     MacroEmissionCheckScope guard(this);
8115     ITScope it_scope(this, &cond, guard);
8116     vneg(cond, dt, rd, rm);
8117   }
Vneg(DataType dt,SRegister rd,SRegister rm)8118   void Vneg(DataType dt, SRegister rd, SRegister rm) { Vneg(al, dt, rd, rm); }
8119 
Vnmla(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)8120   void Vnmla(
8121       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8122     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8123     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8124     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8125     VIXL_ASSERT(allow_macro_instructions_);
8126     VIXL_ASSERT(OutsideITBlock());
8127     MacroEmissionCheckScope guard(this);
8128     ITScope it_scope(this, &cond, guard);
8129     vnmla(cond, dt, rd, rn, rm);
8130   }
Vnmla(DataType dt,SRegister rd,SRegister rn,SRegister rm)8131   void Vnmla(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8132     Vnmla(al, dt, rd, rn, rm);
8133   }
8134 
Vnmla(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8135   void Vnmla(
8136       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8137     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8138     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8139     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8140     VIXL_ASSERT(allow_macro_instructions_);
8141     VIXL_ASSERT(OutsideITBlock());
8142     MacroEmissionCheckScope guard(this);
8143     ITScope it_scope(this, &cond, guard);
8144     vnmla(cond, dt, rd, rn, rm);
8145   }
Vnmla(DataType dt,DRegister rd,DRegister rn,DRegister rm)8146   void Vnmla(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8147     Vnmla(al, dt, rd, rn, rm);
8148   }
8149 
Vnmls(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)8150   void Vnmls(
8151       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8152     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8153     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8154     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8155     VIXL_ASSERT(allow_macro_instructions_);
8156     VIXL_ASSERT(OutsideITBlock());
8157     MacroEmissionCheckScope guard(this);
8158     ITScope it_scope(this, &cond, guard);
8159     vnmls(cond, dt, rd, rn, rm);
8160   }
Vnmls(DataType dt,SRegister rd,SRegister rn,SRegister rm)8161   void Vnmls(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8162     Vnmls(al, dt, rd, rn, rm);
8163   }
8164 
Vnmls(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8165   void Vnmls(
8166       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8167     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8168     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8169     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8170     VIXL_ASSERT(allow_macro_instructions_);
8171     VIXL_ASSERT(OutsideITBlock());
8172     MacroEmissionCheckScope guard(this);
8173     ITScope it_scope(this, &cond, guard);
8174     vnmls(cond, dt, rd, rn, rm);
8175   }
Vnmls(DataType dt,DRegister rd,DRegister rn,DRegister rm)8176   void Vnmls(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8177     Vnmls(al, dt, rd, rn, rm);
8178   }
8179 
Vnmul(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)8180   void Vnmul(
8181       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8182     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8183     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8184     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8185     VIXL_ASSERT(allow_macro_instructions_);
8186     VIXL_ASSERT(OutsideITBlock());
8187     MacroEmissionCheckScope guard(this);
8188     ITScope it_scope(this, &cond, guard);
8189     vnmul(cond, dt, rd, rn, rm);
8190   }
Vnmul(DataType dt,SRegister rd,SRegister rn,SRegister rm)8191   void Vnmul(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8192     Vnmul(al, dt, rd, rn, rm);
8193   }
8194 
Vnmul(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8195   void Vnmul(
8196       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8197     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8198     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8199     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8200     VIXL_ASSERT(allow_macro_instructions_);
8201     VIXL_ASSERT(OutsideITBlock());
8202     MacroEmissionCheckScope guard(this);
8203     ITScope it_scope(this, &cond, guard);
8204     vnmul(cond, dt, rd, rn, rm);
8205   }
Vnmul(DataType dt,DRegister rd,DRegister rn,DRegister rm)8206   void Vnmul(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8207     Vnmul(al, dt, rd, rn, rm);
8208   }
8209 
Vorn(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)8210   void Vorn(Condition cond,
8211             DataType dt,
8212             DRegister rd,
8213             DRegister rn,
8214             const DOperand& operand) {
8215     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8216     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8217     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8218     VIXL_ASSERT(allow_macro_instructions_);
8219     VIXL_ASSERT(OutsideITBlock());
8220     MacroEmissionCheckScope guard(this);
8221     ITScope it_scope(this, &cond, guard);
8222     vorn(cond, dt, rd, rn, operand);
8223   }
Vorn(DataType dt,DRegister rd,DRegister rn,const DOperand & operand)8224   void Vorn(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
8225     Vorn(al, dt, rd, rn, operand);
8226   }
8227 
Vorn(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)8228   void Vorn(Condition cond,
8229             DataType dt,
8230             QRegister rd,
8231             QRegister rn,
8232             const QOperand& operand) {
8233     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8234     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8235     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8236     VIXL_ASSERT(allow_macro_instructions_);
8237     VIXL_ASSERT(OutsideITBlock());
8238     MacroEmissionCheckScope guard(this);
8239     ITScope it_scope(this, &cond, guard);
8240     vorn(cond, dt, rd, rn, operand);
8241   }
Vorn(DataType dt,QRegister rd,QRegister rn,const QOperand & operand)8242   void Vorn(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
8243     Vorn(al, dt, rd, rn, operand);
8244   }
8245 
Vorr(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)8246   void Vorr(Condition cond,
8247             DataType dt,
8248             DRegister rd,
8249             DRegister rn,
8250             const DOperand& operand) {
8251     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8252     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8253     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8254     VIXL_ASSERT(allow_macro_instructions_);
8255     VIXL_ASSERT(OutsideITBlock());
8256     MacroEmissionCheckScope guard(this);
8257     ITScope it_scope(this, &cond, guard);
8258     vorr(cond, dt, rd, rn, operand);
8259   }
Vorr(DataType dt,DRegister rd,DRegister rn,const DOperand & operand)8260   void Vorr(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
8261     Vorr(al, dt, rd, rn, operand);
8262   }
Vorr(Condition cond,DRegister rd,DRegister rn,const DOperand & operand)8263   void Vorr(Condition cond,
8264             DRegister rd,
8265             DRegister rn,
8266             const DOperand& operand) {
8267     Vorr(cond, kDataTypeValueNone, rd, rn, operand);
8268   }
Vorr(DRegister rd,DRegister rn,const DOperand & operand)8269   void Vorr(DRegister rd, DRegister rn, const DOperand& operand) {
8270     Vorr(al, kDataTypeValueNone, rd, rn, operand);
8271   }
8272 
Vorr(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)8273   void Vorr(Condition cond,
8274             DataType dt,
8275             QRegister rd,
8276             QRegister rn,
8277             const QOperand& operand) {
8278     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8279     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8280     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8281     VIXL_ASSERT(allow_macro_instructions_);
8282     VIXL_ASSERT(OutsideITBlock());
8283     MacroEmissionCheckScope guard(this);
8284     ITScope it_scope(this, &cond, guard);
8285     vorr(cond, dt, rd, rn, operand);
8286   }
Vorr(DataType dt,QRegister rd,QRegister rn,const QOperand & operand)8287   void Vorr(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
8288     Vorr(al, dt, rd, rn, operand);
8289   }
Vorr(Condition cond,QRegister rd,QRegister rn,const QOperand & operand)8290   void Vorr(Condition cond,
8291             QRegister rd,
8292             QRegister rn,
8293             const QOperand& operand) {
8294     Vorr(cond, kDataTypeValueNone, rd, rn, operand);
8295   }
Vorr(QRegister rd,QRegister rn,const QOperand & operand)8296   void Vorr(QRegister rd, QRegister rn, const QOperand& operand) {
8297     Vorr(al, kDataTypeValueNone, rd, rn, operand);
8298   }
8299 
Vpadal(Condition cond,DataType dt,DRegister rd,DRegister rm)8300   void Vpadal(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8301     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8302     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8303     VIXL_ASSERT(allow_macro_instructions_);
8304     VIXL_ASSERT(OutsideITBlock());
8305     MacroEmissionCheckScope guard(this);
8306     ITScope it_scope(this, &cond, guard);
8307     vpadal(cond, dt, rd, rm);
8308   }
Vpadal(DataType dt,DRegister rd,DRegister rm)8309   void Vpadal(DataType dt, DRegister rd, DRegister rm) {
8310     Vpadal(al, dt, rd, rm);
8311   }
8312 
Vpadal(Condition cond,DataType dt,QRegister rd,QRegister rm)8313   void Vpadal(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8314     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8315     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8316     VIXL_ASSERT(allow_macro_instructions_);
8317     VIXL_ASSERT(OutsideITBlock());
8318     MacroEmissionCheckScope guard(this);
8319     ITScope it_scope(this, &cond, guard);
8320     vpadal(cond, dt, rd, rm);
8321   }
Vpadal(DataType dt,QRegister rd,QRegister rm)8322   void Vpadal(DataType dt, QRegister rd, QRegister rm) {
8323     Vpadal(al, dt, rd, rm);
8324   }
8325 
Vpadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8326   void Vpadd(
8327       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8328     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8329     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8330     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8331     VIXL_ASSERT(allow_macro_instructions_);
8332     VIXL_ASSERT(OutsideITBlock());
8333     MacroEmissionCheckScope guard(this);
8334     ITScope it_scope(this, &cond, guard);
8335     vpadd(cond, dt, rd, rn, rm);
8336   }
Vpadd(DataType dt,DRegister rd,DRegister rn,DRegister rm)8337   void Vpadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8338     Vpadd(al, dt, rd, rn, rm);
8339   }
8340 
Vpaddl(Condition cond,DataType dt,DRegister rd,DRegister rm)8341   void Vpaddl(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8342     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8343     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8344     VIXL_ASSERT(allow_macro_instructions_);
8345     VIXL_ASSERT(OutsideITBlock());
8346     MacroEmissionCheckScope guard(this);
8347     ITScope it_scope(this, &cond, guard);
8348     vpaddl(cond, dt, rd, rm);
8349   }
Vpaddl(DataType dt,DRegister rd,DRegister rm)8350   void Vpaddl(DataType dt, DRegister rd, DRegister rm) {
8351     Vpaddl(al, dt, rd, rm);
8352   }
8353 
Vpaddl(Condition cond,DataType dt,QRegister rd,QRegister rm)8354   void Vpaddl(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8355     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8356     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8357     VIXL_ASSERT(allow_macro_instructions_);
8358     VIXL_ASSERT(OutsideITBlock());
8359     MacroEmissionCheckScope guard(this);
8360     ITScope it_scope(this, &cond, guard);
8361     vpaddl(cond, dt, rd, rm);
8362   }
Vpaddl(DataType dt,QRegister rd,QRegister rm)8363   void Vpaddl(DataType dt, QRegister rd, QRegister rm) {
8364     Vpaddl(al, dt, rd, rm);
8365   }
8366 
Vpmax(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8367   void Vpmax(
8368       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8369     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8370     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8371     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8372     VIXL_ASSERT(allow_macro_instructions_);
8373     VIXL_ASSERT(OutsideITBlock());
8374     MacroEmissionCheckScope guard(this);
8375     ITScope it_scope(this, &cond, guard);
8376     vpmax(cond, dt, rd, rn, rm);
8377   }
Vpmax(DataType dt,DRegister rd,DRegister rn,DRegister rm)8378   void Vpmax(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8379     Vpmax(al, dt, rd, rn, rm);
8380   }
8381 
Vpmin(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8382   void Vpmin(
8383       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8384     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8385     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8386     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8387     VIXL_ASSERT(allow_macro_instructions_);
8388     VIXL_ASSERT(OutsideITBlock());
8389     MacroEmissionCheckScope guard(this);
8390     ITScope it_scope(this, &cond, guard);
8391     vpmin(cond, dt, rd, rn, rm);
8392   }
Vpmin(DataType dt,DRegister rd,DRegister rn,DRegister rm)8393   void Vpmin(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8394     Vpmin(al, dt, rd, rn, rm);
8395   }
8396 
Vpop(Condition cond,DataType dt,DRegisterList dreglist)8397   void Vpop(Condition cond, DataType dt, DRegisterList dreglist) {
8398     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
8399     VIXL_ASSERT(allow_macro_instructions_);
8400     VIXL_ASSERT(OutsideITBlock());
8401     MacroEmissionCheckScope guard(this);
8402     ITScope it_scope(this, &cond, guard);
8403     vpop(cond, dt, dreglist);
8404   }
Vpop(DataType dt,DRegisterList dreglist)8405   void Vpop(DataType dt, DRegisterList dreglist) { Vpop(al, dt, dreglist); }
Vpop(Condition cond,DRegisterList dreglist)8406   void Vpop(Condition cond, DRegisterList dreglist) {
8407     Vpop(cond, kDataTypeValueNone, dreglist);
8408   }
Vpop(DRegisterList dreglist)8409   void Vpop(DRegisterList dreglist) { Vpop(al, kDataTypeValueNone, dreglist); }
8410 
Vpop(Condition cond,DataType dt,SRegisterList sreglist)8411   void Vpop(Condition cond, DataType dt, SRegisterList sreglist) {
8412     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
8413     VIXL_ASSERT(allow_macro_instructions_);
8414     VIXL_ASSERT(OutsideITBlock());
8415     MacroEmissionCheckScope guard(this);
8416     ITScope it_scope(this, &cond, guard);
8417     vpop(cond, dt, sreglist);
8418   }
Vpop(DataType dt,SRegisterList sreglist)8419   void Vpop(DataType dt, SRegisterList sreglist) { Vpop(al, dt, sreglist); }
Vpop(Condition cond,SRegisterList sreglist)8420   void Vpop(Condition cond, SRegisterList sreglist) {
8421     Vpop(cond, kDataTypeValueNone, sreglist);
8422   }
Vpop(SRegisterList sreglist)8423   void Vpop(SRegisterList sreglist) { Vpop(al, kDataTypeValueNone, sreglist); }
8424 
Vpush(Condition cond,DataType dt,DRegisterList dreglist)8425   void Vpush(Condition cond, DataType dt, DRegisterList dreglist) {
8426     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
8427     VIXL_ASSERT(allow_macro_instructions_);
8428     VIXL_ASSERT(OutsideITBlock());
8429     MacroEmissionCheckScope guard(this);
8430     ITScope it_scope(this, &cond, guard);
8431     vpush(cond, dt, dreglist);
8432   }
Vpush(DataType dt,DRegisterList dreglist)8433   void Vpush(DataType dt, DRegisterList dreglist) { Vpush(al, dt, dreglist); }
Vpush(Condition cond,DRegisterList dreglist)8434   void Vpush(Condition cond, DRegisterList dreglist) {
8435     Vpush(cond, kDataTypeValueNone, dreglist);
8436   }
Vpush(DRegisterList dreglist)8437   void Vpush(DRegisterList dreglist) {
8438     Vpush(al, kDataTypeValueNone, dreglist);
8439   }
8440 
Vpush(Condition cond,DataType dt,SRegisterList sreglist)8441   void Vpush(Condition cond, DataType dt, SRegisterList sreglist) {
8442     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
8443     VIXL_ASSERT(allow_macro_instructions_);
8444     VIXL_ASSERT(OutsideITBlock());
8445     MacroEmissionCheckScope guard(this);
8446     ITScope it_scope(this, &cond, guard);
8447     vpush(cond, dt, sreglist);
8448   }
Vpush(DataType dt,SRegisterList sreglist)8449   void Vpush(DataType dt, SRegisterList sreglist) { Vpush(al, dt, sreglist); }
Vpush(Condition cond,SRegisterList sreglist)8450   void Vpush(Condition cond, SRegisterList sreglist) {
8451     Vpush(cond, kDataTypeValueNone, sreglist);
8452   }
Vpush(SRegisterList sreglist)8453   void Vpush(SRegisterList sreglist) {
8454     Vpush(al, kDataTypeValueNone, sreglist);
8455   }
8456 
Vqabs(Condition cond,DataType dt,DRegister rd,DRegister rm)8457   void Vqabs(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8458     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8459     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8460     VIXL_ASSERT(allow_macro_instructions_);
8461     VIXL_ASSERT(OutsideITBlock());
8462     MacroEmissionCheckScope guard(this);
8463     ITScope it_scope(this, &cond, guard);
8464     vqabs(cond, dt, rd, rm);
8465   }
Vqabs(DataType dt,DRegister rd,DRegister rm)8466   void Vqabs(DataType dt, DRegister rd, DRegister rm) { Vqabs(al, dt, rd, rm); }
8467 
Vqabs(Condition cond,DataType dt,QRegister rd,QRegister rm)8468   void Vqabs(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8469     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8470     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8471     VIXL_ASSERT(allow_macro_instructions_);
8472     VIXL_ASSERT(OutsideITBlock());
8473     MacroEmissionCheckScope guard(this);
8474     ITScope it_scope(this, &cond, guard);
8475     vqabs(cond, dt, rd, rm);
8476   }
Vqabs(DataType dt,QRegister rd,QRegister rm)8477   void Vqabs(DataType dt, QRegister rd, QRegister rm) { Vqabs(al, dt, rd, rm); }
8478 
Vqadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8479   void Vqadd(
8480       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8481     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8482     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8483     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8484     VIXL_ASSERT(allow_macro_instructions_);
8485     VIXL_ASSERT(OutsideITBlock());
8486     MacroEmissionCheckScope guard(this);
8487     ITScope it_scope(this, &cond, guard);
8488     vqadd(cond, dt, rd, rn, rm);
8489   }
Vqadd(DataType dt,DRegister rd,DRegister rn,DRegister rm)8490   void Vqadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8491     Vqadd(al, dt, rd, rn, rm);
8492   }
8493 
Vqadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)8494   void Vqadd(
8495       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8496     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8497     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8498     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8499     VIXL_ASSERT(allow_macro_instructions_);
8500     VIXL_ASSERT(OutsideITBlock());
8501     MacroEmissionCheckScope guard(this);
8502     ITScope it_scope(this, &cond, guard);
8503     vqadd(cond, dt, rd, rn, rm);
8504   }
Vqadd(DataType dt,QRegister rd,QRegister rn,QRegister rm)8505   void Vqadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8506     Vqadd(al, dt, rd, rn, rm);
8507   }
8508 
Vqdmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)8509   void Vqdmlal(
8510       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8511     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8512     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8513     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8514     VIXL_ASSERT(allow_macro_instructions_);
8515     VIXL_ASSERT(OutsideITBlock());
8516     MacroEmissionCheckScope guard(this);
8517     ITScope it_scope(this, &cond, guard);
8518     vqdmlal(cond, dt, rd, rn, rm);
8519   }
Vqdmlal(DataType dt,QRegister rd,DRegister rn,DRegister rm)8520   void Vqdmlal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8521     Vqdmlal(al, dt, rd, rn, rm);
8522   }
8523 
Vqdmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8524   void Vqdmlal(Condition cond,
8525                DataType dt,
8526                QRegister rd,
8527                DRegister rn,
8528                DRegister dm,
8529                unsigned index) {
8530     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8531     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8532     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8533     VIXL_ASSERT(allow_macro_instructions_);
8534     VIXL_ASSERT(OutsideITBlock());
8535     MacroEmissionCheckScope guard(this);
8536     ITScope it_scope(this, &cond, guard);
8537     vqdmlal(cond, dt, rd, rn, dm, index);
8538   }
Vqdmlal(DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8539   void Vqdmlal(
8540       DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
8541     Vqdmlal(al, dt, rd, rn, dm, index);
8542   }
8543 
Vqdmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)8544   void Vqdmlsl(
8545       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8546     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8547     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8548     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8549     VIXL_ASSERT(allow_macro_instructions_);
8550     VIXL_ASSERT(OutsideITBlock());
8551     MacroEmissionCheckScope guard(this);
8552     ITScope it_scope(this, &cond, guard);
8553     vqdmlsl(cond, dt, rd, rn, rm);
8554   }
Vqdmlsl(DataType dt,QRegister rd,DRegister rn,DRegister rm)8555   void Vqdmlsl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8556     Vqdmlsl(al, dt, rd, rn, rm);
8557   }
8558 
Vqdmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8559   void Vqdmlsl(Condition cond,
8560                DataType dt,
8561                QRegister rd,
8562                DRegister rn,
8563                DRegister dm,
8564                unsigned index) {
8565     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8566     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8567     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8568     VIXL_ASSERT(allow_macro_instructions_);
8569     VIXL_ASSERT(OutsideITBlock());
8570     MacroEmissionCheckScope guard(this);
8571     ITScope it_scope(this, &cond, guard);
8572     vqdmlsl(cond, dt, rd, rn, dm, index);
8573   }
Vqdmlsl(DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8574   void Vqdmlsl(
8575       DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
8576     Vqdmlsl(al, dt, rd, rn, dm, index);
8577   }
8578 
Vqdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8579   void Vqdmulh(
8580       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8581     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8582     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8583     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8584     VIXL_ASSERT(allow_macro_instructions_);
8585     VIXL_ASSERT(OutsideITBlock());
8586     MacroEmissionCheckScope guard(this);
8587     ITScope it_scope(this, &cond, guard);
8588     vqdmulh(cond, dt, rd, rn, rm);
8589   }
Vqdmulh(DataType dt,DRegister rd,DRegister rn,DRegister rm)8590   void Vqdmulh(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8591     Vqdmulh(al, dt, rd, rn, rm);
8592   }
8593 
Vqdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)8594   void Vqdmulh(
8595       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8596     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8597     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8598     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8599     VIXL_ASSERT(allow_macro_instructions_);
8600     VIXL_ASSERT(OutsideITBlock());
8601     MacroEmissionCheckScope guard(this);
8602     ITScope it_scope(this, &cond, guard);
8603     vqdmulh(cond, dt, rd, rn, rm);
8604   }
Vqdmulh(DataType dt,QRegister rd,QRegister rn,QRegister rm)8605   void Vqdmulh(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8606     Vqdmulh(al, dt, rd, rn, rm);
8607   }
8608 
Vqdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)8609   void Vqdmulh(Condition cond,
8610                DataType dt,
8611                DRegister rd,
8612                DRegister rn,
8613                DRegisterLane rm) {
8614     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8615     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8616     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8617     VIXL_ASSERT(allow_macro_instructions_);
8618     VIXL_ASSERT(OutsideITBlock());
8619     MacroEmissionCheckScope guard(this);
8620     ITScope it_scope(this, &cond, guard);
8621     vqdmulh(cond, dt, rd, rn, rm);
8622   }
Vqdmulh(DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)8623   void Vqdmulh(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
8624     Vqdmulh(al, dt, rd, rn, rm);
8625   }
8626 
Vqdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)8627   void Vqdmulh(Condition cond,
8628                DataType dt,
8629                QRegister rd,
8630                QRegister rn,
8631                DRegisterLane rm) {
8632     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8633     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8634     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8635     VIXL_ASSERT(allow_macro_instructions_);
8636     VIXL_ASSERT(OutsideITBlock());
8637     MacroEmissionCheckScope guard(this);
8638     ITScope it_scope(this, &cond, guard);
8639     vqdmulh(cond, dt, rd, rn, rm);
8640   }
Vqdmulh(DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)8641   void Vqdmulh(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
8642     Vqdmulh(al, dt, rd, rn, rm);
8643   }
8644 
Vqdmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)8645   void Vqdmull(
8646       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8647     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8648     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8649     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8650     VIXL_ASSERT(allow_macro_instructions_);
8651     VIXL_ASSERT(OutsideITBlock());
8652     MacroEmissionCheckScope guard(this);
8653     ITScope it_scope(this, &cond, guard);
8654     vqdmull(cond, dt, rd, rn, rm);
8655   }
Vqdmull(DataType dt,QRegister rd,DRegister rn,DRegister rm)8656   void Vqdmull(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8657     Vqdmull(al, dt, rd, rn, rm);
8658   }
8659 
Vqdmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)8660   void Vqdmull(Condition cond,
8661                DataType dt,
8662                QRegister rd,
8663                DRegister rn,
8664                DRegisterLane rm) {
8665     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8666     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8667     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8668     VIXL_ASSERT(allow_macro_instructions_);
8669     VIXL_ASSERT(OutsideITBlock());
8670     MacroEmissionCheckScope guard(this);
8671     ITScope it_scope(this, &cond, guard);
8672     vqdmull(cond, dt, rd, rn, rm);
8673   }
Vqdmull(DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)8674   void Vqdmull(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
8675     Vqdmull(al, dt, rd, rn, rm);
8676   }
8677 
Vqmovn(Condition cond,DataType dt,DRegister rd,QRegister rm)8678   void Vqmovn(Condition cond, DataType dt, DRegister rd, QRegister rm) {
8679     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8680     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8681     VIXL_ASSERT(allow_macro_instructions_);
8682     VIXL_ASSERT(OutsideITBlock());
8683     MacroEmissionCheckScope guard(this);
8684     ITScope it_scope(this, &cond, guard);
8685     vqmovn(cond, dt, rd, rm);
8686   }
Vqmovn(DataType dt,DRegister rd,QRegister rm)8687   void Vqmovn(DataType dt, DRegister rd, QRegister rm) {
8688     Vqmovn(al, dt, rd, rm);
8689   }
8690 
Vqmovun(Condition cond,DataType dt,DRegister rd,QRegister rm)8691   void Vqmovun(Condition cond, DataType dt, DRegister rd, QRegister rm) {
8692     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8693     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8694     VIXL_ASSERT(allow_macro_instructions_);
8695     VIXL_ASSERT(OutsideITBlock());
8696     MacroEmissionCheckScope guard(this);
8697     ITScope it_scope(this, &cond, guard);
8698     vqmovun(cond, dt, rd, rm);
8699   }
Vqmovun(DataType dt,DRegister rd,QRegister rm)8700   void Vqmovun(DataType dt, DRegister rd, QRegister rm) {
8701     Vqmovun(al, dt, rd, rm);
8702   }
8703 
Vqneg(Condition cond,DataType dt,DRegister rd,DRegister rm)8704   void Vqneg(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8705     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8706     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8707     VIXL_ASSERT(allow_macro_instructions_);
8708     VIXL_ASSERT(OutsideITBlock());
8709     MacroEmissionCheckScope guard(this);
8710     ITScope it_scope(this, &cond, guard);
8711     vqneg(cond, dt, rd, rm);
8712   }
Vqneg(DataType dt,DRegister rd,DRegister rm)8713   void Vqneg(DataType dt, DRegister rd, DRegister rm) { Vqneg(al, dt, rd, rm); }
8714 
Vqneg(Condition cond,DataType dt,QRegister rd,QRegister rm)8715   void Vqneg(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8716     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8717     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8718     VIXL_ASSERT(allow_macro_instructions_);
8719     VIXL_ASSERT(OutsideITBlock());
8720     MacroEmissionCheckScope guard(this);
8721     ITScope it_scope(this, &cond, guard);
8722     vqneg(cond, dt, rd, rm);
8723   }
Vqneg(DataType dt,QRegister rd,QRegister rm)8724   void Vqneg(DataType dt, QRegister rd, QRegister rm) { Vqneg(al, dt, rd, rm); }
8725 
Vqrdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8726   void Vqrdmulh(
8727       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8728     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8729     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8730     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8731     VIXL_ASSERT(allow_macro_instructions_);
8732     VIXL_ASSERT(OutsideITBlock());
8733     MacroEmissionCheckScope guard(this);
8734     ITScope it_scope(this, &cond, guard);
8735     vqrdmulh(cond, dt, rd, rn, rm);
8736   }
Vqrdmulh(DataType dt,DRegister rd,DRegister rn,DRegister rm)8737   void Vqrdmulh(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8738     Vqrdmulh(al, dt, rd, rn, rm);
8739   }
8740 
Vqrdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)8741   void Vqrdmulh(
8742       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8743     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8744     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8745     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8746     VIXL_ASSERT(allow_macro_instructions_);
8747     VIXL_ASSERT(OutsideITBlock());
8748     MacroEmissionCheckScope guard(this);
8749     ITScope it_scope(this, &cond, guard);
8750     vqrdmulh(cond, dt, rd, rn, rm);
8751   }
Vqrdmulh(DataType dt,QRegister rd,QRegister rn,QRegister rm)8752   void Vqrdmulh(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8753     Vqrdmulh(al, dt, rd, rn, rm);
8754   }
8755 
Vqrdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)8756   void Vqrdmulh(Condition cond,
8757                 DataType dt,
8758                 DRegister rd,
8759                 DRegister rn,
8760                 DRegisterLane rm) {
8761     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8762     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8763     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8764     VIXL_ASSERT(allow_macro_instructions_);
8765     VIXL_ASSERT(OutsideITBlock());
8766     MacroEmissionCheckScope guard(this);
8767     ITScope it_scope(this, &cond, guard);
8768     vqrdmulh(cond, dt, rd, rn, rm);
8769   }
Vqrdmulh(DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)8770   void Vqrdmulh(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
8771     Vqrdmulh(al, dt, rd, rn, rm);
8772   }
8773 
Vqrdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)8774   void Vqrdmulh(Condition cond,
8775                 DataType dt,
8776                 QRegister rd,
8777                 QRegister rn,
8778                 DRegisterLane rm) {
8779     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8780     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8781     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8782     VIXL_ASSERT(allow_macro_instructions_);
8783     VIXL_ASSERT(OutsideITBlock());
8784     MacroEmissionCheckScope guard(this);
8785     ITScope it_scope(this, &cond, guard);
8786     vqrdmulh(cond, dt, rd, rn, rm);
8787   }
Vqrdmulh(DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)8788   void Vqrdmulh(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
8789     Vqrdmulh(al, dt, rd, rn, rm);
8790   }
8791 
Vqrshl(Condition cond,DataType dt,DRegister rd,DRegister rm,DRegister rn)8792   void Vqrshl(
8793       Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
8794     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8795     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8796     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8797     VIXL_ASSERT(allow_macro_instructions_);
8798     VIXL_ASSERT(OutsideITBlock());
8799     MacroEmissionCheckScope guard(this);
8800     ITScope it_scope(this, &cond, guard);
8801     vqrshl(cond, dt, rd, rm, rn);
8802   }
Vqrshl(DataType dt,DRegister rd,DRegister rm,DRegister rn)8803   void Vqrshl(DataType dt, DRegister rd, DRegister rm, DRegister rn) {
8804     Vqrshl(al, dt, rd, rm, rn);
8805   }
8806 
Vqrshl(Condition cond,DataType dt,QRegister rd,QRegister rm,QRegister rn)8807   void Vqrshl(
8808       Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
8809     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8810     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8811     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8812     VIXL_ASSERT(allow_macro_instructions_);
8813     VIXL_ASSERT(OutsideITBlock());
8814     MacroEmissionCheckScope guard(this);
8815     ITScope it_scope(this, &cond, guard);
8816     vqrshl(cond, dt, rd, rm, rn);
8817   }
Vqrshl(DataType dt,QRegister rd,QRegister rm,QRegister rn)8818   void Vqrshl(DataType dt, QRegister rd, QRegister rm, QRegister rn) {
8819     Vqrshl(al, dt, rd, rm, rn);
8820   }
8821 
Vqrshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8822   void Vqrshrn(Condition cond,
8823                DataType dt,
8824                DRegister rd,
8825                QRegister rm,
8826                const QOperand& operand) {
8827     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8828     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8829     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8830     VIXL_ASSERT(allow_macro_instructions_);
8831     VIXL_ASSERT(OutsideITBlock());
8832     MacroEmissionCheckScope guard(this);
8833     ITScope it_scope(this, &cond, guard);
8834     vqrshrn(cond, dt, rd, rm, operand);
8835   }
Vqrshrn(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8836   void Vqrshrn(DataType dt,
8837                DRegister rd,
8838                QRegister rm,
8839                const QOperand& operand) {
8840     Vqrshrn(al, dt, rd, rm, operand);
8841   }
8842 
Vqrshrun(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8843   void Vqrshrun(Condition cond,
8844                 DataType dt,
8845                 DRegister rd,
8846                 QRegister rm,
8847                 const QOperand& operand) {
8848     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8849     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8850     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8851     VIXL_ASSERT(allow_macro_instructions_);
8852     VIXL_ASSERT(OutsideITBlock());
8853     MacroEmissionCheckScope guard(this);
8854     ITScope it_scope(this, &cond, guard);
8855     vqrshrun(cond, dt, rd, rm, operand);
8856   }
Vqrshrun(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8857   void Vqrshrun(DataType dt,
8858                 DRegister rd,
8859                 QRegister rm,
8860                 const QOperand& operand) {
8861     Vqrshrun(al, dt, rd, rm, operand);
8862   }
8863 
Vqshl(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)8864   void Vqshl(Condition cond,
8865              DataType dt,
8866              DRegister rd,
8867              DRegister rm,
8868              const DOperand& operand) {
8869     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8870     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8871     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8872     VIXL_ASSERT(allow_macro_instructions_);
8873     VIXL_ASSERT(OutsideITBlock());
8874     MacroEmissionCheckScope guard(this);
8875     ITScope it_scope(this, &cond, guard);
8876     vqshl(cond, dt, rd, rm, operand);
8877   }
Vqshl(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)8878   void Vqshl(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
8879     Vqshl(al, dt, rd, rm, operand);
8880   }
8881 
Vqshl(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)8882   void Vqshl(Condition cond,
8883              DataType dt,
8884              QRegister rd,
8885              QRegister rm,
8886              const QOperand& operand) {
8887     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8888     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8889     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8890     VIXL_ASSERT(allow_macro_instructions_);
8891     VIXL_ASSERT(OutsideITBlock());
8892     MacroEmissionCheckScope guard(this);
8893     ITScope it_scope(this, &cond, guard);
8894     vqshl(cond, dt, rd, rm, operand);
8895   }
Vqshl(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)8896   void Vqshl(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
8897     Vqshl(al, dt, rd, rm, operand);
8898   }
8899 
Vqshlu(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)8900   void Vqshlu(Condition cond,
8901               DataType dt,
8902               DRegister rd,
8903               DRegister rm,
8904               const DOperand& operand) {
8905     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8906     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8907     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8908     VIXL_ASSERT(allow_macro_instructions_);
8909     VIXL_ASSERT(OutsideITBlock());
8910     MacroEmissionCheckScope guard(this);
8911     ITScope it_scope(this, &cond, guard);
8912     vqshlu(cond, dt, rd, rm, operand);
8913   }
Vqshlu(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)8914   void Vqshlu(DataType dt,
8915               DRegister rd,
8916               DRegister rm,
8917               const DOperand& operand) {
8918     Vqshlu(al, dt, rd, rm, operand);
8919   }
8920 
Vqshlu(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)8921   void Vqshlu(Condition cond,
8922               DataType dt,
8923               QRegister rd,
8924               QRegister rm,
8925               const QOperand& operand) {
8926     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8927     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8928     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8929     VIXL_ASSERT(allow_macro_instructions_);
8930     VIXL_ASSERT(OutsideITBlock());
8931     MacroEmissionCheckScope guard(this);
8932     ITScope it_scope(this, &cond, guard);
8933     vqshlu(cond, dt, rd, rm, operand);
8934   }
Vqshlu(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)8935   void Vqshlu(DataType dt,
8936               QRegister rd,
8937               QRegister rm,
8938               const QOperand& operand) {
8939     Vqshlu(al, dt, rd, rm, operand);
8940   }
8941 
Vqshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8942   void Vqshrn(Condition cond,
8943               DataType dt,
8944               DRegister rd,
8945               QRegister rm,
8946               const QOperand& operand) {
8947     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8948     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8949     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8950     VIXL_ASSERT(allow_macro_instructions_);
8951     VIXL_ASSERT(OutsideITBlock());
8952     MacroEmissionCheckScope guard(this);
8953     ITScope it_scope(this, &cond, guard);
8954     vqshrn(cond, dt, rd, rm, operand);
8955   }
Vqshrn(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8956   void Vqshrn(DataType dt,
8957               DRegister rd,
8958               QRegister rm,
8959               const QOperand& operand) {
8960     Vqshrn(al, dt, rd, rm, operand);
8961   }
8962 
Vqshrun(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8963   void Vqshrun(Condition cond,
8964                DataType dt,
8965                DRegister rd,
8966                QRegister rm,
8967                const QOperand& operand) {
8968     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8969     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8970     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8971     VIXL_ASSERT(allow_macro_instructions_);
8972     VIXL_ASSERT(OutsideITBlock());
8973     MacroEmissionCheckScope guard(this);
8974     ITScope it_scope(this, &cond, guard);
8975     vqshrun(cond, dt, rd, rm, operand);
8976   }
Vqshrun(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8977   void Vqshrun(DataType dt,
8978                DRegister rd,
8979                QRegister rm,
8980                const QOperand& operand) {
8981     Vqshrun(al, dt, rd, rm, operand);
8982   }
8983 
Vqsub(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8984   void Vqsub(
8985       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8986     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8987     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8988     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8989     VIXL_ASSERT(allow_macro_instructions_);
8990     VIXL_ASSERT(OutsideITBlock());
8991     MacroEmissionCheckScope guard(this);
8992     ITScope it_scope(this, &cond, guard);
8993     vqsub(cond, dt, rd, rn, rm);
8994   }
Vqsub(DataType dt,DRegister rd,DRegister rn,DRegister rm)8995   void Vqsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8996     Vqsub(al, dt, rd, rn, rm);
8997   }
8998 
Vqsub(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)8999   void Vqsub(
9000       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9001     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9002     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9003     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9004     VIXL_ASSERT(allow_macro_instructions_);
9005     VIXL_ASSERT(OutsideITBlock());
9006     MacroEmissionCheckScope guard(this);
9007     ITScope it_scope(this, &cond, guard);
9008     vqsub(cond, dt, rd, rn, rm);
9009   }
Vqsub(DataType dt,QRegister rd,QRegister rn,QRegister rm)9010   void Vqsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9011     Vqsub(al, dt, rd, rn, rm);
9012   }
9013 
Vraddhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)9014   void Vraddhn(
9015       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9016     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9017     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9018     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9019     VIXL_ASSERT(allow_macro_instructions_);
9020     VIXL_ASSERT(OutsideITBlock());
9021     MacroEmissionCheckScope guard(this);
9022     ITScope it_scope(this, &cond, guard);
9023     vraddhn(cond, dt, rd, rn, rm);
9024   }
Vraddhn(DataType dt,DRegister rd,QRegister rn,QRegister rm)9025   void Vraddhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9026     Vraddhn(al, dt, rd, rn, rm);
9027   }
9028 
Vrecpe(Condition cond,DataType dt,DRegister rd,DRegister rm)9029   void Vrecpe(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9030     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9031     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9032     VIXL_ASSERT(allow_macro_instructions_);
9033     VIXL_ASSERT(OutsideITBlock());
9034     MacroEmissionCheckScope guard(this);
9035     ITScope it_scope(this, &cond, guard);
9036     vrecpe(cond, dt, rd, rm);
9037   }
Vrecpe(DataType dt,DRegister rd,DRegister rm)9038   void Vrecpe(DataType dt, DRegister rd, DRegister rm) {
9039     Vrecpe(al, dt, rd, rm);
9040   }
9041 
Vrecpe(Condition cond,DataType dt,QRegister rd,QRegister rm)9042   void Vrecpe(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9043     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9044     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9045     VIXL_ASSERT(allow_macro_instructions_);
9046     VIXL_ASSERT(OutsideITBlock());
9047     MacroEmissionCheckScope guard(this);
9048     ITScope it_scope(this, &cond, guard);
9049     vrecpe(cond, dt, rd, rm);
9050   }
Vrecpe(DataType dt,QRegister rd,QRegister rm)9051   void Vrecpe(DataType dt, QRegister rd, QRegister rm) {
9052     Vrecpe(al, dt, rd, rm);
9053   }
9054 
Vrecps(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)9055   void Vrecps(
9056       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9057     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9058     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9059     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9060     VIXL_ASSERT(allow_macro_instructions_);
9061     VIXL_ASSERT(OutsideITBlock());
9062     MacroEmissionCheckScope guard(this);
9063     ITScope it_scope(this, &cond, guard);
9064     vrecps(cond, dt, rd, rn, rm);
9065   }
Vrecps(DataType dt,DRegister rd,DRegister rn,DRegister rm)9066   void Vrecps(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9067     Vrecps(al, dt, rd, rn, rm);
9068   }
9069 
Vrecps(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)9070   void Vrecps(
9071       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9072     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9073     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9074     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9075     VIXL_ASSERT(allow_macro_instructions_);
9076     VIXL_ASSERT(OutsideITBlock());
9077     MacroEmissionCheckScope guard(this);
9078     ITScope it_scope(this, &cond, guard);
9079     vrecps(cond, dt, rd, rn, rm);
9080   }
Vrecps(DataType dt,QRegister rd,QRegister rn,QRegister rm)9081   void Vrecps(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9082     Vrecps(al, dt, rd, rn, rm);
9083   }
9084 
Vrev16(Condition cond,DataType dt,DRegister rd,DRegister rm)9085   void Vrev16(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9086     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9087     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9088     VIXL_ASSERT(allow_macro_instructions_);
9089     VIXL_ASSERT(OutsideITBlock());
9090     MacroEmissionCheckScope guard(this);
9091     ITScope it_scope(this, &cond, guard);
9092     vrev16(cond, dt, rd, rm);
9093   }
Vrev16(DataType dt,DRegister rd,DRegister rm)9094   void Vrev16(DataType dt, DRegister rd, DRegister rm) {
9095     Vrev16(al, dt, rd, rm);
9096   }
9097 
Vrev16(Condition cond,DataType dt,QRegister rd,QRegister rm)9098   void Vrev16(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9099     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9100     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9101     VIXL_ASSERT(allow_macro_instructions_);
9102     VIXL_ASSERT(OutsideITBlock());
9103     MacroEmissionCheckScope guard(this);
9104     ITScope it_scope(this, &cond, guard);
9105     vrev16(cond, dt, rd, rm);
9106   }
Vrev16(DataType dt,QRegister rd,QRegister rm)9107   void Vrev16(DataType dt, QRegister rd, QRegister rm) {
9108     Vrev16(al, dt, rd, rm);
9109   }
9110 
Vrev32(Condition cond,DataType dt,DRegister rd,DRegister rm)9111   void Vrev32(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9112     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9113     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9114     VIXL_ASSERT(allow_macro_instructions_);
9115     VIXL_ASSERT(OutsideITBlock());
9116     MacroEmissionCheckScope guard(this);
9117     ITScope it_scope(this, &cond, guard);
9118     vrev32(cond, dt, rd, rm);
9119   }
Vrev32(DataType dt,DRegister rd,DRegister rm)9120   void Vrev32(DataType dt, DRegister rd, DRegister rm) {
9121     Vrev32(al, dt, rd, rm);
9122   }
9123 
Vrev32(Condition cond,DataType dt,QRegister rd,QRegister rm)9124   void Vrev32(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9125     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9126     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9127     VIXL_ASSERT(allow_macro_instructions_);
9128     VIXL_ASSERT(OutsideITBlock());
9129     MacroEmissionCheckScope guard(this);
9130     ITScope it_scope(this, &cond, guard);
9131     vrev32(cond, dt, rd, rm);
9132   }
Vrev32(DataType dt,QRegister rd,QRegister rm)9133   void Vrev32(DataType dt, QRegister rd, QRegister rm) {
9134     Vrev32(al, dt, rd, rm);
9135   }
9136 
Vrev64(Condition cond,DataType dt,DRegister rd,DRegister rm)9137   void Vrev64(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9138     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9139     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9140     VIXL_ASSERT(allow_macro_instructions_);
9141     VIXL_ASSERT(OutsideITBlock());
9142     MacroEmissionCheckScope guard(this);
9143     ITScope it_scope(this, &cond, guard);
9144     vrev64(cond, dt, rd, rm);
9145   }
Vrev64(DataType dt,DRegister rd,DRegister rm)9146   void Vrev64(DataType dt, DRegister rd, DRegister rm) {
9147     Vrev64(al, dt, rd, rm);
9148   }
9149 
Vrev64(Condition cond,DataType dt,QRegister rd,QRegister rm)9150   void Vrev64(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9151     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9152     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9153     VIXL_ASSERT(allow_macro_instructions_);
9154     VIXL_ASSERT(OutsideITBlock());
9155     MacroEmissionCheckScope guard(this);
9156     ITScope it_scope(this, &cond, guard);
9157     vrev64(cond, dt, rd, rm);
9158   }
Vrev64(DataType dt,QRegister rd,QRegister rm)9159   void Vrev64(DataType dt, QRegister rd, QRegister rm) {
9160     Vrev64(al, dt, rd, rm);
9161   }
9162 
Vrhadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)9163   void Vrhadd(
9164       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9165     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9166     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9167     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9168     VIXL_ASSERT(allow_macro_instructions_);
9169     VIXL_ASSERT(OutsideITBlock());
9170     MacroEmissionCheckScope guard(this);
9171     ITScope it_scope(this, &cond, guard);
9172     vrhadd(cond, dt, rd, rn, rm);
9173   }
Vrhadd(DataType dt,DRegister rd,DRegister rn,DRegister rm)9174   void Vrhadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9175     Vrhadd(al, dt, rd, rn, rm);
9176   }
9177 
Vrhadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)9178   void Vrhadd(
9179       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9180     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9181     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9182     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9183     VIXL_ASSERT(allow_macro_instructions_);
9184     VIXL_ASSERT(OutsideITBlock());
9185     MacroEmissionCheckScope guard(this);
9186     ITScope it_scope(this, &cond, guard);
9187     vrhadd(cond, dt, rd, rn, rm);
9188   }
Vrhadd(DataType dt,QRegister rd,QRegister rn,QRegister rm)9189   void Vrhadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9190     Vrhadd(al, dt, rd, rn, rm);
9191   }
9192 
Vrinta(DataType dt,DRegister rd,DRegister rm)9193   void Vrinta(DataType dt, DRegister rd, DRegister rm) {
9194     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9195     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9196     VIXL_ASSERT(allow_macro_instructions_);
9197     VIXL_ASSERT(OutsideITBlock());
9198     MacroEmissionCheckScope guard(this);
9199     vrinta(dt, rd, rm);
9200   }
9201 
Vrinta(DataType dt,QRegister rd,QRegister rm)9202   void Vrinta(DataType dt, QRegister rd, QRegister rm) {
9203     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9204     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9205     VIXL_ASSERT(allow_macro_instructions_);
9206     VIXL_ASSERT(OutsideITBlock());
9207     MacroEmissionCheckScope guard(this);
9208     vrinta(dt, rd, rm);
9209   }
9210 
Vrinta(DataType dt,SRegister rd,SRegister rm)9211   void Vrinta(DataType dt, SRegister rd, SRegister rm) {
9212     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9213     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9214     VIXL_ASSERT(allow_macro_instructions_);
9215     VIXL_ASSERT(OutsideITBlock());
9216     MacroEmissionCheckScope guard(this);
9217     vrinta(dt, rd, rm);
9218   }
9219 
Vrintm(DataType dt,DRegister rd,DRegister rm)9220   void Vrintm(DataType dt, DRegister rd, DRegister rm) {
9221     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9222     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9223     VIXL_ASSERT(allow_macro_instructions_);
9224     VIXL_ASSERT(OutsideITBlock());
9225     MacroEmissionCheckScope guard(this);
9226     vrintm(dt, rd, rm);
9227   }
9228 
Vrintm(DataType dt,QRegister rd,QRegister rm)9229   void Vrintm(DataType dt, QRegister rd, QRegister rm) {
9230     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9231     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9232     VIXL_ASSERT(allow_macro_instructions_);
9233     VIXL_ASSERT(OutsideITBlock());
9234     MacroEmissionCheckScope guard(this);
9235     vrintm(dt, rd, rm);
9236   }
9237 
Vrintm(DataType dt,SRegister rd,SRegister rm)9238   void Vrintm(DataType dt, SRegister rd, SRegister rm) {
9239     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9240     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9241     VIXL_ASSERT(allow_macro_instructions_);
9242     VIXL_ASSERT(OutsideITBlock());
9243     MacroEmissionCheckScope guard(this);
9244     vrintm(dt, rd, rm);
9245   }
9246 
Vrintn(DataType dt,DRegister rd,DRegister rm)9247   void Vrintn(DataType dt, DRegister rd, DRegister rm) {
9248     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9249     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9250     VIXL_ASSERT(allow_macro_instructions_);
9251     VIXL_ASSERT(OutsideITBlock());
9252     MacroEmissionCheckScope guard(this);
9253     vrintn(dt, rd, rm);
9254   }
9255 
Vrintn(DataType dt,QRegister rd,QRegister rm)9256   void Vrintn(DataType dt, QRegister rd, QRegister rm) {
9257     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9258     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9259     VIXL_ASSERT(allow_macro_instructions_);
9260     VIXL_ASSERT(OutsideITBlock());
9261     MacroEmissionCheckScope guard(this);
9262     vrintn(dt, rd, rm);
9263   }
9264 
Vrintn(DataType dt,SRegister rd,SRegister rm)9265   void Vrintn(DataType dt, SRegister rd, SRegister rm) {
9266     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9267     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9268     VIXL_ASSERT(allow_macro_instructions_);
9269     VIXL_ASSERT(OutsideITBlock());
9270     MacroEmissionCheckScope guard(this);
9271     vrintn(dt, rd, rm);
9272   }
9273 
Vrintp(DataType dt,DRegister rd,DRegister rm)9274   void Vrintp(DataType dt, DRegister rd, DRegister rm) {
9275     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9276     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9277     VIXL_ASSERT(allow_macro_instructions_);
9278     VIXL_ASSERT(OutsideITBlock());
9279     MacroEmissionCheckScope guard(this);
9280     vrintp(dt, rd, rm);
9281   }
9282 
Vrintp(DataType dt,QRegister rd,QRegister rm)9283   void Vrintp(DataType dt, QRegister rd, QRegister rm) {
9284     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9285     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9286     VIXL_ASSERT(allow_macro_instructions_);
9287     VIXL_ASSERT(OutsideITBlock());
9288     MacroEmissionCheckScope guard(this);
9289     vrintp(dt, rd, rm);
9290   }
9291 
Vrintp(DataType dt,SRegister rd,SRegister rm)9292   void Vrintp(DataType dt, SRegister rd, SRegister rm) {
9293     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9294     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9295     VIXL_ASSERT(allow_macro_instructions_);
9296     VIXL_ASSERT(OutsideITBlock());
9297     MacroEmissionCheckScope guard(this);
9298     vrintp(dt, rd, rm);
9299   }
9300 
Vrintr(Condition cond,DataType dt,SRegister rd,SRegister rm)9301   void Vrintr(Condition cond, DataType dt, SRegister rd, SRegister rm) {
9302     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9303     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9304     VIXL_ASSERT(allow_macro_instructions_);
9305     VIXL_ASSERT(OutsideITBlock());
9306     MacroEmissionCheckScope guard(this);
9307     ITScope it_scope(this, &cond, guard);
9308     vrintr(cond, dt, rd, rm);
9309   }
Vrintr(DataType dt,SRegister rd,SRegister rm)9310   void Vrintr(DataType dt, SRegister rd, SRegister rm) {
9311     Vrintr(al, dt, rd, rm);
9312   }
9313 
Vrintr(Condition cond,DataType dt,DRegister rd,DRegister rm)9314   void Vrintr(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9315     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9316     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9317     VIXL_ASSERT(allow_macro_instructions_);
9318     VIXL_ASSERT(OutsideITBlock());
9319     MacroEmissionCheckScope guard(this);
9320     ITScope it_scope(this, &cond, guard);
9321     vrintr(cond, dt, rd, rm);
9322   }
Vrintr(DataType dt,DRegister rd,DRegister rm)9323   void Vrintr(DataType dt, DRegister rd, DRegister rm) {
9324     Vrintr(al, dt, rd, rm);
9325   }
9326 
Vrintx(Condition cond,DataType dt,DRegister rd,DRegister rm)9327   void Vrintx(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9328     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9329     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9330     VIXL_ASSERT(allow_macro_instructions_);
9331     VIXL_ASSERT(OutsideITBlock());
9332     MacroEmissionCheckScope guard(this);
9333     ITScope it_scope(this, &cond, guard);
9334     vrintx(cond, dt, rd, rm);
9335   }
Vrintx(DataType dt,DRegister rd,DRegister rm)9336   void Vrintx(DataType dt, DRegister rd, DRegister rm) {
9337     Vrintx(al, dt, rd, rm);
9338   }
9339 
Vrintx(DataType dt,QRegister rd,QRegister rm)9340   void Vrintx(DataType dt, QRegister rd, QRegister rm) {
9341     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9342     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9343     VIXL_ASSERT(allow_macro_instructions_);
9344     VIXL_ASSERT(OutsideITBlock());
9345     MacroEmissionCheckScope guard(this);
9346     vrintx(dt, rd, rm);
9347   }
9348 
Vrintx(Condition cond,DataType dt,SRegister rd,SRegister rm)9349   void Vrintx(Condition cond, DataType dt, SRegister rd, SRegister rm) {
9350     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9351     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9352     VIXL_ASSERT(allow_macro_instructions_);
9353     VIXL_ASSERT(OutsideITBlock());
9354     MacroEmissionCheckScope guard(this);
9355     ITScope it_scope(this, &cond, guard);
9356     vrintx(cond, dt, rd, rm);
9357   }
Vrintx(DataType dt,SRegister rd,SRegister rm)9358   void Vrintx(DataType dt, SRegister rd, SRegister rm) {
9359     Vrintx(al, dt, rd, rm);
9360   }
9361 
Vrintz(Condition cond,DataType dt,DRegister rd,DRegister rm)9362   void Vrintz(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9363     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9364     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9365     VIXL_ASSERT(allow_macro_instructions_);
9366     VIXL_ASSERT(OutsideITBlock());
9367     MacroEmissionCheckScope guard(this);
9368     ITScope it_scope(this, &cond, guard);
9369     vrintz(cond, dt, rd, rm);
9370   }
Vrintz(DataType dt,DRegister rd,DRegister rm)9371   void Vrintz(DataType dt, DRegister rd, DRegister rm) {
9372     Vrintz(al, dt, rd, rm);
9373   }
9374 
Vrintz(DataType dt,QRegister rd,QRegister rm)9375   void Vrintz(DataType dt, QRegister rd, QRegister rm) {
9376     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9377     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9378     VIXL_ASSERT(allow_macro_instructions_);
9379     VIXL_ASSERT(OutsideITBlock());
9380     MacroEmissionCheckScope guard(this);
9381     vrintz(dt, rd, rm);
9382   }
9383 
Vrintz(Condition cond,DataType dt,SRegister rd,SRegister rm)9384   void Vrintz(Condition cond, DataType dt, SRegister rd, SRegister rm) {
9385     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9386     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9387     VIXL_ASSERT(allow_macro_instructions_);
9388     VIXL_ASSERT(OutsideITBlock());
9389     MacroEmissionCheckScope guard(this);
9390     ITScope it_scope(this, &cond, guard);
9391     vrintz(cond, dt, rd, rm);
9392   }
Vrintz(DataType dt,SRegister rd,SRegister rm)9393   void Vrintz(DataType dt, SRegister rd, SRegister rm) {
9394     Vrintz(al, dt, rd, rm);
9395   }
9396 
Vrshl(Condition cond,DataType dt,DRegister rd,DRegister rm,DRegister rn)9397   void Vrshl(
9398       Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
9399     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9400     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9401     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9402     VIXL_ASSERT(allow_macro_instructions_);
9403     VIXL_ASSERT(OutsideITBlock());
9404     MacroEmissionCheckScope guard(this);
9405     ITScope it_scope(this, &cond, guard);
9406     vrshl(cond, dt, rd, rm, rn);
9407   }
Vrshl(DataType dt,DRegister rd,DRegister rm,DRegister rn)9408   void Vrshl(DataType dt, DRegister rd, DRegister rm, DRegister rn) {
9409     Vrshl(al, dt, rd, rm, rn);
9410   }
9411 
Vrshl(Condition cond,DataType dt,QRegister rd,QRegister rm,QRegister rn)9412   void Vrshl(
9413       Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
9414     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9415     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9416     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9417     VIXL_ASSERT(allow_macro_instructions_);
9418     VIXL_ASSERT(OutsideITBlock());
9419     MacroEmissionCheckScope guard(this);
9420     ITScope it_scope(this, &cond, guard);
9421     vrshl(cond, dt, rd, rm, rn);
9422   }
Vrshl(DataType dt,QRegister rd,QRegister rm,QRegister rn)9423   void Vrshl(DataType dt, QRegister rd, QRegister rm, QRegister rn) {
9424     Vrshl(al, dt, rd, rm, rn);
9425   }
9426 
Vrshr(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9427   void Vrshr(Condition cond,
9428              DataType dt,
9429              DRegister rd,
9430              DRegister rm,
9431              const DOperand& operand) {
9432     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9433     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9434     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9435     VIXL_ASSERT(allow_macro_instructions_);
9436     VIXL_ASSERT(OutsideITBlock());
9437     MacroEmissionCheckScope guard(this);
9438     ITScope it_scope(this, &cond, guard);
9439     vrshr(cond, dt, rd, rm, operand);
9440   }
Vrshr(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9441   void Vrshr(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9442     Vrshr(al, dt, rd, rm, operand);
9443   }
9444 
Vrshr(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9445   void Vrshr(Condition cond,
9446              DataType dt,
9447              QRegister rd,
9448              QRegister rm,
9449              const QOperand& operand) {
9450     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9451     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9452     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9453     VIXL_ASSERT(allow_macro_instructions_);
9454     VIXL_ASSERT(OutsideITBlock());
9455     MacroEmissionCheckScope guard(this);
9456     ITScope it_scope(this, &cond, guard);
9457     vrshr(cond, dt, rd, rm, operand);
9458   }
Vrshr(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9459   void Vrshr(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9460     Vrshr(al, dt, rd, rm, operand);
9461   }
9462 
Vrshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9463   void Vrshrn(Condition cond,
9464               DataType dt,
9465               DRegister rd,
9466               QRegister rm,
9467               const QOperand& operand) {
9468     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9469     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9470     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9471     VIXL_ASSERT(allow_macro_instructions_);
9472     VIXL_ASSERT(OutsideITBlock());
9473     MacroEmissionCheckScope guard(this);
9474     ITScope it_scope(this, &cond, guard);
9475     vrshrn(cond, dt, rd, rm, operand);
9476   }
Vrshrn(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9477   void Vrshrn(DataType dt,
9478               DRegister rd,
9479               QRegister rm,
9480               const QOperand& operand) {
9481     Vrshrn(al, dt, rd, rm, operand);
9482   }
9483 
Vrsqrte(Condition cond,DataType dt,DRegister rd,DRegister rm)9484   void Vrsqrte(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9485     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9486     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9487     VIXL_ASSERT(allow_macro_instructions_);
9488     VIXL_ASSERT(OutsideITBlock());
9489     MacroEmissionCheckScope guard(this);
9490     ITScope it_scope(this, &cond, guard);
9491     vrsqrte(cond, dt, rd, rm);
9492   }
Vrsqrte(DataType dt,DRegister rd,DRegister rm)9493   void Vrsqrte(DataType dt, DRegister rd, DRegister rm) {
9494     Vrsqrte(al, dt, rd, rm);
9495   }
9496 
Vrsqrte(Condition cond,DataType dt,QRegister rd,QRegister rm)9497   void Vrsqrte(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9498     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9499     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9500     VIXL_ASSERT(allow_macro_instructions_);
9501     VIXL_ASSERT(OutsideITBlock());
9502     MacroEmissionCheckScope guard(this);
9503     ITScope it_scope(this, &cond, guard);
9504     vrsqrte(cond, dt, rd, rm);
9505   }
Vrsqrte(DataType dt,QRegister rd,QRegister rm)9506   void Vrsqrte(DataType dt, QRegister rd, QRegister rm) {
9507     Vrsqrte(al, dt, rd, rm);
9508   }
9509 
Vrsqrts(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)9510   void Vrsqrts(
9511       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9512     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9513     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9514     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9515     VIXL_ASSERT(allow_macro_instructions_);
9516     VIXL_ASSERT(OutsideITBlock());
9517     MacroEmissionCheckScope guard(this);
9518     ITScope it_scope(this, &cond, guard);
9519     vrsqrts(cond, dt, rd, rn, rm);
9520   }
Vrsqrts(DataType dt,DRegister rd,DRegister rn,DRegister rm)9521   void Vrsqrts(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9522     Vrsqrts(al, dt, rd, rn, rm);
9523   }
9524 
Vrsqrts(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)9525   void Vrsqrts(
9526       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9527     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9528     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9529     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9530     VIXL_ASSERT(allow_macro_instructions_);
9531     VIXL_ASSERT(OutsideITBlock());
9532     MacroEmissionCheckScope guard(this);
9533     ITScope it_scope(this, &cond, guard);
9534     vrsqrts(cond, dt, rd, rn, rm);
9535   }
Vrsqrts(DataType dt,QRegister rd,QRegister rn,QRegister rm)9536   void Vrsqrts(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9537     Vrsqrts(al, dt, rd, rn, rm);
9538   }
9539 
Vrsra(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9540   void Vrsra(Condition cond,
9541              DataType dt,
9542              DRegister rd,
9543              DRegister rm,
9544              const DOperand& operand) {
9545     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9546     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9547     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9548     VIXL_ASSERT(allow_macro_instructions_);
9549     VIXL_ASSERT(OutsideITBlock());
9550     MacroEmissionCheckScope guard(this);
9551     ITScope it_scope(this, &cond, guard);
9552     vrsra(cond, dt, rd, rm, operand);
9553   }
Vrsra(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9554   void Vrsra(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9555     Vrsra(al, dt, rd, rm, operand);
9556   }
9557 
Vrsra(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9558   void Vrsra(Condition cond,
9559              DataType dt,
9560              QRegister rd,
9561              QRegister rm,
9562              const QOperand& operand) {
9563     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9564     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9565     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9566     VIXL_ASSERT(allow_macro_instructions_);
9567     VIXL_ASSERT(OutsideITBlock());
9568     MacroEmissionCheckScope guard(this);
9569     ITScope it_scope(this, &cond, guard);
9570     vrsra(cond, dt, rd, rm, operand);
9571   }
Vrsra(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9572   void Vrsra(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9573     Vrsra(al, dt, rd, rm, operand);
9574   }
9575 
Vrsubhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)9576   void Vrsubhn(
9577       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9578     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9579     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9580     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9581     VIXL_ASSERT(allow_macro_instructions_);
9582     VIXL_ASSERT(OutsideITBlock());
9583     MacroEmissionCheckScope guard(this);
9584     ITScope it_scope(this, &cond, guard);
9585     vrsubhn(cond, dt, rd, rn, rm);
9586   }
Vrsubhn(DataType dt,DRegister rd,QRegister rn,QRegister rm)9587   void Vrsubhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9588     Vrsubhn(al, dt, rd, rn, rm);
9589   }
9590 
Vseleq(DataType dt,DRegister rd,DRegister rn,DRegister rm)9591   void Vseleq(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9592     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9593     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9594     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9595     VIXL_ASSERT(allow_macro_instructions_);
9596     VIXL_ASSERT(OutsideITBlock());
9597     MacroEmissionCheckScope guard(this);
9598     vseleq(dt, rd, rn, rm);
9599   }
9600 
Vseleq(DataType dt,SRegister rd,SRegister rn,SRegister rm)9601   void Vseleq(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9602     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9603     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9604     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9605     VIXL_ASSERT(allow_macro_instructions_);
9606     VIXL_ASSERT(OutsideITBlock());
9607     MacroEmissionCheckScope guard(this);
9608     vseleq(dt, rd, rn, rm);
9609   }
9610 
Vselge(DataType dt,DRegister rd,DRegister rn,DRegister rm)9611   void Vselge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9612     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9613     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9614     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9615     VIXL_ASSERT(allow_macro_instructions_);
9616     VIXL_ASSERT(OutsideITBlock());
9617     MacroEmissionCheckScope guard(this);
9618     vselge(dt, rd, rn, rm);
9619   }
9620 
Vselge(DataType dt,SRegister rd,SRegister rn,SRegister rm)9621   void Vselge(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9622     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9623     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9624     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9625     VIXL_ASSERT(allow_macro_instructions_);
9626     VIXL_ASSERT(OutsideITBlock());
9627     MacroEmissionCheckScope guard(this);
9628     vselge(dt, rd, rn, rm);
9629   }
9630 
Vselgt(DataType dt,DRegister rd,DRegister rn,DRegister rm)9631   void Vselgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9632     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9633     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9634     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9635     VIXL_ASSERT(allow_macro_instructions_);
9636     VIXL_ASSERT(OutsideITBlock());
9637     MacroEmissionCheckScope guard(this);
9638     vselgt(dt, rd, rn, rm);
9639   }
9640 
Vselgt(DataType dt,SRegister rd,SRegister rn,SRegister rm)9641   void Vselgt(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9642     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9643     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9644     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9645     VIXL_ASSERT(allow_macro_instructions_);
9646     VIXL_ASSERT(OutsideITBlock());
9647     MacroEmissionCheckScope guard(this);
9648     vselgt(dt, rd, rn, rm);
9649   }
9650 
Vselvs(DataType dt,DRegister rd,DRegister rn,DRegister rm)9651   void Vselvs(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9652     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9653     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9654     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9655     VIXL_ASSERT(allow_macro_instructions_);
9656     VIXL_ASSERT(OutsideITBlock());
9657     MacroEmissionCheckScope guard(this);
9658     vselvs(dt, rd, rn, rm);
9659   }
9660 
Vselvs(DataType dt,SRegister rd,SRegister rn,SRegister rm)9661   void Vselvs(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9662     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9663     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9664     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9665     VIXL_ASSERT(allow_macro_instructions_);
9666     VIXL_ASSERT(OutsideITBlock());
9667     MacroEmissionCheckScope guard(this);
9668     vselvs(dt, rd, rn, rm);
9669   }
9670 
Vshl(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9671   void Vshl(Condition cond,
9672             DataType dt,
9673             DRegister rd,
9674             DRegister rm,
9675             const DOperand& operand) {
9676     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9677     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9678     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9679     VIXL_ASSERT(allow_macro_instructions_);
9680     VIXL_ASSERT(OutsideITBlock());
9681     MacroEmissionCheckScope guard(this);
9682     ITScope it_scope(this, &cond, guard);
9683     vshl(cond, dt, rd, rm, operand);
9684   }
Vshl(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9685   void Vshl(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9686     Vshl(al, dt, rd, rm, operand);
9687   }
9688 
Vshl(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9689   void Vshl(Condition cond,
9690             DataType dt,
9691             QRegister rd,
9692             QRegister rm,
9693             const QOperand& operand) {
9694     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9695     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9696     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9697     VIXL_ASSERT(allow_macro_instructions_);
9698     VIXL_ASSERT(OutsideITBlock());
9699     MacroEmissionCheckScope guard(this);
9700     ITScope it_scope(this, &cond, guard);
9701     vshl(cond, dt, rd, rm, operand);
9702   }
Vshl(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9703   void Vshl(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9704     Vshl(al, dt, rd, rm, operand);
9705   }
9706 
Vshll(Condition cond,DataType dt,QRegister rd,DRegister rm,const DOperand & operand)9707   void Vshll(Condition cond,
9708              DataType dt,
9709              QRegister rd,
9710              DRegister rm,
9711              const DOperand& operand) {
9712     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9713     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9714     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9715     VIXL_ASSERT(allow_macro_instructions_);
9716     VIXL_ASSERT(OutsideITBlock());
9717     MacroEmissionCheckScope guard(this);
9718     ITScope it_scope(this, &cond, guard);
9719     vshll(cond, dt, rd, rm, operand);
9720   }
Vshll(DataType dt,QRegister rd,DRegister rm,const DOperand & operand)9721   void Vshll(DataType dt, QRegister rd, DRegister rm, const DOperand& operand) {
9722     Vshll(al, dt, rd, rm, operand);
9723   }
9724 
Vshr(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9725   void Vshr(Condition cond,
9726             DataType dt,
9727             DRegister rd,
9728             DRegister rm,
9729             const DOperand& operand) {
9730     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9731     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9732     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9733     VIXL_ASSERT(allow_macro_instructions_);
9734     VIXL_ASSERT(OutsideITBlock());
9735     MacroEmissionCheckScope guard(this);
9736     ITScope it_scope(this, &cond, guard);
9737     vshr(cond, dt, rd, rm, operand);
9738   }
Vshr(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9739   void Vshr(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9740     Vshr(al, dt, rd, rm, operand);
9741   }
9742 
Vshr(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9743   void Vshr(Condition cond,
9744             DataType dt,
9745             QRegister rd,
9746             QRegister rm,
9747             const QOperand& operand) {
9748     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9749     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9750     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9751     VIXL_ASSERT(allow_macro_instructions_);
9752     VIXL_ASSERT(OutsideITBlock());
9753     MacroEmissionCheckScope guard(this);
9754     ITScope it_scope(this, &cond, guard);
9755     vshr(cond, dt, rd, rm, operand);
9756   }
Vshr(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9757   void Vshr(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9758     Vshr(al, dt, rd, rm, operand);
9759   }
9760 
Vshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9761   void Vshrn(Condition cond,
9762              DataType dt,
9763              DRegister rd,
9764              QRegister rm,
9765              const QOperand& operand) {
9766     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9767     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9768     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9769     VIXL_ASSERT(allow_macro_instructions_);
9770     VIXL_ASSERT(OutsideITBlock());
9771     MacroEmissionCheckScope guard(this);
9772     ITScope it_scope(this, &cond, guard);
9773     vshrn(cond, dt, rd, rm, operand);
9774   }
Vshrn(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9775   void Vshrn(DataType dt, DRegister rd, QRegister rm, const QOperand& operand) {
9776     Vshrn(al, dt, rd, rm, operand);
9777   }
9778 
Vsli(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9779   void Vsli(Condition cond,
9780             DataType dt,
9781             DRegister rd,
9782             DRegister rm,
9783             const DOperand& operand) {
9784     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9785     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9786     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9787     VIXL_ASSERT(allow_macro_instructions_);
9788     VIXL_ASSERT(OutsideITBlock());
9789     MacroEmissionCheckScope guard(this);
9790     ITScope it_scope(this, &cond, guard);
9791     vsli(cond, dt, rd, rm, operand);
9792   }
Vsli(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9793   void Vsli(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9794     Vsli(al, dt, rd, rm, operand);
9795   }
9796 
Vsli(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9797   void Vsli(Condition cond,
9798             DataType dt,
9799             QRegister rd,
9800             QRegister rm,
9801             const QOperand& operand) {
9802     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9803     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9804     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9805     VIXL_ASSERT(allow_macro_instructions_);
9806     VIXL_ASSERT(OutsideITBlock());
9807     MacroEmissionCheckScope guard(this);
9808     ITScope it_scope(this, &cond, guard);
9809     vsli(cond, dt, rd, rm, operand);
9810   }
Vsli(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9811   void Vsli(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9812     Vsli(al, dt, rd, rm, operand);
9813   }
9814 
Vsqrt(Condition cond,DataType dt,SRegister rd,SRegister rm)9815   void Vsqrt(Condition cond, DataType dt, SRegister rd, SRegister rm) {
9816     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9817     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9818     VIXL_ASSERT(allow_macro_instructions_);
9819     VIXL_ASSERT(OutsideITBlock());
9820     MacroEmissionCheckScope guard(this);
9821     ITScope it_scope(this, &cond, guard);
9822     vsqrt(cond, dt, rd, rm);
9823   }
Vsqrt(DataType dt,SRegister rd,SRegister rm)9824   void Vsqrt(DataType dt, SRegister rd, SRegister rm) { Vsqrt(al, dt, rd, rm); }
9825 
Vsqrt(Condition cond,DataType dt,DRegister rd,DRegister rm)9826   void Vsqrt(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9827     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9828     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9829     VIXL_ASSERT(allow_macro_instructions_);
9830     VIXL_ASSERT(OutsideITBlock());
9831     MacroEmissionCheckScope guard(this);
9832     ITScope it_scope(this, &cond, guard);
9833     vsqrt(cond, dt, rd, rm);
9834   }
Vsqrt(DataType dt,DRegister rd,DRegister rm)9835   void Vsqrt(DataType dt, DRegister rd, DRegister rm) { Vsqrt(al, dt, rd, rm); }
9836 
Vsra(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9837   void Vsra(Condition cond,
9838             DataType dt,
9839             DRegister rd,
9840             DRegister rm,
9841             const DOperand& operand) {
9842     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9843     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9844     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9845     VIXL_ASSERT(allow_macro_instructions_);
9846     VIXL_ASSERT(OutsideITBlock());
9847     MacroEmissionCheckScope guard(this);
9848     ITScope it_scope(this, &cond, guard);
9849     vsra(cond, dt, rd, rm, operand);
9850   }
Vsra(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9851   void Vsra(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9852     Vsra(al, dt, rd, rm, operand);
9853   }
9854 
Vsra(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9855   void Vsra(Condition cond,
9856             DataType dt,
9857             QRegister rd,
9858             QRegister rm,
9859             const QOperand& operand) {
9860     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9861     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9862     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9863     VIXL_ASSERT(allow_macro_instructions_);
9864     VIXL_ASSERT(OutsideITBlock());
9865     MacroEmissionCheckScope guard(this);
9866     ITScope it_scope(this, &cond, guard);
9867     vsra(cond, dt, rd, rm, operand);
9868   }
Vsra(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9869   void Vsra(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9870     Vsra(al, dt, rd, rm, operand);
9871   }
9872 
Vsri(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9873   void Vsri(Condition cond,
9874             DataType dt,
9875             DRegister rd,
9876             DRegister rm,
9877             const DOperand& operand) {
9878     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9879     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9880     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9881     VIXL_ASSERT(allow_macro_instructions_);
9882     VIXL_ASSERT(OutsideITBlock());
9883     MacroEmissionCheckScope guard(this);
9884     ITScope it_scope(this, &cond, guard);
9885     vsri(cond, dt, rd, rm, operand);
9886   }
Vsri(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9887   void Vsri(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9888     Vsri(al, dt, rd, rm, operand);
9889   }
9890 
Vsri(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9891   void Vsri(Condition cond,
9892             DataType dt,
9893             QRegister rd,
9894             QRegister rm,
9895             const QOperand& operand) {
9896     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9897     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9898     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9899     VIXL_ASSERT(allow_macro_instructions_);
9900     VIXL_ASSERT(OutsideITBlock());
9901     MacroEmissionCheckScope guard(this);
9902     ITScope it_scope(this, &cond, guard);
9903     vsri(cond, dt, rd, rm, operand);
9904   }
Vsri(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9905   void Vsri(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9906     Vsri(al, dt, rd, rm, operand);
9907   }
9908 
Vst1(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9909   void Vst1(Condition cond,
9910             DataType dt,
9911             const NeonRegisterList& nreglist,
9912             const AlignedMemOperand& operand) {
9913     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
9914     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9915     VIXL_ASSERT(allow_macro_instructions_);
9916     VIXL_ASSERT(OutsideITBlock());
9917     MacroEmissionCheckScope guard(this);
9918     ITScope it_scope(this, &cond, guard);
9919     vst1(cond, dt, nreglist, operand);
9920   }
Vst1(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9921   void Vst1(DataType dt,
9922             const NeonRegisterList& nreglist,
9923             const AlignedMemOperand& operand) {
9924     Vst1(al, dt, nreglist, operand);
9925   }
9926 
Vst2(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9927   void Vst2(Condition cond,
9928             DataType dt,
9929             const NeonRegisterList& nreglist,
9930             const AlignedMemOperand& operand) {
9931     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
9932     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9933     VIXL_ASSERT(allow_macro_instructions_);
9934     VIXL_ASSERT(OutsideITBlock());
9935     MacroEmissionCheckScope guard(this);
9936     ITScope it_scope(this, &cond, guard);
9937     vst2(cond, dt, nreglist, operand);
9938   }
Vst2(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9939   void Vst2(DataType dt,
9940             const NeonRegisterList& nreglist,
9941             const AlignedMemOperand& operand) {
9942     Vst2(al, dt, nreglist, operand);
9943   }
9944 
Vst3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9945   void Vst3(Condition cond,
9946             DataType dt,
9947             const NeonRegisterList& nreglist,
9948             const AlignedMemOperand& operand) {
9949     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
9950     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9951     VIXL_ASSERT(allow_macro_instructions_);
9952     VIXL_ASSERT(OutsideITBlock());
9953     MacroEmissionCheckScope guard(this);
9954     ITScope it_scope(this, &cond, guard);
9955     vst3(cond, dt, nreglist, operand);
9956   }
Vst3(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9957   void Vst3(DataType dt,
9958             const NeonRegisterList& nreglist,
9959             const AlignedMemOperand& operand) {
9960     Vst3(al, dt, nreglist, operand);
9961   }
9962 
Vst3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)9963   void Vst3(Condition cond,
9964             DataType dt,
9965             const NeonRegisterList& nreglist,
9966             const MemOperand& operand) {
9967     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
9968     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9969     VIXL_ASSERT(allow_macro_instructions_);
9970     VIXL_ASSERT(OutsideITBlock());
9971     MacroEmissionCheckScope guard(this);
9972     ITScope it_scope(this, &cond, guard);
9973     vst3(cond, dt, nreglist, operand);
9974   }
Vst3(DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)9975   void Vst3(DataType dt,
9976             const NeonRegisterList& nreglist,
9977             const MemOperand& operand) {
9978     Vst3(al, dt, nreglist, operand);
9979   }
9980 
Vst4(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9981   void Vst4(Condition cond,
9982             DataType dt,
9983             const NeonRegisterList& nreglist,
9984             const AlignedMemOperand& operand) {
9985     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
9986     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9987     VIXL_ASSERT(allow_macro_instructions_);
9988     VIXL_ASSERT(OutsideITBlock());
9989     MacroEmissionCheckScope guard(this);
9990     ITScope it_scope(this, &cond, guard);
9991     vst4(cond, dt, nreglist, operand);
9992   }
Vst4(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9993   void Vst4(DataType dt,
9994             const NeonRegisterList& nreglist,
9995             const AlignedMemOperand& operand) {
9996     Vst4(al, dt, nreglist, operand);
9997   }
9998 
Vstm(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)9999   void Vstm(Condition cond,
10000             DataType dt,
10001             Register rn,
10002             WriteBack write_back,
10003             DRegisterList dreglist) {
10004     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10005     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
10006     VIXL_ASSERT(allow_macro_instructions_);
10007     VIXL_ASSERT(OutsideITBlock());
10008     MacroEmissionCheckScope guard(this);
10009     ITScope it_scope(this, &cond, guard);
10010     vstm(cond, dt, rn, write_back, dreglist);
10011   }
Vstm(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10012   void Vstm(DataType dt,
10013             Register rn,
10014             WriteBack write_back,
10015             DRegisterList dreglist) {
10016     Vstm(al, dt, rn, write_back, dreglist);
10017   }
Vstm(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)10018   void Vstm(Condition cond,
10019             Register rn,
10020             WriteBack write_back,
10021             DRegisterList dreglist) {
10022     Vstm(cond, kDataTypeValueNone, rn, write_back, dreglist);
10023   }
Vstm(Register rn,WriteBack write_back,DRegisterList dreglist)10024   void Vstm(Register rn, WriteBack write_back, DRegisterList dreglist) {
10025     Vstm(al, kDataTypeValueNone, rn, write_back, dreglist);
10026   }
10027 
Vstm(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10028   void Vstm(Condition cond,
10029             DataType dt,
10030             Register rn,
10031             WriteBack write_back,
10032             SRegisterList sreglist) {
10033     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10034     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
10035     VIXL_ASSERT(allow_macro_instructions_);
10036     VIXL_ASSERT(OutsideITBlock());
10037     MacroEmissionCheckScope guard(this);
10038     ITScope it_scope(this, &cond, guard);
10039     vstm(cond, dt, rn, write_back, sreglist);
10040   }
Vstm(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10041   void Vstm(DataType dt,
10042             Register rn,
10043             WriteBack write_back,
10044             SRegisterList sreglist) {
10045     Vstm(al, dt, rn, write_back, sreglist);
10046   }
Vstm(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)10047   void Vstm(Condition cond,
10048             Register rn,
10049             WriteBack write_back,
10050             SRegisterList sreglist) {
10051     Vstm(cond, kDataTypeValueNone, rn, write_back, sreglist);
10052   }
Vstm(Register rn,WriteBack write_back,SRegisterList sreglist)10053   void Vstm(Register rn, WriteBack write_back, SRegisterList sreglist) {
10054     Vstm(al, kDataTypeValueNone, rn, write_back, sreglist);
10055   }
10056 
Vstmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10057   void Vstmdb(Condition cond,
10058               DataType dt,
10059               Register rn,
10060               WriteBack write_back,
10061               DRegisterList dreglist) {
10062     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10063     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
10064     VIXL_ASSERT(allow_macro_instructions_);
10065     VIXL_ASSERT(OutsideITBlock());
10066     MacroEmissionCheckScope guard(this);
10067     ITScope it_scope(this, &cond, guard);
10068     vstmdb(cond, dt, rn, write_back, dreglist);
10069   }
Vstmdb(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10070   void Vstmdb(DataType dt,
10071               Register rn,
10072               WriteBack write_back,
10073               DRegisterList dreglist) {
10074     Vstmdb(al, dt, rn, write_back, dreglist);
10075   }
Vstmdb(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)10076   void Vstmdb(Condition cond,
10077               Register rn,
10078               WriteBack write_back,
10079               DRegisterList dreglist) {
10080     Vstmdb(cond, kDataTypeValueNone, rn, write_back, dreglist);
10081   }
Vstmdb(Register rn,WriteBack write_back,DRegisterList dreglist)10082   void Vstmdb(Register rn, WriteBack write_back, DRegisterList dreglist) {
10083     Vstmdb(al, kDataTypeValueNone, rn, write_back, dreglist);
10084   }
10085 
Vstmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10086   void Vstmdb(Condition cond,
10087               DataType dt,
10088               Register rn,
10089               WriteBack write_back,
10090               SRegisterList sreglist) {
10091     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10092     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
10093     VIXL_ASSERT(allow_macro_instructions_);
10094     VIXL_ASSERT(OutsideITBlock());
10095     MacroEmissionCheckScope guard(this);
10096     ITScope it_scope(this, &cond, guard);
10097     vstmdb(cond, dt, rn, write_back, sreglist);
10098   }
Vstmdb(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10099   void Vstmdb(DataType dt,
10100               Register rn,
10101               WriteBack write_back,
10102               SRegisterList sreglist) {
10103     Vstmdb(al, dt, rn, write_back, sreglist);
10104   }
Vstmdb(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)10105   void Vstmdb(Condition cond,
10106               Register rn,
10107               WriteBack write_back,
10108               SRegisterList sreglist) {
10109     Vstmdb(cond, kDataTypeValueNone, rn, write_back, sreglist);
10110   }
Vstmdb(Register rn,WriteBack write_back,SRegisterList sreglist)10111   void Vstmdb(Register rn, WriteBack write_back, SRegisterList sreglist) {
10112     Vstmdb(al, kDataTypeValueNone, rn, write_back, sreglist);
10113   }
10114 
Vstmia(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10115   void Vstmia(Condition cond,
10116               DataType dt,
10117               Register rn,
10118               WriteBack write_back,
10119               DRegisterList dreglist) {
10120     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10121     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
10122     VIXL_ASSERT(allow_macro_instructions_);
10123     VIXL_ASSERT(OutsideITBlock());
10124     MacroEmissionCheckScope guard(this);
10125     ITScope it_scope(this, &cond, guard);
10126     vstmia(cond, dt, rn, write_back, dreglist);
10127   }
Vstmia(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10128   void Vstmia(DataType dt,
10129               Register rn,
10130               WriteBack write_back,
10131               DRegisterList dreglist) {
10132     Vstmia(al, dt, rn, write_back, dreglist);
10133   }
Vstmia(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)10134   void Vstmia(Condition cond,
10135               Register rn,
10136               WriteBack write_back,
10137               DRegisterList dreglist) {
10138     Vstmia(cond, kDataTypeValueNone, rn, write_back, dreglist);
10139   }
Vstmia(Register rn,WriteBack write_back,DRegisterList dreglist)10140   void Vstmia(Register rn, WriteBack write_back, DRegisterList dreglist) {
10141     Vstmia(al, kDataTypeValueNone, rn, write_back, dreglist);
10142   }
10143 
Vstmia(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10144   void Vstmia(Condition cond,
10145               DataType dt,
10146               Register rn,
10147               WriteBack write_back,
10148               SRegisterList sreglist) {
10149     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10150     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
10151     VIXL_ASSERT(allow_macro_instructions_);
10152     VIXL_ASSERT(OutsideITBlock());
10153     MacroEmissionCheckScope guard(this);
10154     ITScope it_scope(this, &cond, guard);
10155     vstmia(cond, dt, rn, write_back, sreglist);
10156   }
Vstmia(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10157   void Vstmia(DataType dt,
10158               Register rn,
10159               WriteBack write_back,
10160               SRegisterList sreglist) {
10161     Vstmia(al, dt, rn, write_back, sreglist);
10162   }
Vstmia(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)10163   void Vstmia(Condition cond,
10164               Register rn,
10165               WriteBack write_back,
10166               SRegisterList sreglist) {
10167     Vstmia(cond, kDataTypeValueNone, rn, write_back, sreglist);
10168   }
Vstmia(Register rn,WriteBack write_back,SRegisterList sreglist)10169   void Vstmia(Register rn, WriteBack write_back, SRegisterList sreglist) {
10170     Vstmia(al, kDataTypeValueNone, rn, write_back, sreglist);
10171   }
10172 
Vstr(Condition cond,DataType dt,DRegister rd,const MemOperand & operand)10173   void Vstr(Condition cond,
10174             DataType dt,
10175             DRegister rd,
10176             const MemOperand& operand) {
10177     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10178     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10179     VIXL_ASSERT(allow_macro_instructions_);
10180     VIXL_ASSERT(OutsideITBlock());
10181     MacroEmissionCheckScope guard(this);
10182     ITScope it_scope(this, &cond, guard);
10183     vstr(cond, dt, rd, operand);
10184   }
Vstr(DataType dt,DRegister rd,const MemOperand & operand)10185   void Vstr(DataType dt, DRegister rd, const MemOperand& operand) {
10186     Vstr(al, dt, rd, operand);
10187   }
Vstr(Condition cond,DRegister rd,const MemOperand & operand)10188   void Vstr(Condition cond, DRegister rd, const MemOperand& operand) {
10189     Vstr(cond, Untyped64, rd, operand);
10190   }
Vstr(DRegister rd,const MemOperand & operand)10191   void Vstr(DRegister rd, const MemOperand& operand) {
10192     Vstr(al, Untyped64, rd, operand);
10193   }
10194 
Vstr(Condition cond,DataType dt,SRegister rd,const MemOperand & operand)10195   void Vstr(Condition cond,
10196             DataType dt,
10197             SRegister rd,
10198             const MemOperand& operand) {
10199     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10200     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10201     VIXL_ASSERT(allow_macro_instructions_);
10202     VIXL_ASSERT(OutsideITBlock());
10203     MacroEmissionCheckScope guard(this);
10204     ITScope it_scope(this, &cond, guard);
10205     vstr(cond, dt, rd, operand);
10206   }
Vstr(DataType dt,SRegister rd,const MemOperand & operand)10207   void Vstr(DataType dt, SRegister rd, const MemOperand& operand) {
10208     Vstr(al, dt, rd, operand);
10209   }
Vstr(Condition cond,SRegister rd,const MemOperand & operand)10210   void Vstr(Condition cond, SRegister rd, const MemOperand& operand) {
10211     Vstr(cond, Untyped32, rd, operand);
10212   }
Vstr(SRegister rd,const MemOperand & operand)10213   void Vstr(SRegister rd, const MemOperand& operand) {
10214     Vstr(al, Untyped32, rd, operand);
10215   }
10216 
Vsub(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)10217   void Vsub(
10218       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10219     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10220     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10221     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10222     VIXL_ASSERT(allow_macro_instructions_);
10223     VIXL_ASSERT(OutsideITBlock());
10224     MacroEmissionCheckScope guard(this);
10225     ITScope it_scope(this, &cond, guard);
10226     vsub(cond, dt, rd, rn, rm);
10227   }
Vsub(DataType dt,DRegister rd,DRegister rn,DRegister rm)10228   void Vsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10229     Vsub(al, dt, rd, rn, rm);
10230   }
10231 
Vsub(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)10232   void Vsub(
10233       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10234     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10235     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10236     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10237     VIXL_ASSERT(allow_macro_instructions_);
10238     VIXL_ASSERT(OutsideITBlock());
10239     MacroEmissionCheckScope guard(this);
10240     ITScope it_scope(this, &cond, guard);
10241     vsub(cond, dt, rd, rn, rm);
10242   }
Vsub(DataType dt,QRegister rd,QRegister rn,QRegister rm)10243   void Vsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10244     Vsub(al, dt, rd, rn, rm);
10245   }
10246 
Vsub(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)10247   void Vsub(
10248       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
10249     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10250     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10251     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10252     VIXL_ASSERT(allow_macro_instructions_);
10253     VIXL_ASSERT(OutsideITBlock());
10254     MacroEmissionCheckScope guard(this);
10255     ITScope it_scope(this, &cond, guard);
10256     vsub(cond, dt, rd, rn, rm);
10257   }
Vsub(DataType dt,SRegister rd,SRegister rn,SRegister rm)10258   void Vsub(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
10259     Vsub(al, dt, rd, rn, rm);
10260   }
10261 
Vsubhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)10262   void Vsubhn(
10263       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
10264     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10265     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10266     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10267     VIXL_ASSERT(allow_macro_instructions_);
10268     VIXL_ASSERT(OutsideITBlock());
10269     MacroEmissionCheckScope guard(this);
10270     ITScope it_scope(this, &cond, guard);
10271     vsubhn(cond, dt, rd, rn, rm);
10272   }
Vsubhn(DataType dt,DRegister rd,QRegister rn,QRegister rm)10273   void Vsubhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
10274     Vsubhn(al, dt, rd, rn, rm);
10275   }
10276 
Vsubl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)10277   void Vsubl(
10278       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
10279     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10280     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10281     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10282     VIXL_ASSERT(allow_macro_instructions_);
10283     VIXL_ASSERT(OutsideITBlock());
10284     MacroEmissionCheckScope guard(this);
10285     ITScope it_scope(this, &cond, guard);
10286     vsubl(cond, dt, rd, rn, rm);
10287   }
Vsubl(DataType dt,QRegister rd,DRegister rn,DRegister rm)10288   void Vsubl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
10289     Vsubl(al, dt, rd, rn, rm);
10290   }
10291 
Vsubw(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegister rm)10292   void Vsubw(
10293       Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
10294     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10295     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10296     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10297     VIXL_ASSERT(allow_macro_instructions_);
10298     VIXL_ASSERT(OutsideITBlock());
10299     MacroEmissionCheckScope guard(this);
10300     ITScope it_scope(this, &cond, guard);
10301     vsubw(cond, dt, rd, rn, rm);
10302   }
Vsubw(DataType dt,QRegister rd,QRegister rn,DRegister rm)10303   void Vsubw(DataType dt, QRegister rd, QRegister rn, DRegister rm) {
10304     Vsubw(al, dt, rd, rn, rm);
10305   }
10306 
Vswp(Condition cond,DataType dt,DRegister rd,DRegister rm)10307   void Vswp(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10308     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10309     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10310     VIXL_ASSERT(allow_macro_instructions_);
10311     VIXL_ASSERT(OutsideITBlock());
10312     MacroEmissionCheckScope guard(this);
10313     ITScope it_scope(this, &cond, guard);
10314     vswp(cond, dt, rd, rm);
10315   }
Vswp(DataType dt,DRegister rd,DRegister rm)10316   void Vswp(DataType dt, DRegister rd, DRegister rm) { Vswp(al, dt, rd, rm); }
Vswp(Condition cond,DRegister rd,DRegister rm)10317   void Vswp(Condition cond, DRegister rd, DRegister rm) {
10318     Vswp(cond, kDataTypeValueNone, rd, rm);
10319   }
Vswp(DRegister rd,DRegister rm)10320   void Vswp(DRegister rd, DRegister rm) {
10321     Vswp(al, kDataTypeValueNone, rd, rm);
10322   }
10323 
Vswp(Condition cond,DataType dt,QRegister rd,QRegister rm)10324   void Vswp(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10325     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10326     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10327     VIXL_ASSERT(allow_macro_instructions_);
10328     VIXL_ASSERT(OutsideITBlock());
10329     MacroEmissionCheckScope guard(this);
10330     ITScope it_scope(this, &cond, guard);
10331     vswp(cond, dt, rd, rm);
10332   }
Vswp(DataType dt,QRegister rd,QRegister rm)10333   void Vswp(DataType dt, QRegister rd, QRegister rm) { Vswp(al, dt, rd, rm); }
Vswp(Condition cond,QRegister rd,QRegister rm)10334   void Vswp(Condition cond, QRegister rd, QRegister rm) {
10335     Vswp(cond, kDataTypeValueNone, rd, rm);
10336   }
Vswp(QRegister rd,QRegister rm)10337   void Vswp(QRegister rd, QRegister rm) {
10338     Vswp(al, kDataTypeValueNone, rd, rm);
10339   }
10340 
Vtbl(Condition cond,DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)10341   void Vtbl(Condition cond,
10342             DataType dt,
10343             DRegister rd,
10344             const NeonRegisterList& nreglist,
10345             DRegister rm) {
10346     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10347     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10348     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10349     VIXL_ASSERT(allow_macro_instructions_);
10350     VIXL_ASSERT(OutsideITBlock());
10351     MacroEmissionCheckScope guard(this);
10352     ITScope it_scope(this, &cond, guard);
10353     vtbl(cond, dt, rd, nreglist, rm);
10354   }
Vtbl(DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)10355   void Vtbl(DataType dt,
10356             DRegister rd,
10357             const NeonRegisterList& nreglist,
10358             DRegister rm) {
10359     Vtbl(al, dt, rd, nreglist, rm);
10360   }
10361 
Vtbx(Condition cond,DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)10362   void Vtbx(Condition cond,
10363             DataType dt,
10364             DRegister rd,
10365             const NeonRegisterList& nreglist,
10366             DRegister rm) {
10367     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10368     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10369     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10370     VIXL_ASSERT(allow_macro_instructions_);
10371     VIXL_ASSERT(OutsideITBlock());
10372     MacroEmissionCheckScope guard(this);
10373     ITScope it_scope(this, &cond, guard);
10374     vtbx(cond, dt, rd, nreglist, rm);
10375   }
Vtbx(DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)10376   void Vtbx(DataType dt,
10377             DRegister rd,
10378             const NeonRegisterList& nreglist,
10379             DRegister rm) {
10380     Vtbx(al, dt, rd, nreglist, rm);
10381   }
10382 
Vtrn(Condition cond,DataType dt,DRegister rd,DRegister rm)10383   void Vtrn(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10384     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10385     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10386     VIXL_ASSERT(allow_macro_instructions_);
10387     VIXL_ASSERT(OutsideITBlock());
10388     MacroEmissionCheckScope guard(this);
10389     ITScope it_scope(this, &cond, guard);
10390     vtrn(cond, dt, rd, rm);
10391   }
Vtrn(DataType dt,DRegister rd,DRegister rm)10392   void Vtrn(DataType dt, DRegister rd, DRegister rm) { Vtrn(al, dt, rd, rm); }
10393 
Vtrn(Condition cond,DataType dt,QRegister rd,QRegister rm)10394   void Vtrn(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10395     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10396     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10397     VIXL_ASSERT(allow_macro_instructions_);
10398     VIXL_ASSERT(OutsideITBlock());
10399     MacroEmissionCheckScope guard(this);
10400     ITScope it_scope(this, &cond, guard);
10401     vtrn(cond, dt, rd, rm);
10402   }
Vtrn(DataType dt,QRegister rd,QRegister rm)10403   void Vtrn(DataType dt, QRegister rd, QRegister rm) { Vtrn(al, dt, rd, rm); }
10404 
Vtst(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)10405   void Vtst(
10406       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10407     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10408     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10409     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10410     VIXL_ASSERT(allow_macro_instructions_);
10411     VIXL_ASSERT(OutsideITBlock());
10412     MacroEmissionCheckScope guard(this);
10413     ITScope it_scope(this, &cond, guard);
10414     vtst(cond, dt, rd, rn, rm);
10415   }
Vtst(DataType dt,DRegister rd,DRegister rn,DRegister rm)10416   void Vtst(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10417     Vtst(al, dt, rd, rn, rm);
10418   }
10419 
Vtst(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)10420   void Vtst(
10421       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10422     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10423     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10424     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10425     VIXL_ASSERT(allow_macro_instructions_);
10426     VIXL_ASSERT(OutsideITBlock());
10427     MacroEmissionCheckScope guard(this);
10428     ITScope it_scope(this, &cond, guard);
10429     vtst(cond, dt, rd, rn, rm);
10430   }
Vtst(DataType dt,QRegister rd,QRegister rn,QRegister rm)10431   void Vtst(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10432     Vtst(al, dt, rd, rn, rm);
10433   }
10434 
Vuzp(Condition cond,DataType dt,DRegister rd,DRegister rm)10435   void Vuzp(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10436     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10437     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10438     VIXL_ASSERT(allow_macro_instructions_);
10439     VIXL_ASSERT(OutsideITBlock());
10440     MacroEmissionCheckScope guard(this);
10441     ITScope it_scope(this, &cond, guard);
10442     vuzp(cond, dt, rd, rm);
10443   }
Vuzp(DataType dt,DRegister rd,DRegister rm)10444   void Vuzp(DataType dt, DRegister rd, DRegister rm) { Vuzp(al, dt, rd, rm); }
10445 
Vuzp(Condition cond,DataType dt,QRegister rd,QRegister rm)10446   void Vuzp(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10447     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10448     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10449     VIXL_ASSERT(allow_macro_instructions_);
10450     VIXL_ASSERT(OutsideITBlock());
10451     MacroEmissionCheckScope guard(this);
10452     ITScope it_scope(this, &cond, guard);
10453     vuzp(cond, dt, rd, rm);
10454   }
Vuzp(DataType dt,QRegister rd,QRegister rm)10455   void Vuzp(DataType dt, QRegister rd, QRegister rm) { Vuzp(al, dt, rd, rm); }
10456 
Vzip(Condition cond,DataType dt,DRegister rd,DRegister rm)10457   void Vzip(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10458     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10459     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10460     VIXL_ASSERT(allow_macro_instructions_);
10461     VIXL_ASSERT(OutsideITBlock());
10462     MacroEmissionCheckScope guard(this);
10463     ITScope it_scope(this, &cond, guard);
10464     vzip(cond, dt, rd, rm);
10465   }
Vzip(DataType dt,DRegister rd,DRegister rm)10466   void Vzip(DataType dt, DRegister rd, DRegister rm) { Vzip(al, dt, rd, rm); }
10467 
Vzip(Condition cond,DataType dt,QRegister rd,QRegister rm)10468   void Vzip(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10469     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10470     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10471     VIXL_ASSERT(allow_macro_instructions_);
10472     VIXL_ASSERT(OutsideITBlock());
10473     MacroEmissionCheckScope guard(this);
10474     ITScope it_scope(this, &cond, guard);
10475     vzip(cond, dt, rd, rm);
10476   }
Vzip(DataType dt,QRegister rd,QRegister rm)10477   void Vzip(DataType dt, QRegister rd, QRegister rm) { Vzip(al, dt, rd, rm); }
10478 
Yield(Condition cond)10479   void Yield(Condition cond) {
10480     VIXL_ASSERT(allow_macro_instructions_);
10481     VIXL_ASSERT(OutsideITBlock());
10482     MacroEmissionCheckScope guard(this);
10483     ITScope it_scope(this, &cond, guard);
10484     yield(cond);
10485   }
Yield()10486   void Yield() { Yield(al); }
Vabs(Condition cond,VRegister rd,VRegister rm)10487   void Vabs(Condition cond, VRegister rd, VRegister rm) {
10488     VIXL_ASSERT(rd.IsS() || rd.IsD());
10489     VIXL_ASSERT(rd.GetType() == rm.GetType());
10490     if (rd.IsS()) {
10491       Vabs(cond, F32, rd.S(), rm.S());
10492     } else {
10493       Vabs(cond, F64, rd.D(), rm.D());
10494     }
10495   }
Vabs(VRegister rd,VRegister rm)10496   void Vabs(VRegister rd, VRegister rm) { Vabs(al, rd, rm); }
Vadd(Condition cond,VRegister rd,VRegister rn,VRegister rm)10497   void Vadd(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10498     VIXL_ASSERT(rd.IsS() || rd.IsD());
10499     VIXL_ASSERT(rd.GetType() == rn.GetType());
10500     VIXL_ASSERT(rd.GetType() == rm.GetType());
10501     if (rd.IsS()) {
10502       Vadd(cond, F32, rd.S(), rn.S(), rm.S());
10503     } else {
10504       Vadd(cond, F64, rd.D(), rn.D(), rm.D());
10505     }
10506   }
Vadd(VRegister rd,VRegister rn,VRegister rm)10507   void Vadd(VRegister rd, VRegister rn, VRegister rm) { Vadd(al, rd, rn, rm); }
Vcmp(Condition cond,VRegister rd,VRegister rm)10508   void Vcmp(Condition cond, VRegister rd, VRegister rm) {
10509     VIXL_ASSERT(rd.IsS() || rd.IsD());
10510     VIXL_ASSERT(rd.GetType() == rm.GetType());
10511     if (rd.IsS()) {
10512       Vcmp(cond, F32, rd.S(), rm.S());
10513     } else {
10514       Vcmp(cond, F64, rd.D(), rm.D());
10515     }
10516   }
Vcmp(VRegister rd,VRegister rm)10517   void Vcmp(VRegister rd, VRegister rm) { Vcmp(al, rd, rm); }
Vcmpe(Condition cond,VRegister rd,VRegister rm)10518   void Vcmpe(Condition cond, VRegister rd, VRegister rm) {
10519     VIXL_ASSERT(rd.IsS() || rd.IsD());
10520     VIXL_ASSERT(rd.GetType() == rm.GetType());
10521     if (rd.IsS()) {
10522       Vcmpe(cond, F32, rd.S(), rm.S());
10523     } else {
10524       Vcmpe(cond, F64, rd.D(), rm.D());
10525     }
10526   }
Vcmpe(VRegister rd,VRegister rm)10527   void Vcmpe(VRegister rd, VRegister rm) { Vcmpe(al, rd, rm); }
Vdiv(Condition cond,VRegister rd,VRegister rn,VRegister rm)10528   void Vdiv(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10529     VIXL_ASSERT(rd.IsS() || rd.IsD());
10530     VIXL_ASSERT(rd.GetType() == rn.GetType());
10531     VIXL_ASSERT(rd.GetType() == rm.GetType());
10532     if (rd.IsS()) {
10533       Vdiv(cond, F32, rd.S(), rn.S(), rm.S());
10534     } else {
10535       Vdiv(cond, F64, rd.D(), rn.D(), rm.D());
10536     }
10537   }
Vdiv(VRegister rd,VRegister rn,VRegister rm)10538   void Vdiv(VRegister rd, VRegister rn, VRegister rm) { Vdiv(al, rd, rn, rm); }
Vfma(Condition cond,VRegister rd,VRegister rn,VRegister rm)10539   void Vfma(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10540     VIXL_ASSERT(rd.IsS() || rd.IsD());
10541     VIXL_ASSERT(rd.GetType() == rn.GetType());
10542     VIXL_ASSERT(rd.GetType() == rm.GetType());
10543     if (rd.IsS()) {
10544       Vfma(cond, F32, rd.S(), rn.S(), rm.S());
10545     } else {
10546       Vfma(cond, F64, rd.D(), rn.D(), rm.D());
10547     }
10548   }
Vfma(VRegister rd,VRegister rn,VRegister rm)10549   void Vfma(VRegister rd, VRegister rn, VRegister rm) { Vfma(al, rd, rn, rm); }
Vfms(Condition cond,VRegister rd,VRegister rn,VRegister rm)10550   void Vfms(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10551     VIXL_ASSERT(rd.IsS() || rd.IsD());
10552     VIXL_ASSERT(rd.GetType() == rn.GetType());
10553     VIXL_ASSERT(rd.GetType() == rm.GetType());
10554     if (rd.IsS()) {
10555       Vfms(cond, F32, rd.S(), rn.S(), rm.S());
10556     } else {
10557       Vfms(cond, F64, rd.D(), rn.D(), rm.D());
10558     }
10559   }
Vfms(VRegister rd,VRegister rn,VRegister rm)10560   void Vfms(VRegister rd, VRegister rn, VRegister rm) { Vfms(al, rd, rn, rm); }
Vfnma(Condition cond,VRegister rd,VRegister rn,VRegister rm)10561   void Vfnma(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10562     VIXL_ASSERT(rd.IsS() || rd.IsD());
10563     VIXL_ASSERT(rd.GetType() == rn.GetType());
10564     VIXL_ASSERT(rd.GetType() == rm.GetType());
10565     if (rd.IsS()) {
10566       Vfnma(cond, F32, rd.S(), rn.S(), rm.S());
10567     } else {
10568       Vfnma(cond, F64, rd.D(), rn.D(), rm.D());
10569     }
10570   }
Vfnma(VRegister rd,VRegister rn,VRegister rm)10571   void Vfnma(VRegister rd, VRegister rn, VRegister rm) {
10572     Vfnma(al, rd, rn, rm);
10573   }
Vfnms(Condition cond,VRegister rd,VRegister rn,VRegister rm)10574   void Vfnms(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10575     VIXL_ASSERT(rd.IsS() || rd.IsD());
10576     VIXL_ASSERT(rd.GetType() == rn.GetType());
10577     VIXL_ASSERT(rd.GetType() == rm.GetType());
10578     if (rd.IsS()) {
10579       Vfnms(cond, F32, rd.S(), rn.S(), rm.S());
10580     } else {
10581       Vfnms(cond, F64, rd.D(), rn.D(), rm.D());
10582     }
10583   }
Vfnms(VRegister rd,VRegister rn,VRegister rm)10584   void Vfnms(VRegister rd, VRegister rn, VRegister rm) {
10585     Vfnms(al, rd, rn, rm);
10586   }
Vmaxnm(VRegister rd,VRegister rn,VRegister rm)10587   void Vmaxnm(VRegister rd, VRegister rn, VRegister rm) {
10588     VIXL_ASSERT(rd.IsS() || rd.IsD());
10589     VIXL_ASSERT(rd.GetType() == rn.GetType());
10590     VIXL_ASSERT(rd.GetType() == rm.GetType());
10591     if (rd.IsS()) {
10592       Vmaxnm(F32, rd.S(), rn.S(), rm.S());
10593     } else {
10594       Vmaxnm(F64, rd.D(), rn.D(), rm.D());
10595     }
10596   }
Vminnm(VRegister rd,VRegister rn,VRegister rm)10597   void Vminnm(VRegister rd, VRegister rn, VRegister rm) {
10598     VIXL_ASSERT(rd.IsS() || rd.IsD());
10599     VIXL_ASSERT(rd.GetType() == rn.GetType());
10600     VIXL_ASSERT(rd.GetType() == rm.GetType());
10601     if (rd.IsS()) {
10602       Vminnm(F32, rd.S(), rn.S(), rm.S());
10603     } else {
10604       Vminnm(F64, rd.D(), rn.D(), rm.D());
10605     }
10606   }
Vmla(Condition cond,VRegister rd,VRegister rn,VRegister rm)10607   void Vmla(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10608     VIXL_ASSERT(rd.IsS() || rd.IsD());
10609     VIXL_ASSERT(rd.GetType() == rn.GetType());
10610     VIXL_ASSERT(rd.GetType() == rm.GetType());
10611     if (rd.IsS()) {
10612       Vmla(cond, F32, rd.S(), rn.S(), rm.S());
10613     } else {
10614       Vmla(cond, F64, rd.D(), rn.D(), rm.D());
10615     }
10616   }
Vmla(VRegister rd,VRegister rn,VRegister rm)10617   void Vmla(VRegister rd, VRegister rn, VRegister rm) { Vmla(al, rd, rn, rm); }
Vmls(Condition cond,VRegister rd,VRegister rn,VRegister rm)10618   void Vmls(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10619     VIXL_ASSERT(rd.IsS() || rd.IsD());
10620     VIXL_ASSERT(rd.GetType() == rn.GetType());
10621     VIXL_ASSERT(rd.GetType() == rm.GetType());
10622     if (rd.IsS()) {
10623       Vmls(cond, F32, rd.S(), rn.S(), rm.S());
10624     } else {
10625       Vmls(cond, F64, rd.D(), rn.D(), rm.D());
10626     }
10627   }
Vmls(VRegister rd,VRegister rn,VRegister rm)10628   void Vmls(VRegister rd, VRegister rn, VRegister rm) { Vmls(al, rd, rn, rm); }
Vmov(Condition cond,VRegister rd,VRegister rm)10629   void Vmov(Condition cond, VRegister rd, VRegister rm) {
10630     VIXL_ASSERT(rd.IsS() || rd.IsD());
10631     VIXL_ASSERT(rd.GetType() == rm.GetType());
10632     if (rd.IsS()) {
10633       Vmov(cond, F32, rd.S(), rm.S());
10634     } else {
10635       Vmov(cond, F64, rd.D(), rm.D());
10636     }
10637   }
Vmov(VRegister rd,VRegister rm)10638   void Vmov(VRegister rd, VRegister rm) { Vmov(al, rd, rm); }
Vmul(Condition cond,VRegister rd,VRegister rn,VRegister rm)10639   void Vmul(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10640     VIXL_ASSERT(rd.IsS() || rd.IsD());
10641     VIXL_ASSERT(rd.GetType() == rn.GetType());
10642     VIXL_ASSERT(rd.GetType() == rm.GetType());
10643     if (rd.IsS()) {
10644       Vmul(cond, F32, rd.S(), rn.S(), rm.S());
10645     } else {
10646       Vmul(cond, F64, rd.D(), rn.D(), rm.D());
10647     }
10648   }
Vmul(VRegister rd,VRegister rn,VRegister rm)10649   void Vmul(VRegister rd, VRegister rn, VRegister rm) { Vmul(al, rd, rn, rm); }
Vneg(Condition cond,VRegister rd,VRegister rm)10650   void Vneg(Condition cond, VRegister rd, VRegister rm) {
10651     VIXL_ASSERT(rd.IsS() || rd.IsD());
10652     VIXL_ASSERT(rd.GetType() == rm.GetType());
10653     if (rd.IsS()) {
10654       Vneg(cond, F32, rd.S(), rm.S());
10655     } else {
10656       Vneg(cond, F64, rd.D(), rm.D());
10657     }
10658   }
Vneg(VRegister rd,VRegister rm)10659   void Vneg(VRegister rd, VRegister rm) { Vneg(al, rd, rm); }
Vnmla(Condition cond,VRegister rd,VRegister rn,VRegister rm)10660   void Vnmla(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10661     VIXL_ASSERT(rd.IsS() || rd.IsD());
10662     VIXL_ASSERT(rd.GetType() == rn.GetType());
10663     VIXL_ASSERT(rd.GetType() == rm.GetType());
10664     if (rd.IsS()) {
10665       Vnmla(cond, F32, rd.S(), rn.S(), rm.S());
10666     } else {
10667       Vnmla(cond, F64, rd.D(), rn.D(), rm.D());
10668     }
10669   }
Vnmla(VRegister rd,VRegister rn,VRegister rm)10670   void Vnmla(VRegister rd, VRegister rn, VRegister rm) {
10671     Vnmla(al, rd, rn, rm);
10672   }
Vnmls(Condition cond,VRegister rd,VRegister rn,VRegister rm)10673   void Vnmls(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10674     VIXL_ASSERT(rd.IsS() || rd.IsD());
10675     VIXL_ASSERT(rd.GetType() == rn.GetType());
10676     VIXL_ASSERT(rd.GetType() == rm.GetType());
10677     if (rd.IsS()) {
10678       Vnmls(cond, F32, rd.S(), rn.S(), rm.S());
10679     } else {
10680       Vnmls(cond, F64, rd.D(), rn.D(), rm.D());
10681     }
10682   }
Vnmls(VRegister rd,VRegister rn,VRegister rm)10683   void Vnmls(VRegister rd, VRegister rn, VRegister rm) {
10684     Vnmls(al, rd, rn, rm);
10685   }
Vnmul(Condition cond,VRegister rd,VRegister rn,VRegister rm)10686   void Vnmul(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10687     VIXL_ASSERT(rd.IsS() || rd.IsD());
10688     VIXL_ASSERT(rd.GetType() == rn.GetType());
10689     VIXL_ASSERT(rd.GetType() == rm.GetType());
10690     if (rd.IsS()) {
10691       Vnmul(cond, F32, rd.S(), rn.S(), rm.S());
10692     } else {
10693       Vnmul(cond, F64, rd.D(), rn.D(), rm.D());
10694     }
10695   }
Vnmul(VRegister rd,VRegister rn,VRegister rm)10696   void Vnmul(VRegister rd, VRegister rn, VRegister rm) {
10697     Vnmul(al, rd, rn, rm);
10698   }
Vrinta(VRegister rd,VRegister rm)10699   void Vrinta(VRegister rd, VRegister rm) {
10700     VIXL_ASSERT(rd.IsS() || rd.IsD());
10701     VIXL_ASSERT(rd.GetType() == rm.GetType());
10702     if (rd.IsS()) {
10703       Vrinta(F32, rd.S(), rm.S());
10704     } else {
10705       Vrinta(F64, rd.D(), rm.D());
10706     }
10707   }
Vrintm(VRegister rd,VRegister rm)10708   void Vrintm(VRegister rd, VRegister rm) {
10709     VIXL_ASSERT(rd.IsS() || rd.IsD());
10710     VIXL_ASSERT(rd.GetType() == rm.GetType());
10711     if (rd.IsS()) {
10712       Vrintm(F32, rd.S(), rm.S());
10713     } else {
10714       Vrintm(F64, rd.D(), rm.D());
10715     }
10716   }
Vrintn(VRegister rd,VRegister rm)10717   void Vrintn(VRegister rd, VRegister rm) {
10718     VIXL_ASSERT(rd.IsS() || rd.IsD());
10719     VIXL_ASSERT(rd.GetType() == rm.GetType());
10720     if (rd.IsS()) {
10721       Vrintn(F32, rd.S(), rm.S());
10722     } else {
10723       Vrintn(F64, rd.D(), rm.D());
10724     }
10725   }
Vrintp(VRegister rd,VRegister rm)10726   void Vrintp(VRegister rd, VRegister rm) {
10727     VIXL_ASSERT(rd.IsS() || rd.IsD());
10728     VIXL_ASSERT(rd.GetType() == rm.GetType());
10729     if (rd.IsS()) {
10730       Vrintp(F32, rd.S(), rm.S());
10731     } else {
10732       Vrintp(F64, rd.D(), rm.D());
10733     }
10734   }
Vrintr(Condition cond,VRegister rd,VRegister rm)10735   void Vrintr(Condition cond, VRegister rd, VRegister rm) {
10736     VIXL_ASSERT(rd.IsS() || rd.IsD());
10737     VIXL_ASSERT(rd.GetType() == rm.GetType());
10738     if (rd.IsS()) {
10739       Vrintr(cond, F32, rd.S(), rm.S());
10740     } else {
10741       Vrintr(cond, F64, rd.D(), rm.D());
10742     }
10743   }
Vrintr(VRegister rd,VRegister rm)10744   void Vrintr(VRegister rd, VRegister rm) { Vrintr(al, rd, rm); }
Vrintx(Condition cond,VRegister rd,VRegister rm)10745   void Vrintx(Condition cond, VRegister rd, VRegister rm) {
10746     VIXL_ASSERT(rd.IsS() || rd.IsD());
10747     VIXL_ASSERT(rd.GetType() == rm.GetType());
10748     if (rd.IsS()) {
10749       Vrintx(cond, F32, rd.S(), rm.S());
10750     } else {
10751       Vrintx(cond, F64, rd.D(), rm.D());
10752     }
10753   }
Vrintx(VRegister rd,VRegister rm)10754   void Vrintx(VRegister rd, VRegister rm) { Vrintx(al, rd, rm); }
Vrintz(Condition cond,VRegister rd,VRegister rm)10755   void Vrintz(Condition cond, VRegister rd, VRegister rm) {
10756     VIXL_ASSERT(rd.IsS() || rd.IsD());
10757     VIXL_ASSERT(rd.GetType() == rm.GetType());
10758     if (rd.IsS()) {
10759       Vrintz(cond, F32, rd.S(), rm.S());
10760     } else {
10761       Vrintz(cond, F64, rd.D(), rm.D());
10762     }
10763   }
Vrintz(VRegister rd,VRegister rm)10764   void Vrintz(VRegister rd, VRegister rm) { Vrintz(al, rd, rm); }
Vseleq(VRegister rd,VRegister rn,VRegister rm)10765   void Vseleq(VRegister rd, VRegister rn, VRegister rm) {
10766     VIXL_ASSERT(rd.IsS() || rd.IsD());
10767     VIXL_ASSERT(rd.GetType() == rn.GetType());
10768     VIXL_ASSERT(rd.GetType() == rm.GetType());
10769     if (rd.IsS()) {
10770       Vseleq(F32, rd.S(), rn.S(), rm.S());
10771     } else {
10772       Vseleq(F64, rd.D(), rn.D(), rm.D());
10773     }
10774   }
Vselge(VRegister rd,VRegister rn,VRegister rm)10775   void Vselge(VRegister rd, VRegister rn, VRegister rm) {
10776     VIXL_ASSERT(rd.IsS() || rd.IsD());
10777     VIXL_ASSERT(rd.GetType() == rn.GetType());
10778     VIXL_ASSERT(rd.GetType() == rm.GetType());
10779     if (rd.IsS()) {
10780       Vselge(F32, rd.S(), rn.S(), rm.S());
10781     } else {
10782       Vselge(F64, rd.D(), rn.D(), rm.D());
10783     }
10784   }
Vselgt(VRegister rd,VRegister rn,VRegister rm)10785   void Vselgt(VRegister rd, VRegister rn, VRegister rm) {
10786     VIXL_ASSERT(rd.IsS() || rd.IsD());
10787     VIXL_ASSERT(rd.GetType() == rn.GetType());
10788     VIXL_ASSERT(rd.GetType() == rm.GetType());
10789     if (rd.IsS()) {
10790       Vselgt(F32, rd.S(), rn.S(), rm.S());
10791     } else {
10792       Vselgt(F64, rd.D(), rn.D(), rm.D());
10793     }
10794   }
Vselvs(VRegister rd,VRegister rn,VRegister rm)10795   void Vselvs(VRegister rd, VRegister rn, VRegister rm) {
10796     VIXL_ASSERT(rd.IsS() || rd.IsD());
10797     VIXL_ASSERT(rd.GetType() == rn.GetType());
10798     VIXL_ASSERT(rd.GetType() == rm.GetType());
10799     if (rd.IsS()) {
10800       Vselvs(F32, rd.S(), rn.S(), rm.S());
10801     } else {
10802       Vselvs(F64, rd.D(), rn.D(), rm.D());
10803     }
10804   }
Vsqrt(Condition cond,VRegister rd,VRegister rm)10805   void Vsqrt(Condition cond, VRegister rd, VRegister rm) {
10806     VIXL_ASSERT(rd.IsS() || rd.IsD());
10807     VIXL_ASSERT(rd.GetType() == rm.GetType());
10808     if (rd.IsS()) {
10809       Vsqrt(cond, F32, rd.S(), rm.S());
10810     } else {
10811       Vsqrt(cond, F64, rd.D(), rm.D());
10812     }
10813   }
Vsqrt(VRegister rd,VRegister rm)10814   void Vsqrt(VRegister rd, VRegister rm) { Vsqrt(al, rd, rm); }
Vsub(Condition cond,VRegister rd,VRegister rn,VRegister rm)10815   void Vsub(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10816     VIXL_ASSERT(rd.IsS() || rd.IsD());
10817     VIXL_ASSERT(rd.GetType() == rn.GetType());
10818     VIXL_ASSERT(rd.GetType() == rm.GetType());
10819     if (rd.IsS()) {
10820       Vsub(cond, F32, rd.S(), rn.S(), rm.S());
10821     } else {
10822       Vsub(cond, F64, rd.D(), rn.D(), rm.D());
10823     }
10824   }
Vsub(VRegister rd,VRegister rn,VRegister rm)10825   void Vsub(VRegister rd, VRegister rn, VRegister rm) { Vsub(al, rd, rn, rm); }
10826   // End of generated code.
10827 
AllowUnpredictable()10828   virtual bool AllowUnpredictable() VIXL_OVERRIDE {
10829     VIXL_ABORT_WITH_MSG("Unpredictable instruction.\n");
10830     return false;
10831   }
AllowStronglyDiscouraged()10832   virtual bool AllowStronglyDiscouraged() VIXL_OVERRIDE {
10833     VIXL_ABORT_WITH_MSG(
10834         "ARM strongly recommends to not use this instruction.\n");
10835     return false;
10836   }
10837   // Old syntax of vrint instructions.
10838   VIXL_DEPRECATED(
10839       "void Vrinta(DataType dt, DRegister rd, DRegister rm)",
Vrinta(DataType dt1,DataType dt2,DRegister rd,DRegister rm)10840       void Vrinta(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
10841     USE(dt2);
10842     VIXL_ASSERT(dt1.Is(dt2));
10843     return Vrinta(dt1, rd, rm);
10844   }
10845   VIXL_DEPRECATED(
10846       "void Vrinta(DataType dt, QRegister rd, QRegister rm)",
Vrinta(DataType dt1,DataType dt2,QRegister rd,QRegister rm)10847       void Vrinta(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
10848     USE(dt2);
10849     VIXL_ASSERT(dt1.Is(dt2));
10850     return Vrinta(dt1, rd, rm);
10851   }
10852   VIXL_DEPRECATED(
10853       "void Vrinta(DataType dt, SRegister rd, SRegister rm)",
Vrinta(DataType dt1,DataType dt2,SRegister rd,SRegister rm)10854       void Vrinta(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
10855     USE(dt2);
10856     VIXL_ASSERT(dt1.Is(dt2));
10857     return Vrinta(dt1, rd, rm);
10858   }
10859 
10860   VIXL_DEPRECATED(
10861       "void Vrintm(DataType dt, DRegister rd, DRegister rm)",
Vrintm(DataType dt1,DataType dt2,DRegister rd,DRegister rm)10862       void Vrintm(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
10863     USE(dt2);
10864     VIXL_ASSERT(dt1.Is(dt2));
10865     return Vrintm(dt1, rd, rm);
10866   }
10867   VIXL_DEPRECATED(
10868       "void Vrintm(DataType dt, QRegister rd, QRegister rm)",
Vrintm(DataType dt1,DataType dt2,QRegister rd,QRegister rm)10869       void Vrintm(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
10870     USE(dt2);
10871     VIXL_ASSERT(dt1.Is(dt2));
10872     return Vrintm(dt1, rd, rm);
10873   }
10874   VIXL_DEPRECATED(
10875       "void Vrintm(DataType dt, SRegister rd, SRegister rm)",
Vrintm(DataType dt1,DataType dt2,SRegister rd,SRegister rm)10876       void Vrintm(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
10877     USE(dt2);
10878     VIXL_ASSERT(dt1.Is(dt2));
10879     return Vrintm(dt1, rd, rm);
10880   }
10881 
10882   VIXL_DEPRECATED(
10883       "void Vrintn(DataType dt, DRegister rd, DRegister rm)",
Vrintn(DataType dt1,DataType dt2,DRegister rd,DRegister rm)10884       void Vrintn(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
10885     USE(dt2);
10886     VIXL_ASSERT(dt1.Is(dt2));
10887     return Vrintn(dt1, rd, rm);
10888   }
10889   VIXL_DEPRECATED(
10890       "void Vrintn(DataType dt, QRegister rd, QRegister rm)",
Vrintn(DataType dt1,DataType dt2,QRegister rd,QRegister rm)10891       void Vrintn(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
10892     USE(dt2);
10893     VIXL_ASSERT(dt1.Is(dt2));
10894     return Vrintn(dt1, rd, rm);
10895   }
10896   VIXL_DEPRECATED(
10897       "void Vrintn(DataType dt, SRegister rd, SRegister rm)",
Vrintn(DataType dt1,DataType dt2,SRegister rd,SRegister rm)10898       void Vrintn(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
10899     USE(dt2);
10900     VIXL_ASSERT(dt1.Is(dt2));
10901     return Vrintn(dt1, rd, rm);
10902   }
10903 
10904   VIXL_DEPRECATED(
10905       "void Vrintp(DataType dt, DRegister rd, DRegister rm)",
Vrintp(DataType dt1,DataType dt2,DRegister rd,DRegister rm)10906       void Vrintp(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
10907     USE(dt2);
10908     VIXL_ASSERT(dt1.Is(dt2));
10909     return Vrintp(dt1, rd, rm);
10910   }
10911   VIXL_DEPRECATED(
10912       "void Vrintp(DataType dt, QRegister rd, QRegister rm)",
Vrintp(DataType dt1,DataType dt2,QRegister rd,QRegister rm)10913       void Vrintp(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
10914     USE(dt2);
10915     VIXL_ASSERT(dt1.Is(dt2));
10916     return Vrintp(dt1, rd, rm);
10917   }
10918   VIXL_DEPRECATED(
10919       "void Vrintp(DataType dt, SRegister rd, SRegister rm)",
Vrintp(DataType dt1,DataType dt2,SRegister rd,SRegister rm)10920       void Vrintp(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
10921     USE(dt2);
10922     VIXL_ASSERT(dt1.Is(dt2));
10923     return Vrintp(dt1, rd, rm);
10924   }
10925 
10926   VIXL_DEPRECATED(
10927       "void Vrintr(Condition cond, DataType dt, SRegister rd, SRegister rm)",
Vrintr(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)10928       void Vrintr(Condition cond,
10929                   DataType dt1,
10930                   DataType dt2,
10931                   SRegister rd,
10932                   SRegister rm)) {
10933     USE(dt2);
10934     VIXL_ASSERT(dt1.Is(dt2));
10935     return Vrintr(cond, dt1, rd, rm);
10936   }
10937   VIXL_DEPRECATED(
10938       "void Vrintr(DataType dt, SRegister rd, SRegister rm)",
Vrintr(DataType dt1,DataType dt2,SRegister rd,SRegister rm)10939       void Vrintr(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
10940     USE(dt2);
10941     VIXL_ASSERT(dt1.Is(dt2));
10942     return Vrintr(dt1, rd, rm);
10943   }
10944 
10945   VIXL_DEPRECATED(
10946       "void Vrintr(Condition cond, DataType dt, DRegister rd, DRegister rm)",
Vrintr(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)10947       void Vrintr(Condition cond,
10948                   DataType dt1,
10949                   DataType dt2,
10950                   DRegister rd,
10951                   DRegister rm)) {
10952     USE(dt2);
10953     VIXL_ASSERT(dt1.Is(dt2));
10954     return Vrintr(cond, dt1, rd, rm);
10955   }
10956   VIXL_DEPRECATED(
10957       "void Vrintr(DataType dt, DRegister rd, DRegister rm)",
Vrintr(DataType dt1,DataType dt2,DRegister rd,DRegister rm)10958       void Vrintr(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
10959     USE(dt2);
10960     VIXL_ASSERT(dt1.Is(dt2));
10961     return Vrintr(dt1, rd, rm);
10962   }
10963 
10964   VIXL_DEPRECATED(
10965       "void Vrintx(Condition cond, DataType dt, DRegister rd, DRegister rm)",
Vrintx(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)10966       void Vrintx(Condition cond,
10967                   DataType dt1,
10968                   DataType dt2,
10969                   DRegister rd,
10970                   DRegister rm)) {
10971     USE(dt2);
10972     VIXL_ASSERT(dt1.Is(dt2));
10973     return Vrintx(cond, dt1, rd, rm);
10974   }
10975   VIXL_DEPRECATED(
10976       "void Vrintx(DataType dt, DRegister rd, DRegister rm)",
Vrintx(DataType dt1,DataType dt2,DRegister rd,DRegister rm)10977       void Vrintx(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
10978     USE(dt2);
10979     VIXL_ASSERT(dt1.Is(dt2));
10980     return Vrintx(dt1, rd, rm);
10981   }
10982 
10983   VIXL_DEPRECATED(
10984       "void Vrintx(DataType dt, QRegister rd, QRegister rm)",
Vrintx(DataType dt1,DataType dt2,QRegister rd,QRegister rm)10985       void Vrintx(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
10986     USE(dt2);
10987     VIXL_ASSERT(dt1.Is(dt2));
10988     return Vrintx(dt1, rd, rm);
10989   }
10990 
10991   VIXL_DEPRECATED(
10992       "void Vrintx(Condition cond, DataType dt, SRegister rd, SRegister rm)",
Vrintx(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)10993       void Vrintx(Condition cond,
10994                   DataType dt1,
10995                   DataType dt2,
10996                   SRegister rd,
10997                   SRegister rm)) {
10998     USE(dt2);
10999     VIXL_ASSERT(dt1.Is(dt2));
11000     return Vrintx(cond, dt1, rd, rm);
11001   }
11002   VIXL_DEPRECATED(
11003       "void Vrintx(DataType dt, SRegister rd, SRegister rm)",
Vrintx(DataType dt1,DataType dt2,SRegister rd,SRegister rm)11004       void Vrintx(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
11005     USE(dt2);
11006     VIXL_ASSERT(dt1.Is(dt2));
11007     return Vrintx(dt1, rd, rm);
11008   }
11009 
11010   VIXL_DEPRECATED(
11011       "void Vrintz(Condition cond, DataType dt, DRegister rd, DRegister rm)",
Vrintz(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)11012       void Vrintz(Condition cond,
11013                   DataType dt1,
11014                   DataType dt2,
11015                   DRegister rd,
11016                   DRegister rm)) {
11017     USE(dt2);
11018     VIXL_ASSERT(dt1.Is(dt2));
11019     return Vrintz(cond, dt1, rd, rm);
11020   }
11021   VIXL_DEPRECATED(
11022       "void Vrintz(DataType dt, DRegister rd, DRegister rm)",
Vrintz(DataType dt1,DataType dt2,DRegister rd,DRegister rm)11023       void Vrintz(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
11024     USE(dt2);
11025     VIXL_ASSERT(dt1.Is(dt2));
11026     return Vrintz(dt1, rd, rm);
11027   }
11028 
11029   VIXL_DEPRECATED(
11030       "void Vrintz(DataType dt, QRegister rd, QRegister rm)",
Vrintz(DataType dt1,DataType dt2,QRegister rd,QRegister rm)11031       void Vrintz(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
11032     USE(dt2);
11033     VIXL_ASSERT(dt1.Is(dt2));
11034     return Vrintz(dt1, rd, rm);
11035   }
11036 
11037   VIXL_DEPRECATED(
11038       "void Vrintz(Condition cond, DataType dt, SRegister rd, SRegister rm)",
Vrintz(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)11039       void Vrintz(Condition cond,
11040                   DataType dt1,
11041                   DataType dt2,
11042                   SRegister rd,
11043                   SRegister rm)) {
11044     USE(dt2);
11045     VIXL_ASSERT(dt1.Is(dt2));
11046     return Vrintz(cond, dt1, rd, rm);
11047   }
11048   VIXL_DEPRECATED(
11049       "void Vrintz(DataType dt, SRegister rd, SRegister rm)",
Vrintz(DataType dt1,DataType dt2,SRegister rd,SRegister rm)11050       void Vrintz(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
11051     USE(dt2);
11052     VIXL_ASSERT(dt1.Is(dt2));
11053     return Vrintz(dt1, rd, rm);
11054   }
11055 
11056  private:
NeedBranch(Condition * cond)11057   bool NeedBranch(Condition* cond) { return !cond->Is(al) && IsUsingT32(); }
11058   static const int kBranchSize = kMaxInstructionSizeInBytes;
11059 
11060   RegisterList available_;
11061   VRegisterList available_vfp_;
11062   UseScratchRegisterScope* current_scratch_scope_;
11063   MacroAssemblerContext context_;
11064   PoolManager<int32_t> pool_manager_;
11065   bool generate_simulator_code_;
11066   bool allow_macro_instructions_;
11067   Label* pool_end_;
11068 
11069   friend class TestMacroAssembler;
11070 };
11071 
11072 // This scope utility allows scratch registers to be managed safely. The
11073 // MacroAssembler's GetScratchRegisterList() is used as a pool of scratch
11074 // registers. These registers can be allocated on demand, and will be returned
11075 // at the end of the scope.
11076 //
11077 // When the scope ends, the MacroAssembler's lists will be restored to their
11078 // original state, even if the lists were modified by some other means.
11079 //
11080 // Scopes must nest perfectly. That is, they must be destructed in reverse
11081 // construction order. Otherwise, it is not clear how to handle cases where one
11082 // scope acquires a register that was included in a now-closing scope. With
11083 // perfect nesting, this cannot occur.
11084 class UseScratchRegisterScope {
11085  public:
11086   // This constructor implicitly calls the `Open` function to initialise the
11087   // scope, so it is ready to use immediately after it has been constructed.
UseScratchRegisterScope(MacroAssembler * masm)11088   explicit UseScratchRegisterScope(MacroAssembler* masm)
11089       : masm_(NULL), parent_(NULL), old_available_(0), old_available_vfp_(0) {
11090     Open(masm);
11091   }
11092   // This constructor allows deferred and optional initialisation of the scope.
11093   // The user is required to explicitly call the `Open` function before using
11094   // the scope.
UseScratchRegisterScope()11095   UseScratchRegisterScope()
11096       : masm_(NULL), parent_(NULL), old_available_(0), old_available_vfp_(0) {}
11097 
11098   // This function performs the actual initialisation work.
11099   void Open(MacroAssembler* masm);
11100 
11101   // The destructor always implicitly calls the `Close` function.
~UseScratchRegisterScope()11102   ~UseScratchRegisterScope() { Close(); }
11103 
11104   // This function performs the cleaning-up work. It must succeed even if the
11105   // scope has not been opened. It is safe to call multiple times.
11106   void Close();
11107 
11108   bool IsAvailable(const Register& reg) const;
11109   bool IsAvailable(const VRegister& reg) const;
11110 
11111   // Take a register from the temp list. It will be returned automatically when
11112   // the scope ends.
11113   Register Acquire();
11114   VRegister AcquireV(unsigned size_in_bits);
11115   QRegister AcquireQ();
11116   DRegister AcquireD();
11117   SRegister AcquireS();
11118 
11119   // Explicitly release an acquired (or excluded) register, putting it back in
11120   // the temp list.
11121   void Release(const Register& reg);
11122   void Release(const VRegister& reg);
11123 
11124   // Make the specified registers available as scratch registers for the
11125   // duration of this scope.
11126   void Include(const RegisterList& list);
11127   void Include(const Register& reg1,
11128                const Register& reg2 = NoReg,
11129                const Register& reg3 = NoReg,
11130                const Register& reg4 = NoReg) {
11131     Include(RegisterList(reg1, reg2, reg3, reg4));
11132   }
11133   void Include(const VRegisterList& list);
11134   void Include(const VRegister& reg1,
11135                const VRegister& reg2 = NoVReg,
11136                const VRegister& reg3 = NoVReg,
11137                const VRegister& reg4 = NoVReg) {
11138     Include(VRegisterList(reg1, reg2, reg3, reg4));
11139   }
11140 
11141   // Make sure that the specified registers are not available in this scope.
11142   // This can be used to prevent helper functions from using sensitive
11143   // registers, for example.
11144   void Exclude(const RegisterList& list);
11145   void Exclude(const Register& reg1,
11146                const Register& reg2 = NoReg,
11147                const Register& reg3 = NoReg,
11148                const Register& reg4 = NoReg) {
11149     Exclude(RegisterList(reg1, reg2, reg3, reg4));
11150   }
11151   void Exclude(const VRegisterList& list);
11152   void Exclude(const VRegister& reg1,
11153                const VRegister& reg2 = NoVReg,
11154                const VRegister& reg3 = NoVReg,
11155                const VRegister& reg4 = NoVReg) {
11156     Exclude(VRegisterList(reg1, reg2, reg3, reg4));
11157   }
11158 
11159   // A convenience helper to exclude any registers used by the operand.
11160   void Exclude(const Operand& operand);
11161 
11162   // Prevent any scratch registers from being used in this scope.
11163   void ExcludeAll();
11164 
11165  private:
11166   // The MacroAssembler maintains a list of available scratch registers, and
11167   // also keeps track of the most recently-opened scope so that on destruction
11168   // we can check that scopes do not outlive their parents.
11169   MacroAssembler* masm_;
11170   UseScratchRegisterScope* parent_;
11171 
11172   // The state of the available lists at the start of this scope.
11173   uint32_t old_available_;      // kRRegister
11174   uint64_t old_available_vfp_;  // kVRegister
11175 
UseScratchRegisterScope(const UseScratchRegisterScope &)11176   VIXL_NO_RETURN_IN_DEBUG_MODE UseScratchRegisterScope(
11177       const UseScratchRegisterScope&) {
11178     VIXL_UNREACHABLE();
11179   }
11180   VIXL_NO_RETURN_IN_DEBUG_MODE void operator=(const UseScratchRegisterScope&) {
11181     VIXL_UNREACHABLE();
11182   }
11183 };
11184 
11185 
11186 }  // namespace aarch32
11187 }  // namespace vixl
11188 
11189 #endif  // VIXL_AARCH32_MACRO_ASSEMBLER_AARCH32_H_
11190