xref: /aosp_15_r20/external/vixl/src/aarch32/macro-assembler-aarch32.h (revision f5c631da2f1efdd72b5fd1e20510e4042af13d77)
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 cursor = GetCursorOffset();
406     if (label->Needs16BitPadding(cursor)) {
407       const int kPaddingBytes = 2;
408       if (pool_manager_.MustEmit(cursor, kPaddingBytes)) {
409         int32_t new_cursor = pool_manager_.Emit(this, cursor, kPaddingBytes);
410         USE(new_cursor);
411         VIXL_ASSERT(new_cursor == 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 cursor = 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       cursor += kBranchSize;
438     }
439     int32_t from = cursor;
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(cursor,
445                                        info->size,
446                                        min,
447                                        max,
448                                        info->alignment);
449     if (pool_manager_.MustEmit(GetCursorOffset(), size, &temp_ref, location)) {
450       int32_t new_cursor = pool_manager_.Emit(this,
451                                               GetCursorOffset(),
452                                               info->size,
453                                               &temp_ref,
454                                               location);
455       USE(new_cursor);
456       VIXL_ASSERT(new_cursor == 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 cursor = GetCursorOffset();
468     int total_size = AlignUp(cursor, alignment) - cursor + literal->GetSize();
469     if (literal->Needs16BitPadding(cursor)) total_size += 2;
470     if (pool_manager_.MustEmit(cursor, total_size)) {
471       int32_t new_cursor = pool_manager_.Emit(this, cursor, total_size);
472       USE(new_cursor);
473       VIXL_ASSERT(new_cursor == 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     if (registers.IsSingleRegister() &&
2901         (!IsUsingT32() || !registers.IsR0toR7orPC())) {
2902       pop(cond, registers.GetFirstAvailableRegister());
2903     } else if (!registers.IsEmpty()) {
2904       pop(cond, registers);
2905     }
2906   }
Pop(RegisterList registers)2907   void Pop(RegisterList registers) { Pop(al, registers); }
2908 
Pop(Condition cond,Register rt)2909   void Pop(Condition cond, Register rt) {
2910     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2911     VIXL_ASSERT(allow_macro_instructions_);
2912     VIXL_ASSERT(OutsideITBlock());
2913     MacroEmissionCheckScope guard(this);
2914     ITScope it_scope(this, &cond, guard);
2915     pop(cond, rt);
2916   }
Pop(Register rt)2917   void Pop(Register rt) { Pop(al, rt); }
2918 
Push(Condition cond,RegisterList registers)2919   void Push(Condition cond, RegisterList registers) {
2920     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2921     VIXL_ASSERT(allow_macro_instructions_);
2922     VIXL_ASSERT(OutsideITBlock());
2923     MacroEmissionCheckScope guard(this);
2924     ITScope it_scope(this, &cond, guard);
2925     if (registers.IsSingleRegister() && !registers.Includes(sp) &&
2926         (!IsUsingT32() || !registers.IsR0toR7orLR())) {
2927       push(cond, registers.GetFirstAvailableRegister());
2928     } else if (!registers.IsEmpty()) {
2929       push(cond, registers);
2930     }
2931   }
Push(RegisterList registers)2932   void Push(RegisterList registers) { Push(al, registers); }
2933 
Push(Condition cond,Register rt)2934   void Push(Condition cond, Register rt) {
2935     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2936     VIXL_ASSERT(allow_macro_instructions_);
2937     VIXL_ASSERT(OutsideITBlock());
2938     MacroEmissionCheckScope guard(this);
2939     ITScope it_scope(this, &cond, guard);
2940     if (IsUsingA32() && rt.IsSP()) {
2941       // Only the A32 multiple-register form can push sp.
2942       push(cond, RegisterList(rt));
2943     } else {
2944       push(cond, rt);
2945     }
2946   }
Push(Register rt)2947   void Push(Register rt) { Push(al, rt); }
2948 
Qadd(Condition cond,Register rd,Register rm,Register rn)2949   void Qadd(Condition cond, Register rd, Register rm, Register rn) {
2950     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2951     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2952     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2953     VIXL_ASSERT(allow_macro_instructions_);
2954     VIXL_ASSERT(OutsideITBlock());
2955     MacroEmissionCheckScope guard(this);
2956     ITScope it_scope(this, &cond, guard);
2957     qadd(cond, rd, rm, rn);
2958   }
Qadd(Register rd,Register rm,Register rn)2959   void Qadd(Register rd, Register rm, Register rn) { Qadd(al, rd, rm, rn); }
2960 
Qadd16(Condition cond,Register rd,Register rn,Register rm)2961   void Qadd16(Condition cond, Register rd, Register rn, Register rm) {
2962     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2963     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2964     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2965     VIXL_ASSERT(allow_macro_instructions_);
2966     VIXL_ASSERT(OutsideITBlock());
2967     MacroEmissionCheckScope guard(this);
2968     ITScope it_scope(this, &cond, guard);
2969     qadd16(cond, rd, rn, rm);
2970   }
Qadd16(Register rd,Register rn,Register rm)2971   void Qadd16(Register rd, Register rn, Register rm) { Qadd16(al, rd, rn, rm); }
2972 
Qadd8(Condition cond,Register rd,Register rn,Register rm)2973   void Qadd8(Condition cond, Register rd, Register rn, Register rm) {
2974     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2975     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2976     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2977     VIXL_ASSERT(allow_macro_instructions_);
2978     VIXL_ASSERT(OutsideITBlock());
2979     MacroEmissionCheckScope guard(this);
2980     ITScope it_scope(this, &cond, guard);
2981     qadd8(cond, rd, rn, rm);
2982   }
Qadd8(Register rd,Register rn,Register rm)2983   void Qadd8(Register rd, Register rn, Register rm) { Qadd8(al, rd, rn, rm); }
2984 
Qasx(Condition cond,Register rd,Register rn,Register rm)2985   void Qasx(Condition cond, Register rd, Register rn, Register rm) {
2986     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2987     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2988     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2989     VIXL_ASSERT(allow_macro_instructions_);
2990     VIXL_ASSERT(OutsideITBlock());
2991     MacroEmissionCheckScope guard(this);
2992     ITScope it_scope(this, &cond, guard);
2993     qasx(cond, rd, rn, rm);
2994   }
Qasx(Register rd,Register rn,Register rm)2995   void Qasx(Register rd, Register rn, Register rm) { Qasx(al, rd, rn, rm); }
2996 
Qdadd(Condition cond,Register rd,Register rm,Register rn)2997   void Qdadd(Condition cond, Register rd, Register rm, Register rn) {
2998     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2999     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3000     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3001     VIXL_ASSERT(allow_macro_instructions_);
3002     VIXL_ASSERT(OutsideITBlock());
3003     MacroEmissionCheckScope guard(this);
3004     ITScope it_scope(this, &cond, guard);
3005     qdadd(cond, rd, rm, rn);
3006   }
Qdadd(Register rd,Register rm,Register rn)3007   void Qdadd(Register rd, Register rm, Register rn) { Qdadd(al, rd, rm, rn); }
3008 
Qdsub(Condition cond,Register rd,Register rm,Register rn)3009   void Qdsub(Condition cond, Register rd, Register rm, Register rn) {
3010     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3011     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3012     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3013     VIXL_ASSERT(allow_macro_instructions_);
3014     VIXL_ASSERT(OutsideITBlock());
3015     MacroEmissionCheckScope guard(this);
3016     ITScope it_scope(this, &cond, guard);
3017     qdsub(cond, rd, rm, rn);
3018   }
Qdsub(Register rd,Register rm,Register rn)3019   void Qdsub(Register rd, Register rm, Register rn) { Qdsub(al, rd, rm, rn); }
3020 
Qsax(Condition cond,Register rd,Register rn,Register rm)3021   void Qsax(Condition cond, Register rd, Register rn, Register rm) {
3022     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3023     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3024     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3025     VIXL_ASSERT(allow_macro_instructions_);
3026     VIXL_ASSERT(OutsideITBlock());
3027     MacroEmissionCheckScope guard(this);
3028     ITScope it_scope(this, &cond, guard);
3029     qsax(cond, rd, rn, rm);
3030   }
Qsax(Register rd,Register rn,Register rm)3031   void Qsax(Register rd, Register rn, Register rm) { Qsax(al, rd, rn, rm); }
3032 
Qsub(Condition cond,Register rd,Register rm,Register rn)3033   void Qsub(Condition cond, Register rd, Register rm, Register rn) {
3034     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3035     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3036     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3037     VIXL_ASSERT(allow_macro_instructions_);
3038     VIXL_ASSERT(OutsideITBlock());
3039     MacroEmissionCheckScope guard(this);
3040     ITScope it_scope(this, &cond, guard);
3041     qsub(cond, rd, rm, rn);
3042   }
Qsub(Register rd,Register rm,Register rn)3043   void Qsub(Register rd, Register rm, Register rn) { Qsub(al, rd, rm, rn); }
3044 
Qsub16(Condition cond,Register rd,Register rn,Register rm)3045   void Qsub16(Condition cond, Register rd, Register rn, Register rm) {
3046     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3047     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3048     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3049     VIXL_ASSERT(allow_macro_instructions_);
3050     VIXL_ASSERT(OutsideITBlock());
3051     MacroEmissionCheckScope guard(this);
3052     ITScope it_scope(this, &cond, guard);
3053     qsub16(cond, rd, rn, rm);
3054   }
Qsub16(Register rd,Register rn,Register rm)3055   void Qsub16(Register rd, Register rn, Register rm) { Qsub16(al, rd, rn, rm); }
3056 
Qsub8(Condition cond,Register rd,Register rn,Register rm)3057   void Qsub8(Condition cond, Register rd, Register rn, Register rm) {
3058     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3059     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3060     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3061     VIXL_ASSERT(allow_macro_instructions_);
3062     VIXL_ASSERT(OutsideITBlock());
3063     MacroEmissionCheckScope guard(this);
3064     ITScope it_scope(this, &cond, guard);
3065     qsub8(cond, rd, rn, rm);
3066   }
Qsub8(Register rd,Register rn,Register rm)3067   void Qsub8(Register rd, Register rn, Register rm) { Qsub8(al, rd, rn, rm); }
3068 
Rbit(Condition cond,Register rd,Register rm)3069   void Rbit(Condition cond, Register rd, Register rm) {
3070     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3071     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3072     VIXL_ASSERT(allow_macro_instructions_);
3073     VIXL_ASSERT(OutsideITBlock());
3074     MacroEmissionCheckScope guard(this);
3075     ITScope it_scope(this, &cond, guard);
3076     rbit(cond, rd, rm);
3077   }
Rbit(Register rd,Register rm)3078   void Rbit(Register rd, Register rm) { Rbit(al, rd, rm); }
3079 
Rev(Condition cond,Register rd,Register rm)3080   void Rev(Condition cond, Register rd, Register rm) {
3081     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3082     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3083     VIXL_ASSERT(allow_macro_instructions_);
3084     VIXL_ASSERT(OutsideITBlock());
3085     MacroEmissionCheckScope guard(this);
3086     ITScope it_scope(this, &cond, guard);
3087     rev(cond, rd, rm);
3088   }
Rev(Register rd,Register rm)3089   void Rev(Register rd, Register rm) { Rev(al, rd, rm); }
3090 
Rev16(Condition cond,Register rd,Register rm)3091   void Rev16(Condition cond, Register rd, Register rm) {
3092     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3093     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3094     VIXL_ASSERT(allow_macro_instructions_);
3095     VIXL_ASSERT(OutsideITBlock());
3096     MacroEmissionCheckScope guard(this);
3097     ITScope it_scope(this, &cond, guard);
3098     rev16(cond, rd, rm);
3099   }
Rev16(Register rd,Register rm)3100   void Rev16(Register rd, Register rm) { Rev16(al, rd, rm); }
3101 
Revsh(Condition cond,Register rd,Register rm)3102   void Revsh(Condition cond, Register rd, Register rm) {
3103     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3104     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3105     VIXL_ASSERT(allow_macro_instructions_);
3106     VIXL_ASSERT(OutsideITBlock());
3107     MacroEmissionCheckScope guard(this);
3108     ITScope it_scope(this, &cond, guard);
3109     revsh(cond, rd, rm);
3110   }
Revsh(Register rd,Register rm)3111   void Revsh(Register rd, Register rm) { Revsh(al, rd, rm); }
3112 
Ror(Condition cond,Register rd,Register rm,const Operand & operand)3113   void Ror(Condition cond, Register rd, Register rm, const Operand& operand) {
3114     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3115     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3116     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3117     VIXL_ASSERT(allow_macro_instructions_);
3118     VIXL_ASSERT(OutsideITBlock());
3119     MacroEmissionCheckScope guard(this);
3120     bool can_use_it =
3121         // ROR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
3122         operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
3123         operand.GetBaseRegister().IsLow();
3124     ITScope it_scope(this, &cond, guard, can_use_it);
3125     ror(cond, rd, rm, operand);
3126   }
Ror(Register rd,Register rm,const Operand & operand)3127   void Ror(Register rd, Register rm, const Operand& operand) {
3128     Ror(al, rd, rm, operand);
3129   }
Ror(FlagsUpdate flags,Condition cond,Register rd,Register rm,const Operand & operand)3130   void Ror(FlagsUpdate flags,
3131            Condition cond,
3132            Register rd,
3133            Register rm,
3134            const Operand& operand) {
3135     switch (flags) {
3136       case LeaveFlags:
3137         Ror(cond, rd, rm, operand);
3138         break;
3139       case SetFlags:
3140         Rors(cond, rd, rm, operand);
3141         break;
3142       case DontCare:
3143         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3144                                    rm.IsLow() && operand.IsPlainRegister() &&
3145                                    rd.Is(rm);
3146         if (setflags_is_smaller) {
3147           Rors(cond, rd, rm, operand);
3148         } else {
3149           Ror(cond, rd, rm, operand);
3150         }
3151         break;
3152     }
3153   }
Ror(FlagsUpdate flags,Register rd,Register rm,const Operand & operand)3154   void Ror(FlagsUpdate flags,
3155            Register rd,
3156            Register rm,
3157            const Operand& operand) {
3158     Ror(flags, al, rd, rm, operand);
3159   }
3160 
Rors(Condition cond,Register rd,Register rm,const Operand & operand)3161   void Rors(Condition cond, Register rd, Register rm, const Operand& operand) {
3162     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3163     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3164     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3165     VIXL_ASSERT(allow_macro_instructions_);
3166     VIXL_ASSERT(OutsideITBlock());
3167     MacroEmissionCheckScope guard(this);
3168     ITScope it_scope(this, &cond, guard);
3169     rors(cond, rd, rm, operand);
3170   }
Rors(Register rd,Register rm,const Operand & operand)3171   void Rors(Register rd, Register rm, const Operand& operand) {
3172     Rors(al, rd, rm, operand);
3173   }
3174 
Rrx(Condition cond,Register rd,Register rm)3175   void Rrx(Condition cond, Register rd, Register rm) {
3176     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3177     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3178     VIXL_ASSERT(allow_macro_instructions_);
3179     VIXL_ASSERT(OutsideITBlock());
3180     MacroEmissionCheckScope guard(this);
3181     ITScope it_scope(this, &cond, guard);
3182     rrx(cond, rd, rm);
3183   }
Rrx(Register rd,Register rm)3184   void Rrx(Register rd, Register rm) { Rrx(al, rd, rm); }
Rrx(FlagsUpdate flags,Condition cond,Register rd,Register rm)3185   void Rrx(FlagsUpdate flags, Condition cond, Register rd, Register rm) {
3186     switch (flags) {
3187       case LeaveFlags:
3188         Rrx(cond, rd, rm);
3189         break;
3190       case SetFlags:
3191         Rrxs(cond, rd, rm);
3192         break;
3193       case DontCare:
3194         Rrx(cond, rd, rm);
3195         break;
3196     }
3197   }
Rrx(FlagsUpdate flags,Register rd,Register rm)3198   void Rrx(FlagsUpdate flags, Register rd, Register rm) {
3199     Rrx(flags, al, rd, rm);
3200   }
3201 
Rrxs(Condition cond,Register rd,Register rm)3202   void Rrxs(Condition cond, Register rd, Register rm) {
3203     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3204     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3205     VIXL_ASSERT(allow_macro_instructions_);
3206     VIXL_ASSERT(OutsideITBlock());
3207     MacroEmissionCheckScope guard(this);
3208     ITScope it_scope(this, &cond, guard);
3209     rrxs(cond, rd, rm);
3210   }
Rrxs(Register rd,Register rm)3211   void Rrxs(Register rd, Register rm) { Rrxs(al, rd, rm); }
3212 
Rsb(Condition cond,Register rd,Register rn,const Operand & operand)3213   void Rsb(Condition cond, Register rd, Register rn, const Operand& operand) {
3214     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3215     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3216     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3217     VIXL_ASSERT(allow_macro_instructions_);
3218     VIXL_ASSERT(OutsideITBlock());
3219     MacroEmissionCheckScope guard(this);
3220     bool can_use_it =
3221         // RSB<c>{<q>} {<Rd>, }<Rn>, #0 ; T1
3222         operand.IsImmediate() && rd.IsLow() && rn.IsLow() &&
3223         (operand.GetImmediate() == 0);
3224     ITScope it_scope(this, &cond, guard, can_use_it);
3225     rsb(cond, rd, rn, operand);
3226   }
Rsb(Register rd,Register rn,const Operand & operand)3227   void Rsb(Register rd, Register rn, const Operand& operand) {
3228     Rsb(al, rd, rn, operand);
3229   }
Rsb(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)3230   void Rsb(FlagsUpdate flags,
3231            Condition cond,
3232            Register rd,
3233            Register rn,
3234            const Operand& operand) {
3235     switch (flags) {
3236       case LeaveFlags:
3237         Rsb(cond, rd, rn, operand);
3238         break;
3239       case SetFlags:
3240         Rsbs(cond, rd, rn, operand);
3241         break;
3242       case DontCare:
3243         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3244                                    rn.IsLow() && operand.IsImmediate() &&
3245                                    (operand.GetImmediate() == 0);
3246         if (setflags_is_smaller) {
3247           Rsbs(cond, rd, rn, operand);
3248         } else {
3249           Rsb(cond, rd, rn, operand);
3250         }
3251         break;
3252     }
3253   }
Rsb(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)3254   void Rsb(FlagsUpdate flags,
3255            Register rd,
3256            Register rn,
3257            const Operand& operand) {
3258     Rsb(flags, al, rd, rn, operand);
3259   }
3260 
Rsbs(Condition cond,Register rd,Register rn,const Operand & operand)3261   void Rsbs(Condition cond, Register rd, Register rn, const Operand& operand) {
3262     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3263     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3264     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3265     VIXL_ASSERT(allow_macro_instructions_);
3266     VIXL_ASSERT(OutsideITBlock());
3267     MacroEmissionCheckScope guard(this);
3268     ITScope it_scope(this, &cond, guard);
3269     rsbs(cond, rd, rn, operand);
3270   }
Rsbs(Register rd,Register rn,const Operand & operand)3271   void Rsbs(Register rd, Register rn, const Operand& operand) {
3272     Rsbs(al, rd, rn, operand);
3273   }
3274 
Rsc(Condition cond,Register rd,Register rn,const Operand & operand)3275   void Rsc(Condition cond, Register rd, Register rn, const Operand& operand) {
3276     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3277     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3278     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3279     VIXL_ASSERT(allow_macro_instructions_);
3280     VIXL_ASSERT(OutsideITBlock());
3281     MacroEmissionCheckScope guard(this);
3282     ITScope it_scope(this, &cond, guard);
3283     rsc(cond, rd, rn, operand);
3284   }
Rsc(Register rd,Register rn,const Operand & operand)3285   void Rsc(Register rd, Register rn, const Operand& operand) {
3286     Rsc(al, rd, rn, operand);
3287   }
Rsc(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)3288   void Rsc(FlagsUpdate flags,
3289            Condition cond,
3290            Register rd,
3291            Register rn,
3292            const Operand& operand) {
3293     switch (flags) {
3294       case LeaveFlags:
3295         Rsc(cond, rd, rn, operand);
3296         break;
3297       case SetFlags:
3298         Rscs(cond, rd, rn, operand);
3299         break;
3300       case DontCare:
3301         Rsc(cond, rd, rn, operand);
3302         break;
3303     }
3304   }
Rsc(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)3305   void Rsc(FlagsUpdate flags,
3306            Register rd,
3307            Register rn,
3308            const Operand& operand) {
3309     Rsc(flags, al, rd, rn, operand);
3310   }
3311 
Rscs(Condition cond,Register rd,Register rn,const Operand & operand)3312   void Rscs(Condition cond, Register rd, Register rn, const Operand& operand) {
3313     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3314     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3315     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3316     VIXL_ASSERT(allow_macro_instructions_);
3317     VIXL_ASSERT(OutsideITBlock());
3318     MacroEmissionCheckScope guard(this);
3319     ITScope it_scope(this, &cond, guard);
3320     rscs(cond, rd, rn, operand);
3321   }
Rscs(Register rd,Register rn,const Operand & operand)3322   void Rscs(Register rd, Register rn, const Operand& operand) {
3323     Rscs(al, rd, rn, operand);
3324   }
3325 
Sadd16(Condition cond,Register rd,Register rn,Register rm)3326   void Sadd16(Condition cond, Register rd, Register rn, Register rm) {
3327     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3328     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3329     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3330     VIXL_ASSERT(allow_macro_instructions_);
3331     VIXL_ASSERT(OutsideITBlock());
3332     MacroEmissionCheckScope guard(this);
3333     ITScope it_scope(this, &cond, guard);
3334     sadd16(cond, rd, rn, rm);
3335   }
Sadd16(Register rd,Register rn,Register rm)3336   void Sadd16(Register rd, Register rn, Register rm) { Sadd16(al, rd, rn, rm); }
3337 
Sadd8(Condition cond,Register rd,Register rn,Register rm)3338   void Sadd8(Condition cond, Register rd, Register rn, Register rm) {
3339     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3340     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3341     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3342     VIXL_ASSERT(allow_macro_instructions_);
3343     VIXL_ASSERT(OutsideITBlock());
3344     MacroEmissionCheckScope guard(this);
3345     ITScope it_scope(this, &cond, guard);
3346     sadd8(cond, rd, rn, rm);
3347   }
Sadd8(Register rd,Register rn,Register rm)3348   void Sadd8(Register rd, Register rn, Register rm) { Sadd8(al, rd, rn, rm); }
3349 
Sasx(Condition cond,Register rd,Register rn,Register rm)3350   void Sasx(Condition cond, Register rd, Register rn, Register rm) {
3351     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3352     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3353     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3354     VIXL_ASSERT(allow_macro_instructions_);
3355     VIXL_ASSERT(OutsideITBlock());
3356     MacroEmissionCheckScope guard(this);
3357     ITScope it_scope(this, &cond, guard);
3358     sasx(cond, rd, rn, rm);
3359   }
Sasx(Register rd,Register rn,Register rm)3360   void Sasx(Register rd, Register rn, Register rm) { Sasx(al, rd, rn, rm); }
3361 
Sbc(Condition cond,Register rd,Register rn,const Operand & operand)3362   void Sbc(Condition cond, Register rd, Register rn, const Operand& operand) {
3363     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3364     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3365     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3366     VIXL_ASSERT(allow_macro_instructions_);
3367     VIXL_ASSERT(OutsideITBlock());
3368     MacroEmissionCheckScope guard(this);
3369     bool can_use_it =
3370         // SBC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
3371         operand.IsPlainRegister() && rn.IsLow() && rd.Is(rn) &&
3372         operand.GetBaseRegister().IsLow();
3373     ITScope it_scope(this, &cond, guard, can_use_it);
3374     sbc(cond, rd, rn, operand);
3375   }
Sbc(Register rd,Register rn,const Operand & operand)3376   void Sbc(Register rd, Register rn, const Operand& operand) {
3377     Sbc(al, rd, rn, operand);
3378   }
Sbc(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)3379   void Sbc(FlagsUpdate flags,
3380            Condition cond,
3381            Register rd,
3382            Register rn,
3383            const Operand& operand) {
3384     switch (flags) {
3385       case LeaveFlags:
3386         Sbc(cond, rd, rn, operand);
3387         break;
3388       case SetFlags:
3389         Sbcs(cond, rd, rn, operand);
3390         break;
3391       case DontCare:
3392         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3393                                    rn.Is(rd) && operand.IsPlainRegister() &&
3394                                    operand.GetBaseRegister().IsLow();
3395         if (setflags_is_smaller) {
3396           Sbcs(cond, rd, rn, operand);
3397         } else {
3398           Sbc(cond, rd, rn, operand);
3399         }
3400         break;
3401     }
3402   }
Sbc(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)3403   void Sbc(FlagsUpdate flags,
3404            Register rd,
3405            Register rn,
3406            const Operand& operand) {
3407     Sbc(flags, al, rd, rn, operand);
3408   }
3409 
Sbcs(Condition cond,Register rd,Register rn,const Operand & operand)3410   void Sbcs(Condition cond, Register rd, Register rn, const Operand& operand) {
3411     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3412     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3413     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3414     VIXL_ASSERT(allow_macro_instructions_);
3415     VIXL_ASSERT(OutsideITBlock());
3416     MacroEmissionCheckScope guard(this);
3417     ITScope it_scope(this, &cond, guard);
3418     sbcs(cond, rd, rn, operand);
3419   }
Sbcs(Register rd,Register rn,const Operand & operand)3420   void Sbcs(Register rd, Register rn, const Operand& operand) {
3421     Sbcs(al, rd, rn, operand);
3422   }
3423 
Sbfx(Condition cond,Register rd,Register rn,uint32_t lsb,uint32_t width)3424   void Sbfx(
3425       Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
3426     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3427     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3428     VIXL_ASSERT(allow_macro_instructions_);
3429     VIXL_ASSERT(OutsideITBlock());
3430     MacroEmissionCheckScope guard(this);
3431     ITScope it_scope(this, &cond, guard);
3432     sbfx(cond, rd, rn, lsb, width);
3433   }
Sbfx(Register rd,Register rn,uint32_t lsb,uint32_t width)3434   void Sbfx(Register rd, Register rn, uint32_t lsb, uint32_t width) {
3435     Sbfx(al, rd, rn, lsb, width);
3436   }
3437 
Sdiv(Condition cond,Register rd,Register rn,Register rm)3438   void Sdiv(Condition cond, Register rd, Register rn, Register rm) {
3439     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3440     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3441     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3442     VIXL_ASSERT(allow_macro_instructions_);
3443     VIXL_ASSERT(OutsideITBlock());
3444     MacroEmissionCheckScope guard(this);
3445     ITScope it_scope(this, &cond, guard);
3446     sdiv(cond, rd, rn, rm);
3447   }
Sdiv(Register rd,Register rn,Register rm)3448   void Sdiv(Register rd, Register rn, Register rm) { Sdiv(al, rd, rn, rm); }
3449 
Sel(Condition cond,Register rd,Register rn,Register rm)3450   void Sel(Condition cond, Register rd, Register rn, Register rm) {
3451     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3452     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3453     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3454     VIXL_ASSERT(allow_macro_instructions_);
3455     VIXL_ASSERT(OutsideITBlock());
3456     MacroEmissionCheckScope guard(this);
3457     ITScope it_scope(this, &cond, guard);
3458     sel(cond, rd, rn, rm);
3459   }
Sel(Register rd,Register rn,Register rm)3460   void Sel(Register rd, Register rn, Register rm) { Sel(al, rd, rn, rm); }
3461 
Shadd16(Condition cond,Register rd,Register rn,Register rm)3462   void Shadd16(Condition cond, Register rd, Register rn, Register rm) {
3463     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3464     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3465     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3466     VIXL_ASSERT(allow_macro_instructions_);
3467     VIXL_ASSERT(OutsideITBlock());
3468     MacroEmissionCheckScope guard(this);
3469     ITScope it_scope(this, &cond, guard);
3470     shadd16(cond, rd, rn, rm);
3471   }
Shadd16(Register rd,Register rn,Register rm)3472   void Shadd16(Register rd, Register rn, Register rm) {
3473     Shadd16(al, rd, rn, rm);
3474   }
3475 
Shadd8(Condition cond,Register rd,Register rn,Register rm)3476   void Shadd8(Condition cond, Register rd, Register rn, Register rm) {
3477     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3478     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3479     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3480     VIXL_ASSERT(allow_macro_instructions_);
3481     VIXL_ASSERT(OutsideITBlock());
3482     MacroEmissionCheckScope guard(this);
3483     ITScope it_scope(this, &cond, guard);
3484     shadd8(cond, rd, rn, rm);
3485   }
Shadd8(Register rd,Register rn,Register rm)3486   void Shadd8(Register rd, Register rn, Register rm) { Shadd8(al, rd, rn, rm); }
3487 
Shasx(Condition cond,Register rd,Register rn,Register rm)3488   void Shasx(Condition cond, Register rd, Register rn, Register rm) {
3489     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3490     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3491     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3492     VIXL_ASSERT(allow_macro_instructions_);
3493     VIXL_ASSERT(OutsideITBlock());
3494     MacroEmissionCheckScope guard(this);
3495     ITScope it_scope(this, &cond, guard);
3496     shasx(cond, rd, rn, rm);
3497   }
Shasx(Register rd,Register rn,Register rm)3498   void Shasx(Register rd, Register rn, Register rm) { Shasx(al, rd, rn, rm); }
3499 
Shsax(Condition cond,Register rd,Register rn,Register rm)3500   void Shsax(Condition cond, Register rd, Register rn, Register rm) {
3501     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3502     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3503     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3504     VIXL_ASSERT(allow_macro_instructions_);
3505     VIXL_ASSERT(OutsideITBlock());
3506     MacroEmissionCheckScope guard(this);
3507     ITScope it_scope(this, &cond, guard);
3508     shsax(cond, rd, rn, rm);
3509   }
Shsax(Register rd,Register rn,Register rm)3510   void Shsax(Register rd, Register rn, Register rm) { Shsax(al, rd, rn, rm); }
3511 
Shsub16(Condition cond,Register rd,Register rn,Register rm)3512   void Shsub16(Condition cond, Register rd, Register rn, Register rm) {
3513     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3514     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3515     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3516     VIXL_ASSERT(allow_macro_instructions_);
3517     VIXL_ASSERT(OutsideITBlock());
3518     MacroEmissionCheckScope guard(this);
3519     ITScope it_scope(this, &cond, guard);
3520     shsub16(cond, rd, rn, rm);
3521   }
Shsub16(Register rd,Register rn,Register rm)3522   void Shsub16(Register rd, Register rn, Register rm) {
3523     Shsub16(al, rd, rn, rm);
3524   }
3525 
Shsub8(Condition cond,Register rd,Register rn,Register rm)3526   void Shsub8(Condition cond, Register rd, Register rn, Register rm) {
3527     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3528     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3529     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3530     VIXL_ASSERT(allow_macro_instructions_);
3531     VIXL_ASSERT(OutsideITBlock());
3532     MacroEmissionCheckScope guard(this);
3533     ITScope it_scope(this, &cond, guard);
3534     shsub8(cond, rd, rn, rm);
3535   }
Shsub8(Register rd,Register rn,Register rm)3536   void Shsub8(Register rd, Register rn, Register rm) { Shsub8(al, rd, rn, rm); }
3537 
Smlabb(Condition cond,Register rd,Register rn,Register rm,Register ra)3538   void Smlabb(
3539       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3540     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3541     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3542     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3543     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3544     VIXL_ASSERT(allow_macro_instructions_);
3545     VIXL_ASSERT(OutsideITBlock());
3546     MacroEmissionCheckScope guard(this);
3547     ITScope it_scope(this, &cond, guard);
3548     smlabb(cond, rd, rn, rm, ra);
3549   }
Smlabb(Register rd,Register rn,Register rm,Register ra)3550   void Smlabb(Register rd, Register rn, Register rm, Register ra) {
3551     Smlabb(al, rd, rn, rm, ra);
3552   }
3553 
Smlabt(Condition cond,Register rd,Register rn,Register rm,Register ra)3554   void Smlabt(
3555       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3556     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3557     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3558     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3559     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3560     VIXL_ASSERT(allow_macro_instructions_);
3561     VIXL_ASSERT(OutsideITBlock());
3562     MacroEmissionCheckScope guard(this);
3563     ITScope it_scope(this, &cond, guard);
3564     smlabt(cond, rd, rn, rm, ra);
3565   }
Smlabt(Register rd,Register rn,Register rm,Register ra)3566   void Smlabt(Register rd, Register rn, Register rm, Register ra) {
3567     Smlabt(al, rd, rn, rm, ra);
3568   }
3569 
Smlad(Condition cond,Register rd,Register rn,Register rm,Register ra)3570   void Smlad(
3571       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3572     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3573     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3574     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3575     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3576     VIXL_ASSERT(allow_macro_instructions_);
3577     VIXL_ASSERT(OutsideITBlock());
3578     MacroEmissionCheckScope guard(this);
3579     ITScope it_scope(this, &cond, guard);
3580     smlad(cond, rd, rn, rm, ra);
3581   }
Smlad(Register rd,Register rn,Register rm,Register ra)3582   void Smlad(Register rd, Register rn, Register rm, Register ra) {
3583     Smlad(al, rd, rn, rm, ra);
3584   }
3585 
Smladx(Condition cond,Register rd,Register rn,Register rm,Register ra)3586   void Smladx(
3587       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3588     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3589     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3590     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3591     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3592     VIXL_ASSERT(allow_macro_instructions_);
3593     VIXL_ASSERT(OutsideITBlock());
3594     MacroEmissionCheckScope guard(this);
3595     ITScope it_scope(this, &cond, guard);
3596     smladx(cond, rd, rn, rm, ra);
3597   }
Smladx(Register rd,Register rn,Register rm,Register ra)3598   void Smladx(Register rd, Register rn, Register rm, Register ra) {
3599     Smladx(al, rd, rn, rm, ra);
3600   }
3601 
Smlal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3602   void Smlal(
3603       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3604     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3605     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3606     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3607     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3608     VIXL_ASSERT(allow_macro_instructions_);
3609     VIXL_ASSERT(OutsideITBlock());
3610     MacroEmissionCheckScope guard(this);
3611     ITScope it_scope(this, &cond, guard);
3612     smlal(cond, rdlo, rdhi, rn, rm);
3613   }
Smlal(Register rdlo,Register rdhi,Register rn,Register rm)3614   void Smlal(Register rdlo, Register rdhi, Register rn, Register rm) {
3615     Smlal(al, rdlo, rdhi, rn, rm);
3616   }
3617 
Smlalbb(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3618   void Smlalbb(
3619       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3620     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3621     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3622     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3623     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3624     VIXL_ASSERT(allow_macro_instructions_);
3625     VIXL_ASSERT(OutsideITBlock());
3626     MacroEmissionCheckScope guard(this);
3627     ITScope it_scope(this, &cond, guard);
3628     smlalbb(cond, rdlo, rdhi, rn, rm);
3629   }
Smlalbb(Register rdlo,Register rdhi,Register rn,Register rm)3630   void Smlalbb(Register rdlo, Register rdhi, Register rn, Register rm) {
3631     Smlalbb(al, rdlo, rdhi, rn, rm);
3632   }
3633 
Smlalbt(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3634   void Smlalbt(
3635       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3636     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3637     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3638     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3639     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3640     VIXL_ASSERT(allow_macro_instructions_);
3641     VIXL_ASSERT(OutsideITBlock());
3642     MacroEmissionCheckScope guard(this);
3643     ITScope it_scope(this, &cond, guard);
3644     smlalbt(cond, rdlo, rdhi, rn, rm);
3645   }
Smlalbt(Register rdlo,Register rdhi,Register rn,Register rm)3646   void Smlalbt(Register rdlo, Register rdhi, Register rn, Register rm) {
3647     Smlalbt(al, rdlo, rdhi, rn, rm);
3648   }
3649 
Smlald(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3650   void Smlald(
3651       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3652     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3653     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3654     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3655     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3656     VIXL_ASSERT(allow_macro_instructions_);
3657     VIXL_ASSERT(OutsideITBlock());
3658     MacroEmissionCheckScope guard(this);
3659     ITScope it_scope(this, &cond, guard);
3660     smlald(cond, rdlo, rdhi, rn, rm);
3661   }
Smlald(Register rdlo,Register rdhi,Register rn,Register rm)3662   void Smlald(Register rdlo, Register rdhi, Register rn, Register rm) {
3663     Smlald(al, rdlo, rdhi, rn, rm);
3664   }
3665 
Smlaldx(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3666   void Smlaldx(
3667       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3668     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3669     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3670     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3671     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3672     VIXL_ASSERT(allow_macro_instructions_);
3673     VIXL_ASSERT(OutsideITBlock());
3674     MacroEmissionCheckScope guard(this);
3675     ITScope it_scope(this, &cond, guard);
3676     smlaldx(cond, rdlo, rdhi, rn, rm);
3677   }
Smlaldx(Register rdlo,Register rdhi,Register rn,Register rm)3678   void Smlaldx(Register rdlo, Register rdhi, Register rn, Register rm) {
3679     Smlaldx(al, rdlo, rdhi, rn, rm);
3680   }
3681 
Smlals(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3682   void Smlals(
3683       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3684     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3685     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3686     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3687     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3688     VIXL_ASSERT(allow_macro_instructions_);
3689     VIXL_ASSERT(OutsideITBlock());
3690     MacroEmissionCheckScope guard(this);
3691     ITScope it_scope(this, &cond, guard);
3692     smlals(cond, rdlo, rdhi, rn, rm);
3693   }
Smlals(Register rdlo,Register rdhi,Register rn,Register rm)3694   void Smlals(Register rdlo, Register rdhi, Register rn, Register rm) {
3695     Smlals(al, rdlo, rdhi, rn, rm);
3696   }
3697 
Smlaltb(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3698   void Smlaltb(
3699       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3700     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3701     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3702     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3703     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3704     VIXL_ASSERT(allow_macro_instructions_);
3705     VIXL_ASSERT(OutsideITBlock());
3706     MacroEmissionCheckScope guard(this);
3707     ITScope it_scope(this, &cond, guard);
3708     smlaltb(cond, rdlo, rdhi, rn, rm);
3709   }
Smlaltb(Register rdlo,Register rdhi,Register rn,Register rm)3710   void Smlaltb(Register rdlo, Register rdhi, Register rn, Register rm) {
3711     Smlaltb(al, rdlo, rdhi, rn, rm);
3712   }
3713 
Smlaltt(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3714   void Smlaltt(
3715       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3716     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3717     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3718     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3719     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3720     VIXL_ASSERT(allow_macro_instructions_);
3721     VIXL_ASSERT(OutsideITBlock());
3722     MacroEmissionCheckScope guard(this);
3723     ITScope it_scope(this, &cond, guard);
3724     smlaltt(cond, rdlo, rdhi, rn, rm);
3725   }
Smlaltt(Register rdlo,Register rdhi,Register rn,Register rm)3726   void Smlaltt(Register rdlo, Register rdhi, Register rn, Register rm) {
3727     Smlaltt(al, rdlo, rdhi, rn, rm);
3728   }
3729 
Smlatb(Condition cond,Register rd,Register rn,Register rm,Register ra)3730   void Smlatb(
3731       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3732     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3733     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3734     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3735     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3736     VIXL_ASSERT(allow_macro_instructions_);
3737     VIXL_ASSERT(OutsideITBlock());
3738     MacroEmissionCheckScope guard(this);
3739     ITScope it_scope(this, &cond, guard);
3740     smlatb(cond, rd, rn, rm, ra);
3741   }
Smlatb(Register rd,Register rn,Register rm,Register ra)3742   void Smlatb(Register rd, Register rn, Register rm, Register ra) {
3743     Smlatb(al, rd, rn, rm, ra);
3744   }
3745 
Smlatt(Condition cond,Register rd,Register rn,Register rm,Register ra)3746   void Smlatt(
3747       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3748     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3749     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3750     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3751     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3752     VIXL_ASSERT(allow_macro_instructions_);
3753     VIXL_ASSERT(OutsideITBlock());
3754     MacroEmissionCheckScope guard(this);
3755     ITScope it_scope(this, &cond, guard);
3756     smlatt(cond, rd, rn, rm, ra);
3757   }
Smlatt(Register rd,Register rn,Register rm,Register ra)3758   void Smlatt(Register rd, Register rn, Register rm, Register ra) {
3759     Smlatt(al, rd, rn, rm, ra);
3760   }
3761 
Smlawb(Condition cond,Register rd,Register rn,Register rm,Register ra)3762   void Smlawb(
3763       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3764     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3765     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3766     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3767     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3768     VIXL_ASSERT(allow_macro_instructions_);
3769     VIXL_ASSERT(OutsideITBlock());
3770     MacroEmissionCheckScope guard(this);
3771     ITScope it_scope(this, &cond, guard);
3772     smlawb(cond, rd, rn, rm, ra);
3773   }
Smlawb(Register rd,Register rn,Register rm,Register ra)3774   void Smlawb(Register rd, Register rn, Register rm, Register ra) {
3775     Smlawb(al, rd, rn, rm, ra);
3776   }
3777 
Smlawt(Condition cond,Register rd,Register rn,Register rm,Register ra)3778   void Smlawt(
3779       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3780     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3781     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3782     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3783     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3784     VIXL_ASSERT(allow_macro_instructions_);
3785     VIXL_ASSERT(OutsideITBlock());
3786     MacroEmissionCheckScope guard(this);
3787     ITScope it_scope(this, &cond, guard);
3788     smlawt(cond, rd, rn, rm, ra);
3789   }
Smlawt(Register rd,Register rn,Register rm,Register ra)3790   void Smlawt(Register rd, Register rn, Register rm, Register ra) {
3791     Smlawt(al, rd, rn, rm, ra);
3792   }
3793 
Smlsd(Condition cond,Register rd,Register rn,Register rm,Register ra)3794   void Smlsd(
3795       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3796     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3797     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3798     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3799     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3800     VIXL_ASSERT(allow_macro_instructions_);
3801     VIXL_ASSERT(OutsideITBlock());
3802     MacroEmissionCheckScope guard(this);
3803     ITScope it_scope(this, &cond, guard);
3804     smlsd(cond, rd, rn, rm, ra);
3805   }
Smlsd(Register rd,Register rn,Register rm,Register ra)3806   void Smlsd(Register rd, Register rn, Register rm, Register ra) {
3807     Smlsd(al, rd, rn, rm, ra);
3808   }
3809 
Smlsdx(Condition cond,Register rd,Register rn,Register rm,Register ra)3810   void Smlsdx(
3811       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3812     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3813     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3814     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3815     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3816     VIXL_ASSERT(allow_macro_instructions_);
3817     VIXL_ASSERT(OutsideITBlock());
3818     MacroEmissionCheckScope guard(this);
3819     ITScope it_scope(this, &cond, guard);
3820     smlsdx(cond, rd, rn, rm, ra);
3821   }
Smlsdx(Register rd,Register rn,Register rm,Register ra)3822   void Smlsdx(Register rd, Register rn, Register rm, Register ra) {
3823     Smlsdx(al, rd, rn, rm, ra);
3824   }
3825 
Smlsld(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3826   void Smlsld(
3827       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3828     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3829     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3830     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3831     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3832     VIXL_ASSERT(allow_macro_instructions_);
3833     VIXL_ASSERT(OutsideITBlock());
3834     MacroEmissionCheckScope guard(this);
3835     ITScope it_scope(this, &cond, guard);
3836     smlsld(cond, rdlo, rdhi, rn, rm);
3837   }
Smlsld(Register rdlo,Register rdhi,Register rn,Register rm)3838   void Smlsld(Register rdlo, Register rdhi, Register rn, Register rm) {
3839     Smlsld(al, rdlo, rdhi, rn, rm);
3840   }
3841 
Smlsldx(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3842   void Smlsldx(
3843       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3844     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3845     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3846     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3847     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3848     VIXL_ASSERT(allow_macro_instructions_);
3849     VIXL_ASSERT(OutsideITBlock());
3850     MacroEmissionCheckScope guard(this);
3851     ITScope it_scope(this, &cond, guard);
3852     smlsldx(cond, rdlo, rdhi, rn, rm);
3853   }
Smlsldx(Register rdlo,Register rdhi,Register rn,Register rm)3854   void Smlsldx(Register rdlo, Register rdhi, Register rn, Register rm) {
3855     Smlsldx(al, rdlo, rdhi, rn, rm);
3856   }
3857 
Smmla(Condition cond,Register rd,Register rn,Register rm,Register ra)3858   void Smmla(
3859       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3860     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3861     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3862     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3863     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3864     VIXL_ASSERT(allow_macro_instructions_);
3865     VIXL_ASSERT(OutsideITBlock());
3866     MacroEmissionCheckScope guard(this);
3867     ITScope it_scope(this, &cond, guard);
3868     smmla(cond, rd, rn, rm, ra);
3869   }
Smmla(Register rd,Register rn,Register rm,Register ra)3870   void Smmla(Register rd, Register rn, Register rm, Register ra) {
3871     Smmla(al, rd, rn, rm, ra);
3872   }
3873 
Smmlar(Condition cond,Register rd,Register rn,Register rm,Register ra)3874   void Smmlar(
3875       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3876     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3877     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3878     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3879     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3880     VIXL_ASSERT(allow_macro_instructions_);
3881     VIXL_ASSERT(OutsideITBlock());
3882     MacroEmissionCheckScope guard(this);
3883     ITScope it_scope(this, &cond, guard);
3884     smmlar(cond, rd, rn, rm, ra);
3885   }
Smmlar(Register rd,Register rn,Register rm,Register ra)3886   void Smmlar(Register rd, Register rn, Register rm, Register ra) {
3887     Smmlar(al, rd, rn, rm, ra);
3888   }
3889 
Smmls(Condition cond,Register rd,Register rn,Register rm,Register ra)3890   void Smmls(
3891       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3892     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3893     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3894     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3895     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3896     VIXL_ASSERT(allow_macro_instructions_);
3897     VIXL_ASSERT(OutsideITBlock());
3898     MacroEmissionCheckScope guard(this);
3899     ITScope it_scope(this, &cond, guard);
3900     smmls(cond, rd, rn, rm, ra);
3901   }
Smmls(Register rd,Register rn,Register rm,Register ra)3902   void Smmls(Register rd, Register rn, Register rm, Register ra) {
3903     Smmls(al, rd, rn, rm, ra);
3904   }
3905 
Smmlsr(Condition cond,Register rd,Register rn,Register rm,Register ra)3906   void Smmlsr(
3907       Condition cond, Register rd, Register rn, Register rm, Register ra) {
3908     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3909     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3910     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3911     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3912     VIXL_ASSERT(allow_macro_instructions_);
3913     VIXL_ASSERT(OutsideITBlock());
3914     MacroEmissionCheckScope guard(this);
3915     ITScope it_scope(this, &cond, guard);
3916     smmlsr(cond, rd, rn, rm, ra);
3917   }
Smmlsr(Register rd,Register rn,Register rm,Register ra)3918   void Smmlsr(Register rd, Register rn, Register rm, Register ra) {
3919     Smmlsr(al, rd, rn, rm, ra);
3920   }
3921 
Smmul(Condition cond,Register rd,Register rn,Register rm)3922   void Smmul(Condition cond, Register rd, Register rn, Register rm) {
3923     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3924     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3925     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3926     VIXL_ASSERT(allow_macro_instructions_);
3927     VIXL_ASSERT(OutsideITBlock());
3928     MacroEmissionCheckScope guard(this);
3929     ITScope it_scope(this, &cond, guard);
3930     smmul(cond, rd, rn, rm);
3931   }
Smmul(Register rd,Register rn,Register rm)3932   void Smmul(Register rd, Register rn, Register rm) { Smmul(al, rd, rn, rm); }
3933 
Smmulr(Condition cond,Register rd,Register rn,Register rm)3934   void Smmulr(Condition cond, Register rd, Register rn, Register rm) {
3935     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3936     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3937     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3938     VIXL_ASSERT(allow_macro_instructions_);
3939     VIXL_ASSERT(OutsideITBlock());
3940     MacroEmissionCheckScope guard(this);
3941     ITScope it_scope(this, &cond, guard);
3942     smmulr(cond, rd, rn, rm);
3943   }
Smmulr(Register rd,Register rn,Register rm)3944   void Smmulr(Register rd, Register rn, Register rm) { Smmulr(al, rd, rn, rm); }
3945 
Smuad(Condition cond,Register rd,Register rn,Register rm)3946   void Smuad(Condition cond, Register rd, Register rn, Register rm) {
3947     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3948     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3949     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3950     VIXL_ASSERT(allow_macro_instructions_);
3951     VIXL_ASSERT(OutsideITBlock());
3952     MacroEmissionCheckScope guard(this);
3953     ITScope it_scope(this, &cond, guard);
3954     smuad(cond, rd, rn, rm);
3955   }
Smuad(Register rd,Register rn,Register rm)3956   void Smuad(Register rd, Register rn, Register rm) { Smuad(al, rd, rn, rm); }
3957 
Smuadx(Condition cond,Register rd,Register rn,Register rm)3958   void Smuadx(Condition cond, Register rd, Register rn, Register rm) {
3959     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3960     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3961     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3962     VIXL_ASSERT(allow_macro_instructions_);
3963     VIXL_ASSERT(OutsideITBlock());
3964     MacroEmissionCheckScope guard(this);
3965     ITScope it_scope(this, &cond, guard);
3966     smuadx(cond, rd, rn, rm);
3967   }
Smuadx(Register rd,Register rn,Register rm)3968   void Smuadx(Register rd, Register rn, Register rm) { Smuadx(al, rd, rn, rm); }
3969 
Smulbb(Condition cond,Register rd,Register rn,Register rm)3970   void Smulbb(Condition cond, Register rd, Register rn, Register rm) {
3971     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3972     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3973     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3974     VIXL_ASSERT(allow_macro_instructions_);
3975     VIXL_ASSERT(OutsideITBlock());
3976     MacroEmissionCheckScope guard(this);
3977     ITScope it_scope(this, &cond, guard);
3978     smulbb(cond, rd, rn, rm);
3979   }
Smulbb(Register rd,Register rn,Register rm)3980   void Smulbb(Register rd, Register rn, Register rm) { Smulbb(al, rd, rn, rm); }
3981 
Smulbt(Condition cond,Register rd,Register rn,Register rm)3982   void Smulbt(Condition cond, Register rd, Register rn, Register rm) {
3983     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3984     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3985     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3986     VIXL_ASSERT(allow_macro_instructions_);
3987     VIXL_ASSERT(OutsideITBlock());
3988     MacroEmissionCheckScope guard(this);
3989     ITScope it_scope(this, &cond, guard);
3990     smulbt(cond, rd, rn, rm);
3991   }
Smulbt(Register rd,Register rn,Register rm)3992   void Smulbt(Register rd, Register rn, Register rm) { Smulbt(al, rd, rn, rm); }
3993 
Smull(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3994   void Smull(
3995       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3996     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3997     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3998     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3999     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4000     VIXL_ASSERT(allow_macro_instructions_);
4001     VIXL_ASSERT(OutsideITBlock());
4002     MacroEmissionCheckScope guard(this);
4003     ITScope it_scope(this, &cond, guard);
4004     smull(cond, rdlo, rdhi, rn, rm);
4005   }
Smull(Register rdlo,Register rdhi,Register rn,Register rm)4006   void Smull(Register rdlo, Register rdhi, Register rn, Register rm) {
4007     Smull(al, rdlo, rdhi, rn, rm);
4008   }
Smull(FlagsUpdate flags,Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4009   void Smull(FlagsUpdate flags,
4010              Condition cond,
4011              Register rdlo,
4012              Register rdhi,
4013              Register rn,
4014              Register rm) {
4015     switch (flags) {
4016       case LeaveFlags:
4017         Smull(cond, rdlo, rdhi, rn, rm);
4018         break;
4019       case SetFlags:
4020         Smulls(cond, rdlo, rdhi, rn, rm);
4021         break;
4022       case DontCare:
4023         Smull(cond, rdlo, rdhi, rn, rm);
4024         break;
4025     }
4026   }
Smull(FlagsUpdate flags,Register rdlo,Register rdhi,Register rn,Register rm)4027   void Smull(FlagsUpdate flags,
4028              Register rdlo,
4029              Register rdhi,
4030              Register rn,
4031              Register rm) {
4032     Smull(flags, al, rdlo, rdhi, rn, rm);
4033   }
4034 
Smulls(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4035   void Smulls(
4036       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4037     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4038     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4039     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4040     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4041     VIXL_ASSERT(allow_macro_instructions_);
4042     VIXL_ASSERT(OutsideITBlock());
4043     MacroEmissionCheckScope guard(this);
4044     ITScope it_scope(this, &cond, guard);
4045     smulls(cond, rdlo, rdhi, rn, rm);
4046   }
Smulls(Register rdlo,Register rdhi,Register rn,Register rm)4047   void Smulls(Register rdlo, Register rdhi, Register rn, Register rm) {
4048     Smulls(al, rdlo, rdhi, rn, rm);
4049   }
4050 
Smultb(Condition cond,Register rd,Register rn,Register rm)4051   void Smultb(Condition cond, Register rd, Register rn, Register rm) {
4052     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4053     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4054     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4055     VIXL_ASSERT(allow_macro_instructions_);
4056     VIXL_ASSERT(OutsideITBlock());
4057     MacroEmissionCheckScope guard(this);
4058     ITScope it_scope(this, &cond, guard);
4059     smultb(cond, rd, rn, rm);
4060   }
Smultb(Register rd,Register rn,Register rm)4061   void Smultb(Register rd, Register rn, Register rm) { Smultb(al, rd, rn, rm); }
4062 
Smultt(Condition cond,Register rd,Register rn,Register rm)4063   void Smultt(Condition cond, Register rd, Register rn, Register rm) {
4064     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4065     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4066     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4067     VIXL_ASSERT(allow_macro_instructions_);
4068     VIXL_ASSERT(OutsideITBlock());
4069     MacroEmissionCheckScope guard(this);
4070     ITScope it_scope(this, &cond, guard);
4071     smultt(cond, rd, rn, rm);
4072   }
Smultt(Register rd,Register rn,Register rm)4073   void Smultt(Register rd, Register rn, Register rm) { Smultt(al, rd, rn, rm); }
4074 
Smulwb(Condition cond,Register rd,Register rn,Register rm)4075   void Smulwb(Condition cond, Register rd, Register rn, Register rm) {
4076     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4077     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4078     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4079     VIXL_ASSERT(allow_macro_instructions_);
4080     VIXL_ASSERT(OutsideITBlock());
4081     MacroEmissionCheckScope guard(this);
4082     ITScope it_scope(this, &cond, guard);
4083     smulwb(cond, rd, rn, rm);
4084   }
Smulwb(Register rd,Register rn,Register rm)4085   void Smulwb(Register rd, Register rn, Register rm) { Smulwb(al, rd, rn, rm); }
4086 
Smulwt(Condition cond,Register rd,Register rn,Register rm)4087   void Smulwt(Condition cond, Register rd, Register rn, Register rm) {
4088     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4089     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4090     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4091     VIXL_ASSERT(allow_macro_instructions_);
4092     VIXL_ASSERT(OutsideITBlock());
4093     MacroEmissionCheckScope guard(this);
4094     ITScope it_scope(this, &cond, guard);
4095     smulwt(cond, rd, rn, rm);
4096   }
Smulwt(Register rd,Register rn,Register rm)4097   void Smulwt(Register rd, Register rn, Register rm) { Smulwt(al, rd, rn, rm); }
4098 
Smusd(Condition cond,Register rd,Register rn,Register rm)4099   void Smusd(Condition cond, Register rd, Register rn, Register rm) {
4100     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4101     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4102     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4103     VIXL_ASSERT(allow_macro_instructions_);
4104     VIXL_ASSERT(OutsideITBlock());
4105     MacroEmissionCheckScope guard(this);
4106     ITScope it_scope(this, &cond, guard);
4107     smusd(cond, rd, rn, rm);
4108   }
Smusd(Register rd,Register rn,Register rm)4109   void Smusd(Register rd, Register rn, Register rm) { Smusd(al, rd, rn, rm); }
4110 
Smusdx(Condition cond,Register rd,Register rn,Register rm)4111   void Smusdx(Condition cond, Register rd, Register rn, Register rm) {
4112     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4113     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4114     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4115     VIXL_ASSERT(allow_macro_instructions_);
4116     VIXL_ASSERT(OutsideITBlock());
4117     MacroEmissionCheckScope guard(this);
4118     ITScope it_scope(this, &cond, guard);
4119     smusdx(cond, rd, rn, rm);
4120   }
Smusdx(Register rd,Register rn,Register rm)4121   void Smusdx(Register rd, Register rn, Register rm) { Smusdx(al, rd, rn, rm); }
4122 
Ssat(Condition cond,Register rd,uint32_t imm,const Operand & operand)4123   void Ssat(Condition cond, Register rd, uint32_t imm, const Operand& operand) {
4124     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4125     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4126     VIXL_ASSERT(allow_macro_instructions_);
4127     VIXL_ASSERT(OutsideITBlock());
4128     MacroEmissionCheckScope guard(this);
4129     ITScope it_scope(this, &cond, guard);
4130     ssat(cond, rd, imm, operand);
4131   }
Ssat(Register rd,uint32_t imm,const Operand & operand)4132   void Ssat(Register rd, uint32_t imm, const Operand& operand) {
4133     Ssat(al, rd, imm, operand);
4134   }
4135 
Ssat16(Condition cond,Register rd,uint32_t imm,Register rn)4136   void Ssat16(Condition cond, Register rd, uint32_t imm, Register rn) {
4137     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4138     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4139     VIXL_ASSERT(allow_macro_instructions_);
4140     VIXL_ASSERT(OutsideITBlock());
4141     MacroEmissionCheckScope guard(this);
4142     ITScope it_scope(this, &cond, guard);
4143     ssat16(cond, rd, imm, rn);
4144   }
Ssat16(Register rd,uint32_t imm,Register rn)4145   void Ssat16(Register rd, uint32_t imm, Register rn) {
4146     Ssat16(al, rd, imm, rn);
4147   }
4148 
Ssax(Condition cond,Register rd,Register rn,Register rm)4149   void Ssax(Condition cond, Register rd, Register rn, Register rm) {
4150     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4151     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4152     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4153     VIXL_ASSERT(allow_macro_instructions_);
4154     VIXL_ASSERT(OutsideITBlock());
4155     MacroEmissionCheckScope guard(this);
4156     ITScope it_scope(this, &cond, guard);
4157     ssax(cond, rd, rn, rm);
4158   }
Ssax(Register rd,Register rn,Register rm)4159   void Ssax(Register rd, Register rn, Register rm) { Ssax(al, rd, rn, rm); }
4160 
Ssub16(Condition cond,Register rd,Register rn,Register rm)4161   void Ssub16(Condition cond, Register rd, Register rn, Register rm) {
4162     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4163     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4164     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4165     VIXL_ASSERT(allow_macro_instructions_);
4166     VIXL_ASSERT(OutsideITBlock());
4167     MacroEmissionCheckScope guard(this);
4168     ITScope it_scope(this, &cond, guard);
4169     ssub16(cond, rd, rn, rm);
4170   }
Ssub16(Register rd,Register rn,Register rm)4171   void Ssub16(Register rd, Register rn, Register rm) { Ssub16(al, rd, rn, rm); }
4172 
Ssub8(Condition cond,Register rd,Register rn,Register rm)4173   void Ssub8(Condition cond, Register rd, Register rn, Register rm) {
4174     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4175     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4176     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4177     VIXL_ASSERT(allow_macro_instructions_);
4178     VIXL_ASSERT(OutsideITBlock());
4179     MacroEmissionCheckScope guard(this);
4180     ITScope it_scope(this, &cond, guard);
4181     ssub8(cond, rd, rn, rm);
4182   }
Ssub8(Register rd,Register rn,Register rm)4183   void Ssub8(Register rd, Register rn, Register rm) { Ssub8(al, rd, rn, rm); }
4184 
Stl(Condition cond,Register rt,const MemOperand & operand)4185   void Stl(Condition cond, Register rt, const MemOperand& operand) {
4186     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4187     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4188     VIXL_ASSERT(allow_macro_instructions_);
4189     VIXL_ASSERT(OutsideITBlock());
4190     MacroEmissionCheckScope guard(this);
4191     ITScope it_scope(this, &cond, guard);
4192     stl(cond, rt, operand);
4193   }
Stl(Register rt,const MemOperand & operand)4194   void Stl(Register rt, const MemOperand& operand) { Stl(al, rt, operand); }
4195 
Stlb(Condition cond,Register rt,const MemOperand & operand)4196   void Stlb(Condition cond, Register rt, const MemOperand& operand) {
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     stlb(cond, rt, operand);
4204   }
Stlb(Register rt,const MemOperand & operand)4205   void Stlb(Register rt, const MemOperand& operand) { Stlb(al, rt, operand); }
4206 
Stlex(Condition cond,Register rd,Register rt,const MemOperand & operand)4207   void Stlex(Condition cond,
4208              Register rd,
4209              Register rt,
4210              const MemOperand& operand) {
4211     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4212     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4213     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4214     VIXL_ASSERT(allow_macro_instructions_);
4215     VIXL_ASSERT(OutsideITBlock());
4216     MacroEmissionCheckScope guard(this);
4217     ITScope it_scope(this, &cond, guard);
4218     stlex(cond, rd, rt, operand);
4219   }
Stlex(Register rd,Register rt,const MemOperand & operand)4220   void Stlex(Register rd, Register rt, const MemOperand& operand) {
4221     Stlex(al, rd, rt, operand);
4222   }
4223 
Stlexb(Condition cond,Register rd,Register rt,const MemOperand & operand)4224   void Stlexb(Condition cond,
4225               Register rd,
4226               Register rt,
4227               const MemOperand& operand) {
4228     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4229     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4230     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4231     VIXL_ASSERT(allow_macro_instructions_);
4232     VIXL_ASSERT(OutsideITBlock());
4233     MacroEmissionCheckScope guard(this);
4234     ITScope it_scope(this, &cond, guard);
4235     stlexb(cond, rd, rt, operand);
4236   }
Stlexb(Register rd,Register rt,const MemOperand & operand)4237   void Stlexb(Register rd, Register rt, const MemOperand& operand) {
4238     Stlexb(al, rd, rt, operand);
4239   }
4240 
Stlexd(Condition cond,Register rd,Register rt,Register rt2,const MemOperand & operand)4241   void Stlexd(Condition cond,
4242               Register rd,
4243               Register rt,
4244               Register rt2,
4245               const MemOperand& operand) {
4246     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4247     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4248     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
4249     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4250     VIXL_ASSERT(allow_macro_instructions_);
4251     VIXL_ASSERT(OutsideITBlock());
4252     MacroEmissionCheckScope guard(this);
4253     ITScope it_scope(this, &cond, guard);
4254     stlexd(cond, rd, rt, rt2, operand);
4255   }
Stlexd(Register rd,Register rt,Register rt2,const MemOperand & operand)4256   void Stlexd(Register rd,
4257               Register rt,
4258               Register rt2,
4259               const MemOperand& operand) {
4260     Stlexd(al, rd, rt, rt2, operand);
4261   }
4262 
Stlexh(Condition cond,Register rd,Register rt,const MemOperand & operand)4263   void Stlexh(Condition cond,
4264               Register rd,
4265               Register rt,
4266               const MemOperand& operand) {
4267     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4268     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4269     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4270     VIXL_ASSERT(allow_macro_instructions_);
4271     VIXL_ASSERT(OutsideITBlock());
4272     MacroEmissionCheckScope guard(this);
4273     ITScope it_scope(this, &cond, guard);
4274     stlexh(cond, rd, rt, operand);
4275   }
Stlexh(Register rd,Register rt,const MemOperand & operand)4276   void Stlexh(Register rd, Register rt, const MemOperand& operand) {
4277     Stlexh(al, rd, rt, operand);
4278   }
4279 
Stlh(Condition cond,Register rt,const MemOperand & operand)4280   void Stlh(Condition cond, Register rt, const MemOperand& operand) {
4281     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4282     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4283     VIXL_ASSERT(allow_macro_instructions_);
4284     VIXL_ASSERT(OutsideITBlock());
4285     MacroEmissionCheckScope guard(this);
4286     ITScope it_scope(this, &cond, guard);
4287     stlh(cond, rt, operand);
4288   }
Stlh(Register rt,const MemOperand & operand)4289   void Stlh(Register rt, const MemOperand& operand) { Stlh(al, rt, operand); }
4290 
Stm(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4291   void Stm(Condition cond,
4292            Register rn,
4293            WriteBack write_back,
4294            RegisterList registers) {
4295     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4296     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4297     VIXL_ASSERT(allow_macro_instructions_);
4298     VIXL_ASSERT(OutsideITBlock());
4299     MacroEmissionCheckScope guard(this);
4300     ITScope it_scope(this, &cond, guard);
4301     stm(cond, rn, write_back, registers);
4302   }
Stm(Register rn,WriteBack write_back,RegisterList registers)4303   void Stm(Register rn, WriteBack write_back, RegisterList registers) {
4304     Stm(al, rn, write_back, registers);
4305   }
4306 
Stmda(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4307   void Stmda(Condition cond,
4308              Register rn,
4309              WriteBack write_back,
4310              RegisterList registers) {
4311     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4312     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4313     VIXL_ASSERT(allow_macro_instructions_);
4314     VIXL_ASSERT(OutsideITBlock());
4315     MacroEmissionCheckScope guard(this);
4316     ITScope it_scope(this, &cond, guard);
4317     stmda(cond, rn, write_back, registers);
4318   }
Stmda(Register rn,WriteBack write_back,RegisterList registers)4319   void Stmda(Register rn, WriteBack write_back, RegisterList registers) {
4320     Stmda(al, rn, write_back, registers);
4321   }
4322 
Stmdb(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4323   void Stmdb(Condition cond,
4324              Register rn,
4325              WriteBack write_back,
4326              RegisterList registers) {
4327     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4328     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4329     VIXL_ASSERT(allow_macro_instructions_);
4330     VIXL_ASSERT(OutsideITBlock());
4331     MacroEmissionCheckScope guard(this);
4332     ITScope it_scope(this, &cond, guard);
4333     stmdb(cond, rn, write_back, registers);
4334   }
Stmdb(Register rn,WriteBack write_back,RegisterList registers)4335   void Stmdb(Register rn, WriteBack write_back, RegisterList registers) {
4336     Stmdb(al, rn, write_back, registers);
4337   }
4338 
Stmea(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4339   void Stmea(Condition cond,
4340              Register rn,
4341              WriteBack write_back,
4342              RegisterList registers) {
4343     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4344     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4345     VIXL_ASSERT(allow_macro_instructions_);
4346     VIXL_ASSERT(OutsideITBlock());
4347     MacroEmissionCheckScope guard(this);
4348     ITScope it_scope(this, &cond, guard);
4349     stmea(cond, rn, write_back, registers);
4350   }
Stmea(Register rn,WriteBack write_back,RegisterList registers)4351   void Stmea(Register rn, WriteBack write_back, RegisterList registers) {
4352     Stmea(al, rn, write_back, registers);
4353   }
4354 
Stmed(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4355   void Stmed(Condition cond,
4356              Register rn,
4357              WriteBack write_back,
4358              RegisterList registers) {
4359     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4360     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4361     VIXL_ASSERT(allow_macro_instructions_);
4362     VIXL_ASSERT(OutsideITBlock());
4363     MacroEmissionCheckScope guard(this);
4364     ITScope it_scope(this, &cond, guard);
4365     stmed(cond, rn, write_back, registers);
4366   }
Stmed(Register rn,WriteBack write_back,RegisterList registers)4367   void Stmed(Register rn, WriteBack write_back, RegisterList registers) {
4368     Stmed(al, rn, write_back, registers);
4369   }
4370 
Stmfa(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4371   void Stmfa(Condition cond,
4372              Register rn,
4373              WriteBack write_back,
4374              RegisterList registers) {
4375     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4376     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4377     VIXL_ASSERT(allow_macro_instructions_);
4378     VIXL_ASSERT(OutsideITBlock());
4379     MacroEmissionCheckScope guard(this);
4380     ITScope it_scope(this, &cond, guard);
4381     stmfa(cond, rn, write_back, registers);
4382   }
Stmfa(Register rn,WriteBack write_back,RegisterList registers)4383   void Stmfa(Register rn, WriteBack write_back, RegisterList registers) {
4384     Stmfa(al, rn, write_back, registers);
4385   }
4386 
Stmfd(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4387   void Stmfd(Condition cond,
4388              Register rn,
4389              WriteBack write_back,
4390              RegisterList registers) {
4391     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4392     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4393     VIXL_ASSERT(allow_macro_instructions_);
4394     VIXL_ASSERT(OutsideITBlock());
4395     MacroEmissionCheckScope guard(this);
4396     ITScope it_scope(this, &cond, guard);
4397     stmfd(cond, rn, write_back, registers);
4398   }
Stmfd(Register rn,WriteBack write_back,RegisterList registers)4399   void Stmfd(Register rn, WriteBack write_back, RegisterList registers) {
4400     Stmfd(al, rn, write_back, registers);
4401   }
4402 
Stmib(Condition cond,Register rn,WriteBack write_back,RegisterList registers)4403   void Stmib(Condition cond,
4404              Register rn,
4405              WriteBack write_back,
4406              RegisterList registers) {
4407     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4408     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4409     VIXL_ASSERT(allow_macro_instructions_);
4410     VIXL_ASSERT(OutsideITBlock());
4411     MacroEmissionCheckScope guard(this);
4412     ITScope it_scope(this, &cond, guard);
4413     stmib(cond, rn, write_back, registers);
4414   }
Stmib(Register rn,WriteBack write_back,RegisterList registers)4415   void Stmib(Register rn, WriteBack write_back, RegisterList registers) {
4416     Stmib(al, rn, write_back, registers);
4417   }
4418 
Str(Condition cond,Register rt,const MemOperand & operand)4419   void Str(Condition cond, Register rt, const MemOperand& operand) {
4420     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4421     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4422     VIXL_ASSERT(allow_macro_instructions_);
4423     VIXL_ASSERT(OutsideITBlock());
4424     MacroEmissionCheckScope guard(this);
4425     bool can_use_it =
4426         // STR{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
4427         (operand.IsImmediate() && rt.IsLow() &&
4428          operand.GetBaseRegister().IsLow() &&
4429          operand.IsOffsetImmediateWithinRange(0, 124, 4) &&
4430          (operand.GetAddrMode() == Offset)) ||
4431         // STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
4432         (operand.IsImmediate() && rt.IsLow() &&
4433          operand.GetBaseRegister().IsSP() &&
4434          operand.IsOffsetImmediateWithinRange(0, 1020, 4) &&
4435          (operand.GetAddrMode() == Offset)) ||
4436         // STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
4437         (operand.IsPlainRegister() && rt.IsLow() &&
4438          operand.GetBaseRegister().IsLow() &&
4439          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
4440          (operand.GetAddrMode() == Offset));
4441     ITScope it_scope(this, &cond, guard, can_use_it);
4442     str(cond, rt, operand);
4443   }
Str(Register rt,const MemOperand & operand)4444   void Str(Register rt, const MemOperand& operand) { Str(al, rt, operand); }
4445 
Strb(Condition cond,Register rt,const MemOperand & operand)4446   void Strb(Condition cond, Register rt, const MemOperand& operand) {
4447     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4448     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4449     VIXL_ASSERT(allow_macro_instructions_);
4450     VIXL_ASSERT(OutsideITBlock());
4451     MacroEmissionCheckScope guard(this);
4452     bool can_use_it =
4453         // STRB{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
4454         (operand.IsImmediate() && rt.IsLow() &&
4455          operand.GetBaseRegister().IsLow() &&
4456          operand.IsOffsetImmediateWithinRange(0, 31) &&
4457          (operand.GetAddrMode() == Offset)) ||
4458         // STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
4459         (operand.IsPlainRegister() && rt.IsLow() &&
4460          operand.GetBaseRegister().IsLow() &&
4461          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
4462          (operand.GetAddrMode() == Offset));
4463     ITScope it_scope(this, &cond, guard, can_use_it);
4464     strb(cond, rt, operand);
4465   }
Strb(Register rt,const MemOperand & operand)4466   void Strb(Register rt, const MemOperand& operand) { Strb(al, rt, operand); }
4467 
Strd(Condition cond,Register rt,Register rt2,const MemOperand & operand)4468   void Strd(Condition cond,
4469             Register rt,
4470             Register rt2,
4471             const MemOperand& operand) {
4472     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4473     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
4474     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4475     VIXL_ASSERT(allow_macro_instructions_);
4476     VIXL_ASSERT(OutsideITBlock());
4477     MacroEmissionCheckScope guard(this);
4478     ITScope it_scope(this, &cond, guard);
4479     strd(cond, rt, rt2, operand);
4480   }
Strd(Register rt,Register rt2,const MemOperand & operand)4481   void Strd(Register rt, Register rt2, const MemOperand& operand) {
4482     Strd(al, rt, rt2, operand);
4483   }
4484 
Strex(Condition cond,Register rd,Register rt,const MemOperand & operand)4485   void Strex(Condition cond,
4486              Register rd,
4487              Register rt,
4488              const MemOperand& operand) {
4489     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4490     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4491     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4492     VIXL_ASSERT(allow_macro_instructions_);
4493     VIXL_ASSERT(OutsideITBlock());
4494     MacroEmissionCheckScope guard(this);
4495     ITScope it_scope(this, &cond, guard);
4496     strex(cond, rd, rt, operand);
4497   }
Strex(Register rd,Register rt,const MemOperand & operand)4498   void Strex(Register rd, Register rt, const MemOperand& operand) {
4499     Strex(al, rd, rt, operand);
4500   }
4501 
Strexb(Condition cond,Register rd,Register rt,const MemOperand & operand)4502   void Strexb(Condition cond,
4503               Register rd,
4504               Register rt,
4505               const MemOperand& operand) {
4506     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4507     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4508     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4509     VIXL_ASSERT(allow_macro_instructions_);
4510     VIXL_ASSERT(OutsideITBlock());
4511     MacroEmissionCheckScope guard(this);
4512     ITScope it_scope(this, &cond, guard);
4513     strexb(cond, rd, rt, operand);
4514   }
Strexb(Register rd,Register rt,const MemOperand & operand)4515   void Strexb(Register rd, Register rt, const MemOperand& operand) {
4516     Strexb(al, rd, rt, operand);
4517   }
4518 
Strexd(Condition cond,Register rd,Register rt,Register rt2,const MemOperand & operand)4519   void Strexd(Condition cond,
4520               Register rd,
4521               Register rt,
4522               Register rt2,
4523               const MemOperand& operand) {
4524     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4525     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4526     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
4527     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4528     VIXL_ASSERT(allow_macro_instructions_);
4529     VIXL_ASSERT(OutsideITBlock());
4530     MacroEmissionCheckScope guard(this);
4531     ITScope it_scope(this, &cond, guard);
4532     strexd(cond, rd, rt, rt2, operand);
4533   }
Strexd(Register rd,Register rt,Register rt2,const MemOperand & operand)4534   void Strexd(Register rd,
4535               Register rt,
4536               Register rt2,
4537               const MemOperand& operand) {
4538     Strexd(al, rd, rt, rt2, operand);
4539   }
4540 
Strexh(Condition cond,Register rd,Register rt,const MemOperand & operand)4541   void Strexh(Condition cond,
4542               Register rd,
4543               Register rt,
4544               const MemOperand& operand) {
4545     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4546     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4547     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4548     VIXL_ASSERT(allow_macro_instructions_);
4549     VIXL_ASSERT(OutsideITBlock());
4550     MacroEmissionCheckScope guard(this);
4551     ITScope it_scope(this, &cond, guard);
4552     strexh(cond, rd, rt, operand);
4553   }
Strexh(Register rd,Register rt,const MemOperand & operand)4554   void Strexh(Register rd, Register rt, const MemOperand& operand) {
4555     Strexh(al, rd, rt, operand);
4556   }
4557 
Strh(Condition cond,Register rt,const MemOperand & operand)4558   void Strh(Condition cond, Register rt, const MemOperand& operand) {
4559     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4560     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4561     VIXL_ASSERT(allow_macro_instructions_);
4562     VIXL_ASSERT(OutsideITBlock());
4563     MacroEmissionCheckScope guard(this);
4564     bool can_use_it =
4565         // STRH{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
4566         (operand.IsImmediate() && rt.IsLow() &&
4567          operand.GetBaseRegister().IsLow() &&
4568          operand.IsOffsetImmediateWithinRange(0, 62, 2) &&
4569          (operand.GetAddrMode() == Offset)) ||
4570         // STRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
4571         (operand.IsPlainRegister() && rt.IsLow() &&
4572          operand.GetBaseRegister().IsLow() &&
4573          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
4574          (operand.GetAddrMode() == Offset));
4575     ITScope it_scope(this, &cond, guard, can_use_it);
4576     strh(cond, rt, operand);
4577   }
Strh(Register rt,const MemOperand & operand)4578   void Strh(Register rt, const MemOperand& operand) { Strh(al, rt, operand); }
4579 
Sub(Condition cond,Register rd,Register rn,const Operand & operand)4580   void Sub(Condition cond, Register rd, Register rn, const Operand& operand) {
4581     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4582     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4583     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4584     VIXL_ASSERT(allow_macro_instructions_);
4585     VIXL_ASSERT(OutsideITBlock());
4586     MacroEmissionCheckScope guard(this);
4587     if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) {
4588       uint32_t immediate = operand.GetImmediate();
4589       if (immediate == 0) {
4590         return;
4591       }
4592     }
4593     bool can_use_it =
4594         // SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
4595         (operand.IsImmediate() && (operand.GetImmediate() <= 7) && rn.IsLow() &&
4596          rd.IsLow()) ||
4597         // SUB<c>{<q>} {<Rdn>,} <Rdn>, #<imm8> ; T2
4598         (operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
4599          rd.IsLow() && rn.Is(rd)) ||
4600         // SUB<c>{<q>} <Rd>, <Rn>, <Rm>
4601         (operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
4602          operand.GetBaseRegister().IsLow());
4603     ITScope it_scope(this, &cond, guard, can_use_it);
4604     sub(cond, rd, rn, operand);
4605   }
Sub(Register rd,Register rn,const Operand & operand)4606   void Sub(Register rd, Register rn, const Operand& operand) {
4607     Sub(al, rd, rn, operand);
4608   }
Sub(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)4609   void Sub(FlagsUpdate flags,
4610            Condition cond,
4611            Register rd,
4612            Register rn,
4613            const Operand& operand) {
4614     switch (flags) {
4615       case LeaveFlags:
4616         Sub(cond, rd, rn, operand);
4617         break;
4618       case SetFlags:
4619         Subs(cond, rd, rn, operand);
4620         break;
4621       case DontCare:
4622         bool setflags_is_smaller =
4623             IsUsingT32() && cond.Is(al) &&
4624             ((operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
4625               operand.GetBaseRegister().IsLow()) ||
4626              (operand.IsImmediate() &&
4627               ((rd.IsLow() && rn.IsLow() && (operand.GetImmediate() < 8)) ||
4628                (rd.IsLow() && rn.Is(rd) && (operand.GetImmediate() < 256)))));
4629         if (setflags_is_smaller) {
4630           Subs(cond, rd, rn, operand);
4631         } else {
4632           bool changed_op_is_smaller =
4633               operand.IsImmediate() && (operand.GetSignedImmediate() < 0) &&
4634               ((rd.IsLow() && rn.IsLow() &&
4635                 (operand.GetSignedImmediate() >= -7)) ||
4636                (rd.IsLow() && rn.Is(rd) &&
4637                 (operand.GetSignedImmediate() >= -255)));
4638           if (changed_op_is_smaller) {
4639             Adds(cond, rd, rn, -operand.GetSignedImmediate());
4640           } else {
4641             Sub(cond, rd, rn, operand);
4642           }
4643         }
4644         break;
4645     }
4646   }
Sub(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)4647   void Sub(FlagsUpdate flags,
4648            Register rd,
4649            Register rn,
4650            const Operand& operand) {
4651     Sub(flags, al, rd, rn, operand);
4652   }
4653 
Subs(Condition cond,Register rd,Register rn,const Operand & operand)4654   void Subs(Condition cond, Register rd, Register rn, const Operand& operand) {
4655     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4656     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4657     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4658     VIXL_ASSERT(allow_macro_instructions_);
4659     VIXL_ASSERT(OutsideITBlock());
4660     MacroEmissionCheckScope guard(this);
4661     ITScope it_scope(this, &cond, guard);
4662     subs(cond, rd, rn, operand);
4663   }
Subs(Register rd,Register rn,const Operand & operand)4664   void Subs(Register rd, Register rn, const Operand& operand) {
4665     Subs(al, rd, rn, operand);
4666   }
4667 
Svc(Condition cond,uint32_t imm)4668   void Svc(Condition cond, uint32_t imm) {
4669     VIXL_ASSERT(allow_macro_instructions_);
4670     VIXL_ASSERT(OutsideITBlock());
4671     MacroEmissionCheckScope guard(this);
4672     ITScope it_scope(this, &cond, guard);
4673     svc(cond, imm);
4674   }
Svc(uint32_t imm)4675   void Svc(uint32_t imm) { Svc(al, imm); }
4676 
Sxtab(Condition cond,Register rd,Register rn,const Operand & operand)4677   void Sxtab(Condition cond, Register rd, Register rn, const Operand& operand) {
4678     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4679     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4680     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4681     VIXL_ASSERT(allow_macro_instructions_);
4682     VIXL_ASSERT(OutsideITBlock());
4683     MacroEmissionCheckScope guard(this);
4684     ITScope it_scope(this, &cond, guard);
4685     sxtab(cond, rd, rn, operand);
4686   }
Sxtab(Register rd,Register rn,const Operand & operand)4687   void Sxtab(Register rd, Register rn, const Operand& operand) {
4688     Sxtab(al, rd, rn, operand);
4689   }
4690 
Sxtab16(Condition cond,Register rd,Register rn,const Operand & operand)4691   void Sxtab16(Condition cond,
4692                Register rd,
4693                Register rn,
4694                const Operand& operand) {
4695     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4696     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4697     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4698     VIXL_ASSERT(allow_macro_instructions_);
4699     VIXL_ASSERT(OutsideITBlock());
4700     MacroEmissionCheckScope guard(this);
4701     ITScope it_scope(this, &cond, guard);
4702     sxtab16(cond, rd, rn, operand);
4703   }
Sxtab16(Register rd,Register rn,const Operand & operand)4704   void Sxtab16(Register rd, Register rn, const Operand& operand) {
4705     Sxtab16(al, rd, rn, operand);
4706   }
4707 
Sxtah(Condition cond,Register rd,Register rn,const Operand & operand)4708   void Sxtah(Condition cond, Register rd, Register rn, const Operand& operand) {
4709     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4710     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4711     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4712     VIXL_ASSERT(allow_macro_instructions_);
4713     VIXL_ASSERT(OutsideITBlock());
4714     MacroEmissionCheckScope guard(this);
4715     ITScope it_scope(this, &cond, guard);
4716     sxtah(cond, rd, rn, operand);
4717   }
Sxtah(Register rd,Register rn,const Operand & operand)4718   void Sxtah(Register rd, Register rn, const Operand& operand) {
4719     Sxtah(al, rd, rn, operand);
4720   }
4721 
Sxtb(Condition cond,Register rd,const Operand & operand)4722   void Sxtb(Condition cond, Register rd, const Operand& operand) {
4723     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4724     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4725     VIXL_ASSERT(allow_macro_instructions_);
4726     VIXL_ASSERT(OutsideITBlock());
4727     MacroEmissionCheckScope guard(this);
4728     ITScope it_scope(this, &cond, guard);
4729     sxtb(cond, rd, operand);
4730   }
Sxtb(Register rd,const Operand & operand)4731   void Sxtb(Register rd, const Operand& operand) { Sxtb(al, rd, operand); }
4732 
Sxtb16(Condition cond,Register rd,const Operand & operand)4733   void Sxtb16(Condition cond, Register rd, const Operand& operand) {
4734     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4735     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4736     VIXL_ASSERT(allow_macro_instructions_);
4737     VIXL_ASSERT(OutsideITBlock());
4738     MacroEmissionCheckScope guard(this);
4739     ITScope it_scope(this, &cond, guard);
4740     sxtb16(cond, rd, operand);
4741   }
Sxtb16(Register rd,const Operand & operand)4742   void Sxtb16(Register rd, const Operand& operand) { Sxtb16(al, rd, operand); }
4743 
Sxth(Condition cond,Register rd,const Operand & operand)4744   void Sxth(Condition cond, Register rd, const Operand& operand) {
4745     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4746     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4747     VIXL_ASSERT(allow_macro_instructions_);
4748     VIXL_ASSERT(OutsideITBlock());
4749     MacroEmissionCheckScope guard(this);
4750     ITScope it_scope(this, &cond, guard);
4751     sxth(cond, rd, operand);
4752   }
Sxth(Register rd,const Operand & operand)4753   void Sxth(Register rd, const Operand& operand) { Sxth(al, rd, operand); }
4754 
Teq(Condition cond,Register rn,const Operand & operand)4755   void Teq(Condition cond, Register rn, const Operand& operand) {
4756     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4757     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4758     VIXL_ASSERT(allow_macro_instructions_);
4759     VIXL_ASSERT(OutsideITBlock());
4760     MacroEmissionCheckScope guard(this);
4761     ITScope it_scope(this, &cond, guard);
4762     teq(cond, rn, operand);
4763   }
Teq(Register rn,const Operand & operand)4764   void Teq(Register rn, const Operand& operand) { Teq(al, rn, operand); }
4765 
Tst(Condition cond,Register rn,const Operand & operand)4766   void Tst(Condition cond, Register rn, const Operand& operand) {
4767     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4768     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4769     VIXL_ASSERT(allow_macro_instructions_);
4770     VIXL_ASSERT(OutsideITBlock());
4771     MacroEmissionCheckScope guard(this);
4772     bool can_use_it =
4773         // TST{<c>}{<q>} <Rn>, <Rm> ; T1
4774         operand.IsPlainRegister() && rn.IsLow() &&
4775         operand.GetBaseRegister().IsLow();
4776     ITScope it_scope(this, &cond, guard, can_use_it);
4777     tst(cond, rn, operand);
4778   }
Tst(Register rn,const Operand & operand)4779   void Tst(Register rn, const Operand& operand) { Tst(al, rn, operand); }
4780 
Uadd16(Condition cond,Register rd,Register rn,Register rm)4781   void Uadd16(Condition cond, Register rd, Register rn, Register rm) {
4782     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4783     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4784     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4785     VIXL_ASSERT(allow_macro_instructions_);
4786     VIXL_ASSERT(OutsideITBlock());
4787     MacroEmissionCheckScope guard(this);
4788     ITScope it_scope(this, &cond, guard);
4789     uadd16(cond, rd, rn, rm);
4790   }
Uadd16(Register rd,Register rn,Register rm)4791   void Uadd16(Register rd, Register rn, Register rm) { Uadd16(al, rd, rn, rm); }
4792 
Uadd8(Condition cond,Register rd,Register rn,Register rm)4793   void Uadd8(Condition cond, Register rd, Register rn, Register rm) {
4794     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4795     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4796     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4797     VIXL_ASSERT(allow_macro_instructions_);
4798     VIXL_ASSERT(OutsideITBlock());
4799     MacroEmissionCheckScope guard(this);
4800     ITScope it_scope(this, &cond, guard);
4801     uadd8(cond, rd, rn, rm);
4802   }
Uadd8(Register rd,Register rn,Register rm)4803   void Uadd8(Register rd, Register rn, Register rm) { Uadd8(al, rd, rn, rm); }
4804 
Uasx(Condition cond,Register rd,Register rn,Register rm)4805   void Uasx(Condition cond, Register rd, Register rn, Register rm) {
4806     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4807     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4808     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4809     VIXL_ASSERT(allow_macro_instructions_);
4810     VIXL_ASSERT(OutsideITBlock());
4811     MacroEmissionCheckScope guard(this);
4812     ITScope it_scope(this, &cond, guard);
4813     uasx(cond, rd, rn, rm);
4814   }
Uasx(Register rd,Register rn,Register rm)4815   void Uasx(Register rd, Register rn, Register rm) { Uasx(al, rd, rn, rm); }
4816 
Ubfx(Condition cond,Register rd,Register rn,uint32_t lsb,uint32_t width)4817   void Ubfx(
4818       Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
4819     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4820     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4821     VIXL_ASSERT(allow_macro_instructions_);
4822     VIXL_ASSERT(OutsideITBlock());
4823     MacroEmissionCheckScope guard(this);
4824     ITScope it_scope(this, &cond, guard);
4825     ubfx(cond, rd, rn, lsb, width);
4826   }
Ubfx(Register rd,Register rn,uint32_t lsb,uint32_t width)4827   void Ubfx(Register rd, Register rn, uint32_t lsb, uint32_t width) {
4828     Ubfx(al, rd, rn, lsb, width);
4829   }
4830 
Udf(Condition cond,uint32_t imm)4831   void Udf(Condition cond, uint32_t imm) {
4832     VIXL_ASSERT(allow_macro_instructions_);
4833     VIXL_ASSERT(OutsideITBlock());
4834     MacroEmissionCheckScope guard(this);
4835     ITScope it_scope(this, &cond, guard);
4836     udf(cond, imm);
4837   }
Udf(uint32_t imm)4838   void Udf(uint32_t imm) { Udf(al, imm); }
4839 
Udiv(Condition cond,Register rd,Register rn,Register rm)4840   void Udiv(Condition cond, Register rd, Register rn, Register rm) {
4841     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4842     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4843     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4844     VIXL_ASSERT(allow_macro_instructions_);
4845     VIXL_ASSERT(OutsideITBlock());
4846     MacroEmissionCheckScope guard(this);
4847     ITScope it_scope(this, &cond, guard);
4848     udiv(cond, rd, rn, rm);
4849   }
Udiv(Register rd,Register rn,Register rm)4850   void Udiv(Register rd, Register rn, Register rm) { Udiv(al, rd, rn, rm); }
4851 
Uhadd16(Condition cond,Register rd,Register rn,Register rm)4852   void Uhadd16(Condition cond, Register rd, Register rn, Register rm) {
4853     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4854     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4855     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4856     VIXL_ASSERT(allow_macro_instructions_);
4857     VIXL_ASSERT(OutsideITBlock());
4858     MacroEmissionCheckScope guard(this);
4859     ITScope it_scope(this, &cond, guard);
4860     uhadd16(cond, rd, rn, rm);
4861   }
Uhadd16(Register rd,Register rn,Register rm)4862   void Uhadd16(Register rd, Register rn, Register rm) {
4863     Uhadd16(al, rd, rn, rm);
4864   }
4865 
Uhadd8(Condition cond,Register rd,Register rn,Register rm)4866   void Uhadd8(Condition cond, Register rd, Register rn, Register rm) {
4867     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4868     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4869     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4870     VIXL_ASSERT(allow_macro_instructions_);
4871     VIXL_ASSERT(OutsideITBlock());
4872     MacroEmissionCheckScope guard(this);
4873     ITScope it_scope(this, &cond, guard);
4874     uhadd8(cond, rd, rn, rm);
4875   }
Uhadd8(Register rd,Register rn,Register rm)4876   void Uhadd8(Register rd, Register rn, Register rm) { Uhadd8(al, rd, rn, rm); }
4877 
Uhasx(Condition cond,Register rd,Register rn,Register rm)4878   void Uhasx(Condition cond, Register rd, Register rn, Register rm) {
4879     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4880     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4881     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4882     VIXL_ASSERT(allow_macro_instructions_);
4883     VIXL_ASSERT(OutsideITBlock());
4884     MacroEmissionCheckScope guard(this);
4885     ITScope it_scope(this, &cond, guard);
4886     uhasx(cond, rd, rn, rm);
4887   }
Uhasx(Register rd,Register rn,Register rm)4888   void Uhasx(Register rd, Register rn, Register rm) { Uhasx(al, rd, rn, rm); }
4889 
Uhsax(Condition cond,Register rd,Register rn,Register rm)4890   void Uhsax(Condition cond, Register rd, Register rn, Register rm) {
4891     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4892     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4893     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4894     VIXL_ASSERT(allow_macro_instructions_);
4895     VIXL_ASSERT(OutsideITBlock());
4896     MacroEmissionCheckScope guard(this);
4897     ITScope it_scope(this, &cond, guard);
4898     uhsax(cond, rd, rn, rm);
4899   }
Uhsax(Register rd,Register rn,Register rm)4900   void Uhsax(Register rd, Register rn, Register rm) { Uhsax(al, rd, rn, rm); }
4901 
Uhsub16(Condition cond,Register rd,Register rn,Register rm)4902   void Uhsub16(Condition cond, Register rd, Register rn, Register rm) {
4903     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4904     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4905     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4906     VIXL_ASSERT(allow_macro_instructions_);
4907     VIXL_ASSERT(OutsideITBlock());
4908     MacroEmissionCheckScope guard(this);
4909     ITScope it_scope(this, &cond, guard);
4910     uhsub16(cond, rd, rn, rm);
4911   }
Uhsub16(Register rd,Register rn,Register rm)4912   void Uhsub16(Register rd, Register rn, Register rm) {
4913     Uhsub16(al, rd, rn, rm);
4914   }
4915 
Uhsub8(Condition cond,Register rd,Register rn,Register rm)4916   void Uhsub8(Condition cond, Register rd, Register rn, Register rm) {
4917     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4918     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4919     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4920     VIXL_ASSERT(allow_macro_instructions_);
4921     VIXL_ASSERT(OutsideITBlock());
4922     MacroEmissionCheckScope guard(this);
4923     ITScope it_scope(this, &cond, guard);
4924     uhsub8(cond, rd, rn, rm);
4925   }
Uhsub8(Register rd,Register rn,Register rm)4926   void Uhsub8(Register rd, Register rn, Register rm) { Uhsub8(al, rd, rn, rm); }
4927 
Umaal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4928   void Umaal(
4929       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4930     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4931     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4932     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4933     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4934     VIXL_ASSERT(allow_macro_instructions_);
4935     VIXL_ASSERT(OutsideITBlock());
4936     MacroEmissionCheckScope guard(this);
4937     ITScope it_scope(this, &cond, guard);
4938     umaal(cond, rdlo, rdhi, rn, rm);
4939   }
Umaal(Register rdlo,Register rdhi,Register rn,Register rm)4940   void Umaal(Register rdlo, Register rdhi, Register rn, Register rm) {
4941     Umaal(al, rdlo, rdhi, rn, rm);
4942   }
4943 
Umlal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4944   void Umlal(
4945       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4946     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4947     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4948     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4949     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4950     VIXL_ASSERT(allow_macro_instructions_);
4951     VIXL_ASSERT(OutsideITBlock());
4952     MacroEmissionCheckScope guard(this);
4953     ITScope it_scope(this, &cond, guard);
4954     umlal(cond, rdlo, rdhi, rn, rm);
4955   }
Umlal(Register rdlo,Register rdhi,Register rn,Register rm)4956   void Umlal(Register rdlo, Register rdhi, Register rn, Register rm) {
4957     Umlal(al, rdlo, rdhi, rn, rm);
4958   }
Umlal(FlagsUpdate flags,Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4959   void Umlal(FlagsUpdate flags,
4960              Condition cond,
4961              Register rdlo,
4962              Register rdhi,
4963              Register rn,
4964              Register rm) {
4965     switch (flags) {
4966       case LeaveFlags:
4967         Umlal(cond, rdlo, rdhi, rn, rm);
4968         break;
4969       case SetFlags:
4970         Umlals(cond, rdlo, rdhi, rn, rm);
4971         break;
4972       case DontCare:
4973         Umlal(cond, rdlo, rdhi, rn, rm);
4974         break;
4975     }
4976   }
Umlal(FlagsUpdate flags,Register rdlo,Register rdhi,Register rn,Register rm)4977   void Umlal(FlagsUpdate flags,
4978              Register rdlo,
4979              Register rdhi,
4980              Register rn,
4981              Register rm) {
4982     Umlal(flags, al, rdlo, rdhi, rn, rm);
4983   }
4984 
Umlals(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4985   void Umlals(
4986       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4987     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4988     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4989     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4990     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4991     VIXL_ASSERT(allow_macro_instructions_);
4992     VIXL_ASSERT(OutsideITBlock());
4993     MacroEmissionCheckScope guard(this);
4994     ITScope it_scope(this, &cond, guard);
4995     umlals(cond, rdlo, rdhi, rn, rm);
4996   }
Umlals(Register rdlo,Register rdhi,Register rn,Register rm)4997   void Umlals(Register rdlo, Register rdhi, Register rn, Register rm) {
4998     Umlals(al, rdlo, rdhi, rn, rm);
4999   }
5000 
Umull(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)5001   void Umull(
5002       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
5003     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
5004     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
5005     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5006     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5007     VIXL_ASSERT(allow_macro_instructions_);
5008     VIXL_ASSERT(OutsideITBlock());
5009     MacroEmissionCheckScope guard(this);
5010     ITScope it_scope(this, &cond, guard);
5011     umull(cond, rdlo, rdhi, rn, rm);
5012   }
Umull(Register rdlo,Register rdhi,Register rn,Register rm)5013   void Umull(Register rdlo, Register rdhi, Register rn, Register rm) {
5014     Umull(al, rdlo, rdhi, rn, rm);
5015   }
Umull(FlagsUpdate flags,Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)5016   void Umull(FlagsUpdate flags,
5017              Condition cond,
5018              Register rdlo,
5019              Register rdhi,
5020              Register rn,
5021              Register rm) {
5022     switch (flags) {
5023       case LeaveFlags:
5024         Umull(cond, rdlo, rdhi, rn, rm);
5025         break;
5026       case SetFlags:
5027         Umulls(cond, rdlo, rdhi, rn, rm);
5028         break;
5029       case DontCare:
5030         Umull(cond, rdlo, rdhi, rn, rm);
5031         break;
5032     }
5033   }
Umull(FlagsUpdate flags,Register rdlo,Register rdhi,Register rn,Register rm)5034   void Umull(FlagsUpdate flags,
5035              Register rdlo,
5036              Register rdhi,
5037              Register rn,
5038              Register rm) {
5039     Umull(flags, al, rdlo, rdhi, rn, rm);
5040   }
5041 
Umulls(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)5042   void Umulls(
5043       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
5044     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
5045     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
5046     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5047     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5048     VIXL_ASSERT(allow_macro_instructions_);
5049     VIXL_ASSERT(OutsideITBlock());
5050     MacroEmissionCheckScope guard(this);
5051     ITScope it_scope(this, &cond, guard);
5052     umulls(cond, rdlo, rdhi, rn, rm);
5053   }
Umulls(Register rdlo,Register rdhi,Register rn,Register rm)5054   void Umulls(Register rdlo, Register rdhi, Register rn, Register rm) {
5055     Umulls(al, rdlo, rdhi, rn, rm);
5056   }
5057 
Uqadd16(Condition cond,Register rd,Register rn,Register rm)5058   void Uqadd16(Condition cond, Register rd, Register rn, Register rm) {
5059     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5060     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5061     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5062     VIXL_ASSERT(allow_macro_instructions_);
5063     VIXL_ASSERT(OutsideITBlock());
5064     MacroEmissionCheckScope guard(this);
5065     ITScope it_scope(this, &cond, guard);
5066     uqadd16(cond, rd, rn, rm);
5067   }
Uqadd16(Register rd,Register rn,Register rm)5068   void Uqadd16(Register rd, Register rn, Register rm) {
5069     Uqadd16(al, rd, rn, rm);
5070   }
5071 
Uqadd8(Condition cond,Register rd,Register rn,Register rm)5072   void Uqadd8(Condition cond, Register rd, Register rn, Register rm) {
5073     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5074     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5075     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5076     VIXL_ASSERT(allow_macro_instructions_);
5077     VIXL_ASSERT(OutsideITBlock());
5078     MacroEmissionCheckScope guard(this);
5079     ITScope it_scope(this, &cond, guard);
5080     uqadd8(cond, rd, rn, rm);
5081   }
Uqadd8(Register rd,Register rn,Register rm)5082   void Uqadd8(Register rd, Register rn, Register rm) { Uqadd8(al, rd, rn, rm); }
5083 
Uqasx(Condition cond,Register rd,Register rn,Register rm)5084   void Uqasx(Condition cond, Register rd, Register rn, Register rm) {
5085     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5086     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5087     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5088     VIXL_ASSERT(allow_macro_instructions_);
5089     VIXL_ASSERT(OutsideITBlock());
5090     MacroEmissionCheckScope guard(this);
5091     ITScope it_scope(this, &cond, guard);
5092     uqasx(cond, rd, rn, rm);
5093   }
Uqasx(Register rd,Register rn,Register rm)5094   void Uqasx(Register rd, Register rn, Register rm) { Uqasx(al, rd, rn, rm); }
5095 
Uqsax(Condition cond,Register rd,Register rn,Register rm)5096   void Uqsax(Condition cond, Register rd, Register rn, Register rm) {
5097     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5098     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5099     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5100     VIXL_ASSERT(allow_macro_instructions_);
5101     VIXL_ASSERT(OutsideITBlock());
5102     MacroEmissionCheckScope guard(this);
5103     ITScope it_scope(this, &cond, guard);
5104     uqsax(cond, rd, rn, rm);
5105   }
Uqsax(Register rd,Register rn,Register rm)5106   void Uqsax(Register rd, Register rn, Register rm) { Uqsax(al, rd, rn, rm); }
5107 
Uqsub16(Condition cond,Register rd,Register rn,Register rm)5108   void Uqsub16(Condition cond, Register rd, Register rn, Register rm) {
5109     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5110     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5111     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5112     VIXL_ASSERT(allow_macro_instructions_);
5113     VIXL_ASSERT(OutsideITBlock());
5114     MacroEmissionCheckScope guard(this);
5115     ITScope it_scope(this, &cond, guard);
5116     uqsub16(cond, rd, rn, rm);
5117   }
Uqsub16(Register rd,Register rn,Register rm)5118   void Uqsub16(Register rd, Register rn, Register rm) {
5119     Uqsub16(al, rd, rn, rm);
5120   }
5121 
Uqsub8(Condition cond,Register rd,Register rn,Register rm)5122   void Uqsub8(Condition cond, Register rd, Register rn, Register rm) {
5123     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5124     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5125     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5126     VIXL_ASSERT(allow_macro_instructions_);
5127     VIXL_ASSERT(OutsideITBlock());
5128     MacroEmissionCheckScope guard(this);
5129     ITScope it_scope(this, &cond, guard);
5130     uqsub8(cond, rd, rn, rm);
5131   }
Uqsub8(Register rd,Register rn,Register rm)5132   void Uqsub8(Register rd, Register rn, Register rm) { Uqsub8(al, rd, rn, rm); }
5133 
Usad8(Condition cond,Register rd,Register rn,Register rm)5134   void Usad8(Condition cond, Register rd, Register rn, Register rm) {
5135     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5136     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5137     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5138     VIXL_ASSERT(allow_macro_instructions_);
5139     VIXL_ASSERT(OutsideITBlock());
5140     MacroEmissionCheckScope guard(this);
5141     ITScope it_scope(this, &cond, guard);
5142     usad8(cond, rd, rn, rm);
5143   }
Usad8(Register rd,Register rn,Register rm)5144   void Usad8(Register rd, Register rn, Register rm) { Usad8(al, rd, rn, rm); }
5145 
Usada8(Condition cond,Register rd,Register rn,Register rm,Register ra)5146   void Usada8(
5147       Condition cond, Register rd, Register rn, Register rm, Register ra) {
5148     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5149     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5150     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5151     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
5152     VIXL_ASSERT(allow_macro_instructions_);
5153     VIXL_ASSERT(OutsideITBlock());
5154     MacroEmissionCheckScope guard(this);
5155     ITScope it_scope(this, &cond, guard);
5156     usada8(cond, rd, rn, rm, ra);
5157   }
Usada8(Register rd,Register rn,Register rm,Register ra)5158   void Usada8(Register rd, Register rn, Register rm, Register ra) {
5159     Usada8(al, rd, rn, rm, ra);
5160   }
5161 
Usat(Condition cond,Register rd,uint32_t imm,const Operand & operand)5162   void Usat(Condition cond, Register rd, uint32_t imm, const Operand& operand) {
5163     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5164     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5165     VIXL_ASSERT(allow_macro_instructions_);
5166     VIXL_ASSERT(OutsideITBlock());
5167     MacroEmissionCheckScope guard(this);
5168     ITScope it_scope(this, &cond, guard);
5169     usat(cond, rd, imm, operand);
5170   }
Usat(Register rd,uint32_t imm,const Operand & operand)5171   void Usat(Register rd, uint32_t imm, const Operand& operand) {
5172     Usat(al, rd, imm, operand);
5173   }
5174 
Usat16(Condition cond,Register rd,uint32_t imm,Register rn)5175   void Usat16(Condition cond, Register rd, uint32_t imm, Register rn) {
5176     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5177     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5178     VIXL_ASSERT(allow_macro_instructions_);
5179     VIXL_ASSERT(OutsideITBlock());
5180     MacroEmissionCheckScope guard(this);
5181     ITScope it_scope(this, &cond, guard);
5182     usat16(cond, rd, imm, rn);
5183   }
Usat16(Register rd,uint32_t imm,Register rn)5184   void Usat16(Register rd, uint32_t imm, Register rn) {
5185     Usat16(al, rd, imm, rn);
5186   }
5187 
Usax(Condition cond,Register rd,Register rn,Register rm)5188   void Usax(Condition cond, Register rd, Register rn, Register rm) {
5189     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5190     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5191     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5192     VIXL_ASSERT(allow_macro_instructions_);
5193     VIXL_ASSERT(OutsideITBlock());
5194     MacroEmissionCheckScope guard(this);
5195     ITScope it_scope(this, &cond, guard);
5196     usax(cond, rd, rn, rm);
5197   }
Usax(Register rd,Register rn,Register rm)5198   void Usax(Register rd, Register rn, Register rm) { Usax(al, rd, rn, rm); }
5199 
Usub16(Condition cond,Register rd,Register rn,Register rm)5200   void Usub16(Condition cond, Register rd, Register rn, Register rm) {
5201     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5202     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5203     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5204     VIXL_ASSERT(allow_macro_instructions_);
5205     VIXL_ASSERT(OutsideITBlock());
5206     MacroEmissionCheckScope guard(this);
5207     ITScope it_scope(this, &cond, guard);
5208     usub16(cond, rd, rn, rm);
5209   }
Usub16(Register rd,Register rn,Register rm)5210   void Usub16(Register rd, Register rn, Register rm) { Usub16(al, rd, rn, rm); }
5211 
Usub8(Condition cond,Register rd,Register rn,Register rm)5212   void Usub8(Condition cond, Register rd, Register rn, Register rm) {
5213     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5214     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5215     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5216     VIXL_ASSERT(allow_macro_instructions_);
5217     VIXL_ASSERT(OutsideITBlock());
5218     MacroEmissionCheckScope guard(this);
5219     ITScope it_scope(this, &cond, guard);
5220     usub8(cond, rd, rn, rm);
5221   }
Usub8(Register rd,Register rn,Register rm)5222   void Usub8(Register rd, Register rn, Register rm) { Usub8(al, rd, rn, rm); }
5223 
Uxtab(Condition cond,Register rd,Register rn,const Operand & operand)5224   void Uxtab(Condition cond, Register rd, Register rn, const Operand& operand) {
5225     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5226     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5227     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5228     VIXL_ASSERT(allow_macro_instructions_);
5229     VIXL_ASSERT(OutsideITBlock());
5230     MacroEmissionCheckScope guard(this);
5231     ITScope it_scope(this, &cond, guard);
5232     uxtab(cond, rd, rn, operand);
5233   }
Uxtab(Register rd,Register rn,const Operand & operand)5234   void Uxtab(Register rd, Register rn, const Operand& operand) {
5235     Uxtab(al, rd, rn, operand);
5236   }
5237 
Uxtab16(Condition cond,Register rd,Register rn,const Operand & operand)5238   void Uxtab16(Condition cond,
5239                Register rd,
5240                Register rn,
5241                const Operand& operand) {
5242     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5243     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5244     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5245     VIXL_ASSERT(allow_macro_instructions_);
5246     VIXL_ASSERT(OutsideITBlock());
5247     MacroEmissionCheckScope guard(this);
5248     ITScope it_scope(this, &cond, guard);
5249     uxtab16(cond, rd, rn, operand);
5250   }
Uxtab16(Register rd,Register rn,const Operand & operand)5251   void Uxtab16(Register rd, Register rn, const Operand& operand) {
5252     Uxtab16(al, rd, rn, operand);
5253   }
5254 
Uxtah(Condition cond,Register rd,Register rn,const Operand & operand)5255   void Uxtah(Condition cond, Register rd, Register rn, const Operand& operand) {
5256     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5257     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5258     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5259     VIXL_ASSERT(allow_macro_instructions_);
5260     VIXL_ASSERT(OutsideITBlock());
5261     MacroEmissionCheckScope guard(this);
5262     ITScope it_scope(this, &cond, guard);
5263     uxtah(cond, rd, rn, operand);
5264   }
Uxtah(Register rd,Register rn,const Operand & operand)5265   void Uxtah(Register rd, Register rn, const Operand& operand) {
5266     Uxtah(al, rd, rn, operand);
5267   }
5268 
Uxtb(Condition cond,Register rd,const Operand & operand)5269   void Uxtb(Condition cond, Register rd, const Operand& operand) {
5270     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5271     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5272     VIXL_ASSERT(allow_macro_instructions_);
5273     VIXL_ASSERT(OutsideITBlock());
5274     MacroEmissionCheckScope guard(this);
5275     ITScope it_scope(this, &cond, guard);
5276     uxtb(cond, rd, operand);
5277   }
Uxtb(Register rd,const Operand & operand)5278   void Uxtb(Register rd, const Operand& operand) { Uxtb(al, rd, operand); }
5279 
Uxtb16(Condition cond,Register rd,const Operand & operand)5280   void Uxtb16(Condition cond, Register rd, const Operand& operand) {
5281     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5282     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5283     VIXL_ASSERT(allow_macro_instructions_);
5284     VIXL_ASSERT(OutsideITBlock());
5285     MacroEmissionCheckScope guard(this);
5286     ITScope it_scope(this, &cond, guard);
5287     uxtb16(cond, rd, operand);
5288   }
Uxtb16(Register rd,const Operand & operand)5289   void Uxtb16(Register rd, const Operand& operand) { Uxtb16(al, rd, operand); }
5290 
Uxth(Condition cond,Register rd,const Operand & operand)5291   void Uxth(Condition cond, Register rd, const Operand& operand) {
5292     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5293     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5294     VIXL_ASSERT(allow_macro_instructions_);
5295     VIXL_ASSERT(OutsideITBlock());
5296     MacroEmissionCheckScope guard(this);
5297     ITScope it_scope(this, &cond, guard);
5298     uxth(cond, rd, operand);
5299   }
Uxth(Register rd,const Operand & operand)5300   void Uxth(Register rd, const Operand& operand) { Uxth(al, rd, operand); }
5301 
Vaba(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5302   void Vaba(
5303       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)5313   void Vaba(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5314     Vaba(al, dt, rd, rn, rm);
5315   }
5316 
Vaba(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5317   void Vaba(
5318       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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     vaba(cond, dt, rd, rn, rm);
5327   }
Vaba(DataType dt,QRegister rd,QRegister rn,QRegister rm)5328   void Vaba(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5329     Vaba(al, dt, rd, rn, rm);
5330   }
5331 
Vabal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5332   void Vabal(
5333       Condition cond, DataType dt, QRegister 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     vabal(cond, dt, rd, rn, rm);
5342   }
Vabal(DataType dt,QRegister rd,DRegister rn,DRegister rm)5343   void Vabal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5344     Vabal(al, dt, rd, rn, rm);
5345   }
5346 
Vabd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5347   void Vabd(
5348       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)5358   void Vabd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5359     Vabd(al, dt, rd, rn, rm);
5360   }
5361 
Vabd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5362   void Vabd(
5363       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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     vabd(cond, dt, rd, rn, rm);
5372   }
Vabd(DataType dt,QRegister rd,QRegister rn,QRegister rm)5373   void Vabd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5374     Vabd(al, dt, rd, rn, rm);
5375   }
5376 
Vabdl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5377   void Vabdl(
5378       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5379     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5380     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5381     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5382     VIXL_ASSERT(allow_macro_instructions_);
5383     VIXL_ASSERT(OutsideITBlock());
5384     MacroEmissionCheckScope guard(this);
5385     ITScope it_scope(this, &cond, guard);
5386     vabdl(cond, dt, rd, rn, rm);
5387   }
Vabdl(DataType dt,QRegister rd,DRegister rn,DRegister rm)5388   void Vabdl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5389     Vabdl(al, dt, rd, rn, rm);
5390   }
5391 
Vabs(Condition cond,DataType dt,DRegister rd,DRegister rm)5392   void Vabs(Condition cond, DataType dt, DRegister rd, DRegister rm) {
5393     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5394     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5395     VIXL_ASSERT(allow_macro_instructions_);
5396     VIXL_ASSERT(OutsideITBlock());
5397     MacroEmissionCheckScope guard(this);
5398     ITScope it_scope(this, &cond, guard);
5399     vabs(cond, dt, rd, rm);
5400   }
Vabs(DataType dt,DRegister rd,DRegister rm)5401   void Vabs(DataType dt, DRegister rd, DRegister rm) { Vabs(al, dt, rd, rm); }
5402 
Vabs(Condition cond,DataType dt,QRegister rd,QRegister rm)5403   void Vabs(Condition cond, DataType dt, QRegister rd, QRegister rm) {
5404     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5405     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5406     VIXL_ASSERT(allow_macro_instructions_);
5407     VIXL_ASSERT(OutsideITBlock());
5408     MacroEmissionCheckScope guard(this);
5409     ITScope it_scope(this, &cond, guard);
5410     vabs(cond, dt, rd, rm);
5411   }
Vabs(DataType dt,QRegister rd,QRegister rm)5412   void Vabs(DataType dt, QRegister rd, QRegister rm) { Vabs(al, dt, rd, rm); }
5413 
Vabs(Condition cond,DataType dt,SRegister rd,SRegister rm)5414   void Vabs(Condition cond, DataType dt, SRegister rd, SRegister rm) {
5415     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5416     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5417     VIXL_ASSERT(allow_macro_instructions_);
5418     VIXL_ASSERT(OutsideITBlock());
5419     MacroEmissionCheckScope guard(this);
5420     ITScope it_scope(this, &cond, guard);
5421     vabs(cond, dt, rd, rm);
5422   }
Vabs(DataType dt,SRegister rd,SRegister rm)5423   void Vabs(DataType dt, SRegister rd, SRegister rm) { Vabs(al, dt, rd, rm); }
5424 
Vacge(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5425   void Vacge(
5426       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)5436   void Vacge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5437     Vacge(al, dt, rd, rn, rm);
5438   }
5439 
Vacge(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5440   void Vacge(
5441       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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     vacge(cond, dt, rd, rn, rm);
5450   }
Vacge(DataType dt,QRegister rd,QRegister rn,QRegister rm)5451   void Vacge(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5452     Vacge(al, dt, rd, rn, rm);
5453   }
5454 
Vacgt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5455   void Vacgt(
5456       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)5466   void Vacgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5467     Vacgt(al, dt, rd, rn, rm);
5468   }
5469 
Vacgt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5470   void Vacgt(
5471       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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     vacgt(cond, dt, rd, rn, rm);
5480   }
Vacgt(DataType dt,QRegister rd,QRegister rn,QRegister rm)5481   void Vacgt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5482     Vacgt(al, dt, rd, rn, rm);
5483   }
5484 
Vacle(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5485   void Vacle(
5486       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5487     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5488     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5489     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5490     VIXL_ASSERT(allow_macro_instructions_);
5491     VIXL_ASSERT(OutsideITBlock());
5492     MacroEmissionCheckScope guard(this);
5493     ITScope it_scope(this, &cond, guard);
5494     vacle(cond, dt, rd, rn, rm);
5495   }
Vacle(DataType dt,DRegister rd,DRegister rn,DRegister rm)5496   void Vacle(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5497     Vacle(al, dt, rd, rn, rm);
5498   }
5499 
Vacle(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5500   void Vacle(
5501       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5502     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5503     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5504     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5505     VIXL_ASSERT(allow_macro_instructions_);
5506     VIXL_ASSERT(OutsideITBlock());
5507     MacroEmissionCheckScope guard(this);
5508     ITScope it_scope(this, &cond, guard);
5509     vacle(cond, dt, rd, rn, rm);
5510   }
Vacle(DataType dt,QRegister rd,QRegister rn,QRegister rm)5511   void Vacle(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5512     Vacle(al, dt, rd, rn, rm);
5513   }
5514 
Vaclt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5515   void Vaclt(
5516       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5517     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5518     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5519     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5520     VIXL_ASSERT(allow_macro_instructions_);
5521     VIXL_ASSERT(OutsideITBlock());
5522     MacroEmissionCheckScope guard(this);
5523     ITScope it_scope(this, &cond, guard);
5524     vaclt(cond, dt, rd, rn, rm);
5525   }
Vaclt(DataType dt,DRegister rd,DRegister rn,DRegister rm)5526   void Vaclt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5527     Vaclt(al, dt, rd, rn, rm);
5528   }
5529 
Vaclt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5530   void Vaclt(
5531       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5532     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5533     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5534     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5535     VIXL_ASSERT(allow_macro_instructions_);
5536     VIXL_ASSERT(OutsideITBlock());
5537     MacroEmissionCheckScope guard(this);
5538     ITScope it_scope(this, &cond, guard);
5539     vaclt(cond, dt, rd, rn, rm);
5540   }
Vaclt(DataType dt,QRegister rd,QRegister rn,QRegister rm)5541   void Vaclt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5542     Vaclt(al, dt, rd, rn, rm);
5543   }
5544 
Vadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5545   void Vadd(
5546       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5547     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5548     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5549     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5550     VIXL_ASSERT(allow_macro_instructions_);
5551     VIXL_ASSERT(OutsideITBlock());
5552     MacroEmissionCheckScope guard(this);
5553     ITScope it_scope(this, &cond, guard);
5554     vadd(cond, dt, rd, rn, rm);
5555   }
Vadd(DataType dt,DRegister rd,DRegister rn,DRegister rm)5556   void Vadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5557     Vadd(al, dt, rd, rn, rm);
5558   }
5559 
Vadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5560   void Vadd(
5561       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5562     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5563     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5564     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5565     VIXL_ASSERT(allow_macro_instructions_);
5566     VIXL_ASSERT(OutsideITBlock());
5567     MacroEmissionCheckScope guard(this);
5568     ITScope it_scope(this, &cond, guard);
5569     vadd(cond, dt, rd, rn, rm);
5570   }
Vadd(DataType dt,QRegister rd,QRegister rn,QRegister rm)5571   void Vadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5572     Vadd(al, dt, rd, rn, rm);
5573   }
5574 
Vadd(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)5575   void Vadd(
5576       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister 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     vadd(cond, dt, rd, rn, rm);
5585   }
Vadd(DataType dt,SRegister rd,SRegister rn,SRegister rm)5586   void Vadd(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5587     Vadd(al, dt, rd, rn, rm);
5588   }
5589 
Vaddhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)5590   void Vaddhn(
5591       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
5592     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5593     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5594     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5595     VIXL_ASSERT(allow_macro_instructions_);
5596     VIXL_ASSERT(OutsideITBlock());
5597     MacroEmissionCheckScope guard(this);
5598     ITScope it_scope(this, &cond, guard);
5599     vaddhn(cond, dt, rd, rn, rm);
5600   }
Vaddhn(DataType dt,DRegister rd,QRegister rn,QRegister rm)5601   void Vaddhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
5602     Vaddhn(al, dt, rd, rn, rm);
5603   }
5604 
Vaddl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)5605   void Vaddl(
5606       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5607     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5608     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5609     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5610     VIXL_ASSERT(allow_macro_instructions_);
5611     VIXL_ASSERT(OutsideITBlock());
5612     MacroEmissionCheckScope guard(this);
5613     ITScope it_scope(this, &cond, guard);
5614     vaddl(cond, dt, rd, rn, rm);
5615   }
Vaddl(DataType dt,QRegister rd,DRegister rn,DRegister rm)5616   void Vaddl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5617     Vaddl(al, dt, rd, rn, rm);
5618   }
5619 
Vaddw(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegister rm)5620   void Vaddw(
5621       Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
5622     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5623     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5624     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5625     VIXL_ASSERT(allow_macro_instructions_);
5626     VIXL_ASSERT(OutsideITBlock());
5627     MacroEmissionCheckScope guard(this);
5628     ITScope it_scope(this, &cond, guard);
5629     vaddw(cond, dt, rd, rn, rm);
5630   }
Vaddw(DataType dt,QRegister rd,QRegister rn,DRegister rm)5631   void Vaddw(DataType dt, QRegister rd, QRegister rn, DRegister rm) {
5632     Vaddw(al, dt, rd, rn, rm);
5633   }
5634 
Vand(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5635   void Vand(Condition cond,
5636             DataType dt,
5637             DRegister rd,
5638             DRegister rn,
5639             const DOperand& operand) {
5640     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5641     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5642     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5643     VIXL_ASSERT(allow_macro_instructions_);
5644     VIXL_ASSERT(OutsideITBlock());
5645     MacroEmissionCheckScope guard(this);
5646     ITScope it_scope(this, &cond, guard);
5647     vand(cond, dt, rd, rn, operand);
5648   }
Vand(DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5649   void Vand(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
5650     Vand(al, dt, rd, rn, operand);
5651   }
5652 
Vand(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5653   void Vand(Condition cond,
5654             DataType dt,
5655             QRegister rd,
5656             QRegister rn,
5657             const QOperand& operand) {
5658     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5659     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5660     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5661     VIXL_ASSERT(allow_macro_instructions_);
5662     VIXL_ASSERT(OutsideITBlock());
5663     MacroEmissionCheckScope guard(this);
5664     ITScope it_scope(this, &cond, guard);
5665     vand(cond, dt, rd, rn, operand);
5666   }
Vand(DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5667   void Vand(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
5668     Vand(al, dt, rd, rn, operand);
5669   }
5670 
Vbic(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5671   void Vbic(Condition cond,
5672             DataType dt,
5673             DRegister rd,
5674             DRegister rn,
5675             const DOperand& operand) {
5676     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5677     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5678     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5679     VIXL_ASSERT(allow_macro_instructions_);
5680     VIXL_ASSERT(OutsideITBlock());
5681     MacroEmissionCheckScope guard(this);
5682     ITScope it_scope(this, &cond, guard);
5683     vbic(cond, dt, rd, rn, operand);
5684   }
Vbic(DataType dt,DRegister rd,DRegister rn,const DOperand & operand)5685   void Vbic(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
5686     Vbic(al, dt, rd, rn, operand);
5687   }
5688 
Vbic(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5689   void Vbic(Condition cond,
5690             DataType dt,
5691             QRegister rd,
5692             QRegister rn,
5693             const QOperand& operand) {
5694     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5695     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5696     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5697     VIXL_ASSERT(allow_macro_instructions_);
5698     VIXL_ASSERT(OutsideITBlock());
5699     MacroEmissionCheckScope guard(this);
5700     ITScope it_scope(this, &cond, guard);
5701     vbic(cond, dt, rd, rn, operand);
5702   }
Vbic(DataType dt,QRegister rd,QRegister rn,const QOperand & operand)5703   void Vbic(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
5704     Vbic(al, dt, rd, rn, operand);
5705   }
5706 
Vbif(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5707   void Vbif(
5708       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5709     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5710     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5711     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5712     VIXL_ASSERT(allow_macro_instructions_);
5713     VIXL_ASSERT(OutsideITBlock());
5714     MacroEmissionCheckScope guard(this);
5715     ITScope it_scope(this, &cond, guard);
5716     vbif(cond, dt, rd, rn, rm);
5717   }
Vbif(DataType dt,DRegister rd,DRegister rn,DRegister rm)5718   void Vbif(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5719     Vbif(al, dt, rd, rn, rm);
5720   }
Vbif(Condition cond,DRegister rd,DRegister rn,DRegister rm)5721   void Vbif(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
5722     Vbif(cond, kDataTypeValueNone, rd, rn, rm);
5723   }
Vbif(DRegister rd,DRegister rn,DRegister rm)5724   void Vbif(DRegister rd, DRegister rn, DRegister rm) {
5725     Vbif(al, kDataTypeValueNone, rd, rn, rm);
5726   }
5727 
Vbif(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5728   void Vbif(
5729       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5730     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5731     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5732     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5733     VIXL_ASSERT(allow_macro_instructions_);
5734     VIXL_ASSERT(OutsideITBlock());
5735     MacroEmissionCheckScope guard(this);
5736     ITScope it_scope(this, &cond, guard);
5737     vbif(cond, dt, rd, rn, rm);
5738   }
Vbif(DataType dt,QRegister rd,QRegister rn,QRegister rm)5739   void Vbif(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5740     Vbif(al, dt, rd, rn, rm);
5741   }
Vbif(Condition cond,QRegister rd,QRegister rn,QRegister rm)5742   void Vbif(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
5743     Vbif(cond, kDataTypeValueNone, rd, rn, rm);
5744   }
Vbif(QRegister rd,QRegister rn,QRegister rm)5745   void Vbif(QRegister rd, QRegister rn, QRegister rm) {
5746     Vbif(al, kDataTypeValueNone, rd, rn, rm);
5747   }
5748 
Vbit(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5749   void Vbit(
5750       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5751     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5752     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5753     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5754     VIXL_ASSERT(allow_macro_instructions_);
5755     VIXL_ASSERT(OutsideITBlock());
5756     MacroEmissionCheckScope guard(this);
5757     ITScope it_scope(this, &cond, guard);
5758     vbit(cond, dt, rd, rn, rm);
5759   }
Vbit(DataType dt,DRegister rd,DRegister rn,DRegister rm)5760   void Vbit(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5761     Vbit(al, dt, rd, rn, rm);
5762   }
Vbit(Condition cond,DRegister rd,DRegister rn,DRegister rm)5763   void Vbit(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
5764     Vbit(cond, kDataTypeValueNone, rd, rn, rm);
5765   }
Vbit(DRegister rd,DRegister rn,DRegister rm)5766   void Vbit(DRegister rd, DRegister rn, DRegister rm) {
5767     Vbit(al, kDataTypeValueNone, rd, rn, rm);
5768   }
5769 
Vbit(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5770   void Vbit(
5771       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5772     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5773     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5774     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5775     VIXL_ASSERT(allow_macro_instructions_);
5776     VIXL_ASSERT(OutsideITBlock());
5777     MacroEmissionCheckScope guard(this);
5778     ITScope it_scope(this, &cond, guard);
5779     vbit(cond, dt, rd, rn, rm);
5780   }
Vbit(DataType dt,QRegister rd,QRegister rn,QRegister rm)5781   void Vbit(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5782     Vbit(al, dt, rd, rn, rm);
5783   }
Vbit(Condition cond,QRegister rd,QRegister rn,QRegister rm)5784   void Vbit(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
5785     Vbit(cond, kDataTypeValueNone, rd, rn, rm);
5786   }
Vbit(QRegister rd,QRegister rn,QRegister rm)5787   void Vbit(QRegister rd, QRegister rn, QRegister rm) {
5788     Vbit(al, kDataTypeValueNone, rd, rn, rm);
5789   }
5790 
Vbsl(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5791   void Vbsl(
5792       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5793     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5794     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5795     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5796     VIXL_ASSERT(allow_macro_instructions_);
5797     VIXL_ASSERT(OutsideITBlock());
5798     MacroEmissionCheckScope guard(this);
5799     ITScope it_scope(this, &cond, guard);
5800     vbsl(cond, dt, rd, rn, rm);
5801   }
Vbsl(DataType dt,DRegister rd,DRegister rn,DRegister rm)5802   void Vbsl(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5803     Vbsl(al, dt, rd, rn, rm);
5804   }
Vbsl(Condition cond,DRegister rd,DRegister rn,DRegister rm)5805   void Vbsl(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
5806     Vbsl(cond, kDataTypeValueNone, rd, rn, rm);
5807   }
Vbsl(DRegister rd,DRegister rn,DRegister rm)5808   void Vbsl(DRegister rd, DRegister rn, DRegister rm) {
5809     Vbsl(al, kDataTypeValueNone, rd, rn, rm);
5810   }
5811 
Vbsl(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5812   void Vbsl(
5813       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5814     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5815     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5816     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5817     VIXL_ASSERT(allow_macro_instructions_);
5818     VIXL_ASSERT(OutsideITBlock());
5819     MacroEmissionCheckScope guard(this);
5820     ITScope it_scope(this, &cond, guard);
5821     vbsl(cond, dt, rd, rn, rm);
5822   }
Vbsl(DataType dt,QRegister rd,QRegister rn,QRegister rm)5823   void Vbsl(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5824     Vbsl(al, dt, rd, rn, rm);
5825   }
Vbsl(Condition cond,QRegister rd,QRegister rn,QRegister rm)5826   void Vbsl(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
5827     Vbsl(cond, kDataTypeValueNone, rd, rn, rm);
5828   }
Vbsl(QRegister rd,QRegister rn,QRegister rm)5829   void Vbsl(QRegister rd, QRegister rn, QRegister rm) {
5830     Vbsl(al, kDataTypeValueNone, rd, rn, rm);
5831   }
5832 
Vceq(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5833   void Vceq(Condition cond,
5834             DataType dt,
5835             DRegister rd,
5836             DRegister rm,
5837             const DOperand& operand) {
5838     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5839     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5840     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5841     VIXL_ASSERT(allow_macro_instructions_);
5842     VIXL_ASSERT(OutsideITBlock());
5843     MacroEmissionCheckScope guard(this);
5844     ITScope it_scope(this, &cond, guard);
5845     vceq(cond, dt, rd, rm, operand);
5846   }
Vceq(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5847   void Vceq(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
5848     Vceq(al, dt, rd, rm, operand);
5849   }
5850 
Vceq(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5851   void Vceq(Condition cond,
5852             DataType dt,
5853             QRegister rd,
5854             QRegister rm,
5855             const QOperand& operand) {
5856     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5857     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5858     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
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, rm, operand);
5864   }
Vceq(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5865   void Vceq(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
5866     Vceq(al, dt, rd, rm, operand);
5867   }
5868 
Vceq(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5869   void Vceq(
5870       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)5880   void Vceq(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5881     Vceq(al, dt, rd, rn, rm);
5882   }
5883 
Vceq(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5884   void Vceq(
5885       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5886     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5887     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5888     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5889     VIXL_ASSERT(allow_macro_instructions_);
5890     VIXL_ASSERT(OutsideITBlock());
5891     MacroEmissionCheckScope guard(this);
5892     ITScope it_scope(this, &cond, guard);
5893     vceq(cond, dt, rd, rn, rm);
5894   }
Vceq(DataType dt,QRegister rd,QRegister rn,QRegister rm)5895   void Vceq(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5896     Vceq(al, dt, rd, rn, rm);
5897   }
5898 
Vcge(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5899   void Vcge(Condition cond,
5900             DataType dt,
5901             DRegister rd,
5902             DRegister rm,
5903             const DOperand& operand) {
5904     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5905     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5906     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5907     VIXL_ASSERT(allow_macro_instructions_);
5908     VIXL_ASSERT(OutsideITBlock());
5909     MacroEmissionCheckScope guard(this);
5910     ITScope it_scope(this, &cond, guard);
5911     vcge(cond, dt, rd, rm, operand);
5912   }
Vcge(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5913   void Vcge(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
5914     Vcge(al, dt, rd, rm, operand);
5915   }
5916 
Vcge(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5917   void Vcge(Condition cond,
5918             DataType dt,
5919             QRegister rd,
5920             QRegister rm,
5921             const QOperand& operand) {
5922     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5923     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5924     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
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, rm, operand);
5930   }
Vcge(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5931   void Vcge(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
5932     Vcge(al, dt, rd, rm, operand);
5933   }
5934 
Vcge(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)5935   void Vcge(
5936       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)5946   void Vcge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5947     Vcge(al, dt, rd, rn, rm);
5948   }
5949 
Vcge(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)5950   void Vcge(
5951       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5952     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5953     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5954     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5955     VIXL_ASSERT(allow_macro_instructions_);
5956     VIXL_ASSERT(OutsideITBlock());
5957     MacroEmissionCheckScope guard(this);
5958     ITScope it_scope(this, &cond, guard);
5959     vcge(cond, dt, rd, rn, rm);
5960   }
Vcge(DataType dt,QRegister rd,QRegister rn,QRegister rm)5961   void Vcge(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5962     Vcge(al, dt, rd, rn, rm);
5963   }
5964 
Vcgt(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5965   void Vcgt(Condition cond,
5966             DataType dt,
5967             DRegister rd,
5968             DRegister rm,
5969             const DOperand& operand) {
5970     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5971     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5972     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5973     VIXL_ASSERT(allow_macro_instructions_);
5974     VIXL_ASSERT(OutsideITBlock());
5975     MacroEmissionCheckScope guard(this);
5976     ITScope it_scope(this, &cond, guard);
5977     vcgt(cond, dt, rd, rm, operand);
5978   }
Vcgt(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)5979   void Vcgt(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
5980     Vcgt(al, dt, rd, rm, operand);
5981   }
5982 
Vcgt(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5983   void Vcgt(Condition cond,
5984             DataType dt,
5985             QRegister rd,
5986             QRegister rm,
5987             const QOperand& operand) {
5988     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5989     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5990     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
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, rm, operand);
5996   }
Vcgt(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)5997   void Vcgt(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
5998     Vcgt(al, dt, rd, rm, operand);
5999   }
6000 
Vcgt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6001   void Vcgt(
6002       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)6012   void Vcgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6013     Vcgt(al, dt, rd, rn, rm);
6014   }
6015 
Vcgt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6016   void Vcgt(
6017       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6018     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6019     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6020     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6021     VIXL_ASSERT(allow_macro_instructions_);
6022     VIXL_ASSERT(OutsideITBlock());
6023     MacroEmissionCheckScope guard(this);
6024     ITScope it_scope(this, &cond, guard);
6025     vcgt(cond, dt, rd, rn, rm);
6026   }
Vcgt(DataType dt,QRegister rd,QRegister rn,QRegister rm)6027   void Vcgt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6028     Vcgt(al, dt, rd, rn, rm);
6029   }
6030 
Vcle(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6031   void Vcle(Condition cond,
6032             DataType dt,
6033             DRegister rd,
6034             DRegister rm,
6035             const DOperand& operand) {
6036     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6037     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6038     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6039     VIXL_ASSERT(allow_macro_instructions_);
6040     VIXL_ASSERT(OutsideITBlock());
6041     MacroEmissionCheckScope guard(this);
6042     ITScope it_scope(this, &cond, guard);
6043     vcle(cond, dt, rd, rm, operand);
6044   }
Vcle(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6045   void Vcle(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
6046     Vcle(al, dt, rd, rm, operand);
6047   }
6048 
Vcle(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6049   void Vcle(Condition cond,
6050             DataType dt,
6051             QRegister rd,
6052             QRegister rm,
6053             const QOperand& operand) {
6054     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6055     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6056     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
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, rm, operand);
6062   }
Vcle(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6063   void Vcle(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
6064     Vcle(al, dt, rd, rm, operand);
6065   }
6066 
Vcle(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6067   void Vcle(
6068       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)6078   void Vcle(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6079     Vcle(al, dt, rd, rn, rm);
6080   }
6081 
Vcle(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6082   void Vcle(
6083       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6084     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6085     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6086     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6087     VIXL_ASSERT(allow_macro_instructions_);
6088     VIXL_ASSERT(OutsideITBlock());
6089     MacroEmissionCheckScope guard(this);
6090     ITScope it_scope(this, &cond, guard);
6091     vcle(cond, dt, rd, rn, rm);
6092   }
Vcle(DataType dt,QRegister rd,QRegister rn,QRegister rm)6093   void Vcle(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6094     Vcle(al, dt, rd, rn, rm);
6095   }
6096 
Vcls(Condition cond,DataType dt,DRegister rd,DRegister rm)6097   void Vcls(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6098     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6099     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6100     VIXL_ASSERT(allow_macro_instructions_);
6101     VIXL_ASSERT(OutsideITBlock());
6102     MacroEmissionCheckScope guard(this);
6103     ITScope it_scope(this, &cond, guard);
6104     vcls(cond, dt, rd, rm);
6105   }
Vcls(DataType dt,DRegister rd,DRegister rm)6106   void Vcls(DataType dt, DRegister rd, DRegister rm) { Vcls(al, dt, rd, rm); }
6107 
Vcls(Condition cond,DataType dt,QRegister rd,QRegister rm)6108   void Vcls(Condition cond, DataType dt, QRegister rd, QRegister rm) {
6109     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6110     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6111     VIXL_ASSERT(allow_macro_instructions_);
6112     VIXL_ASSERT(OutsideITBlock());
6113     MacroEmissionCheckScope guard(this);
6114     ITScope it_scope(this, &cond, guard);
6115     vcls(cond, dt, rd, rm);
6116   }
Vcls(DataType dt,QRegister rd,QRegister rm)6117   void Vcls(DataType dt, QRegister rd, QRegister rm) { Vcls(al, dt, rd, rm); }
6118 
Vclt(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6119   void Vclt(Condition cond,
6120             DataType dt,
6121             DRegister rd,
6122             DRegister rm,
6123             const DOperand& operand) {
6124     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6125     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6126     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6127     VIXL_ASSERT(allow_macro_instructions_);
6128     VIXL_ASSERT(OutsideITBlock());
6129     MacroEmissionCheckScope guard(this);
6130     ITScope it_scope(this, &cond, guard);
6131     vclt(cond, dt, rd, rm, operand);
6132   }
Vclt(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)6133   void Vclt(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
6134     Vclt(al, dt, rd, rm, operand);
6135   }
6136 
Vclt(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6137   void Vclt(Condition cond,
6138             DataType dt,
6139             QRegister rd,
6140             QRegister rm,
6141             const QOperand& operand) {
6142     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6143     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6144     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
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, rm, operand);
6150   }
Vclt(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)6151   void Vclt(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
6152     Vclt(al, dt, rd, rm, operand);
6153   }
6154 
Vclt(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6155   void Vclt(
6156       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)6166   void Vclt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6167     Vclt(al, dt, rd, rn, rm);
6168   }
6169 
Vclt(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6170   void Vclt(
6171       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6172     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6173     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6174     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6175     VIXL_ASSERT(allow_macro_instructions_);
6176     VIXL_ASSERT(OutsideITBlock());
6177     MacroEmissionCheckScope guard(this);
6178     ITScope it_scope(this, &cond, guard);
6179     vclt(cond, dt, rd, rn, rm);
6180   }
Vclt(DataType dt,QRegister rd,QRegister rn,QRegister rm)6181   void Vclt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6182     Vclt(al, dt, rd, rn, rm);
6183   }
6184 
Vclz(Condition cond,DataType dt,DRegister rd,DRegister rm)6185   void Vclz(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6186     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6187     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6188     VIXL_ASSERT(allow_macro_instructions_);
6189     VIXL_ASSERT(OutsideITBlock());
6190     MacroEmissionCheckScope guard(this);
6191     ITScope it_scope(this, &cond, guard);
6192     vclz(cond, dt, rd, rm);
6193   }
Vclz(DataType dt,DRegister rd,DRegister rm)6194   void Vclz(DataType dt, DRegister rd, DRegister rm) { Vclz(al, dt, rd, rm); }
6195 
Vclz(Condition cond,DataType dt,QRegister rd,QRegister rm)6196   void Vclz(Condition cond, DataType dt, QRegister rd, QRegister rm) {
6197     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6198     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6199     VIXL_ASSERT(allow_macro_instructions_);
6200     VIXL_ASSERT(OutsideITBlock());
6201     MacroEmissionCheckScope guard(this);
6202     ITScope it_scope(this, &cond, guard);
6203     vclz(cond, dt, rd, rm);
6204   }
Vclz(DataType dt,QRegister rd,QRegister rm)6205   void Vclz(DataType dt, QRegister rd, QRegister rm) { Vclz(al, dt, rd, rm); }
6206 
Vcmp(Condition cond,DataType dt,SRegister rd,const SOperand & operand)6207   void Vcmp(Condition cond,
6208             DataType dt,
6209             SRegister rd,
6210             const SOperand& operand) {
6211     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6212     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6213     VIXL_ASSERT(allow_macro_instructions_);
6214     VIXL_ASSERT(OutsideITBlock());
6215     MacroEmissionCheckScope guard(this);
6216     ITScope it_scope(this, &cond, guard);
6217     vcmp(cond, dt, rd, operand);
6218   }
Vcmp(DataType dt,SRegister rd,const SOperand & operand)6219   void Vcmp(DataType dt, SRegister rd, const SOperand& operand) {
6220     Vcmp(al, dt, rd, operand);
6221   }
6222 
Vcmp(Condition cond,DataType dt,DRegister rd,const DOperand & operand)6223   void Vcmp(Condition cond,
6224             DataType dt,
6225             DRegister rd,
6226             const DOperand& operand) {
6227     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6228     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6229     VIXL_ASSERT(allow_macro_instructions_);
6230     VIXL_ASSERT(OutsideITBlock());
6231     MacroEmissionCheckScope guard(this);
6232     ITScope it_scope(this, &cond, guard);
6233     vcmp(cond, dt, rd, operand);
6234   }
Vcmp(DataType dt,DRegister rd,const DOperand & operand)6235   void Vcmp(DataType dt, DRegister rd, const DOperand& operand) {
6236     Vcmp(al, dt, rd, operand);
6237   }
6238 
Vcmpe(Condition cond,DataType dt,SRegister rd,const SOperand & operand)6239   void Vcmpe(Condition cond,
6240              DataType dt,
6241              SRegister rd,
6242              const SOperand& operand) {
6243     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6244     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6245     VIXL_ASSERT(allow_macro_instructions_);
6246     VIXL_ASSERT(OutsideITBlock());
6247     MacroEmissionCheckScope guard(this);
6248     ITScope it_scope(this, &cond, guard);
6249     vcmpe(cond, dt, rd, operand);
6250   }
Vcmpe(DataType dt,SRegister rd,const SOperand & operand)6251   void Vcmpe(DataType dt, SRegister rd, const SOperand& operand) {
6252     Vcmpe(al, dt, rd, operand);
6253   }
6254 
Vcmpe(Condition cond,DataType dt,DRegister rd,const DOperand & operand)6255   void Vcmpe(Condition cond,
6256              DataType dt,
6257              DRegister rd,
6258              const DOperand& operand) {
6259     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6260     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6261     VIXL_ASSERT(allow_macro_instructions_);
6262     VIXL_ASSERT(OutsideITBlock());
6263     MacroEmissionCheckScope guard(this);
6264     ITScope it_scope(this, &cond, guard);
6265     vcmpe(cond, dt, rd, operand);
6266   }
Vcmpe(DataType dt,DRegister rd,const DOperand & operand)6267   void Vcmpe(DataType dt, DRegister rd, const DOperand& operand) {
6268     Vcmpe(al, dt, rd, operand);
6269   }
6270 
Vcnt(Condition cond,DataType dt,DRegister rd,DRegister rm)6271   void Vcnt(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6272     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6273     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6274     VIXL_ASSERT(allow_macro_instructions_);
6275     VIXL_ASSERT(OutsideITBlock());
6276     MacroEmissionCheckScope guard(this);
6277     ITScope it_scope(this, &cond, guard);
6278     vcnt(cond, dt, rd, rm);
6279   }
Vcnt(DataType dt,DRegister rd,DRegister rm)6280   void Vcnt(DataType dt, DRegister rd, DRegister rm) { Vcnt(al, dt, rd, rm); }
6281 
Vcnt(Condition cond,DataType dt,QRegister rd,QRegister rm)6282   void Vcnt(Condition cond, DataType dt, QRegister rd, QRegister rm) {
6283     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6284     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6285     VIXL_ASSERT(allow_macro_instructions_);
6286     VIXL_ASSERT(OutsideITBlock());
6287     MacroEmissionCheckScope guard(this);
6288     ITScope it_scope(this, &cond, guard);
6289     vcnt(cond, dt, rd, rm);
6290   }
Vcnt(DataType dt,QRegister rd,QRegister rm)6291   void Vcnt(DataType dt, QRegister rd, QRegister rm) { Vcnt(al, dt, rd, rm); }
6292 
Vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,SRegister rm)6293   void Vcvt(
6294       Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6295     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6296     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6297     VIXL_ASSERT(allow_macro_instructions_);
6298     VIXL_ASSERT(OutsideITBlock());
6299     MacroEmissionCheckScope guard(this);
6300     ITScope it_scope(this, &cond, guard);
6301     vcvt(cond, dt1, dt2, rd, rm);
6302   }
Vcvt(DataType dt1,DataType dt2,DRegister rd,SRegister rm)6303   void Vcvt(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6304     Vcvt(al, dt1, dt2, rd, rm);
6305   }
6306 
Vcvt(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)6307   void Vcvt(
6308       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6309     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6310     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6311     VIXL_ASSERT(allow_macro_instructions_);
6312     VIXL_ASSERT(OutsideITBlock());
6313     MacroEmissionCheckScope guard(this);
6314     ITScope it_scope(this, &cond, guard);
6315     vcvt(cond, dt1, dt2, rd, rm);
6316   }
Vcvt(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6317   void Vcvt(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6318     Vcvt(al, dt1, dt2, rd, rm);
6319   }
6320 
Vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm,int32_t fbits)6321   void Vcvt(Condition cond,
6322             DataType dt1,
6323             DataType dt2,
6324             DRegister rd,
6325             DRegister rm,
6326             int32_t fbits) {
6327     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6328     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6329     VIXL_ASSERT(allow_macro_instructions_);
6330     VIXL_ASSERT(OutsideITBlock());
6331     MacroEmissionCheckScope guard(this);
6332     ITScope it_scope(this, &cond, guard);
6333     vcvt(cond, dt1, dt2, rd, rm, fbits);
6334   }
Vcvt(DataType dt1,DataType dt2,DRegister rd,DRegister rm,int32_t fbits)6335   void Vcvt(
6336       DataType dt1, DataType dt2, DRegister rd, DRegister rm, int32_t fbits) {
6337     Vcvt(al, dt1, dt2, rd, rm, fbits);
6338   }
6339 
Vcvt(Condition cond,DataType dt1,DataType dt2,QRegister rd,QRegister rm,int32_t fbits)6340   void Vcvt(Condition cond,
6341             DataType dt1,
6342             DataType dt2,
6343             QRegister rd,
6344             QRegister rm,
6345             int32_t fbits) {
6346     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6347     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6348     VIXL_ASSERT(allow_macro_instructions_);
6349     VIXL_ASSERT(OutsideITBlock());
6350     MacroEmissionCheckScope guard(this);
6351     ITScope it_scope(this, &cond, guard);
6352     vcvt(cond, dt1, dt2, rd, rm, fbits);
6353   }
Vcvt(DataType dt1,DataType dt2,QRegister rd,QRegister rm,int32_t fbits)6354   void Vcvt(
6355       DataType dt1, DataType dt2, QRegister rd, QRegister rm, int32_t fbits) {
6356     Vcvt(al, dt1, dt2, rd, rm, fbits);
6357   }
6358 
Vcvt(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm,int32_t fbits)6359   void Vcvt(Condition cond,
6360             DataType dt1,
6361             DataType dt2,
6362             SRegister rd,
6363             SRegister rm,
6364             int32_t fbits) {
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, fbits);
6372   }
Vcvt(DataType dt1,DataType dt2,SRegister rd,SRegister rm,int32_t fbits)6373   void Vcvt(
6374       DataType dt1, DataType dt2, SRegister rd, SRegister rm, int32_t fbits) {
6375     Vcvt(al, dt1, dt2, rd, rm, fbits);
6376   }
6377 
Vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)6378   void Vcvt(
6379       Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6380     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6381     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6382     VIXL_ASSERT(allow_macro_instructions_);
6383     VIXL_ASSERT(OutsideITBlock());
6384     MacroEmissionCheckScope guard(this);
6385     ITScope it_scope(this, &cond, guard);
6386     vcvt(cond, dt1, dt2, rd, rm);
6387   }
Vcvt(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6388   void Vcvt(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6389     Vcvt(al, dt1, dt2, rd, rm);
6390   }
6391 
Vcvt(Condition cond,DataType dt1,DataType dt2,QRegister rd,QRegister rm)6392   void Vcvt(
6393       Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6394     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6395     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6396     VIXL_ASSERT(allow_macro_instructions_);
6397     VIXL_ASSERT(OutsideITBlock());
6398     MacroEmissionCheckScope guard(this);
6399     ITScope it_scope(this, &cond, guard);
6400     vcvt(cond, dt1, dt2, rd, rm);
6401   }
Vcvt(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6402   void Vcvt(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6403     Vcvt(al, dt1, dt2, rd, rm);
6404   }
6405 
Vcvt(Condition cond,DataType dt1,DataType dt2,DRegister rd,QRegister rm)6406   void Vcvt(
6407       Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
6408     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6409     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6410     VIXL_ASSERT(allow_macro_instructions_);
6411     VIXL_ASSERT(OutsideITBlock());
6412     MacroEmissionCheckScope guard(this);
6413     ITScope it_scope(this, &cond, guard);
6414     vcvt(cond, dt1, dt2, rd, rm);
6415   }
Vcvt(DataType dt1,DataType dt2,DRegister rd,QRegister rm)6416   void Vcvt(DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
6417     Vcvt(al, dt1, dt2, rd, rm);
6418   }
6419 
Vcvt(Condition cond,DataType dt1,DataType dt2,QRegister rd,DRegister rm)6420   void Vcvt(
6421       Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
6422     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6423     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6424     VIXL_ASSERT(allow_macro_instructions_);
6425     VIXL_ASSERT(OutsideITBlock());
6426     MacroEmissionCheckScope guard(this);
6427     ITScope it_scope(this, &cond, guard);
6428     vcvt(cond, dt1, dt2, rd, rm);
6429   }
Vcvt(DataType dt1,DataType dt2,QRegister rd,DRegister rm)6430   void Vcvt(DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
6431     Vcvt(al, dt1, dt2, rd, rm);
6432   }
6433 
Vcvt(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6434   void Vcvt(
6435       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6436     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6437     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6438     VIXL_ASSERT(allow_macro_instructions_);
6439     VIXL_ASSERT(OutsideITBlock());
6440     MacroEmissionCheckScope guard(this);
6441     ITScope it_scope(this, &cond, guard);
6442     vcvt(cond, dt1, dt2, rd, rm);
6443   }
Vcvt(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6444   void Vcvt(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6445     Vcvt(al, dt1, dt2, rd, rm);
6446   }
6447 
Vcvta(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6448   void Vcvta(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6449     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6450     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6451     VIXL_ASSERT(allow_macro_instructions_);
6452     VIXL_ASSERT(OutsideITBlock());
6453     MacroEmissionCheckScope guard(this);
6454     vcvta(dt1, dt2, rd, rm);
6455   }
6456 
Vcvta(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6457   void Vcvta(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6458     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6459     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6460     VIXL_ASSERT(allow_macro_instructions_);
6461     VIXL_ASSERT(OutsideITBlock());
6462     MacroEmissionCheckScope guard(this);
6463     vcvta(dt1, dt2, rd, rm);
6464   }
6465 
Vcvta(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6466   void Vcvta(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6467     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6468     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6469     VIXL_ASSERT(allow_macro_instructions_);
6470     VIXL_ASSERT(OutsideITBlock());
6471     MacroEmissionCheckScope guard(this);
6472     vcvta(dt1, dt2, rd, rm);
6473   }
6474 
Vcvta(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6475   void Vcvta(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6476     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6477     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6478     VIXL_ASSERT(allow_macro_instructions_);
6479     VIXL_ASSERT(OutsideITBlock());
6480     MacroEmissionCheckScope guard(this);
6481     vcvta(dt1, dt2, rd, rm);
6482   }
6483 
Vcvtb(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6484   void Vcvtb(
6485       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6486     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6487     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6488     VIXL_ASSERT(allow_macro_instructions_);
6489     VIXL_ASSERT(OutsideITBlock());
6490     MacroEmissionCheckScope guard(this);
6491     ITScope it_scope(this, &cond, guard);
6492     vcvtb(cond, dt1, dt2, rd, rm);
6493   }
Vcvtb(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6494   void Vcvtb(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6495     Vcvtb(al, dt1, dt2, rd, rm);
6496   }
6497 
Vcvtb(Condition cond,DataType dt1,DataType dt2,DRegister rd,SRegister rm)6498   void Vcvtb(
6499       Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6500     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6501     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6502     VIXL_ASSERT(allow_macro_instructions_);
6503     VIXL_ASSERT(OutsideITBlock());
6504     MacroEmissionCheckScope guard(this);
6505     ITScope it_scope(this, &cond, guard);
6506     vcvtb(cond, dt1, dt2, rd, rm);
6507   }
Vcvtb(DataType dt1,DataType dt2,DRegister rd,SRegister rm)6508   void Vcvtb(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6509     Vcvtb(al, dt1, dt2, rd, rm);
6510   }
6511 
Vcvtb(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)6512   void Vcvtb(
6513       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6514     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6515     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6516     VIXL_ASSERT(allow_macro_instructions_);
6517     VIXL_ASSERT(OutsideITBlock());
6518     MacroEmissionCheckScope guard(this);
6519     ITScope it_scope(this, &cond, guard);
6520     vcvtb(cond, dt1, dt2, rd, rm);
6521   }
Vcvtb(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6522   void Vcvtb(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6523     Vcvtb(al, dt1, dt2, rd, rm);
6524   }
6525 
Vcvtm(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6526   void Vcvtm(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6527     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6528     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6529     VIXL_ASSERT(allow_macro_instructions_);
6530     VIXL_ASSERT(OutsideITBlock());
6531     MacroEmissionCheckScope guard(this);
6532     vcvtm(dt1, dt2, rd, rm);
6533   }
6534 
Vcvtm(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6535   void Vcvtm(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6536     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6537     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6538     VIXL_ASSERT(allow_macro_instructions_);
6539     VIXL_ASSERT(OutsideITBlock());
6540     MacroEmissionCheckScope guard(this);
6541     vcvtm(dt1, dt2, rd, rm);
6542   }
6543 
Vcvtm(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6544   void Vcvtm(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6545     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6546     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6547     VIXL_ASSERT(allow_macro_instructions_);
6548     VIXL_ASSERT(OutsideITBlock());
6549     MacroEmissionCheckScope guard(this);
6550     vcvtm(dt1, dt2, rd, rm);
6551   }
6552 
Vcvtm(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6553   void Vcvtm(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6554     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6555     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6556     VIXL_ASSERT(allow_macro_instructions_);
6557     VIXL_ASSERT(OutsideITBlock());
6558     MacroEmissionCheckScope guard(this);
6559     vcvtm(dt1, dt2, rd, rm);
6560   }
6561 
Vcvtn(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6562   void Vcvtn(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6563     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6564     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6565     VIXL_ASSERT(allow_macro_instructions_);
6566     VIXL_ASSERT(OutsideITBlock());
6567     MacroEmissionCheckScope guard(this);
6568     vcvtn(dt1, dt2, rd, rm);
6569   }
6570 
Vcvtn(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6571   void Vcvtn(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6572     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6573     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6574     VIXL_ASSERT(allow_macro_instructions_);
6575     VIXL_ASSERT(OutsideITBlock());
6576     MacroEmissionCheckScope guard(this);
6577     vcvtn(dt1, dt2, rd, rm);
6578   }
6579 
Vcvtn(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6580   void Vcvtn(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6581     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6582     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6583     VIXL_ASSERT(allow_macro_instructions_);
6584     VIXL_ASSERT(OutsideITBlock());
6585     MacroEmissionCheckScope guard(this);
6586     vcvtn(dt1, dt2, rd, rm);
6587   }
6588 
Vcvtn(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6589   void Vcvtn(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6590     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6591     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6592     VIXL_ASSERT(allow_macro_instructions_);
6593     VIXL_ASSERT(OutsideITBlock());
6594     MacroEmissionCheckScope guard(this);
6595     vcvtn(dt1, dt2, rd, rm);
6596   }
6597 
Vcvtp(DataType dt1,DataType dt2,DRegister rd,DRegister rm)6598   void Vcvtp(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6599     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6600     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6601     VIXL_ASSERT(allow_macro_instructions_);
6602     VIXL_ASSERT(OutsideITBlock());
6603     MacroEmissionCheckScope guard(this);
6604     vcvtp(dt1, dt2, rd, rm);
6605   }
6606 
Vcvtp(DataType dt1,DataType dt2,QRegister rd,QRegister rm)6607   void Vcvtp(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6608     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6609     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6610     VIXL_ASSERT(allow_macro_instructions_);
6611     VIXL_ASSERT(OutsideITBlock());
6612     MacroEmissionCheckScope guard(this);
6613     vcvtp(dt1, dt2, rd, rm);
6614   }
6615 
Vcvtp(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6616   void Vcvtp(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6617     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6618     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6619     VIXL_ASSERT(allow_macro_instructions_);
6620     VIXL_ASSERT(OutsideITBlock());
6621     MacroEmissionCheckScope guard(this);
6622     vcvtp(dt1, dt2, rd, rm);
6623   }
6624 
Vcvtp(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6625   void Vcvtp(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6626     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6627     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6628     VIXL_ASSERT(allow_macro_instructions_);
6629     VIXL_ASSERT(OutsideITBlock());
6630     MacroEmissionCheckScope guard(this);
6631     vcvtp(dt1, dt2, rd, rm);
6632   }
6633 
Vcvtr(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6634   void Vcvtr(
6635       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6636     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6637     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6638     VIXL_ASSERT(allow_macro_instructions_);
6639     VIXL_ASSERT(OutsideITBlock());
6640     MacroEmissionCheckScope guard(this);
6641     ITScope it_scope(this, &cond, guard);
6642     vcvtr(cond, dt1, dt2, rd, rm);
6643   }
Vcvtr(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6644   void Vcvtr(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6645     Vcvtr(al, dt1, dt2, rd, rm);
6646   }
6647 
Vcvtr(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)6648   void Vcvtr(
6649       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6650     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6651     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6652     VIXL_ASSERT(allow_macro_instructions_);
6653     VIXL_ASSERT(OutsideITBlock());
6654     MacroEmissionCheckScope guard(this);
6655     ITScope it_scope(this, &cond, guard);
6656     vcvtr(cond, dt1, dt2, rd, rm);
6657   }
Vcvtr(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6658   void Vcvtr(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6659     Vcvtr(al, dt1, dt2, rd, rm);
6660   }
6661 
Vcvtt(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)6662   void Vcvtt(
6663       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6664     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6665     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6666     VIXL_ASSERT(allow_macro_instructions_);
6667     VIXL_ASSERT(OutsideITBlock());
6668     MacroEmissionCheckScope guard(this);
6669     ITScope it_scope(this, &cond, guard);
6670     vcvtt(cond, dt1, dt2, rd, rm);
6671   }
Vcvtt(DataType dt1,DataType dt2,SRegister rd,SRegister rm)6672   void Vcvtt(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6673     Vcvtt(al, dt1, dt2, rd, rm);
6674   }
6675 
Vcvtt(Condition cond,DataType dt1,DataType dt2,DRegister rd,SRegister rm)6676   void Vcvtt(
6677       Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6678     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6679     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6680     VIXL_ASSERT(allow_macro_instructions_);
6681     VIXL_ASSERT(OutsideITBlock());
6682     MacroEmissionCheckScope guard(this);
6683     ITScope it_scope(this, &cond, guard);
6684     vcvtt(cond, dt1, dt2, rd, rm);
6685   }
Vcvtt(DataType dt1,DataType dt2,DRegister rd,SRegister rm)6686   void Vcvtt(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6687     Vcvtt(al, dt1, dt2, rd, rm);
6688   }
6689 
Vcvtt(Condition cond,DataType dt1,DataType dt2,SRegister rd,DRegister rm)6690   void Vcvtt(
6691       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6692     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
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     vcvtt(cond, dt1, dt2, rd, rm);
6699   }
Vcvtt(DataType dt1,DataType dt2,SRegister rd,DRegister rm)6700   void Vcvtt(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6701     Vcvtt(al, dt1, dt2, rd, rm);
6702   }
6703 
Vdiv(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6704   void Vdiv(
6705       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister 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,SRegister rd,SRegister rn,SRegister rm)6715   void Vdiv(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6716     Vdiv(al, dt, rd, rn, rm);
6717   }
6718 
Vdiv(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6719   void Vdiv(
6720       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6721     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6722     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6723     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6724     VIXL_ASSERT(allow_macro_instructions_);
6725     VIXL_ASSERT(OutsideITBlock());
6726     MacroEmissionCheckScope guard(this);
6727     ITScope it_scope(this, &cond, guard);
6728     vdiv(cond, dt, rd, rn, rm);
6729   }
Vdiv(DataType dt,DRegister rd,DRegister rn,DRegister rm)6730   void Vdiv(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6731     Vdiv(al, dt, rd, rn, rm);
6732   }
6733 
Vdup(Condition cond,DataType dt,QRegister rd,Register rt)6734   void Vdup(Condition cond, DataType dt, QRegister rd, Register rt) {
6735     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6736     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
6737     VIXL_ASSERT(allow_macro_instructions_);
6738     VIXL_ASSERT(OutsideITBlock());
6739     MacroEmissionCheckScope guard(this);
6740     ITScope it_scope(this, &cond, guard);
6741     vdup(cond, dt, rd, rt);
6742   }
Vdup(DataType dt,QRegister rd,Register rt)6743   void Vdup(DataType dt, QRegister rd, Register rt) { Vdup(al, dt, rd, rt); }
6744 
Vdup(Condition cond,DataType dt,DRegister rd,Register rt)6745   void Vdup(Condition cond, DataType dt, DRegister rd, Register rt) {
6746     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6747     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
6748     VIXL_ASSERT(allow_macro_instructions_);
6749     VIXL_ASSERT(OutsideITBlock());
6750     MacroEmissionCheckScope guard(this);
6751     ITScope it_scope(this, &cond, guard);
6752     vdup(cond, dt, rd, rt);
6753   }
Vdup(DataType dt,DRegister rd,Register rt)6754   void Vdup(DataType dt, DRegister rd, Register rt) { Vdup(al, dt, rd, rt); }
6755 
Vdup(Condition cond,DataType dt,DRegister rd,DRegisterLane rm)6756   void Vdup(Condition cond, DataType dt, DRegister rd, DRegisterLane rm) {
6757     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6758     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6759     VIXL_ASSERT(allow_macro_instructions_);
6760     VIXL_ASSERT(OutsideITBlock());
6761     MacroEmissionCheckScope guard(this);
6762     ITScope it_scope(this, &cond, guard);
6763     vdup(cond, dt, rd, rm);
6764   }
Vdup(DataType dt,DRegister rd,DRegisterLane rm)6765   void Vdup(DataType dt, DRegister rd, DRegisterLane rm) {
6766     Vdup(al, dt, rd, rm);
6767   }
6768 
Vdup(Condition cond,DataType dt,QRegister rd,DRegisterLane rm)6769   void Vdup(Condition cond, DataType dt, QRegister rd, DRegisterLane rm) {
6770     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
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     vdup(cond, dt, rd, rm);
6777   }
Vdup(DataType dt,QRegister rd,DRegisterLane rm)6778   void Vdup(DataType dt, QRegister rd, DRegisterLane rm) {
6779     Vdup(al, dt, rd, rm);
6780   }
6781 
Veor(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6782   void Veor(
6783       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6784     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6785     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6786     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6787     VIXL_ASSERT(allow_macro_instructions_);
6788     VIXL_ASSERT(OutsideITBlock());
6789     MacroEmissionCheckScope guard(this);
6790     ITScope it_scope(this, &cond, guard);
6791     veor(cond, dt, rd, rn, rm);
6792   }
Veor(DataType dt,DRegister rd,DRegister rn,DRegister rm)6793   void Veor(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6794     Veor(al, dt, rd, rn, rm);
6795   }
Veor(Condition cond,DRegister rd,DRegister rn,DRegister rm)6796   void Veor(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
6797     Veor(cond, kDataTypeValueNone, rd, rn, rm);
6798   }
Veor(DRegister rd,DRegister rn,DRegister rm)6799   void Veor(DRegister rd, DRegister rn, DRegister rm) {
6800     Veor(al, kDataTypeValueNone, rd, rn, rm);
6801   }
6802 
Veor(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6803   void Veor(
6804       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6805     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6806     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6807     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6808     VIXL_ASSERT(allow_macro_instructions_);
6809     VIXL_ASSERT(OutsideITBlock());
6810     MacroEmissionCheckScope guard(this);
6811     ITScope it_scope(this, &cond, guard);
6812     veor(cond, dt, rd, rn, rm);
6813   }
Veor(DataType dt,QRegister rd,QRegister rn,QRegister rm)6814   void Veor(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6815     Veor(al, dt, rd, rn, rm);
6816   }
Veor(Condition cond,QRegister rd,QRegister rn,QRegister rm)6817   void Veor(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
6818     Veor(cond, kDataTypeValueNone, rd, rn, rm);
6819   }
Veor(QRegister rd,QRegister rn,QRegister rm)6820   void Veor(QRegister rd, QRegister rn, QRegister rm) {
6821     Veor(al, kDataTypeValueNone, rd, rn, rm);
6822   }
6823 
Vext(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm,const DOperand & operand)6824   void Vext(Condition cond,
6825             DataType dt,
6826             DRegister rd,
6827             DRegister rn,
6828             DRegister rm,
6829             const DOperand& operand) {
6830     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6831     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6832     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6833     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6834     VIXL_ASSERT(allow_macro_instructions_);
6835     VIXL_ASSERT(OutsideITBlock());
6836     MacroEmissionCheckScope guard(this);
6837     ITScope it_scope(this, &cond, guard);
6838     vext(cond, dt, rd, rn, rm, operand);
6839   }
Vext(DataType dt,DRegister rd,DRegister rn,DRegister rm,const DOperand & operand)6840   void Vext(DataType dt,
6841             DRegister rd,
6842             DRegister rn,
6843             DRegister rm,
6844             const DOperand& operand) {
6845     Vext(al, dt, rd, rn, rm, operand);
6846   }
6847 
Vext(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm,const QOperand & operand)6848   void Vext(Condition cond,
6849             DataType dt,
6850             QRegister rd,
6851             QRegister rn,
6852             QRegister rm,
6853             const QOperand& operand) {
6854     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6855     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6856     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6857     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6858     VIXL_ASSERT(allow_macro_instructions_);
6859     VIXL_ASSERT(OutsideITBlock());
6860     MacroEmissionCheckScope guard(this);
6861     ITScope it_scope(this, &cond, guard);
6862     vext(cond, dt, rd, rn, rm, operand);
6863   }
Vext(DataType dt,QRegister rd,QRegister rn,QRegister rm,const QOperand & operand)6864   void Vext(DataType dt,
6865             QRegister rd,
6866             QRegister rn,
6867             QRegister rm,
6868             const QOperand& operand) {
6869     Vext(al, dt, rd, rn, rm, operand);
6870   }
6871 
Vfma(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6872   void Vfma(
6873       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)6883   void Vfma(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6884     Vfma(al, dt, rd, rn, rm);
6885   }
6886 
Vfma(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6887   void Vfma(
6888       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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,QRegister rd,QRegister rn,QRegister rm)6898   void Vfma(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6899     Vfma(al, dt, rd, rn, rm);
6900   }
6901 
Vfma(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6902   void Vfma(
6903       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister 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     vfma(cond, dt, rd, rn, rm);
6912   }
Vfma(DataType dt,SRegister rd,SRegister rn,SRegister rm)6913   void Vfma(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6914     Vfma(al, dt, rd, rn, rm);
6915   }
6916 
Vfms(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6917   void Vfms(
6918       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)6928   void Vfms(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6929     Vfms(al, dt, rd, rn, rm);
6930   }
6931 
Vfms(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)6932   void Vfms(
6933       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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,QRegister rd,QRegister rn,QRegister rm)6943   void Vfms(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6944     Vfms(al, dt, rd, rn, rm);
6945   }
6946 
Vfms(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6947   void Vfms(
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     vfms(cond, dt, rd, rn, rm);
6957   }
Vfms(DataType dt,SRegister rd,SRegister rn,SRegister rm)6958   void Vfms(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6959     Vfms(al, dt, rd, rn, rm);
6960   }
6961 
Vfnma(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6962   void Vfnma(
6963       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister 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,SRegister rd,SRegister rn,SRegister rm)6973   void Vfnma(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6974     Vfnma(al, dt, rd, rn, rm);
6975   }
6976 
Vfnma(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)6977   void Vfnma(
6978       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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     vfnma(cond, dt, rd, rn, rm);
6987   }
Vfnma(DataType dt,DRegister rd,DRegister rn,DRegister rm)6988   void Vfnma(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6989     Vfnma(al, dt, rd, rn, rm);
6990   }
6991 
Vfnms(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)6992   void Vfnms(
6993       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister 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,SRegister rd,SRegister rn,SRegister rm)7003   void Vfnms(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7004     Vfnms(al, dt, rd, rn, rm);
7005   }
7006 
Vfnms(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7007   void Vfnms(
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     vfnms(cond, dt, rd, rn, rm);
7017   }
Vfnms(DataType dt,DRegister rd,DRegister rn,DRegister rm)7018   void Vfnms(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7019     Vfnms(al, dt, rd, rn, rm);
7020   }
7021 
Vhadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7022   void Vhadd(
7023       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)7033   void Vhadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7034     Vhadd(al, dt, rd, rn, rm);
7035   }
7036 
Vhadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7037   void Vhadd(
7038       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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     vhadd(cond, dt, rd, rn, rm);
7047   }
Vhadd(DataType dt,QRegister rd,QRegister rn,QRegister rm)7048   void Vhadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7049     Vhadd(al, dt, rd, rn, rm);
7050   }
7051 
Vhsub(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7052   void Vhsub(
7053       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)7063   void Vhsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7064     Vhsub(al, dt, rd, rn, rm);
7065   }
7066 
Vhsub(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7067   void Vhsub(
7068       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7069     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7070     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7071     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7072     VIXL_ASSERT(allow_macro_instructions_);
7073     VIXL_ASSERT(OutsideITBlock());
7074     MacroEmissionCheckScope guard(this);
7075     ITScope it_scope(this, &cond, guard);
7076     vhsub(cond, dt, rd, rn, rm);
7077   }
Vhsub(DataType dt,QRegister rd,QRegister rn,QRegister rm)7078   void Vhsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7079     Vhsub(al, dt, rd, rn, rm);
7080   }
7081 
Vld1(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7082   void Vld1(Condition cond,
7083             DataType dt,
7084             const NeonRegisterList& nreglist,
7085             const AlignedMemOperand& operand) {
7086     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7087     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7088     VIXL_ASSERT(allow_macro_instructions_);
7089     VIXL_ASSERT(OutsideITBlock());
7090     MacroEmissionCheckScope guard(this);
7091     ITScope it_scope(this, &cond, guard);
7092     vld1(cond, dt, nreglist, operand);
7093   }
Vld1(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7094   void Vld1(DataType dt,
7095             const NeonRegisterList& nreglist,
7096             const AlignedMemOperand& operand) {
7097     Vld1(al, dt, nreglist, operand);
7098   }
7099 
Vld2(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7100   void Vld2(Condition cond,
7101             DataType dt,
7102             const NeonRegisterList& nreglist,
7103             const AlignedMemOperand& operand) {
7104     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7105     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7106     VIXL_ASSERT(allow_macro_instructions_);
7107     VIXL_ASSERT(OutsideITBlock());
7108     MacroEmissionCheckScope guard(this);
7109     ITScope it_scope(this, &cond, guard);
7110     vld2(cond, dt, nreglist, operand);
7111   }
Vld2(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7112   void Vld2(DataType dt,
7113             const NeonRegisterList& nreglist,
7114             const AlignedMemOperand& operand) {
7115     Vld2(al, dt, nreglist, operand);
7116   }
7117 
Vld3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7118   void Vld3(Condition cond,
7119             DataType dt,
7120             const NeonRegisterList& nreglist,
7121             const AlignedMemOperand& operand) {
7122     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7123     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7124     VIXL_ASSERT(allow_macro_instructions_);
7125     VIXL_ASSERT(OutsideITBlock());
7126     MacroEmissionCheckScope guard(this);
7127     ITScope it_scope(this, &cond, guard);
7128     vld3(cond, dt, nreglist, operand);
7129   }
Vld3(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7130   void Vld3(DataType dt,
7131             const NeonRegisterList& nreglist,
7132             const AlignedMemOperand& operand) {
7133     Vld3(al, dt, nreglist, operand);
7134   }
7135 
Vld3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)7136   void Vld3(Condition cond,
7137             DataType dt,
7138             const NeonRegisterList& nreglist,
7139             const MemOperand& operand) {
7140     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7141     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7142     VIXL_ASSERT(allow_macro_instructions_);
7143     VIXL_ASSERT(OutsideITBlock());
7144     MacroEmissionCheckScope guard(this);
7145     ITScope it_scope(this, &cond, guard);
7146     vld3(cond, dt, nreglist, operand);
7147   }
Vld3(DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)7148   void Vld3(DataType dt,
7149             const NeonRegisterList& nreglist,
7150             const MemOperand& operand) {
7151     Vld3(al, dt, nreglist, operand);
7152   }
7153 
Vld4(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7154   void Vld4(Condition cond,
7155             DataType dt,
7156             const NeonRegisterList& nreglist,
7157             const AlignedMemOperand& operand) {
7158     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7159     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7160     VIXL_ASSERT(allow_macro_instructions_);
7161     VIXL_ASSERT(OutsideITBlock());
7162     MacroEmissionCheckScope guard(this);
7163     ITScope it_scope(this, &cond, guard);
7164     vld4(cond, dt, nreglist, operand);
7165   }
Vld4(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)7166   void Vld4(DataType dt,
7167             const NeonRegisterList& nreglist,
7168             const AlignedMemOperand& operand) {
7169     Vld4(al, dt, nreglist, operand);
7170   }
7171 
Vldm(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7172   void Vldm(Condition cond,
7173             DataType dt,
7174             Register rn,
7175             WriteBack write_back,
7176             DRegisterList dreglist) {
7177     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7178     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
7179     VIXL_ASSERT(allow_macro_instructions_);
7180     VIXL_ASSERT(OutsideITBlock());
7181     MacroEmissionCheckScope guard(this);
7182     ITScope it_scope(this, &cond, guard);
7183     vldm(cond, dt, rn, write_back, dreglist);
7184   }
Vldm(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7185   void Vldm(DataType dt,
7186             Register rn,
7187             WriteBack write_back,
7188             DRegisterList dreglist) {
7189     Vldm(al, dt, rn, write_back, dreglist);
7190   }
Vldm(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)7191   void Vldm(Condition cond,
7192             Register rn,
7193             WriteBack write_back,
7194             DRegisterList dreglist) {
7195     Vldm(cond, kDataTypeValueNone, rn, write_back, dreglist);
7196   }
Vldm(Register rn,WriteBack write_back,DRegisterList dreglist)7197   void Vldm(Register rn, WriteBack write_back, DRegisterList dreglist) {
7198     Vldm(al, kDataTypeValueNone, rn, write_back, dreglist);
7199   }
7200 
Vldm(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7201   void Vldm(Condition cond,
7202             DataType dt,
7203             Register rn,
7204             WriteBack write_back,
7205             SRegisterList sreglist) {
7206     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7207     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
7208     VIXL_ASSERT(allow_macro_instructions_);
7209     VIXL_ASSERT(OutsideITBlock());
7210     MacroEmissionCheckScope guard(this);
7211     ITScope it_scope(this, &cond, guard);
7212     vldm(cond, dt, rn, write_back, sreglist);
7213   }
Vldm(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7214   void Vldm(DataType dt,
7215             Register rn,
7216             WriteBack write_back,
7217             SRegisterList sreglist) {
7218     Vldm(al, dt, rn, write_back, sreglist);
7219   }
Vldm(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)7220   void Vldm(Condition cond,
7221             Register rn,
7222             WriteBack write_back,
7223             SRegisterList sreglist) {
7224     Vldm(cond, kDataTypeValueNone, rn, write_back, sreglist);
7225   }
Vldm(Register rn,WriteBack write_back,SRegisterList sreglist)7226   void Vldm(Register rn, WriteBack write_back, SRegisterList sreglist) {
7227     Vldm(al, kDataTypeValueNone, rn, write_back, sreglist);
7228   }
7229 
Vldmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7230   void Vldmdb(Condition cond,
7231               DataType dt,
7232               Register rn,
7233               WriteBack write_back,
7234               DRegisterList dreglist) {
7235     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7236     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
7237     VIXL_ASSERT(allow_macro_instructions_);
7238     VIXL_ASSERT(OutsideITBlock());
7239     MacroEmissionCheckScope guard(this);
7240     ITScope it_scope(this, &cond, guard);
7241     vldmdb(cond, dt, rn, write_back, dreglist);
7242   }
Vldmdb(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7243   void Vldmdb(DataType dt,
7244               Register rn,
7245               WriteBack write_back,
7246               DRegisterList dreglist) {
7247     Vldmdb(al, dt, rn, write_back, dreglist);
7248   }
Vldmdb(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)7249   void Vldmdb(Condition cond,
7250               Register rn,
7251               WriteBack write_back,
7252               DRegisterList dreglist) {
7253     Vldmdb(cond, kDataTypeValueNone, rn, write_back, dreglist);
7254   }
Vldmdb(Register rn,WriteBack write_back,DRegisterList dreglist)7255   void Vldmdb(Register rn, WriteBack write_back, DRegisterList dreglist) {
7256     Vldmdb(al, kDataTypeValueNone, rn, write_back, dreglist);
7257   }
7258 
Vldmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7259   void Vldmdb(Condition cond,
7260               DataType dt,
7261               Register rn,
7262               WriteBack write_back,
7263               SRegisterList sreglist) {
7264     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7265     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
7266     VIXL_ASSERT(allow_macro_instructions_);
7267     VIXL_ASSERT(OutsideITBlock());
7268     MacroEmissionCheckScope guard(this);
7269     ITScope it_scope(this, &cond, guard);
7270     vldmdb(cond, dt, rn, write_back, sreglist);
7271   }
Vldmdb(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7272   void Vldmdb(DataType dt,
7273               Register rn,
7274               WriteBack write_back,
7275               SRegisterList sreglist) {
7276     Vldmdb(al, dt, rn, write_back, sreglist);
7277   }
Vldmdb(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)7278   void Vldmdb(Condition cond,
7279               Register rn,
7280               WriteBack write_back,
7281               SRegisterList sreglist) {
7282     Vldmdb(cond, kDataTypeValueNone, rn, write_back, sreglist);
7283   }
Vldmdb(Register rn,WriteBack write_back,SRegisterList sreglist)7284   void Vldmdb(Register rn, WriteBack write_back, SRegisterList sreglist) {
7285     Vldmdb(al, kDataTypeValueNone, rn, write_back, sreglist);
7286   }
7287 
Vldmia(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7288   void Vldmia(Condition cond,
7289               DataType dt,
7290               Register rn,
7291               WriteBack write_back,
7292               DRegisterList dreglist) {
7293     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7294     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
7295     VIXL_ASSERT(allow_macro_instructions_);
7296     VIXL_ASSERT(OutsideITBlock());
7297     MacroEmissionCheckScope guard(this);
7298     ITScope it_scope(this, &cond, guard);
7299     vldmia(cond, dt, rn, write_back, dreglist);
7300   }
Vldmia(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)7301   void Vldmia(DataType dt,
7302               Register rn,
7303               WriteBack write_back,
7304               DRegisterList dreglist) {
7305     Vldmia(al, dt, rn, write_back, dreglist);
7306   }
Vldmia(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)7307   void Vldmia(Condition cond,
7308               Register rn,
7309               WriteBack write_back,
7310               DRegisterList dreglist) {
7311     Vldmia(cond, kDataTypeValueNone, rn, write_back, dreglist);
7312   }
Vldmia(Register rn,WriteBack write_back,DRegisterList dreglist)7313   void Vldmia(Register rn, WriteBack write_back, DRegisterList dreglist) {
7314     Vldmia(al, kDataTypeValueNone, rn, write_back, dreglist);
7315   }
7316 
Vldmia(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7317   void Vldmia(Condition cond,
7318               DataType dt,
7319               Register rn,
7320               WriteBack write_back,
7321               SRegisterList sreglist) {
7322     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7323     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
7324     VIXL_ASSERT(allow_macro_instructions_);
7325     VIXL_ASSERT(OutsideITBlock());
7326     MacroEmissionCheckScope guard(this);
7327     ITScope it_scope(this, &cond, guard);
7328     vldmia(cond, dt, rn, write_back, sreglist);
7329   }
Vldmia(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)7330   void Vldmia(DataType dt,
7331               Register rn,
7332               WriteBack write_back,
7333               SRegisterList sreglist) {
7334     Vldmia(al, dt, rn, write_back, sreglist);
7335   }
Vldmia(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)7336   void Vldmia(Condition cond,
7337               Register rn,
7338               WriteBack write_back,
7339               SRegisterList sreglist) {
7340     Vldmia(cond, kDataTypeValueNone, rn, write_back, sreglist);
7341   }
Vldmia(Register rn,WriteBack write_back,SRegisterList sreglist)7342   void Vldmia(Register rn, WriteBack write_back, SRegisterList sreglist) {
7343     Vldmia(al, kDataTypeValueNone, rn, write_back, sreglist);
7344   }
7345 
7346 
Vldr(Condition cond,DataType dt,DRegister rd,const MemOperand & operand)7347   void Vldr(Condition cond,
7348             DataType dt,
7349             DRegister rd,
7350             const MemOperand& operand) {
7351     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7352     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7353     VIXL_ASSERT(allow_macro_instructions_);
7354     VIXL_ASSERT(OutsideITBlock());
7355     MacroEmissionCheckScope guard(this);
7356     ITScope it_scope(this, &cond, guard);
7357     vldr(cond, dt, rd, operand);
7358   }
Vldr(DataType dt,DRegister rd,const MemOperand & operand)7359   void Vldr(DataType dt, DRegister rd, const MemOperand& operand) {
7360     Vldr(al, dt, rd, operand);
7361   }
Vldr(Condition cond,DRegister rd,const MemOperand & operand)7362   void Vldr(Condition cond, DRegister rd, const MemOperand& operand) {
7363     Vldr(cond, Untyped64, rd, operand);
7364   }
Vldr(DRegister rd,const MemOperand & operand)7365   void Vldr(DRegister rd, const MemOperand& operand) {
7366     Vldr(al, Untyped64, rd, operand);
7367   }
7368 
7369 
Vldr(Condition cond,DataType dt,SRegister rd,const MemOperand & operand)7370   void Vldr(Condition cond,
7371             DataType dt,
7372             SRegister rd,
7373             const MemOperand& operand) {
7374     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7375     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7376     VIXL_ASSERT(allow_macro_instructions_);
7377     VIXL_ASSERT(OutsideITBlock());
7378     MacroEmissionCheckScope guard(this);
7379     ITScope it_scope(this, &cond, guard);
7380     vldr(cond, dt, rd, operand);
7381   }
Vldr(DataType dt,SRegister rd,const MemOperand & operand)7382   void Vldr(DataType dt, SRegister rd, const MemOperand& operand) {
7383     Vldr(al, dt, rd, operand);
7384   }
Vldr(Condition cond,SRegister rd,const MemOperand & operand)7385   void Vldr(Condition cond, SRegister rd, const MemOperand& operand) {
7386     Vldr(cond, Untyped32, rd, operand);
7387   }
Vldr(SRegister rd,const MemOperand & operand)7388   void Vldr(SRegister rd, const MemOperand& operand) {
7389     Vldr(al, Untyped32, rd, operand);
7390   }
7391 
Vmax(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7392   void Vmax(
7393       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)7403   void Vmax(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7404     Vmax(al, dt, rd, rn, rm);
7405   }
7406 
Vmax(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7407   void Vmax(
7408       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7409     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7410     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7411     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7412     VIXL_ASSERT(allow_macro_instructions_);
7413     VIXL_ASSERT(OutsideITBlock());
7414     MacroEmissionCheckScope guard(this);
7415     ITScope it_scope(this, &cond, guard);
7416     vmax(cond, dt, rd, rn, rm);
7417   }
Vmax(DataType dt,QRegister rd,QRegister rn,QRegister rm)7418   void Vmax(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7419     Vmax(al, dt, rd, rn, rm);
7420   }
7421 
Vmaxnm(DataType dt,DRegister rd,DRegister rn,DRegister rm)7422   void Vmaxnm(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7423     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7424     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7425     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7426     VIXL_ASSERT(allow_macro_instructions_);
7427     VIXL_ASSERT(OutsideITBlock());
7428     MacroEmissionCheckScope guard(this);
7429     vmaxnm(dt, rd, rn, rm);
7430   }
7431 
Vmaxnm(DataType dt,QRegister rd,QRegister rn,QRegister rm)7432   void Vmaxnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7433     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7434     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7435     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7436     VIXL_ASSERT(allow_macro_instructions_);
7437     VIXL_ASSERT(OutsideITBlock());
7438     MacroEmissionCheckScope guard(this);
7439     vmaxnm(dt, rd, rn, rm);
7440   }
7441 
Vmaxnm(DataType dt,SRegister rd,SRegister rn,SRegister rm)7442   void Vmaxnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7443     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7444     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7445     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7446     VIXL_ASSERT(allow_macro_instructions_);
7447     VIXL_ASSERT(OutsideITBlock());
7448     MacroEmissionCheckScope guard(this);
7449     vmaxnm(dt, rd, rn, rm);
7450   }
7451 
Vmin(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7452   void Vmin(
7453       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)7463   void Vmin(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7464     Vmin(al, dt, rd, rn, rm);
7465   }
7466 
Vmin(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7467   void Vmin(
7468       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7469     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7470     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7471     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7472     VIXL_ASSERT(allow_macro_instructions_);
7473     VIXL_ASSERT(OutsideITBlock());
7474     MacroEmissionCheckScope guard(this);
7475     ITScope it_scope(this, &cond, guard);
7476     vmin(cond, dt, rd, rn, rm);
7477   }
Vmin(DataType dt,QRegister rd,QRegister rn,QRegister rm)7478   void Vmin(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7479     Vmin(al, dt, rd, rn, rm);
7480   }
7481 
Vminnm(DataType dt,DRegister rd,DRegister rn,DRegister rm)7482   void Vminnm(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7483     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7484     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7485     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7486     VIXL_ASSERT(allow_macro_instructions_);
7487     VIXL_ASSERT(OutsideITBlock());
7488     MacroEmissionCheckScope guard(this);
7489     vminnm(dt, rd, rn, rm);
7490   }
7491 
Vminnm(DataType dt,QRegister rd,QRegister rn,QRegister rm)7492   void Vminnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7493     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7494     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7495     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7496     VIXL_ASSERT(allow_macro_instructions_);
7497     VIXL_ASSERT(OutsideITBlock());
7498     MacroEmissionCheckScope guard(this);
7499     vminnm(dt, rd, rn, rm);
7500   }
7501 
Vminnm(DataType dt,SRegister rd,SRegister rn,SRegister rm)7502   void Vminnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7503     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7504     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7505     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7506     VIXL_ASSERT(allow_macro_instructions_);
7507     VIXL_ASSERT(OutsideITBlock());
7508     MacroEmissionCheckScope guard(this);
7509     vminnm(dt, rd, rn, rm);
7510   }
7511 
Vmla(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)7512   void Vmla(Condition cond,
7513             DataType dt,
7514             DRegister rd,
7515             DRegister rn,
7516             DRegisterLane rm) {
7517     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7518     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7519     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7520     VIXL_ASSERT(allow_macro_instructions_);
7521     VIXL_ASSERT(OutsideITBlock());
7522     MacroEmissionCheckScope guard(this);
7523     ITScope it_scope(this, &cond, guard);
7524     vmla(cond, dt, rd, rn, rm);
7525   }
Vmla(DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)7526   void Vmla(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
7527     Vmla(al, dt, rd, rn, rm);
7528   }
7529 
Vmla(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)7530   void Vmla(Condition cond,
7531             DataType dt,
7532             QRegister rd,
7533             QRegister rn,
7534             DRegisterLane 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,QRegister rd,QRegister rn,DRegisterLane rm)7544   void Vmla(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
7545     Vmla(al, dt, rd, rn, rm);
7546   }
7547 
Vmla(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7548   void Vmla(
7549       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)7559   void Vmla(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7560     Vmla(al, dt, rd, rn, rm);
7561   }
7562 
Vmla(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7563   void Vmla(
7564       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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,QRegister rd,QRegister rn,QRegister rm)7574   void Vmla(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7575     Vmla(al, dt, rd, rn, rm);
7576   }
7577 
Vmla(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)7578   void Vmla(
7579       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7580     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7581     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7582     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7583     VIXL_ASSERT(allow_macro_instructions_);
7584     VIXL_ASSERT(OutsideITBlock());
7585     MacroEmissionCheckScope guard(this);
7586     ITScope it_scope(this, &cond, guard);
7587     vmla(cond, dt, rd, rn, rm);
7588   }
Vmla(DataType dt,SRegister rd,SRegister rn,SRegister rm)7589   void Vmla(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7590     Vmla(al, dt, rd, rn, rm);
7591   }
7592 
Vmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)7593   void Vmlal(Condition cond,
7594              DataType dt,
7595              QRegister rd,
7596              DRegister rn,
7597              DRegisterLane 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,DRegisterLane rm)7607   void Vmlal(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
7608     Vmlal(al, dt, rd, rn, rm);
7609   }
7610 
Vmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)7611   void Vmlal(
7612       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7613     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7614     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7615     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7616     VIXL_ASSERT(allow_macro_instructions_);
7617     VIXL_ASSERT(OutsideITBlock());
7618     MacroEmissionCheckScope guard(this);
7619     ITScope it_scope(this, &cond, guard);
7620     vmlal(cond, dt, rd, rn, rm);
7621   }
Vmlal(DataType dt,QRegister rd,DRegister rn,DRegister rm)7622   void Vmlal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7623     Vmlal(al, dt, rd, rn, rm);
7624   }
7625 
Vmls(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)7626   void Vmls(Condition cond,
7627             DataType dt,
7628             DRegister rd,
7629             DRegister rn,
7630             DRegisterLane rm) {
7631     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7632     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7633     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7634     VIXL_ASSERT(allow_macro_instructions_);
7635     VIXL_ASSERT(OutsideITBlock());
7636     MacroEmissionCheckScope guard(this);
7637     ITScope it_scope(this, &cond, guard);
7638     vmls(cond, dt, rd, rn, rm);
7639   }
Vmls(DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)7640   void Vmls(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
7641     Vmls(al, dt, rd, rn, rm);
7642   }
7643 
Vmls(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)7644   void Vmls(Condition cond,
7645             DataType dt,
7646             QRegister rd,
7647             QRegister rn,
7648             DRegisterLane 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,QRegister rd,QRegister rn,DRegisterLane rm)7658   void Vmls(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
7659     Vmls(al, dt, rd, rn, rm);
7660   }
7661 
Vmls(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7662   void Vmls(
7663       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)7673   void Vmls(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7674     Vmls(al, dt, rd, rn, rm);
7675   }
7676 
Vmls(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)7677   void Vmls(
7678       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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,QRegister rd,QRegister rn,QRegister rm)7688   void Vmls(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7689     Vmls(al, dt, rd, rn, rm);
7690   }
7691 
Vmls(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)7692   void Vmls(
7693       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7694     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7695     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7696     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7697     VIXL_ASSERT(allow_macro_instructions_);
7698     VIXL_ASSERT(OutsideITBlock());
7699     MacroEmissionCheckScope guard(this);
7700     ITScope it_scope(this, &cond, guard);
7701     vmls(cond, dt, rd, rn, rm);
7702   }
Vmls(DataType dt,SRegister rd,SRegister rn,SRegister rm)7703   void Vmls(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7704     Vmls(al, dt, rd, rn, rm);
7705   }
7706 
Vmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)7707   void Vmlsl(Condition cond,
7708              DataType dt,
7709              QRegister rd,
7710              DRegister rn,
7711              DRegisterLane 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,DRegisterLane rm)7721   void Vmlsl(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
7722     Vmlsl(al, dt, rd, rn, rm);
7723   }
7724 
Vmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)7725   void Vmlsl(
7726       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7727     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7728     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7729     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7730     VIXL_ASSERT(allow_macro_instructions_);
7731     VIXL_ASSERT(OutsideITBlock());
7732     MacroEmissionCheckScope guard(this);
7733     ITScope it_scope(this, &cond, guard);
7734     vmlsl(cond, dt, rd, rn, rm);
7735   }
Vmlsl(DataType dt,QRegister rd,DRegister rn,DRegister rm)7736   void Vmlsl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7737     Vmlsl(al, dt, rd, rn, rm);
7738   }
7739 
Vmov(Condition cond,Register rt,SRegister rn)7740   void Vmov(Condition cond, Register rt, SRegister rn) {
7741     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7742     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7743     VIXL_ASSERT(allow_macro_instructions_);
7744     VIXL_ASSERT(OutsideITBlock());
7745     MacroEmissionCheckScope guard(this);
7746     ITScope it_scope(this, &cond, guard);
7747     vmov(cond, rt, rn);
7748   }
Vmov(Register rt,SRegister rn)7749   void Vmov(Register rt, SRegister rn) { Vmov(al, rt, rn); }
7750 
Vmov(Condition cond,SRegister rn,Register rt)7751   void Vmov(Condition cond, SRegister rn, Register rt) {
7752     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7753     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7754     VIXL_ASSERT(allow_macro_instructions_);
7755     VIXL_ASSERT(OutsideITBlock());
7756     MacroEmissionCheckScope guard(this);
7757     ITScope it_scope(this, &cond, guard);
7758     vmov(cond, rn, rt);
7759   }
Vmov(SRegister rn,Register rt)7760   void Vmov(SRegister rn, Register rt) { Vmov(al, rn, rt); }
7761 
Vmov(Condition cond,Register rt,Register rt2,DRegister rm)7762   void Vmov(Condition cond, Register rt, Register rt2, DRegister rm) {
7763     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7764     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7765     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7766     VIXL_ASSERT(allow_macro_instructions_);
7767     VIXL_ASSERT(OutsideITBlock());
7768     MacroEmissionCheckScope guard(this);
7769     ITScope it_scope(this, &cond, guard);
7770     vmov(cond, rt, rt2, rm);
7771   }
Vmov(Register rt,Register rt2,DRegister rm)7772   void Vmov(Register rt, Register rt2, DRegister rm) { Vmov(al, rt, rt2, rm); }
7773 
Vmov(Condition cond,DRegister rm,Register rt,Register rt2)7774   void Vmov(Condition cond, DRegister rm, Register rt, Register rt2) {
7775     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7776     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7777     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7778     VIXL_ASSERT(allow_macro_instructions_);
7779     VIXL_ASSERT(OutsideITBlock());
7780     MacroEmissionCheckScope guard(this);
7781     ITScope it_scope(this, &cond, guard);
7782     vmov(cond, rm, rt, rt2);
7783   }
Vmov(DRegister rm,Register rt,Register rt2)7784   void Vmov(DRegister rm, Register rt, Register rt2) { Vmov(al, rm, rt, rt2); }
7785 
Vmov(Condition cond,Register rt,Register rt2,SRegister rm,SRegister rm1)7786   void Vmov(
7787       Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) {
7788     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7789     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7790     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7791     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm1));
7792     VIXL_ASSERT(allow_macro_instructions_);
7793     VIXL_ASSERT(OutsideITBlock());
7794     MacroEmissionCheckScope guard(this);
7795     ITScope it_scope(this, &cond, guard);
7796     vmov(cond, rt, rt2, rm, rm1);
7797   }
Vmov(Register rt,Register rt2,SRegister rm,SRegister rm1)7798   void Vmov(Register rt, Register rt2, SRegister rm, SRegister rm1) {
7799     Vmov(al, rt, rt2, rm, rm1);
7800   }
7801 
Vmov(Condition cond,SRegister rm,SRegister rm1,Register rt,Register rt2)7802   void Vmov(
7803       Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) {
7804     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7805     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm1));
7806     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7807     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7808     VIXL_ASSERT(allow_macro_instructions_);
7809     VIXL_ASSERT(OutsideITBlock());
7810     MacroEmissionCheckScope guard(this);
7811     ITScope it_scope(this, &cond, guard);
7812     vmov(cond, rm, rm1, rt, rt2);
7813   }
Vmov(SRegister rm,SRegister rm1,Register rt,Register rt2)7814   void Vmov(SRegister rm, SRegister rm1, Register rt, Register rt2) {
7815     Vmov(al, rm, rm1, rt, rt2);
7816   }
7817 
Vmov(Condition cond,DataType dt,DRegisterLane rd,Register rt)7818   void Vmov(Condition cond, DataType dt, DRegisterLane rd, Register rt) {
7819     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7820     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7821     VIXL_ASSERT(allow_macro_instructions_);
7822     VIXL_ASSERT(OutsideITBlock());
7823     MacroEmissionCheckScope guard(this);
7824     ITScope it_scope(this, &cond, guard);
7825     vmov(cond, dt, rd, rt);
7826   }
Vmov(DataType dt,DRegisterLane rd,Register rt)7827   void Vmov(DataType dt, DRegisterLane rd, Register rt) {
7828     Vmov(al, dt, rd, rt);
7829   }
Vmov(Condition cond,DRegisterLane rd,Register rt)7830   void Vmov(Condition cond, DRegisterLane rd, Register rt) {
7831     Vmov(cond, kDataTypeValueNone, rd, rt);
7832   }
Vmov(DRegisterLane rd,Register rt)7833   void Vmov(DRegisterLane rd, Register rt) {
7834     Vmov(al, kDataTypeValueNone, rd, rt);
7835   }
7836 
Vmov(Condition cond,DataType dt,DRegister rd,const DOperand & operand)7837   void Vmov(Condition cond,
7838             DataType dt,
7839             DRegister rd,
7840             const DOperand& operand) {
7841     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7842     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7843     VIXL_ASSERT(allow_macro_instructions_);
7844     VIXL_ASSERT(OutsideITBlock());
7845     MacroEmissionCheckScope guard(this);
7846     ITScope it_scope(this, &cond, guard);
7847     vmov(cond, dt, rd, operand);
7848   }
Vmov(DataType dt,DRegister rd,const DOperand & operand)7849   void Vmov(DataType dt, DRegister rd, const DOperand& operand) {
7850     Vmov(al, dt, rd, operand);
7851   }
7852 
Vmov(Condition cond,DataType dt,QRegister rd,const QOperand & operand)7853   void Vmov(Condition cond,
7854             DataType dt,
7855             QRegister rd,
7856             const QOperand& operand) {
7857     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7858     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7859     VIXL_ASSERT(allow_macro_instructions_);
7860     VIXL_ASSERT(OutsideITBlock());
7861     MacroEmissionCheckScope guard(this);
7862     ITScope it_scope(this, &cond, guard);
7863     vmov(cond, dt, rd, operand);
7864   }
Vmov(DataType dt,QRegister rd,const QOperand & operand)7865   void Vmov(DataType dt, QRegister rd, const QOperand& operand) {
7866     Vmov(al, dt, rd, operand);
7867   }
7868 
Vmov(Condition cond,DataType dt,SRegister rd,const SOperand & operand)7869   void Vmov(Condition cond,
7870             DataType dt,
7871             SRegister rd,
7872             const SOperand& operand) {
7873     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7874     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7875     VIXL_ASSERT(allow_macro_instructions_);
7876     VIXL_ASSERT(OutsideITBlock());
7877     MacroEmissionCheckScope guard(this);
7878     ITScope it_scope(this, &cond, guard);
7879     vmov(cond, dt, rd, operand);
7880   }
Vmov(DataType dt,SRegister rd,const SOperand & operand)7881   void Vmov(DataType dt, SRegister rd, const SOperand& operand) {
7882     Vmov(al, dt, rd, operand);
7883   }
7884 
Vmov(Condition cond,DataType dt,Register rt,DRegisterLane rn)7885   void Vmov(Condition cond, DataType dt, Register rt, DRegisterLane rn) {
7886     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7887     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7888     VIXL_ASSERT(allow_macro_instructions_);
7889     VIXL_ASSERT(OutsideITBlock());
7890     MacroEmissionCheckScope guard(this);
7891     ITScope it_scope(this, &cond, guard);
7892     vmov(cond, dt, rt, rn);
7893   }
Vmov(DataType dt,Register rt,DRegisterLane rn)7894   void Vmov(DataType dt, Register rt, DRegisterLane rn) {
7895     Vmov(al, dt, rt, rn);
7896   }
Vmov(Condition cond,Register rt,DRegisterLane rn)7897   void Vmov(Condition cond, Register rt, DRegisterLane rn) {
7898     Vmov(cond, kDataTypeValueNone, rt, rn);
7899   }
Vmov(Register rt,DRegisterLane rn)7900   void Vmov(Register rt, DRegisterLane rn) {
7901     Vmov(al, kDataTypeValueNone, rt, rn);
7902   }
7903 
Vmovl(Condition cond,DataType dt,QRegister rd,DRegister rm)7904   void Vmovl(Condition cond, DataType dt, QRegister rd, DRegister rm) {
7905     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7906     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7907     VIXL_ASSERT(allow_macro_instructions_);
7908     VIXL_ASSERT(OutsideITBlock());
7909     MacroEmissionCheckScope guard(this);
7910     ITScope it_scope(this, &cond, guard);
7911     vmovl(cond, dt, rd, rm);
7912   }
Vmovl(DataType dt,QRegister rd,DRegister rm)7913   void Vmovl(DataType dt, QRegister rd, DRegister rm) { Vmovl(al, dt, rd, rm); }
7914 
Vmovn(Condition cond,DataType dt,DRegister rd,QRegister rm)7915   void Vmovn(Condition cond, DataType dt, DRegister rd, QRegister rm) {
7916     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7917     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7918     VIXL_ASSERT(allow_macro_instructions_);
7919     VIXL_ASSERT(OutsideITBlock());
7920     MacroEmissionCheckScope guard(this);
7921     ITScope it_scope(this, &cond, guard);
7922     vmovn(cond, dt, rd, rm);
7923   }
Vmovn(DataType dt,DRegister rd,QRegister rm)7924   void Vmovn(DataType dt, DRegister rd, QRegister rm) { Vmovn(al, dt, rd, rm); }
7925 
Vmrs(Condition cond,RegisterOrAPSR_nzcv rt,SpecialFPRegister spec_reg)7926   void Vmrs(Condition cond,
7927             RegisterOrAPSR_nzcv rt,
7928             SpecialFPRegister spec_reg) {
7929     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7930     VIXL_ASSERT(allow_macro_instructions_);
7931     VIXL_ASSERT(OutsideITBlock());
7932     MacroEmissionCheckScope guard(this);
7933     ITScope it_scope(this, &cond, guard);
7934     vmrs(cond, rt, spec_reg);
7935   }
Vmrs(RegisterOrAPSR_nzcv rt,SpecialFPRegister spec_reg)7936   void Vmrs(RegisterOrAPSR_nzcv rt, SpecialFPRegister spec_reg) {
7937     Vmrs(al, rt, spec_reg);
7938   }
7939 
Vmsr(Condition cond,SpecialFPRegister spec_reg,Register rt)7940   void Vmsr(Condition cond, SpecialFPRegister spec_reg, Register rt) {
7941     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7942     VIXL_ASSERT(allow_macro_instructions_);
7943     VIXL_ASSERT(OutsideITBlock());
7944     MacroEmissionCheckScope guard(this);
7945     ITScope it_scope(this, &cond, guard);
7946     vmsr(cond, spec_reg, rt);
7947   }
Vmsr(SpecialFPRegister spec_reg,Register rt)7948   void Vmsr(SpecialFPRegister spec_reg, Register rt) { Vmsr(al, spec_reg, rt); }
7949 
Vmul(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister dm,unsigned index)7950   void Vmul(Condition cond,
7951             DataType dt,
7952             DRegister rd,
7953             DRegister rn,
7954             DRegister dm,
7955             unsigned index) {
7956     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7957     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7958     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
7959     VIXL_ASSERT(allow_macro_instructions_);
7960     VIXL_ASSERT(OutsideITBlock());
7961     MacroEmissionCheckScope guard(this);
7962     ITScope it_scope(this, &cond, guard);
7963     vmul(cond, dt, rd, rn, dm, index);
7964   }
Vmul(DataType dt,DRegister rd,DRegister rn,DRegister dm,unsigned index)7965   void Vmul(
7966       DataType dt, DRegister rd, DRegister rn, DRegister dm, unsigned index) {
7967     Vmul(al, dt, rd, rn, dm, index);
7968   }
7969 
Vmul(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegister dm,unsigned index)7970   void Vmul(Condition cond,
7971             DataType dt,
7972             QRegister rd,
7973             QRegister rn,
7974             DRegister dm,
7975             unsigned index) {
7976     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7977     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7978     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
7979     VIXL_ASSERT(allow_macro_instructions_);
7980     VIXL_ASSERT(OutsideITBlock());
7981     MacroEmissionCheckScope guard(this);
7982     ITScope it_scope(this, &cond, guard);
7983     vmul(cond, dt, rd, rn, dm, index);
7984   }
Vmul(DataType dt,QRegister rd,QRegister rn,DRegister dm,unsigned index)7985   void Vmul(
7986       DataType dt, QRegister rd, QRegister rn, DRegister dm, unsigned index) {
7987     Vmul(al, dt, rd, rn, dm, index);
7988   }
7989 
Vmul(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)7990   void Vmul(
7991       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)8001   void Vmul(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8002     Vmul(al, dt, rd, rn, rm);
8003   }
8004 
Vmul(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)8005   void Vmul(
8006       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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,QRegister rd,QRegister rn,QRegister rm)8016   void Vmul(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8017     Vmul(al, dt, rd, rn, rm);
8018   }
8019 
Vmul(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)8020   void Vmul(
8021       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8022     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8023     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8024     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8025     VIXL_ASSERT(allow_macro_instructions_);
8026     VIXL_ASSERT(OutsideITBlock());
8027     MacroEmissionCheckScope guard(this);
8028     ITScope it_scope(this, &cond, guard);
8029     vmul(cond, dt, rd, rn, rm);
8030   }
Vmul(DataType dt,SRegister rd,SRegister rn,SRegister rm)8031   void Vmul(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8032     Vmul(al, dt, rd, rn, rm);
8033   }
8034 
Vmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8035   void Vmull(Condition cond,
8036              DataType dt,
8037              QRegister rd,
8038              DRegister rn,
8039              DRegister dm,
8040              unsigned index) {
8041     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8042     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8043     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8044     VIXL_ASSERT(allow_macro_instructions_);
8045     VIXL_ASSERT(OutsideITBlock());
8046     MacroEmissionCheckScope guard(this);
8047     ITScope it_scope(this, &cond, guard);
8048     vmull(cond, dt, rd, rn, dm, index);
8049   }
Vmull(DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8050   void Vmull(
8051       DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
8052     Vmull(al, dt, rd, rn, dm, index);
8053   }
8054 
Vmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)8055   void Vmull(
8056       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8057     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8058     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8059     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8060     VIXL_ASSERT(allow_macro_instructions_);
8061     VIXL_ASSERT(OutsideITBlock());
8062     MacroEmissionCheckScope guard(this);
8063     ITScope it_scope(this, &cond, guard);
8064     vmull(cond, dt, rd, rn, rm);
8065   }
Vmull(DataType dt,QRegister rd,DRegister rn,DRegister rm)8066   void Vmull(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8067     Vmull(al, dt, rd, rn, rm);
8068   }
8069 
Vmvn(Condition cond,DataType dt,DRegister rd,const DOperand & operand)8070   void Vmvn(Condition cond,
8071             DataType dt,
8072             DRegister rd,
8073             const DOperand& operand) {
8074     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8075     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8076     VIXL_ASSERT(allow_macro_instructions_);
8077     VIXL_ASSERT(OutsideITBlock());
8078     MacroEmissionCheckScope guard(this);
8079     ITScope it_scope(this, &cond, guard);
8080     vmvn(cond, dt, rd, operand);
8081   }
Vmvn(DataType dt,DRegister rd,const DOperand & operand)8082   void Vmvn(DataType dt, DRegister rd, const DOperand& operand) {
8083     Vmvn(al, dt, rd, operand);
8084   }
8085 
Vmvn(Condition cond,DataType dt,QRegister rd,const QOperand & operand)8086   void Vmvn(Condition cond,
8087             DataType dt,
8088             QRegister rd,
8089             const QOperand& operand) {
8090     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8091     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8092     VIXL_ASSERT(allow_macro_instructions_);
8093     VIXL_ASSERT(OutsideITBlock());
8094     MacroEmissionCheckScope guard(this);
8095     ITScope it_scope(this, &cond, guard);
8096     vmvn(cond, dt, rd, operand);
8097   }
Vmvn(DataType dt,QRegister rd,const QOperand & operand)8098   void Vmvn(DataType dt, QRegister rd, const QOperand& operand) {
8099     Vmvn(al, dt, rd, operand);
8100   }
8101 
Vneg(Condition cond,DataType dt,DRegister rd,DRegister rm)8102   void Vneg(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8103     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8104     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8105     VIXL_ASSERT(allow_macro_instructions_);
8106     VIXL_ASSERT(OutsideITBlock());
8107     MacroEmissionCheckScope guard(this);
8108     ITScope it_scope(this, &cond, guard);
8109     vneg(cond, dt, rd, rm);
8110   }
Vneg(DataType dt,DRegister rd,DRegister rm)8111   void Vneg(DataType dt, DRegister rd, DRegister rm) { Vneg(al, dt, rd, rm); }
8112 
Vneg(Condition cond,DataType dt,QRegister rd,QRegister rm)8113   void Vneg(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8114     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8115     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8116     VIXL_ASSERT(allow_macro_instructions_);
8117     VIXL_ASSERT(OutsideITBlock());
8118     MacroEmissionCheckScope guard(this);
8119     ITScope it_scope(this, &cond, guard);
8120     vneg(cond, dt, rd, rm);
8121   }
Vneg(DataType dt,QRegister rd,QRegister rm)8122   void Vneg(DataType dt, QRegister rd, QRegister rm) { Vneg(al, dt, rd, rm); }
8123 
Vneg(Condition cond,DataType dt,SRegister rd,SRegister rm)8124   void Vneg(Condition cond, DataType dt, SRegister rd, SRegister rm) {
8125     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8126     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8127     VIXL_ASSERT(allow_macro_instructions_);
8128     VIXL_ASSERT(OutsideITBlock());
8129     MacroEmissionCheckScope guard(this);
8130     ITScope it_scope(this, &cond, guard);
8131     vneg(cond, dt, rd, rm);
8132   }
Vneg(DataType dt,SRegister rd,SRegister rm)8133   void Vneg(DataType dt, SRegister rd, SRegister rm) { Vneg(al, dt, rd, rm); }
8134 
Vnmla(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)8135   void Vnmla(
8136       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister 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,SRegister rd,SRegister rn,SRegister rm)8146   void Vnmla(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8147     Vnmla(al, dt, rd, rn, rm);
8148   }
8149 
Vnmla(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8150   void Vnmla(
8151       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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     vnmla(cond, dt, rd, rn, rm);
8160   }
Vnmla(DataType dt,DRegister rd,DRegister rn,DRegister rm)8161   void Vnmla(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8162     Vnmla(al, dt, rd, rn, rm);
8163   }
8164 
Vnmls(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)8165   void Vnmls(
8166       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister 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,SRegister rd,SRegister rn,SRegister rm)8176   void Vnmls(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8177     Vnmls(al, dt, rd, rn, rm);
8178   }
8179 
Vnmls(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8180   void Vnmls(
8181       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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     vnmls(cond, dt, rd, rn, rm);
8190   }
Vnmls(DataType dt,DRegister rd,DRegister rn,DRegister rm)8191   void Vnmls(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8192     Vnmls(al, dt, rd, rn, rm);
8193   }
8194 
Vnmul(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)8195   void Vnmul(
8196       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister 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,SRegister rd,SRegister rn,SRegister rm)8206   void Vnmul(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8207     Vnmul(al, dt, rd, rn, rm);
8208   }
8209 
Vnmul(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8210   void Vnmul(
8211       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8212     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8213     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8214     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8215     VIXL_ASSERT(allow_macro_instructions_);
8216     VIXL_ASSERT(OutsideITBlock());
8217     MacroEmissionCheckScope guard(this);
8218     ITScope it_scope(this, &cond, guard);
8219     vnmul(cond, dt, rd, rn, rm);
8220   }
Vnmul(DataType dt,DRegister rd,DRegister rn,DRegister rm)8221   void Vnmul(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8222     Vnmul(al, dt, rd, rn, rm);
8223   }
8224 
Vorn(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)8225   void Vorn(Condition cond,
8226             DataType dt,
8227             DRegister rd,
8228             DRegister rn,
8229             const DOperand& operand) {
8230     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8231     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8232     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8233     VIXL_ASSERT(allow_macro_instructions_);
8234     VIXL_ASSERT(OutsideITBlock());
8235     MacroEmissionCheckScope guard(this);
8236     ITScope it_scope(this, &cond, guard);
8237     vorn(cond, dt, rd, rn, operand);
8238   }
Vorn(DataType dt,DRegister rd,DRegister rn,const DOperand & operand)8239   void Vorn(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
8240     Vorn(al, dt, rd, rn, operand);
8241   }
8242 
Vorn(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)8243   void Vorn(Condition cond,
8244             DataType dt,
8245             QRegister rd,
8246             QRegister rn,
8247             const QOperand& operand) {
8248     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8249     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8250     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8251     VIXL_ASSERT(allow_macro_instructions_);
8252     VIXL_ASSERT(OutsideITBlock());
8253     MacroEmissionCheckScope guard(this);
8254     ITScope it_scope(this, &cond, guard);
8255     vorn(cond, dt, rd, rn, operand);
8256   }
Vorn(DataType dt,QRegister rd,QRegister rn,const QOperand & operand)8257   void Vorn(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
8258     Vorn(al, dt, rd, rn, operand);
8259   }
8260 
Vorr(Condition cond,DataType dt,DRegister rd,DRegister rn,const DOperand & operand)8261   void Vorr(Condition cond,
8262             DataType dt,
8263             DRegister rd,
8264             DRegister rn,
8265             const DOperand& operand) {
8266     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8267     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8268     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8269     VIXL_ASSERT(allow_macro_instructions_);
8270     VIXL_ASSERT(OutsideITBlock());
8271     MacroEmissionCheckScope guard(this);
8272     ITScope it_scope(this, &cond, guard);
8273     vorr(cond, dt, rd, rn, operand);
8274   }
Vorr(DataType dt,DRegister rd,DRegister rn,const DOperand & operand)8275   void Vorr(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
8276     Vorr(al, dt, rd, rn, operand);
8277   }
Vorr(Condition cond,DRegister rd,DRegister rn,const DOperand & operand)8278   void Vorr(Condition cond,
8279             DRegister rd,
8280             DRegister rn,
8281             const DOperand& operand) {
8282     Vorr(cond, kDataTypeValueNone, rd, rn, operand);
8283   }
Vorr(DRegister rd,DRegister rn,const DOperand & operand)8284   void Vorr(DRegister rd, DRegister rn, const DOperand& operand) {
8285     Vorr(al, kDataTypeValueNone, rd, rn, operand);
8286   }
8287 
Vorr(Condition cond,DataType dt,QRegister rd,QRegister rn,const QOperand & operand)8288   void Vorr(Condition cond,
8289             DataType dt,
8290             QRegister rd,
8291             QRegister rn,
8292             const QOperand& operand) {
8293     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8294     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8295     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8296     VIXL_ASSERT(allow_macro_instructions_);
8297     VIXL_ASSERT(OutsideITBlock());
8298     MacroEmissionCheckScope guard(this);
8299     ITScope it_scope(this, &cond, guard);
8300     vorr(cond, dt, rd, rn, operand);
8301   }
Vorr(DataType dt,QRegister rd,QRegister rn,const QOperand & operand)8302   void Vorr(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
8303     Vorr(al, dt, rd, rn, operand);
8304   }
Vorr(Condition cond,QRegister rd,QRegister rn,const QOperand & operand)8305   void Vorr(Condition cond,
8306             QRegister rd,
8307             QRegister rn,
8308             const QOperand& operand) {
8309     Vorr(cond, kDataTypeValueNone, rd, rn, operand);
8310   }
Vorr(QRegister rd,QRegister rn,const QOperand & operand)8311   void Vorr(QRegister rd, QRegister rn, const QOperand& operand) {
8312     Vorr(al, kDataTypeValueNone, rd, rn, operand);
8313   }
8314 
Vpadal(Condition cond,DataType dt,DRegister rd,DRegister rm)8315   void Vpadal(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8316     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8317     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8318     VIXL_ASSERT(allow_macro_instructions_);
8319     VIXL_ASSERT(OutsideITBlock());
8320     MacroEmissionCheckScope guard(this);
8321     ITScope it_scope(this, &cond, guard);
8322     vpadal(cond, dt, rd, rm);
8323   }
Vpadal(DataType dt,DRegister rd,DRegister rm)8324   void Vpadal(DataType dt, DRegister rd, DRegister rm) {
8325     Vpadal(al, dt, rd, rm);
8326   }
8327 
Vpadal(Condition cond,DataType dt,QRegister rd,QRegister rm)8328   void Vpadal(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8329     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
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     vpadal(cond, dt, rd, rm);
8336   }
Vpadal(DataType dt,QRegister rd,QRegister rm)8337   void Vpadal(DataType dt, QRegister rd, QRegister rm) {
8338     Vpadal(al, dt, rd, rm);
8339   }
8340 
Vpadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8341   void Vpadd(
8342       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8343     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8344     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8345     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8346     VIXL_ASSERT(allow_macro_instructions_);
8347     VIXL_ASSERT(OutsideITBlock());
8348     MacroEmissionCheckScope guard(this);
8349     ITScope it_scope(this, &cond, guard);
8350     vpadd(cond, dt, rd, rn, rm);
8351   }
Vpadd(DataType dt,DRegister rd,DRegister rn,DRegister rm)8352   void Vpadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8353     Vpadd(al, dt, rd, rn, rm);
8354   }
8355 
Vpaddl(Condition cond,DataType dt,DRegister rd,DRegister rm)8356   void Vpaddl(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8357     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8358     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8359     VIXL_ASSERT(allow_macro_instructions_);
8360     VIXL_ASSERT(OutsideITBlock());
8361     MacroEmissionCheckScope guard(this);
8362     ITScope it_scope(this, &cond, guard);
8363     vpaddl(cond, dt, rd, rm);
8364   }
Vpaddl(DataType dt,DRegister rd,DRegister rm)8365   void Vpaddl(DataType dt, DRegister rd, DRegister rm) {
8366     Vpaddl(al, dt, rd, rm);
8367   }
8368 
Vpaddl(Condition cond,DataType dt,QRegister rd,QRegister rm)8369   void Vpaddl(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8370     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
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     vpaddl(cond, dt, rd, rm);
8377   }
Vpaddl(DataType dt,QRegister rd,QRegister rm)8378   void Vpaddl(DataType dt, QRegister rd, QRegister rm) {
8379     Vpaddl(al, dt, rd, rm);
8380   }
8381 
Vpmax(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8382   void Vpmax(
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     vpmax(cond, dt, rd, rn, rm);
8392   }
Vpmax(DataType dt,DRegister rd,DRegister rn,DRegister rm)8393   void Vpmax(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8394     Vpmax(al, dt, rd, rn, rm);
8395   }
8396 
Vpmin(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8397   void Vpmin(
8398       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8399     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8400     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8401     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8402     VIXL_ASSERT(allow_macro_instructions_);
8403     VIXL_ASSERT(OutsideITBlock());
8404     MacroEmissionCheckScope guard(this);
8405     ITScope it_scope(this, &cond, guard);
8406     vpmin(cond, dt, rd, rn, rm);
8407   }
Vpmin(DataType dt,DRegister rd,DRegister rn,DRegister rm)8408   void Vpmin(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8409     Vpmin(al, dt, rd, rn, rm);
8410   }
8411 
Vpop(Condition cond,DataType dt,DRegisterList dreglist)8412   void Vpop(Condition cond, DataType dt, DRegisterList dreglist) {
8413     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
8414     VIXL_ASSERT(allow_macro_instructions_);
8415     VIXL_ASSERT(OutsideITBlock());
8416     MacroEmissionCheckScope guard(this);
8417     ITScope it_scope(this, &cond, guard);
8418     vpop(cond, dt, dreglist);
8419   }
Vpop(DataType dt,DRegisterList dreglist)8420   void Vpop(DataType dt, DRegisterList dreglist) { Vpop(al, dt, dreglist); }
Vpop(Condition cond,DRegisterList dreglist)8421   void Vpop(Condition cond, DRegisterList dreglist) {
8422     Vpop(cond, kDataTypeValueNone, dreglist);
8423   }
Vpop(DRegisterList dreglist)8424   void Vpop(DRegisterList dreglist) { Vpop(al, kDataTypeValueNone, dreglist); }
8425 
Vpop(Condition cond,DataType dt,SRegisterList sreglist)8426   void Vpop(Condition cond, DataType dt, SRegisterList sreglist) {
8427     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
8428     VIXL_ASSERT(allow_macro_instructions_);
8429     VIXL_ASSERT(OutsideITBlock());
8430     MacroEmissionCheckScope guard(this);
8431     ITScope it_scope(this, &cond, guard);
8432     vpop(cond, dt, sreglist);
8433   }
Vpop(DataType dt,SRegisterList sreglist)8434   void Vpop(DataType dt, SRegisterList sreglist) { Vpop(al, dt, sreglist); }
Vpop(Condition cond,SRegisterList sreglist)8435   void Vpop(Condition cond, SRegisterList sreglist) {
8436     Vpop(cond, kDataTypeValueNone, sreglist);
8437   }
Vpop(SRegisterList sreglist)8438   void Vpop(SRegisterList sreglist) { Vpop(al, kDataTypeValueNone, sreglist); }
8439 
Vpush(Condition cond,DataType dt,DRegisterList dreglist)8440   void Vpush(Condition cond, DataType dt, DRegisterList dreglist) {
8441     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
8442     VIXL_ASSERT(allow_macro_instructions_);
8443     VIXL_ASSERT(OutsideITBlock());
8444     MacroEmissionCheckScope guard(this);
8445     ITScope it_scope(this, &cond, guard);
8446     vpush(cond, dt, dreglist);
8447   }
Vpush(DataType dt,DRegisterList dreglist)8448   void Vpush(DataType dt, DRegisterList dreglist) { Vpush(al, dt, dreglist); }
Vpush(Condition cond,DRegisterList dreglist)8449   void Vpush(Condition cond, DRegisterList dreglist) {
8450     Vpush(cond, kDataTypeValueNone, dreglist);
8451   }
Vpush(DRegisterList dreglist)8452   void Vpush(DRegisterList dreglist) {
8453     Vpush(al, kDataTypeValueNone, dreglist);
8454   }
8455 
Vpush(Condition cond,DataType dt,SRegisterList sreglist)8456   void Vpush(Condition cond, DataType dt, SRegisterList sreglist) {
8457     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
8458     VIXL_ASSERT(allow_macro_instructions_);
8459     VIXL_ASSERT(OutsideITBlock());
8460     MacroEmissionCheckScope guard(this);
8461     ITScope it_scope(this, &cond, guard);
8462     vpush(cond, dt, sreglist);
8463   }
Vpush(DataType dt,SRegisterList sreglist)8464   void Vpush(DataType dt, SRegisterList sreglist) { Vpush(al, dt, sreglist); }
Vpush(Condition cond,SRegisterList sreglist)8465   void Vpush(Condition cond, SRegisterList sreglist) {
8466     Vpush(cond, kDataTypeValueNone, sreglist);
8467   }
Vpush(SRegisterList sreglist)8468   void Vpush(SRegisterList sreglist) {
8469     Vpush(al, kDataTypeValueNone, sreglist);
8470   }
8471 
Vqabs(Condition cond,DataType dt,DRegister rd,DRegister rm)8472   void Vqabs(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8473     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8474     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8475     VIXL_ASSERT(allow_macro_instructions_);
8476     VIXL_ASSERT(OutsideITBlock());
8477     MacroEmissionCheckScope guard(this);
8478     ITScope it_scope(this, &cond, guard);
8479     vqabs(cond, dt, rd, rm);
8480   }
Vqabs(DataType dt,DRegister rd,DRegister rm)8481   void Vqabs(DataType dt, DRegister rd, DRegister rm) { Vqabs(al, dt, rd, rm); }
8482 
Vqabs(Condition cond,DataType dt,QRegister rd,QRegister rm)8483   void Vqabs(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8484     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8485     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8486     VIXL_ASSERT(allow_macro_instructions_);
8487     VIXL_ASSERT(OutsideITBlock());
8488     MacroEmissionCheckScope guard(this);
8489     ITScope it_scope(this, &cond, guard);
8490     vqabs(cond, dt, rd, rm);
8491   }
Vqabs(DataType dt,QRegister rd,QRegister rm)8492   void Vqabs(DataType dt, QRegister rd, QRegister rm) { Vqabs(al, dt, rd, rm); }
8493 
Vqadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8494   void Vqadd(
8495       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)8505   void Vqadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8506     Vqadd(al, dt, rd, rn, rm);
8507   }
8508 
Vqadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)8509   void Vqadd(
8510       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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     vqadd(cond, dt, rd, rn, rm);
8519   }
Vqadd(DataType dt,QRegister rd,QRegister rn,QRegister rm)8520   void Vqadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8521     Vqadd(al, dt, rd, rn, rm);
8522   }
8523 
Vqdmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)8524   void Vqdmlal(
8525       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8526     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8527     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8528     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8529     VIXL_ASSERT(allow_macro_instructions_);
8530     VIXL_ASSERT(OutsideITBlock());
8531     MacroEmissionCheckScope guard(this);
8532     ITScope it_scope(this, &cond, guard);
8533     vqdmlal(cond, dt, rd, rn, rm);
8534   }
Vqdmlal(DataType dt,QRegister rd,DRegister rn,DRegister rm)8535   void Vqdmlal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8536     Vqdmlal(al, dt, rd, rn, rm);
8537   }
8538 
Vqdmlal(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8539   void Vqdmlal(Condition cond,
8540                DataType dt,
8541                QRegister rd,
8542                DRegister rn,
8543                DRegister dm,
8544                unsigned index) {
8545     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8546     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8547     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8548     VIXL_ASSERT(allow_macro_instructions_);
8549     VIXL_ASSERT(OutsideITBlock());
8550     MacroEmissionCheckScope guard(this);
8551     ITScope it_scope(this, &cond, guard);
8552     vqdmlal(cond, dt, rd, rn, dm, index);
8553   }
Vqdmlal(DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8554   void Vqdmlal(
8555       DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
8556     Vqdmlal(al, dt, rd, rn, dm, index);
8557   }
8558 
Vqdmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)8559   void Vqdmlsl(
8560       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8561     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8562     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8563     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8564     VIXL_ASSERT(allow_macro_instructions_);
8565     VIXL_ASSERT(OutsideITBlock());
8566     MacroEmissionCheckScope guard(this);
8567     ITScope it_scope(this, &cond, guard);
8568     vqdmlsl(cond, dt, rd, rn, rm);
8569   }
Vqdmlsl(DataType dt,QRegister rd,DRegister rn,DRegister rm)8570   void Vqdmlsl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8571     Vqdmlsl(al, dt, rd, rn, rm);
8572   }
8573 
Vqdmlsl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8574   void Vqdmlsl(Condition cond,
8575                DataType dt,
8576                QRegister rd,
8577                DRegister rn,
8578                DRegister dm,
8579                unsigned index) {
8580     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8581     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8582     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8583     VIXL_ASSERT(allow_macro_instructions_);
8584     VIXL_ASSERT(OutsideITBlock());
8585     MacroEmissionCheckScope guard(this);
8586     ITScope it_scope(this, &cond, guard);
8587     vqdmlsl(cond, dt, rd, rn, dm, index);
8588   }
Vqdmlsl(DataType dt,QRegister rd,DRegister rn,DRegister dm,unsigned index)8589   void Vqdmlsl(
8590       DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
8591     Vqdmlsl(al, dt, rd, rn, dm, index);
8592   }
8593 
Vqdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8594   void Vqdmulh(
8595       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)8605   void Vqdmulh(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8606     Vqdmulh(al, dt, rd, rn, rm);
8607   }
8608 
Vqdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)8609   void Vqdmulh(
8610       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8611     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8612     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8613     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8614     VIXL_ASSERT(allow_macro_instructions_);
8615     VIXL_ASSERT(OutsideITBlock());
8616     MacroEmissionCheckScope guard(this);
8617     ITScope it_scope(this, &cond, guard);
8618     vqdmulh(cond, dt, rd, rn, rm);
8619   }
Vqdmulh(DataType dt,QRegister rd,QRegister rn,QRegister rm)8620   void Vqdmulh(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8621     Vqdmulh(al, dt, rd, rn, rm);
8622   }
8623 
Vqdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)8624   void Vqdmulh(Condition cond,
8625                DataType dt,
8626                DRegister rd,
8627                DRegister rn,
8628                DRegisterLane rm) {
8629     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8630     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8631     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8632     VIXL_ASSERT(allow_macro_instructions_);
8633     VIXL_ASSERT(OutsideITBlock());
8634     MacroEmissionCheckScope guard(this);
8635     ITScope it_scope(this, &cond, guard);
8636     vqdmulh(cond, dt, rd, rn, rm);
8637   }
Vqdmulh(DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)8638   void Vqdmulh(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
8639     Vqdmulh(al, dt, rd, rn, rm);
8640   }
8641 
Vqdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)8642   void Vqdmulh(Condition cond,
8643                DataType dt,
8644                QRegister rd,
8645                QRegister rn,
8646                DRegisterLane 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     vqdmulh(cond, dt, rd, rn, rm);
8655   }
Vqdmulh(DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)8656   void Vqdmulh(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
8657     Vqdmulh(al, dt, rd, rn, rm);
8658   }
8659 
Vqdmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)8660   void Vqdmull(
8661       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8662     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8663     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8664     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8665     VIXL_ASSERT(allow_macro_instructions_);
8666     VIXL_ASSERT(OutsideITBlock());
8667     MacroEmissionCheckScope guard(this);
8668     ITScope it_scope(this, &cond, guard);
8669     vqdmull(cond, dt, rd, rn, rm);
8670   }
Vqdmull(DataType dt,QRegister rd,DRegister rn,DRegister rm)8671   void Vqdmull(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8672     Vqdmull(al, dt, rd, rn, rm);
8673   }
8674 
Vqdmull(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)8675   void Vqdmull(Condition cond,
8676                DataType dt,
8677                QRegister rd,
8678                DRegister rn,
8679                DRegisterLane rm) {
8680     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8681     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8682     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8683     VIXL_ASSERT(allow_macro_instructions_);
8684     VIXL_ASSERT(OutsideITBlock());
8685     MacroEmissionCheckScope guard(this);
8686     ITScope it_scope(this, &cond, guard);
8687     vqdmull(cond, dt, rd, rn, rm);
8688   }
Vqdmull(DataType dt,QRegister rd,DRegister rn,DRegisterLane rm)8689   void Vqdmull(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
8690     Vqdmull(al, dt, rd, rn, rm);
8691   }
8692 
Vqmovn(Condition cond,DataType dt,DRegister rd,QRegister rm)8693   void Vqmovn(Condition cond, DataType dt, DRegister rd, QRegister rm) {
8694     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8695     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8696     VIXL_ASSERT(allow_macro_instructions_);
8697     VIXL_ASSERT(OutsideITBlock());
8698     MacroEmissionCheckScope guard(this);
8699     ITScope it_scope(this, &cond, guard);
8700     vqmovn(cond, dt, rd, rm);
8701   }
Vqmovn(DataType dt,DRegister rd,QRegister rm)8702   void Vqmovn(DataType dt, DRegister rd, QRegister rm) {
8703     Vqmovn(al, dt, rd, rm);
8704   }
8705 
Vqmovun(Condition cond,DataType dt,DRegister rd,QRegister rm)8706   void Vqmovun(Condition cond, DataType dt, DRegister rd, QRegister rm) {
8707     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8708     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8709     VIXL_ASSERT(allow_macro_instructions_);
8710     VIXL_ASSERT(OutsideITBlock());
8711     MacroEmissionCheckScope guard(this);
8712     ITScope it_scope(this, &cond, guard);
8713     vqmovun(cond, dt, rd, rm);
8714   }
Vqmovun(DataType dt,DRegister rd,QRegister rm)8715   void Vqmovun(DataType dt, DRegister rd, QRegister rm) {
8716     Vqmovun(al, dt, rd, rm);
8717   }
8718 
Vqneg(Condition cond,DataType dt,DRegister rd,DRegister rm)8719   void Vqneg(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8720     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8721     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8722     VIXL_ASSERT(allow_macro_instructions_);
8723     VIXL_ASSERT(OutsideITBlock());
8724     MacroEmissionCheckScope guard(this);
8725     ITScope it_scope(this, &cond, guard);
8726     vqneg(cond, dt, rd, rm);
8727   }
Vqneg(DataType dt,DRegister rd,DRegister rm)8728   void Vqneg(DataType dt, DRegister rd, DRegister rm) { Vqneg(al, dt, rd, rm); }
8729 
Vqneg(Condition cond,DataType dt,QRegister rd,QRegister rm)8730   void Vqneg(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8731     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8732     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8733     VIXL_ASSERT(allow_macro_instructions_);
8734     VIXL_ASSERT(OutsideITBlock());
8735     MacroEmissionCheckScope guard(this);
8736     ITScope it_scope(this, &cond, guard);
8737     vqneg(cond, dt, rd, rm);
8738   }
Vqneg(DataType dt,QRegister rd,QRegister rm)8739   void Vqneg(DataType dt, QRegister rd, QRegister rm) { Vqneg(al, dt, rd, rm); }
8740 
Vqrdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8741   void Vqrdmulh(
8742       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)8752   void Vqrdmulh(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8753     Vqrdmulh(al, dt, rd, rn, rm);
8754   }
8755 
Vqrdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)8756   void Vqrdmulh(
8757       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8758     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8759     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8760     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8761     VIXL_ASSERT(allow_macro_instructions_);
8762     VIXL_ASSERT(OutsideITBlock());
8763     MacroEmissionCheckScope guard(this);
8764     ITScope it_scope(this, &cond, guard);
8765     vqrdmulh(cond, dt, rd, rn, rm);
8766   }
Vqrdmulh(DataType dt,QRegister rd,QRegister rn,QRegister rm)8767   void Vqrdmulh(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8768     Vqrdmulh(al, dt, rd, rn, rm);
8769   }
8770 
Vqrdmulh(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)8771   void Vqrdmulh(Condition cond,
8772                 DataType dt,
8773                 DRegister rd,
8774                 DRegister rn,
8775                 DRegisterLane rm) {
8776     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8777     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8778     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8779     VIXL_ASSERT(allow_macro_instructions_);
8780     VIXL_ASSERT(OutsideITBlock());
8781     MacroEmissionCheckScope guard(this);
8782     ITScope it_scope(this, &cond, guard);
8783     vqrdmulh(cond, dt, rd, rn, rm);
8784   }
Vqrdmulh(DataType dt,DRegister rd,DRegister rn,DRegisterLane rm)8785   void Vqrdmulh(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
8786     Vqrdmulh(al, dt, rd, rn, rm);
8787   }
8788 
Vqrdmulh(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)8789   void Vqrdmulh(Condition cond,
8790                 DataType dt,
8791                 QRegister rd,
8792                 QRegister rn,
8793                 DRegisterLane rm) {
8794     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8795     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8796     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8797     VIXL_ASSERT(allow_macro_instructions_);
8798     VIXL_ASSERT(OutsideITBlock());
8799     MacroEmissionCheckScope guard(this);
8800     ITScope it_scope(this, &cond, guard);
8801     vqrdmulh(cond, dt, rd, rn, rm);
8802   }
Vqrdmulh(DataType dt,QRegister rd,QRegister rn,DRegisterLane rm)8803   void Vqrdmulh(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
8804     Vqrdmulh(al, dt, rd, rn, rm);
8805   }
8806 
Vqrshl(Condition cond,DataType dt,DRegister rd,DRegister rm,DRegister rn)8807   void Vqrshl(
8808       Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister 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,DRegister rd,DRegister rm,DRegister rn)8818   void Vqrshl(DataType dt, DRegister rd, DRegister rm, DRegister rn) {
8819     Vqrshl(al, dt, rd, rm, rn);
8820   }
8821 
Vqrshl(Condition cond,DataType dt,QRegister rd,QRegister rm,QRegister rn)8822   void Vqrshl(
8823       Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
8824     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8825     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8826     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8827     VIXL_ASSERT(allow_macro_instructions_);
8828     VIXL_ASSERT(OutsideITBlock());
8829     MacroEmissionCheckScope guard(this);
8830     ITScope it_scope(this, &cond, guard);
8831     vqrshl(cond, dt, rd, rm, rn);
8832   }
Vqrshl(DataType dt,QRegister rd,QRegister rm,QRegister rn)8833   void Vqrshl(DataType dt, QRegister rd, QRegister rm, QRegister rn) {
8834     Vqrshl(al, dt, rd, rm, rn);
8835   }
8836 
Vqrshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8837   void Vqrshrn(Condition cond,
8838                DataType dt,
8839                DRegister rd,
8840                QRegister rm,
8841                const QOperand& operand) {
8842     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8843     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8844     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8845     VIXL_ASSERT(allow_macro_instructions_);
8846     VIXL_ASSERT(OutsideITBlock());
8847     MacroEmissionCheckScope guard(this);
8848     ITScope it_scope(this, &cond, guard);
8849     vqrshrn(cond, dt, rd, rm, operand);
8850   }
Vqrshrn(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8851   void Vqrshrn(DataType dt,
8852                DRegister rd,
8853                QRegister rm,
8854                const QOperand& operand) {
8855     Vqrshrn(al, dt, rd, rm, operand);
8856   }
8857 
Vqrshrun(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8858   void Vqrshrun(Condition cond,
8859                 DataType dt,
8860                 DRegister rd,
8861                 QRegister rm,
8862                 const QOperand& operand) {
8863     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8864     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8865     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8866     VIXL_ASSERT(allow_macro_instructions_);
8867     VIXL_ASSERT(OutsideITBlock());
8868     MacroEmissionCheckScope guard(this);
8869     ITScope it_scope(this, &cond, guard);
8870     vqrshrun(cond, dt, rd, rm, operand);
8871   }
Vqrshrun(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8872   void Vqrshrun(DataType dt,
8873                 DRegister rd,
8874                 QRegister rm,
8875                 const QOperand& operand) {
8876     Vqrshrun(al, dt, rd, rm, operand);
8877   }
8878 
Vqshl(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)8879   void Vqshl(Condition cond,
8880              DataType dt,
8881              DRegister rd,
8882              DRegister rm,
8883              const DOperand& operand) {
8884     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8885     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8886     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8887     VIXL_ASSERT(allow_macro_instructions_);
8888     VIXL_ASSERT(OutsideITBlock());
8889     MacroEmissionCheckScope guard(this);
8890     ITScope it_scope(this, &cond, guard);
8891     vqshl(cond, dt, rd, rm, operand);
8892   }
Vqshl(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)8893   void Vqshl(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
8894     Vqshl(al, dt, rd, rm, operand);
8895   }
8896 
Vqshl(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)8897   void Vqshl(Condition cond,
8898              DataType dt,
8899              QRegister rd,
8900              QRegister rm,
8901              const QOperand& operand) {
8902     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8903     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8904     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8905     VIXL_ASSERT(allow_macro_instructions_);
8906     VIXL_ASSERT(OutsideITBlock());
8907     MacroEmissionCheckScope guard(this);
8908     ITScope it_scope(this, &cond, guard);
8909     vqshl(cond, dt, rd, rm, operand);
8910   }
Vqshl(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)8911   void Vqshl(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
8912     Vqshl(al, dt, rd, rm, operand);
8913   }
8914 
Vqshlu(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)8915   void Vqshlu(Condition cond,
8916               DataType dt,
8917               DRegister rd,
8918               DRegister rm,
8919               const DOperand& operand) {
8920     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8921     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8922     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8923     VIXL_ASSERT(allow_macro_instructions_);
8924     VIXL_ASSERT(OutsideITBlock());
8925     MacroEmissionCheckScope guard(this);
8926     ITScope it_scope(this, &cond, guard);
8927     vqshlu(cond, dt, rd, rm, operand);
8928   }
Vqshlu(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)8929   void Vqshlu(DataType dt,
8930               DRegister rd,
8931               DRegister rm,
8932               const DOperand& operand) {
8933     Vqshlu(al, dt, rd, rm, operand);
8934   }
8935 
Vqshlu(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)8936   void Vqshlu(Condition cond,
8937               DataType dt,
8938               QRegister rd,
8939               QRegister rm,
8940               const QOperand& operand) {
8941     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8942     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8943     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8944     VIXL_ASSERT(allow_macro_instructions_);
8945     VIXL_ASSERT(OutsideITBlock());
8946     MacroEmissionCheckScope guard(this);
8947     ITScope it_scope(this, &cond, guard);
8948     vqshlu(cond, dt, rd, rm, operand);
8949   }
Vqshlu(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)8950   void Vqshlu(DataType dt,
8951               QRegister rd,
8952               QRegister rm,
8953               const QOperand& operand) {
8954     Vqshlu(al, dt, rd, rm, operand);
8955   }
8956 
Vqshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8957   void Vqshrn(Condition cond,
8958               DataType dt,
8959               DRegister rd,
8960               QRegister rm,
8961               const QOperand& operand) {
8962     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8963     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8964     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8965     VIXL_ASSERT(allow_macro_instructions_);
8966     VIXL_ASSERT(OutsideITBlock());
8967     MacroEmissionCheckScope guard(this);
8968     ITScope it_scope(this, &cond, guard);
8969     vqshrn(cond, dt, rd, rm, operand);
8970   }
Vqshrn(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8971   void Vqshrn(DataType dt,
8972               DRegister rd,
8973               QRegister rm,
8974               const QOperand& operand) {
8975     Vqshrn(al, dt, rd, rm, operand);
8976   }
8977 
Vqshrun(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8978   void Vqshrun(Condition cond,
8979                DataType dt,
8980                DRegister rd,
8981                QRegister rm,
8982                const QOperand& operand) {
8983     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8984     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8985     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8986     VIXL_ASSERT(allow_macro_instructions_);
8987     VIXL_ASSERT(OutsideITBlock());
8988     MacroEmissionCheckScope guard(this);
8989     ITScope it_scope(this, &cond, guard);
8990     vqshrun(cond, dt, rd, rm, operand);
8991   }
Vqshrun(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)8992   void Vqshrun(DataType dt,
8993                DRegister rd,
8994                QRegister rm,
8995                const QOperand& operand) {
8996     Vqshrun(al, dt, rd, rm, operand);
8997   }
8998 
Vqsub(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)8999   void Vqsub(
9000       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)9010   void Vqsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9011     Vqsub(al, dt, rd, rn, rm);
9012   }
9013 
Vqsub(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)9014   void Vqsub(
9015       Condition cond, DataType dt, QRegister 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     vqsub(cond, dt, rd, rn, rm);
9024   }
Vqsub(DataType dt,QRegister rd,QRegister rn,QRegister rm)9025   void Vqsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9026     Vqsub(al, dt, rd, rn, rm);
9027   }
9028 
Vraddhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)9029   void Vraddhn(
9030       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9031     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9032     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9033     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9034     VIXL_ASSERT(allow_macro_instructions_);
9035     VIXL_ASSERT(OutsideITBlock());
9036     MacroEmissionCheckScope guard(this);
9037     ITScope it_scope(this, &cond, guard);
9038     vraddhn(cond, dt, rd, rn, rm);
9039   }
Vraddhn(DataType dt,DRegister rd,QRegister rn,QRegister rm)9040   void Vraddhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9041     Vraddhn(al, dt, rd, rn, rm);
9042   }
9043 
Vrecpe(Condition cond,DataType dt,DRegister rd,DRegister rm)9044   void Vrecpe(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9045     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9046     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9047     VIXL_ASSERT(allow_macro_instructions_);
9048     VIXL_ASSERT(OutsideITBlock());
9049     MacroEmissionCheckScope guard(this);
9050     ITScope it_scope(this, &cond, guard);
9051     vrecpe(cond, dt, rd, rm);
9052   }
Vrecpe(DataType dt,DRegister rd,DRegister rm)9053   void Vrecpe(DataType dt, DRegister rd, DRegister rm) {
9054     Vrecpe(al, dt, rd, rm);
9055   }
9056 
Vrecpe(Condition cond,DataType dt,QRegister rd,QRegister rm)9057   void Vrecpe(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9058     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
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     vrecpe(cond, dt, rd, rm);
9065   }
Vrecpe(DataType dt,QRegister rd,QRegister rm)9066   void Vrecpe(DataType dt, QRegister rd, QRegister rm) {
9067     Vrecpe(al, dt, rd, rm);
9068   }
9069 
Vrecps(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)9070   void Vrecps(
9071       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)9081   void Vrecps(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9082     Vrecps(al, dt, rd, rn, rm);
9083   }
9084 
Vrecps(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)9085   void Vrecps(
9086       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9087     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9088     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9089     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9090     VIXL_ASSERT(allow_macro_instructions_);
9091     VIXL_ASSERT(OutsideITBlock());
9092     MacroEmissionCheckScope guard(this);
9093     ITScope it_scope(this, &cond, guard);
9094     vrecps(cond, dt, rd, rn, rm);
9095   }
Vrecps(DataType dt,QRegister rd,QRegister rn,QRegister rm)9096   void Vrecps(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9097     Vrecps(al, dt, rd, rn, rm);
9098   }
9099 
Vrev16(Condition cond,DataType dt,DRegister rd,DRegister rm)9100   void Vrev16(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9101     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9102     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9103     VIXL_ASSERT(allow_macro_instructions_);
9104     VIXL_ASSERT(OutsideITBlock());
9105     MacroEmissionCheckScope guard(this);
9106     ITScope it_scope(this, &cond, guard);
9107     vrev16(cond, dt, rd, rm);
9108   }
Vrev16(DataType dt,DRegister rd,DRegister rm)9109   void Vrev16(DataType dt, DRegister rd, DRegister rm) {
9110     Vrev16(al, dt, rd, rm);
9111   }
9112 
Vrev16(Condition cond,DataType dt,QRegister rd,QRegister rm)9113   void Vrev16(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9114     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9115     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9116     VIXL_ASSERT(allow_macro_instructions_);
9117     VIXL_ASSERT(OutsideITBlock());
9118     MacroEmissionCheckScope guard(this);
9119     ITScope it_scope(this, &cond, guard);
9120     vrev16(cond, dt, rd, rm);
9121   }
Vrev16(DataType dt,QRegister rd,QRegister rm)9122   void Vrev16(DataType dt, QRegister rd, QRegister rm) {
9123     Vrev16(al, dt, rd, rm);
9124   }
9125 
Vrev32(Condition cond,DataType dt,DRegister rd,DRegister rm)9126   void Vrev32(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9127     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9128     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9129     VIXL_ASSERT(allow_macro_instructions_);
9130     VIXL_ASSERT(OutsideITBlock());
9131     MacroEmissionCheckScope guard(this);
9132     ITScope it_scope(this, &cond, guard);
9133     vrev32(cond, dt, rd, rm);
9134   }
Vrev32(DataType dt,DRegister rd,DRegister rm)9135   void Vrev32(DataType dt, DRegister rd, DRegister rm) {
9136     Vrev32(al, dt, rd, rm);
9137   }
9138 
Vrev32(Condition cond,DataType dt,QRegister rd,QRegister rm)9139   void Vrev32(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9140     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9141     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9142     VIXL_ASSERT(allow_macro_instructions_);
9143     VIXL_ASSERT(OutsideITBlock());
9144     MacroEmissionCheckScope guard(this);
9145     ITScope it_scope(this, &cond, guard);
9146     vrev32(cond, dt, rd, rm);
9147   }
Vrev32(DataType dt,QRegister rd,QRegister rm)9148   void Vrev32(DataType dt, QRegister rd, QRegister rm) {
9149     Vrev32(al, dt, rd, rm);
9150   }
9151 
Vrev64(Condition cond,DataType dt,DRegister rd,DRegister rm)9152   void Vrev64(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9153     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9154     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9155     VIXL_ASSERT(allow_macro_instructions_);
9156     VIXL_ASSERT(OutsideITBlock());
9157     MacroEmissionCheckScope guard(this);
9158     ITScope it_scope(this, &cond, guard);
9159     vrev64(cond, dt, rd, rm);
9160   }
Vrev64(DataType dt,DRegister rd,DRegister rm)9161   void Vrev64(DataType dt, DRegister rd, DRegister rm) {
9162     Vrev64(al, dt, rd, rm);
9163   }
9164 
Vrev64(Condition cond,DataType dt,QRegister rd,QRegister rm)9165   void Vrev64(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9166     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
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     vrev64(cond, dt, rd, rm);
9173   }
Vrev64(DataType dt,QRegister rd,QRegister rm)9174   void Vrev64(DataType dt, QRegister rd, QRegister rm) {
9175     Vrev64(al, dt, rd, rm);
9176   }
9177 
Vrhadd(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)9178   void Vrhadd(
9179       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)9189   void Vrhadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9190     Vrhadd(al, dt, rd, rn, rm);
9191   }
9192 
Vrhadd(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)9193   void Vrhadd(
9194       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9195     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9196     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9197     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9198     VIXL_ASSERT(allow_macro_instructions_);
9199     VIXL_ASSERT(OutsideITBlock());
9200     MacroEmissionCheckScope guard(this);
9201     ITScope it_scope(this, &cond, guard);
9202     vrhadd(cond, dt, rd, rn, rm);
9203   }
Vrhadd(DataType dt,QRegister rd,QRegister rn,QRegister rm)9204   void Vrhadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9205     Vrhadd(al, dt, rd, rn, rm);
9206   }
9207 
Vrinta(DataType dt,DRegister rd,DRegister rm)9208   void Vrinta(DataType dt, DRegister rd, DRegister rm) {
9209     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9210     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9211     VIXL_ASSERT(allow_macro_instructions_);
9212     VIXL_ASSERT(OutsideITBlock());
9213     MacroEmissionCheckScope guard(this);
9214     vrinta(dt, rd, rm);
9215   }
9216 
Vrinta(DataType dt,QRegister rd,QRegister rm)9217   void Vrinta(DataType dt, QRegister rd, QRegister rm) {
9218     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9219     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9220     VIXL_ASSERT(allow_macro_instructions_);
9221     VIXL_ASSERT(OutsideITBlock());
9222     MacroEmissionCheckScope guard(this);
9223     vrinta(dt, rd, rm);
9224   }
9225 
Vrinta(DataType dt,SRegister rd,SRegister rm)9226   void Vrinta(DataType dt, SRegister rd, SRegister rm) {
9227     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9228     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9229     VIXL_ASSERT(allow_macro_instructions_);
9230     VIXL_ASSERT(OutsideITBlock());
9231     MacroEmissionCheckScope guard(this);
9232     vrinta(dt, rd, rm);
9233   }
9234 
Vrintm(DataType dt,DRegister rd,DRegister rm)9235   void Vrintm(DataType dt, DRegister rd, DRegister rm) {
9236     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9237     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9238     VIXL_ASSERT(allow_macro_instructions_);
9239     VIXL_ASSERT(OutsideITBlock());
9240     MacroEmissionCheckScope guard(this);
9241     vrintm(dt, rd, rm);
9242   }
9243 
Vrintm(DataType dt,QRegister rd,QRegister rm)9244   void Vrintm(DataType dt, QRegister rd, QRegister rm) {
9245     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9246     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9247     VIXL_ASSERT(allow_macro_instructions_);
9248     VIXL_ASSERT(OutsideITBlock());
9249     MacroEmissionCheckScope guard(this);
9250     vrintm(dt, rd, rm);
9251   }
9252 
Vrintm(DataType dt,SRegister rd,SRegister rm)9253   void Vrintm(DataType dt, SRegister rd, SRegister rm) {
9254     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9255     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9256     VIXL_ASSERT(allow_macro_instructions_);
9257     VIXL_ASSERT(OutsideITBlock());
9258     MacroEmissionCheckScope guard(this);
9259     vrintm(dt, rd, rm);
9260   }
9261 
Vrintn(DataType dt,DRegister rd,DRegister rm)9262   void Vrintn(DataType dt, DRegister rd, DRegister rm) {
9263     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9264     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9265     VIXL_ASSERT(allow_macro_instructions_);
9266     VIXL_ASSERT(OutsideITBlock());
9267     MacroEmissionCheckScope guard(this);
9268     vrintn(dt, rd, rm);
9269   }
9270 
Vrintn(DataType dt,QRegister rd,QRegister rm)9271   void Vrintn(DataType dt, QRegister rd, QRegister rm) {
9272     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9273     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9274     VIXL_ASSERT(allow_macro_instructions_);
9275     VIXL_ASSERT(OutsideITBlock());
9276     MacroEmissionCheckScope guard(this);
9277     vrintn(dt, rd, rm);
9278   }
9279 
Vrintn(DataType dt,SRegister rd,SRegister rm)9280   void Vrintn(DataType dt, SRegister rd, SRegister rm) {
9281     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9282     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9283     VIXL_ASSERT(allow_macro_instructions_);
9284     VIXL_ASSERT(OutsideITBlock());
9285     MacroEmissionCheckScope guard(this);
9286     vrintn(dt, rd, rm);
9287   }
9288 
Vrintp(DataType dt,DRegister rd,DRegister rm)9289   void Vrintp(DataType dt, DRegister rd, DRegister rm) {
9290     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9291     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9292     VIXL_ASSERT(allow_macro_instructions_);
9293     VIXL_ASSERT(OutsideITBlock());
9294     MacroEmissionCheckScope guard(this);
9295     vrintp(dt, rd, rm);
9296   }
9297 
Vrintp(DataType dt,QRegister rd,QRegister rm)9298   void Vrintp(DataType dt, QRegister rd, QRegister rm) {
9299     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9300     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9301     VIXL_ASSERT(allow_macro_instructions_);
9302     VIXL_ASSERT(OutsideITBlock());
9303     MacroEmissionCheckScope guard(this);
9304     vrintp(dt, rd, rm);
9305   }
9306 
Vrintp(DataType dt,SRegister rd,SRegister rm)9307   void Vrintp(DataType dt, SRegister rd, SRegister rm) {
9308     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9309     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9310     VIXL_ASSERT(allow_macro_instructions_);
9311     VIXL_ASSERT(OutsideITBlock());
9312     MacroEmissionCheckScope guard(this);
9313     vrintp(dt, rd, rm);
9314   }
9315 
Vrintr(Condition cond,DataType dt,SRegister rd,SRegister rm)9316   void Vrintr(Condition cond, DataType dt, SRegister rd, SRegister rm) {
9317     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9318     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9319     VIXL_ASSERT(allow_macro_instructions_);
9320     VIXL_ASSERT(OutsideITBlock());
9321     MacroEmissionCheckScope guard(this);
9322     ITScope it_scope(this, &cond, guard);
9323     vrintr(cond, dt, rd, rm);
9324   }
Vrintr(DataType dt,SRegister rd,SRegister rm)9325   void Vrintr(DataType dt, SRegister rd, SRegister rm) {
9326     Vrintr(al, dt, rd, rm);
9327   }
9328 
Vrintr(Condition cond,DataType dt,DRegister rd,DRegister rm)9329   void Vrintr(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9330     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9331     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9332     VIXL_ASSERT(allow_macro_instructions_);
9333     VIXL_ASSERT(OutsideITBlock());
9334     MacroEmissionCheckScope guard(this);
9335     ITScope it_scope(this, &cond, guard);
9336     vrintr(cond, dt, rd, rm);
9337   }
Vrintr(DataType dt,DRegister rd,DRegister rm)9338   void Vrintr(DataType dt, DRegister rd, DRegister rm) {
9339     Vrintr(al, dt, rd, rm);
9340   }
9341 
Vrintx(Condition cond,DataType dt,DRegister rd,DRegister rm)9342   void Vrintx(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9343     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9344     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9345     VIXL_ASSERT(allow_macro_instructions_);
9346     VIXL_ASSERT(OutsideITBlock());
9347     MacroEmissionCheckScope guard(this);
9348     ITScope it_scope(this, &cond, guard);
9349     vrintx(cond, dt, rd, rm);
9350   }
Vrintx(DataType dt,DRegister rd,DRegister rm)9351   void Vrintx(DataType dt, DRegister rd, DRegister rm) {
9352     Vrintx(al, dt, rd, rm);
9353   }
9354 
Vrintx(DataType dt,QRegister rd,QRegister rm)9355   void Vrintx(DataType dt, QRegister rd, QRegister rm) {
9356     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9357     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9358     VIXL_ASSERT(allow_macro_instructions_);
9359     VIXL_ASSERT(OutsideITBlock());
9360     MacroEmissionCheckScope guard(this);
9361     vrintx(dt, rd, rm);
9362   }
9363 
Vrintx(Condition cond,DataType dt,SRegister rd,SRegister rm)9364   void Vrintx(Condition cond, DataType dt, SRegister rd, SRegister rm) {
9365     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9366     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9367     VIXL_ASSERT(allow_macro_instructions_);
9368     VIXL_ASSERT(OutsideITBlock());
9369     MacroEmissionCheckScope guard(this);
9370     ITScope it_scope(this, &cond, guard);
9371     vrintx(cond, dt, rd, rm);
9372   }
Vrintx(DataType dt,SRegister rd,SRegister rm)9373   void Vrintx(DataType dt, SRegister rd, SRegister rm) {
9374     Vrintx(al, dt, rd, rm);
9375   }
9376 
Vrintz(Condition cond,DataType dt,DRegister rd,DRegister rm)9377   void Vrintz(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9378     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9379     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9380     VIXL_ASSERT(allow_macro_instructions_);
9381     VIXL_ASSERT(OutsideITBlock());
9382     MacroEmissionCheckScope guard(this);
9383     ITScope it_scope(this, &cond, guard);
9384     vrintz(cond, dt, rd, rm);
9385   }
Vrintz(DataType dt,DRegister rd,DRegister rm)9386   void Vrintz(DataType dt, DRegister rd, DRegister rm) {
9387     Vrintz(al, dt, rd, rm);
9388   }
9389 
Vrintz(DataType dt,QRegister rd,QRegister rm)9390   void Vrintz(DataType dt, QRegister rd, QRegister rm) {
9391     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9392     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9393     VIXL_ASSERT(allow_macro_instructions_);
9394     VIXL_ASSERT(OutsideITBlock());
9395     MacroEmissionCheckScope guard(this);
9396     vrintz(dt, rd, rm);
9397   }
9398 
Vrintz(Condition cond,DataType dt,SRegister rd,SRegister rm)9399   void Vrintz(Condition cond, DataType dt, SRegister rd, SRegister rm) {
9400     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9401     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9402     VIXL_ASSERT(allow_macro_instructions_);
9403     VIXL_ASSERT(OutsideITBlock());
9404     MacroEmissionCheckScope guard(this);
9405     ITScope it_scope(this, &cond, guard);
9406     vrintz(cond, dt, rd, rm);
9407   }
Vrintz(DataType dt,SRegister rd,SRegister rm)9408   void Vrintz(DataType dt, SRegister rd, SRegister rm) {
9409     Vrintz(al, dt, rd, rm);
9410   }
9411 
Vrshl(Condition cond,DataType dt,DRegister rd,DRegister rm,DRegister rn)9412   void Vrshl(
9413       Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister 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,DRegister rd,DRegister rm,DRegister rn)9423   void Vrshl(DataType dt, DRegister rd, DRegister rm, DRegister rn) {
9424     Vrshl(al, dt, rd, rm, rn);
9425   }
9426 
Vrshl(Condition cond,DataType dt,QRegister rd,QRegister rm,QRegister rn)9427   void Vrshl(
9428       Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
9429     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9430     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9431     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9432     VIXL_ASSERT(allow_macro_instructions_);
9433     VIXL_ASSERT(OutsideITBlock());
9434     MacroEmissionCheckScope guard(this);
9435     ITScope it_scope(this, &cond, guard);
9436     vrshl(cond, dt, rd, rm, rn);
9437   }
Vrshl(DataType dt,QRegister rd,QRegister rm,QRegister rn)9438   void Vrshl(DataType dt, QRegister rd, QRegister rm, QRegister rn) {
9439     Vrshl(al, dt, rd, rm, rn);
9440   }
9441 
Vrshr(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9442   void Vrshr(Condition cond,
9443              DataType dt,
9444              DRegister rd,
9445              DRegister rm,
9446              const DOperand& operand) {
9447     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9448     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9449     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9450     VIXL_ASSERT(allow_macro_instructions_);
9451     VIXL_ASSERT(OutsideITBlock());
9452     MacroEmissionCheckScope guard(this);
9453     ITScope it_scope(this, &cond, guard);
9454     vrshr(cond, dt, rd, rm, operand);
9455   }
Vrshr(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9456   void Vrshr(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9457     Vrshr(al, dt, rd, rm, operand);
9458   }
9459 
Vrshr(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9460   void Vrshr(Condition cond,
9461              DataType dt,
9462              QRegister rd,
9463              QRegister rm,
9464              const QOperand& operand) {
9465     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9466     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9467     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9468     VIXL_ASSERT(allow_macro_instructions_);
9469     VIXL_ASSERT(OutsideITBlock());
9470     MacroEmissionCheckScope guard(this);
9471     ITScope it_scope(this, &cond, guard);
9472     vrshr(cond, dt, rd, rm, operand);
9473   }
Vrshr(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9474   void Vrshr(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9475     Vrshr(al, dt, rd, rm, operand);
9476   }
9477 
Vrshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9478   void Vrshrn(Condition cond,
9479               DataType dt,
9480               DRegister rd,
9481               QRegister rm,
9482               const QOperand& operand) {
9483     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9484     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9485     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9486     VIXL_ASSERT(allow_macro_instructions_);
9487     VIXL_ASSERT(OutsideITBlock());
9488     MacroEmissionCheckScope guard(this);
9489     ITScope it_scope(this, &cond, guard);
9490     vrshrn(cond, dt, rd, rm, operand);
9491   }
Vrshrn(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9492   void Vrshrn(DataType dt,
9493               DRegister rd,
9494               QRegister rm,
9495               const QOperand& operand) {
9496     Vrshrn(al, dt, rd, rm, operand);
9497   }
9498 
Vrsqrte(Condition cond,DataType dt,DRegister rd,DRegister rm)9499   void Vrsqrte(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9500     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9501     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9502     VIXL_ASSERT(allow_macro_instructions_);
9503     VIXL_ASSERT(OutsideITBlock());
9504     MacroEmissionCheckScope guard(this);
9505     ITScope it_scope(this, &cond, guard);
9506     vrsqrte(cond, dt, rd, rm);
9507   }
Vrsqrte(DataType dt,DRegister rd,DRegister rm)9508   void Vrsqrte(DataType dt, DRegister rd, DRegister rm) {
9509     Vrsqrte(al, dt, rd, rm);
9510   }
9511 
Vrsqrte(Condition cond,DataType dt,QRegister rd,QRegister rm)9512   void Vrsqrte(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9513     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
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     vrsqrte(cond, dt, rd, rm);
9520   }
Vrsqrte(DataType dt,QRegister rd,QRegister rm)9521   void Vrsqrte(DataType dt, QRegister rd, QRegister rm) {
9522     Vrsqrte(al, dt, rd, rm);
9523   }
9524 
Vrsqrts(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)9525   void Vrsqrts(
9526       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)9536   void Vrsqrts(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9537     Vrsqrts(al, dt, rd, rn, rm);
9538   }
9539 
Vrsqrts(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)9540   void Vrsqrts(
9541       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9542     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9543     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9544     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9545     VIXL_ASSERT(allow_macro_instructions_);
9546     VIXL_ASSERT(OutsideITBlock());
9547     MacroEmissionCheckScope guard(this);
9548     ITScope it_scope(this, &cond, guard);
9549     vrsqrts(cond, dt, rd, rn, rm);
9550   }
Vrsqrts(DataType dt,QRegister rd,QRegister rn,QRegister rm)9551   void Vrsqrts(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9552     Vrsqrts(al, dt, rd, rn, rm);
9553   }
9554 
Vrsra(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9555   void Vrsra(Condition cond,
9556              DataType dt,
9557              DRegister rd,
9558              DRegister rm,
9559              const DOperand& operand) {
9560     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9561     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9562     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9563     VIXL_ASSERT(allow_macro_instructions_);
9564     VIXL_ASSERT(OutsideITBlock());
9565     MacroEmissionCheckScope guard(this);
9566     ITScope it_scope(this, &cond, guard);
9567     vrsra(cond, dt, rd, rm, operand);
9568   }
Vrsra(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9569   void Vrsra(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9570     Vrsra(al, dt, rd, rm, operand);
9571   }
9572 
Vrsra(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9573   void Vrsra(Condition cond,
9574              DataType dt,
9575              QRegister rd,
9576              QRegister rm,
9577              const QOperand& operand) {
9578     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9579     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9580     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9581     VIXL_ASSERT(allow_macro_instructions_);
9582     VIXL_ASSERT(OutsideITBlock());
9583     MacroEmissionCheckScope guard(this);
9584     ITScope it_scope(this, &cond, guard);
9585     vrsra(cond, dt, rd, rm, operand);
9586   }
Vrsra(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9587   void Vrsra(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9588     Vrsra(al, dt, rd, rm, operand);
9589   }
9590 
Vrsubhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)9591   void Vrsubhn(
9592       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9593     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9594     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9595     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9596     VIXL_ASSERT(allow_macro_instructions_);
9597     VIXL_ASSERT(OutsideITBlock());
9598     MacroEmissionCheckScope guard(this);
9599     ITScope it_scope(this, &cond, guard);
9600     vrsubhn(cond, dt, rd, rn, rm);
9601   }
Vrsubhn(DataType dt,DRegister rd,QRegister rn,QRegister rm)9602   void Vrsubhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9603     Vrsubhn(al, dt, rd, rn, rm);
9604   }
9605 
Vseleq(DataType dt,DRegister rd,DRegister rn,DRegister rm)9606   void Vseleq(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9607     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9608     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9609     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9610     VIXL_ASSERT(allow_macro_instructions_);
9611     VIXL_ASSERT(OutsideITBlock());
9612     MacroEmissionCheckScope guard(this);
9613     vseleq(dt, rd, rn, rm);
9614   }
9615 
Vseleq(DataType dt,SRegister rd,SRegister rn,SRegister rm)9616   void Vseleq(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9617     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9618     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9619     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9620     VIXL_ASSERT(allow_macro_instructions_);
9621     VIXL_ASSERT(OutsideITBlock());
9622     MacroEmissionCheckScope guard(this);
9623     vseleq(dt, rd, rn, rm);
9624   }
9625 
Vselge(DataType dt,DRegister rd,DRegister rn,DRegister rm)9626   void Vselge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9627     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9628     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9629     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9630     VIXL_ASSERT(allow_macro_instructions_);
9631     VIXL_ASSERT(OutsideITBlock());
9632     MacroEmissionCheckScope guard(this);
9633     vselge(dt, rd, rn, rm);
9634   }
9635 
Vselge(DataType dt,SRegister rd,SRegister rn,SRegister rm)9636   void Vselge(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9637     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9638     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9639     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9640     VIXL_ASSERT(allow_macro_instructions_);
9641     VIXL_ASSERT(OutsideITBlock());
9642     MacroEmissionCheckScope guard(this);
9643     vselge(dt, rd, rn, rm);
9644   }
9645 
Vselgt(DataType dt,DRegister rd,DRegister rn,DRegister rm)9646   void Vselgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9647     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9648     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9649     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9650     VIXL_ASSERT(allow_macro_instructions_);
9651     VIXL_ASSERT(OutsideITBlock());
9652     MacroEmissionCheckScope guard(this);
9653     vselgt(dt, rd, rn, rm);
9654   }
9655 
Vselgt(DataType dt,SRegister rd,SRegister rn,SRegister rm)9656   void Vselgt(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9657     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9658     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9659     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9660     VIXL_ASSERT(allow_macro_instructions_);
9661     VIXL_ASSERT(OutsideITBlock());
9662     MacroEmissionCheckScope guard(this);
9663     vselgt(dt, rd, rn, rm);
9664   }
9665 
Vselvs(DataType dt,DRegister rd,DRegister rn,DRegister rm)9666   void Vselvs(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9667     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9668     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9669     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9670     VIXL_ASSERT(allow_macro_instructions_);
9671     VIXL_ASSERT(OutsideITBlock());
9672     MacroEmissionCheckScope guard(this);
9673     vselvs(dt, rd, rn, rm);
9674   }
9675 
Vselvs(DataType dt,SRegister rd,SRegister rn,SRegister rm)9676   void Vselvs(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9677     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9678     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9679     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9680     VIXL_ASSERT(allow_macro_instructions_);
9681     VIXL_ASSERT(OutsideITBlock());
9682     MacroEmissionCheckScope guard(this);
9683     vselvs(dt, rd, rn, rm);
9684   }
9685 
Vshl(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9686   void Vshl(Condition cond,
9687             DataType dt,
9688             DRegister rd,
9689             DRegister rm,
9690             const DOperand& operand) {
9691     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9692     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9693     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9694     VIXL_ASSERT(allow_macro_instructions_);
9695     VIXL_ASSERT(OutsideITBlock());
9696     MacroEmissionCheckScope guard(this);
9697     ITScope it_scope(this, &cond, guard);
9698     vshl(cond, dt, rd, rm, operand);
9699   }
Vshl(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9700   void Vshl(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9701     Vshl(al, dt, rd, rm, operand);
9702   }
9703 
Vshl(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9704   void Vshl(Condition cond,
9705             DataType dt,
9706             QRegister rd,
9707             QRegister rm,
9708             const QOperand& operand) {
9709     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9710     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9711     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9712     VIXL_ASSERT(allow_macro_instructions_);
9713     VIXL_ASSERT(OutsideITBlock());
9714     MacroEmissionCheckScope guard(this);
9715     ITScope it_scope(this, &cond, guard);
9716     vshl(cond, dt, rd, rm, operand);
9717   }
Vshl(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9718   void Vshl(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9719     Vshl(al, dt, rd, rm, operand);
9720   }
9721 
Vshll(Condition cond,DataType dt,QRegister rd,DRegister rm,const DOperand & operand)9722   void Vshll(Condition cond,
9723              DataType dt,
9724              QRegister rd,
9725              DRegister rm,
9726              const DOperand& operand) {
9727     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9728     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9729     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9730     VIXL_ASSERT(allow_macro_instructions_);
9731     VIXL_ASSERT(OutsideITBlock());
9732     MacroEmissionCheckScope guard(this);
9733     ITScope it_scope(this, &cond, guard);
9734     vshll(cond, dt, rd, rm, operand);
9735   }
Vshll(DataType dt,QRegister rd,DRegister rm,const DOperand & operand)9736   void Vshll(DataType dt, QRegister rd, DRegister rm, const DOperand& operand) {
9737     Vshll(al, dt, rd, rm, operand);
9738   }
9739 
Vshr(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9740   void Vshr(Condition cond,
9741             DataType dt,
9742             DRegister rd,
9743             DRegister rm,
9744             const DOperand& operand) {
9745     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9746     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9747     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9748     VIXL_ASSERT(allow_macro_instructions_);
9749     VIXL_ASSERT(OutsideITBlock());
9750     MacroEmissionCheckScope guard(this);
9751     ITScope it_scope(this, &cond, guard);
9752     vshr(cond, dt, rd, rm, operand);
9753   }
Vshr(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9754   void Vshr(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9755     Vshr(al, dt, rd, rm, operand);
9756   }
9757 
Vshr(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9758   void Vshr(Condition cond,
9759             DataType dt,
9760             QRegister rd,
9761             QRegister rm,
9762             const QOperand& operand) {
9763     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9764     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9765     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9766     VIXL_ASSERT(allow_macro_instructions_);
9767     VIXL_ASSERT(OutsideITBlock());
9768     MacroEmissionCheckScope guard(this);
9769     ITScope it_scope(this, &cond, guard);
9770     vshr(cond, dt, rd, rm, operand);
9771   }
Vshr(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9772   void Vshr(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9773     Vshr(al, dt, rd, rm, operand);
9774   }
9775 
Vshrn(Condition cond,DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9776   void Vshrn(Condition cond,
9777              DataType dt,
9778              DRegister rd,
9779              QRegister rm,
9780              const QOperand& operand) {
9781     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9782     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9783     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9784     VIXL_ASSERT(allow_macro_instructions_);
9785     VIXL_ASSERT(OutsideITBlock());
9786     MacroEmissionCheckScope guard(this);
9787     ITScope it_scope(this, &cond, guard);
9788     vshrn(cond, dt, rd, rm, operand);
9789   }
Vshrn(DataType dt,DRegister rd,QRegister rm,const QOperand & operand)9790   void Vshrn(DataType dt, DRegister rd, QRegister rm, const QOperand& operand) {
9791     Vshrn(al, dt, rd, rm, operand);
9792   }
9793 
Vsli(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9794   void Vsli(Condition cond,
9795             DataType dt,
9796             DRegister rd,
9797             DRegister rm,
9798             const DOperand& operand) {
9799     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9800     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9801     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9802     VIXL_ASSERT(allow_macro_instructions_);
9803     VIXL_ASSERT(OutsideITBlock());
9804     MacroEmissionCheckScope guard(this);
9805     ITScope it_scope(this, &cond, guard);
9806     vsli(cond, dt, rd, rm, operand);
9807   }
Vsli(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9808   void Vsli(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9809     Vsli(al, dt, rd, rm, operand);
9810   }
9811 
Vsli(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9812   void Vsli(Condition cond,
9813             DataType dt,
9814             QRegister rd,
9815             QRegister rm,
9816             const QOperand& operand) {
9817     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9818     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9819     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9820     VIXL_ASSERT(allow_macro_instructions_);
9821     VIXL_ASSERT(OutsideITBlock());
9822     MacroEmissionCheckScope guard(this);
9823     ITScope it_scope(this, &cond, guard);
9824     vsli(cond, dt, rd, rm, operand);
9825   }
Vsli(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9826   void Vsli(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9827     Vsli(al, dt, rd, rm, operand);
9828   }
9829 
Vsqrt(Condition cond,DataType dt,SRegister rd,SRegister rm)9830   void Vsqrt(Condition cond, DataType dt, SRegister rd, SRegister rm) {
9831     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9832     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9833     VIXL_ASSERT(allow_macro_instructions_);
9834     VIXL_ASSERT(OutsideITBlock());
9835     MacroEmissionCheckScope guard(this);
9836     ITScope it_scope(this, &cond, guard);
9837     vsqrt(cond, dt, rd, rm);
9838   }
Vsqrt(DataType dt,SRegister rd,SRegister rm)9839   void Vsqrt(DataType dt, SRegister rd, SRegister rm) { Vsqrt(al, dt, rd, rm); }
9840 
Vsqrt(Condition cond,DataType dt,DRegister rd,DRegister rm)9841   void Vsqrt(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9842     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9843     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9844     VIXL_ASSERT(allow_macro_instructions_);
9845     VIXL_ASSERT(OutsideITBlock());
9846     MacroEmissionCheckScope guard(this);
9847     ITScope it_scope(this, &cond, guard);
9848     vsqrt(cond, dt, rd, rm);
9849   }
Vsqrt(DataType dt,DRegister rd,DRegister rm)9850   void Vsqrt(DataType dt, DRegister rd, DRegister rm) { Vsqrt(al, dt, rd, rm); }
9851 
Vsra(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9852   void Vsra(Condition cond,
9853             DataType dt,
9854             DRegister rd,
9855             DRegister rm,
9856             const DOperand& operand) {
9857     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9858     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9859     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9860     VIXL_ASSERT(allow_macro_instructions_);
9861     VIXL_ASSERT(OutsideITBlock());
9862     MacroEmissionCheckScope guard(this);
9863     ITScope it_scope(this, &cond, guard);
9864     vsra(cond, dt, rd, rm, operand);
9865   }
Vsra(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9866   void Vsra(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9867     Vsra(al, dt, rd, rm, operand);
9868   }
9869 
Vsra(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9870   void Vsra(Condition cond,
9871             DataType dt,
9872             QRegister rd,
9873             QRegister rm,
9874             const QOperand& operand) {
9875     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9876     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9877     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9878     VIXL_ASSERT(allow_macro_instructions_);
9879     VIXL_ASSERT(OutsideITBlock());
9880     MacroEmissionCheckScope guard(this);
9881     ITScope it_scope(this, &cond, guard);
9882     vsra(cond, dt, rd, rm, operand);
9883   }
Vsra(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9884   void Vsra(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9885     Vsra(al, dt, rd, rm, operand);
9886   }
9887 
Vsri(Condition cond,DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9888   void Vsri(Condition cond,
9889             DataType dt,
9890             DRegister rd,
9891             DRegister rm,
9892             const DOperand& operand) {
9893     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9894     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9895     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9896     VIXL_ASSERT(allow_macro_instructions_);
9897     VIXL_ASSERT(OutsideITBlock());
9898     MacroEmissionCheckScope guard(this);
9899     ITScope it_scope(this, &cond, guard);
9900     vsri(cond, dt, rd, rm, operand);
9901   }
Vsri(DataType dt,DRegister rd,DRegister rm,const DOperand & operand)9902   void Vsri(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9903     Vsri(al, dt, rd, rm, operand);
9904   }
9905 
Vsri(Condition cond,DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9906   void Vsri(Condition cond,
9907             DataType dt,
9908             QRegister rd,
9909             QRegister rm,
9910             const QOperand& operand) {
9911     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9912     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9913     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9914     VIXL_ASSERT(allow_macro_instructions_);
9915     VIXL_ASSERT(OutsideITBlock());
9916     MacroEmissionCheckScope guard(this);
9917     ITScope it_scope(this, &cond, guard);
9918     vsri(cond, dt, rd, rm, operand);
9919   }
Vsri(DataType dt,QRegister rd,QRegister rm,const QOperand & operand)9920   void Vsri(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9921     Vsri(al, dt, rd, rm, operand);
9922   }
9923 
Vst1(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9924   void Vst1(Condition cond,
9925             DataType dt,
9926             const NeonRegisterList& nreglist,
9927             const AlignedMemOperand& operand) {
9928     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
9929     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9930     VIXL_ASSERT(allow_macro_instructions_);
9931     VIXL_ASSERT(OutsideITBlock());
9932     MacroEmissionCheckScope guard(this);
9933     ITScope it_scope(this, &cond, guard);
9934     vst1(cond, dt, nreglist, operand);
9935   }
Vst1(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9936   void Vst1(DataType dt,
9937             const NeonRegisterList& nreglist,
9938             const AlignedMemOperand& operand) {
9939     Vst1(al, dt, nreglist, operand);
9940   }
9941 
Vst2(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9942   void Vst2(Condition cond,
9943             DataType dt,
9944             const NeonRegisterList& nreglist,
9945             const AlignedMemOperand& operand) {
9946     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
9947     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9948     VIXL_ASSERT(allow_macro_instructions_);
9949     VIXL_ASSERT(OutsideITBlock());
9950     MacroEmissionCheckScope guard(this);
9951     ITScope it_scope(this, &cond, guard);
9952     vst2(cond, dt, nreglist, operand);
9953   }
Vst2(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9954   void Vst2(DataType dt,
9955             const NeonRegisterList& nreglist,
9956             const AlignedMemOperand& operand) {
9957     Vst2(al, dt, nreglist, operand);
9958   }
9959 
Vst3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9960   void Vst3(Condition cond,
9961             DataType dt,
9962             const NeonRegisterList& nreglist,
9963             const AlignedMemOperand& operand) {
9964     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
9965     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9966     VIXL_ASSERT(allow_macro_instructions_);
9967     VIXL_ASSERT(OutsideITBlock());
9968     MacroEmissionCheckScope guard(this);
9969     ITScope it_scope(this, &cond, guard);
9970     vst3(cond, dt, nreglist, operand);
9971   }
Vst3(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9972   void Vst3(DataType dt,
9973             const NeonRegisterList& nreglist,
9974             const AlignedMemOperand& operand) {
9975     Vst3(al, dt, nreglist, operand);
9976   }
9977 
Vst3(Condition cond,DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)9978   void Vst3(Condition cond,
9979             DataType dt,
9980             const NeonRegisterList& nreglist,
9981             const MemOperand& operand) {
9982     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
9983     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9984     VIXL_ASSERT(allow_macro_instructions_);
9985     VIXL_ASSERT(OutsideITBlock());
9986     MacroEmissionCheckScope guard(this);
9987     ITScope it_scope(this, &cond, guard);
9988     vst3(cond, dt, nreglist, operand);
9989   }
Vst3(DataType dt,const NeonRegisterList & nreglist,const MemOperand & operand)9990   void Vst3(DataType dt,
9991             const NeonRegisterList& nreglist,
9992             const MemOperand& operand) {
9993     Vst3(al, dt, nreglist, operand);
9994   }
9995 
Vst4(Condition cond,DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)9996   void Vst4(Condition cond,
9997             DataType dt,
9998             const NeonRegisterList& nreglist,
9999             const AlignedMemOperand& operand) {
10000     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10001     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10002     VIXL_ASSERT(allow_macro_instructions_);
10003     VIXL_ASSERT(OutsideITBlock());
10004     MacroEmissionCheckScope guard(this);
10005     ITScope it_scope(this, &cond, guard);
10006     vst4(cond, dt, nreglist, operand);
10007   }
Vst4(DataType dt,const NeonRegisterList & nreglist,const AlignedMemOperand & operand)10008   void Vst4(DataType dt,
10009             const NeonRegisterList& nreglist,
10010             const AlignedMemOperand& operand) {
10011     Vst4(al, dt, nreglist, operand);
10012   }
10013 
Vstm(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10014   void Vstm(Condition cond,
10015             DataType dt,
10016             Register rn,
10017             WriteBack write_back,
10018             DRegisterList dreglist) {
10019     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10020     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
10021     VIXL_ASSERT(allow_macro_instructions_);
10022     VIXL_ASSERT(OutsideITBlock());
10023     MacroEmissionCheckScope guard(this);
10024     ITScope it_scope(this, &cond, guard);
10025     vstm(cond, dt, rn, write_back, dreglist);
10026   }
Vstm(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10027   void Vstm(DataType dt,
10028             Register rn,
10029             WriteBack write_back,
10030             DRegisterList dreglist) {
10031     Vstm(al, dt, rn, write_back, dreglist);
10032   }
Vstm(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)10033   void Vstm(Condition cond,
10034             Register rn,
10035             WriteBack write_back,
10036             DRegisterList dreglist) {
10037     Vstm(cond, kDataTypeValueNone, rn, write_back, dreglist);
10038   }
Vstm(Register rn,WriteBack write_back,DRegisterList dreglist)10039   void Vstm(Register rn, WriteBack write_back, DRegisterList dreglist) {
10040     Vstm(al, kDataTypeValueNone, rn, write_back, dreglist);
10041   }
10042 
Vstm(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10043   void Vstm(Condition cond,
10044             DataType dt,
10045             Register rn,
10046             WriteBack write_back,
10047             SRegisterList sreglist) {
10048     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10049     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
10050     VIXL_ASSERT(allow_macro_instructions_);
10051     VIXL_ASSERT(OutsideITBlock());
10052     MacroEmissionCheckScope guard(this);
10053     ITScope it_scope(this, &cond, guard);
10054     vstm(cond, dt, rn, write_back, sreglist);
10055   }
Vstm(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10056   void Vstm(DataType dt,
10057             Register rn,
10058             WriteBack write_back,
10059             SRegisterList sreglist) {
10060     Vstm(al, dt, rn, write_back, sreglist);
10061   }
Vstm(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)10062   void Vstm(Condition cond,
10063             Register rn,
10064             WriteBack write_back,
10065             SRegisterList sreglist) {
10066     Vstm(cond, kDataTypeValueNone, rn, write_back, sreglist);
10067   }
Vstm(Register rn,WriteBack write_back,SRegisterList sreglist)10068   void Vstm(Register rn, WriteBack write_back, SRegisterList sreglist) {
10069     Vstm(al, kDataTypeValueNone, rn, write_back, sreglist);
10070   }
10071 
Vstmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10072   void Vstmdb(Condition cond,
10073               DataType dt,
10074               Register rn,
10075               WriteBack write_back,
10076               DRegisterList dreglist) {
10077     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10078     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
10079     VIXL_ASSERT(allow_macro_instructions_);
10080     VIXL_ASSERT(OutsideITBlock());
10081     MacroEmissionCheckScope guard(this);
10082     ITScope it_scope(this, &cond, guard);
10083     vstmdb(cond, dt, rn, write_back, dreglist);
10084   }
Vstmdb(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10085   void Vstmdb(DataType dt,
10086               Register rn,
10087               WriteBack write_back,
10088               DRegisterList dreglist) {
10089     Vstmdb(al, dt, rn, write_back, dreglist);
10090   }
Vstmdb(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)10091   void Vstmdb(Condition cond,
10092               Register rn,
10093               WriteBack write_back,
10094               DRegisterList dreglist) {
10095     Vstmdb(cond, kDataTypeValueNone, rn, write_back, dreglist);
10096   }
Vstmdb(Register rn,WriteBack write_back,DRegisterList dreglist)10097   void Vstmdb(Register rn, WriteBack write_back, DRegisterList dreglist) {
10098     Vstmdb(al, kDataTypeValueNone, rn, write_back, dreglist);
10099   }
10100 
Vstmdb(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10101   void Vstmdb(Condition cond,
10102               DataType dt,
10103               Register rn,
10104               WriteBack write_back,
10105               SRegisterList sreglist) {
10106     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10107     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
10108     VIXL_ASSERT(allow_macro_instructions_);
10109     VIXL_ASSERT(OutsideITBlock());
10110     MacroEmissionCheckScope guard(this);
10111     ITScope it_scope(this, &cond, guard);
10112     vstmdb(cond, dt, rn, write_back, sreglist);
10113   }
Vstmdb(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10114   void Vstmdb(DataType dt,
10115               Register rn,
10116               WriteBack write_back,
10117               SRegisterList sreglist) {
10118     Vstmdb(al, dt, rn, write_back, sreglist);
10119   }
Vstmdb(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)10120   void Vstmdb(Condition cond,
10121               Register rn,
10122               WriteBack write_back,
10123               SRegisterList sreglist) {
10124     Vstmdb(cond, kDataTypeValueNone, rn, write_back, sreglist);
10125   }
Vstmdb(Register rn,WriteBack write_back,SRegisterList sreglist)10126   void Vstmdb(Register rn, WriteBack write_back, SRegisterList sreglist) {
10127     Vstmdb(al, kDataTypeValueNone, rn, write_back, sreglist);
10128   }
10129 
Vstmia(Condition cond,DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10130   void Vstmia(Condition cond,
10131               DataType dt,
10132               Register rn,
10133               WriteBack write_back,
10134               DRegisterList dreglist) {
10135     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10136     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
10137     VIXL_ASSERT(allow_macro_instructions_);
10138     VIXL_ASSERT(OutsideITBlock());
10139     MacroEmissionCheckScope guard(this);
10140     ITScope it_scope(this, &cond, guard);
10141     vstmia(cond, dt, rn, write_back, dreglist);
10142   }
Vstmia(DataType dt,Register rn,WriteBack write_back,DRegisterList dreglist)10143   void Vstmia(DataType dt,
10144               Register rn,
10145               WriteBack write_back,
10146               DRegisterList dreglist) {
10147     Vstmia(al, dt, rn, write_back, dreglist);
10148   }
Vstmia(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)10149   void Vstmia(Condition cond,
10150               Register rn,
10151               WriteBack write_back,
10152               DRegisterList dreglist) {
10153     Vstmia(cond, kDataTypeValueNone, rn, write_back, dreglist);
10154   }
Vstmia(Register rn,WriteBack write_back,DRegisterList dreglist)10155   void Vstmia(Register rn, WriteBack write_back, DRegisterList dreglist) {
10156     Vstmia(al, kDataTypeValueNone, rn, write_back, dreglist);
10157   }
10158 
Vstmia(Condition cond,DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10159   void Vstmia(Condition cond,
10160               DataType dt,
10161               Register rn,
10162               WriteBack write_back,
10163               SRegisterList sreglist) {
10164     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10165     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
10166     VIXL_ASSERT(allow_macro_instructions_);
10167     VIXL_ASSERT(OutsideITBlock());
10168     MacroEmissionCheckScope guard(this);
10169     ITScope it_scope(this, &cond, guard);
10170     vstmia(cond, dt, rn, write_back, sreglist);
10171   }
Vstmia(DataType dt,Register rn,WriteBack write_back,SRegisterList sreglist)10172   void Vstmia(DataType dt,
10173               Register rn,
10174               WriteBack write_back,
10175               SRegisterList sreglist) {
10176     Vstmia(al, dt, rn, write_back, sreglist);
10177   }
Vstmia(Condition cond,Register rn,WriteBack write_back,SRegisterList sreglist)10178   void Vstmia(Condition cond,
10179               Register rn,
10180               WriteBack write_back,
10181               SRegisterList sreglist) {
10182     Vstmia(cond, kDataTypeValueNone, rn, write_back, sreglist);
10183   }
Vstmia(Register rn,WriteBack write_back,SRegisterList sreglist)10184   void Vstmia(Register rn, WriteBack write_back, SRegisterList sreglist) {
10185     Vstmia(al, kDataTypeValueNone, rn, write_back, sreglist);
10186   }
10187 
Vstr(Condition cond,DataType dt,DRegister rd,const MemOperand & operand)10188   void Vstr(Condition cond,
10189             DataType dt,
10190             DRegister rd,
10191             const MemOperand& operand) {
10192     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10193     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10194     VIXL_ASSERT(allow_macro_instructions_);
10195     VIXL_ASSERT(OutsideITBlock());
10196     MacroEmissionCheckScope guard(this);
10197     ITScope it_scope(this, &cond, guard);
10198     vstr(cond, dt, rd, operand);
10199   }
Vstr(DataType dt,DRegister rd,const MemOperand & operand)10200   void Vstr(DataType dt, DRegister rd, const MemOperand& operand) {
10201     Vstr(al, dt, rd, operand);
10202   }
Vstr(Condition cond,DRegister rd,const MemOperand & operand)10203   void Vstr(Condition cond, DRegister rd, const MemOperand& operand) {
10204     Vstr(cond, Untyped64, rd, operand);
10205   }
Vstr(DRegister rd,const MemOperand & operand)10206   void Vstr(DRegister rd, const MemOperand& operand) {
10207     Vstr(al, Untyped64, rd, operand);
10208   }
10209 
Vstr(Condition cond,DataType dt,SRegister rd,const MemOperand & operand)10210   void Vstr(Condition cond,
10211             DataType dt,
10212             SRegister rd,
10213             const MemOperand& operand) {
10214     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10215     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10216     VIXL_ASSERT(allow_macro_instructions_);
10217     VIXL_ASSERT(OutsideITBlock());
10218     MacroEmissionCheckScope guard(this);
10219     ITScope it_scope(this, &cond, guard);
10220     vstr(cond, dt, rd, operand);
10221   }
Vstr(DataType dt,SRegister rd,const MemOperand & operand)10222   void Vstr(DataType dt, SRegister rd, const MemOperand& operand) {
10223     Vstr(al, dt, rd, operand);
10224   }
Vstr(Condition cond,SRegister rd,const MemOperand & operand)10225   void Vstr(Condition cond, SRegister rd, const MemOperand& operand) {
10226     Vstr(cond, Untyped32, rd, operand);
10227   }
Vstr(SRegister rd,const MemOperand & operand)10228   void Vstr(SRegister rd, const MemOperand& operand) {
10229     Vstr(al, Untyped32, rd, operand);
10230   }
10231 
Vsub(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)10232   void Vsub(
10233       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)10243   void Vsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10244     Vsub(al, dt, rd, rn, rm);
10245   }
10246 
Vsub(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)10247   void Vsub(
10248       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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,QRegister rd,QRegister rn,QRegister rm)10258   void Vsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10259     Vsub(al, dt, rd, rn, rm);
10260   }
10261 
Vsub(Condition cond,DataType dt,SRegister rd,SRegister rn,SRegister rm)10262   void Vsub(
10263       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister 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     vsub(cond, dt, rd, rn, rm);
10272   }
Vsub(DataType dt,SRegister rd,SRegister rn,SRegister rm)10273   void Vsub(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
10274     Vsub(al, dt, rd, rn, rm);
10275   }
10276 
Vsubhn(Condition cond,DataType dt,DRegister rd,QRegister rn,QRegister rm)10277   void Vsubhn(
10278       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister 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     vsubhn(cond, dt, rd, rn, rm);
10287   }
Vsubhn(DataType dt,DRegister rd,QRegister rn,QRegister rm)10288   void Vsubhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
10289     Vsubhn(al, dt, rd, rn, rm);
10290   }
10291 
Vsubl(Condition cond,DataType dt,QRegister rd,DRegister rn,DRegister rm)10292   void Vsubl(
10293       Condition cond, DataType dt, QRegister rd, DRegister 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     vsubl(cond, dt, rd, rn, rm);
10302   }
Vsubl(DataType dt,QRegister rd,DRegister rn,DRegister rm)10303   void Vsubl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
10304     Vsubl(al, dt, rd, rn, rm);
10305   }
10306 
Vsubw(Condition cond,DataType dt,QRegister rd,QRegister rn,DRegister rm)10307   void Vsubw(
10308       Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
10309     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10310     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10311     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10312     VIXL_ASSERT(allow_macro_instructions_);
10313     VIXL_ASSERT(OutsideITBlock());
10314     MacroEmissionCheckScope guard(this);
10315     ITScope it_scope(this, &cond, guard);
10316     vsubw(cond, dt, rd, rn, rm);
10317   }
Vsubw(DataType dt,QRegister rd,QRegister rn,DRegister rm)10318   void Vsubw(DataType dt, QRegister rd, QRegister rn, DRegister rm) {
10319     Vsubw(al, dt, rd, rn, rm);
10320   }
10321 
Vswp(Condition cond,DataType dt,DRegister rd,DRegister rm)10322   void Vswp(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10323     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10324     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10325     VIXL_ASSERT(allow_macro_instructions_);
10326     VIXL_ASSERT(OutsideITBlock());
10327     MacroEmissionCheckScope guard(this);
10328     ITScope it_scope(this, &cond, guard);
10329     vswp(cond, dt, rd, rm);
10330   }
Vswp(DataType dt,DRegister rd,DRegister rm)10331   void Vswp(DataType dt, DRegister rd, DRegister rm) { Vswp(al, dt, rd, rm); }
Vswp(Condition cond,DRegister rd,DRegister rm)10332   void Vswp(Condition cond, DRegister rd, DRegister rm) {
10333     Vswp(cond, kDataTypeValueNone, rd, rm);
10334   }
Vswp(DRegister rd,DRegister rm)10335   void Vswp(DRegister rd, DRegister rm) {
10336     Vswp(al, kDataTypeValueNone, rd, rm);
10337   }
10338 
Vswp(Condition cond,DataType dt,QRegister rd,QRegister rm)10339   void Vswp(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10340     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10341     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10342     VIXL_ASSERT(allow_macro_instructions_);
10343     VIXL_ASSERT(OutsideITBlock());
10344     MacroEmissionCheckScope guard(this);
10345     ITScope it_scope(this, &cond, guard);
10346     vswp(cond, dt, rd, rm);
10347   }
Vswp(DataType dt,QRegister rd,QRegister rm)10348   void Vswp(DataType dt, QRegister rd, QRegister rm) { Vswp(al, dt, rd, rm); }
Vswp(Condition cond,QRegister rd,QRegister rm)10349   void Vswp(Condition cond, QRegister rd, QRegister rm) {
10350     Vswp(cond, kDataTypeValueNone, rd, rm);
10351   }
Vswp(QRegister rd,QRegister rm)10352   void Vswp(QRegister rd, QRegister rm) {
10353     Vswp(al, kDataTypeValueNone, rd, rm);
10354   }
10355 
Vtbl(Condition cond,DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)10356   void Vtbl(Condition cond,
10357             DataType dt,
10358             DRegister rd,
10359             const NeonRegisterList& nreglist,
10360             DRegister rm) {
10361     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10362     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10363     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10364     VIXL_ASSERT(allow_macro_instructions_);
10365     VIXL_ASSERT(OutsideITBlock());
10366     MacroEmissionCheckScope guard(this);
10367     ITScope it_scope(this, &cond, guard);
10368     vtbl(cond, dt, rd, nreglist, rm);
10369   }
Vtbl(DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)10370   void Vtbl(DataType dt,
10371             DRegister rd,
10372             const NeonRegisterList& nreglist,
10373             DRegister rm) {
10374     Vtbl(al, dt, rd, nreglist, rm);
10375   }
10376 
Vtbx(Condition cond,DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)10377   void Vtbx(Condition cond,
10378             DataType dt,
10379             DRegister rd,
10380             const NeonRegisterList& nreglist,
10381             DRegister rm) {
10382     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10383     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10384     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10385     VIXL_ASSERT(allow_macro_instructions_);
10386     VIXL_ASSERT(OutsideITBlock());
10387     MacroEmissionCheckScope guard(this);
10388     ITScope it_scope(this, &cond, guard);
10389     vtbx(cond, dt, rd, nreglist, rm);
10390   }
Vtbx(DataType dt,DRegister rd,const NeonRegisterList & nreglist,DRegister rm)10391   void Vtbx(DataType dt,
10392             DRegister rd,
10393             const NeonRegisterList& nreglist,
10394             DRegister rm) {
10395     Vtbx(al, dt, rd, nreglist, rm);
10396   }
10397 
Vtrn(Condition cond,DataType dt,DRegister rd,DRegister rm)10398   void Vtrn(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10399     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10400     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10401     VIXL_ASSERT(allow_macro_instructions_);
10402     VIXL_ASSERT(OutsideITBlock());
10403     MacroEmissionCheckScope guard(this);
10404     ITScope it_scope(this, &cond, guard);
10405     vtrn(cond, dt, rd, rm);
10406   }
Vtrn(DataType dt,DRegister rd,DRegister rm)10407   void Vtrn(DataType dt, DRegister rd, DRegister rm) { Vtrn(al, dt, rd, rm); }
10408 
Vtrn(Condition cond,DataType dt,QRegister rd,QRegister rm)10409   void Vtrn(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10410     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10411     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10412     VIXL_ASSERT(allow_macro_instructions_);
10413     VIXL_ASSERT(OutsideITBlock());
10414     MacroEmissionCheckScope guard(this);
10415     ITScope it_scope(this, &cond, guard);
10416     vtrn(cond, dt, rd, rm);
10417   }
Vtrn(DataType dt,QRegister rd,QRegister rm)10418   void Vtrn(DataType dt, QRegister rd, QRegister rm) { Vtrn(al, dt, rd, rm); }
10419 
Vtst(Condition cond,DataType dt,DRegister rd,DRegister rn,DRegister rm)10420   void Vtst(
10421       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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,DRegister rd,DRegister rn,DRegister rm)10431   void Vtst(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10432     Vtst(al, dt, rd, rn, rm);
10433   }
10434 
Vtst(Condition cond,DataType dt,QRegister rd,QRegister rn,QRegister rm)10435   void Vtst(
10436       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10437     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10438     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10439     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10440     VIXL_ASSERT(allow_macro_instructions_);
10441     VIXL_ASSERT(OutsideITBlock());
10442     MacroEmissionCheckScope guard(this);
10443     ITScope it_scope(this, &cond, guard);
10444     vtst(cond, dt, rd, rn, rm);
10445   }
Vtst(DataType dt,QRegister rd,QRegister rn,QRegister rm)10446   void Vtst(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10447     Vtst(al, dt, rd, rn, rm);
10448   }
10449 
Vuzp(Condition cond,DataType dt,DRegister rd,DRegister rm)10450   void Vuzp(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10451     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10452     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10453     VIXL_ASSERT(allow_macro_instructions_);
10454     VIXL_ASSERT(OutsideITBlock());
10455     MacroEmissionCheckScope guard(this);
10456     ITScope it_scope(this, &cond, guard);
10457     vuzp(cond, dt, rd, rm);
10458   }
Vuzp(DataType dt,DRegister rd,DRegister rm)10459   void Vuzp(DataType dt, DRegister rd, DRegister rm) { Vuzp(al, dt, rd, rm); }
10460 
Vuzp(Condition cond,DataType dt,QRegister rd,QRegister rm)10461   void Vuzp(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10462     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10463     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10464     VIXL_ASSERT(allow_macro_instructions_);
10465     VIXL_ASSERT(OutsideITBlock());
10466     MacroEmissionCheckScope guard(this);
10467     ITScope it_scope(this, &cond, guard);
10468     vuzp(cond, dt, rd, rm);
10469   }
Vuzp(DataType dt,QRegister rd,QRegister rm)10470   void Vuzp(DataType dt, QRegister rd, QRegister rm) { Vuzp(al, dt, rd, rm); }
10471 
Vzip(Condition cond,DataType dt,DRegister rd,DRegister rm)10472   void Vzip(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10473     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10474     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10475     VIXL_ASSERT(allow_macro_instructions_);
10476     VIXL_ASSERT(OutsideITBlock());
10477     MacroEmissionCheckScope guard(this);
10478     ITScope it_scope(this, &cond, guard);
10479     vzip(cond, dt, rd, rm);
10480   }
Vzip(DataType dt,DRegister rd,DRegister rm)10481   void Vzip(DataType dt, DRegister rd, DRegister rm) { Vzip(al, dt, rd, rm); }
10482 
Vzip(Condition cond,DataType dt,QRegister rd,QRegister rm)10483   void Vzip(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10484     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10485     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10486     VIXL_ASSERT(allow_macro_instructions_);
10487     VIXL_ASSERT(OutsideITBlock());
10488     MacroEmissionCheckScope guard(this);
10489     ITScope it_scope(this, &cond, guard);
10490     vzip(cond, dt, rd, rm);
10491   }
Vzip(DataType dt,QRegister rd,QRegister rm)10492   void Vzip(DataType dt, QRegister rd, QRegister rm) { Vzip(al, dt, rd, rm); }
10493 
Yield(Condition cond)10494   void Yield(Condition cond) {
10495     VIXL_ASSERT(allow_macro_instructions_);
10496     VIXL_ASSERT(OutsideITBlock());
10497     MacroEmissionCheckScope guard(this);
10498     ITScope it_scope(this, &cond, guard);
10499     yield(cond);
10500   }
Yield()10501   void Yield() { Yield(al); }
Vabs(Condition cond,VRegister rd,VRegister rm)10502   void Vabs(Condition cond, VRegister rd, VRegister rm) {
10503     VIXL_ASSERT(rd.IsS() || rd.IsD());
10504     VIXL_ASSERT(rd.GetType() == rm.GetType());
10505     if (rd.IsS()) {
10506       Vabs(cond, F32, rd.S(), rm.S());
10507     } else {
10508       Vabs(cond, F64, rd.D(), rm.D());
10509     }
10510   }
Vabs(VRegister rd,VRegister rm)10511   void Vabs(VRegister rd, VRegister rm) { Vabs(al, rd, rm); }
Vadd(Condition cond,VRegister rd,VRegister rn,VRegister rm)10512   void Vadd(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10513     VIXL_ASSERT(rd.IsS() || rd.IsD());
10514     VIXL_ASSERT(rd.GetType() == rn.GetType());
10515     VIXL_ASSERT(rd.GetType() == rm.GetType());
10516     if (rd.IsS()) {
10517       Vadd(cond, F32, rd.S(), rn.S(), rm.S());
10518     } else {
10519       Vadd(cond, F64, rd.D(), rn.D(), rm.D());
10520     }
10521   }
Vadd(VRegister rd,VRegister rn,VRegister rm)10522   void Vadd(VRegister rd, VRegister rn, VRegister rm) { Vadd(al, rd, rn, rm); }
Vcmp(Condition cond,VRegister rd,VRegister rm)10523   void Vcmp(Condition cond, VRegister rd, VRegister rm) {
10524     VIXL_ASSERT(rd.IsS() || rd.IsD());
10525     VIXL_ASSERT(rd.GetType() == rm.GetType());
10526     if (rd.IsS()) {
10527       Vcmp(cond, F32, rd.S(), rm.S());
10528     } else {
10529       Vcmp(cond, F64, rd.D(), rm.D());
10530     }
10531   }
Vcmp(VRegister rd,VRegister rm)10532   void Vcmp(VRegister rd, VRegister rm) { Vcmp(al, rd, rm); }
Vcmpe(Condition cond,VRegister rd,VRegister rm)10533   void Vcmpe(Condition cond, VRegister rd, VRegister rm) {
10534     VIXL_ASSERT(rd.IsS() || rd.IsD());
10535     VIXL_ASSERT(rd.GetType() == rm.GetType());
10536     if (rd.IsS()) {
10537       Vcmpe(cond, F32, rd.S(), rm.S());
10538     } else {
10539       Vcmpe(cond, F64, rd.D(), rm.D());
10540     }
10541   }
Vcmpe(VRegister rd,VRegister rm)10542   void Vcmpe(VRegister rd, VRegister rm) { Vcmpe(al, rd, rm); }
Vdiv(Condition cond,VRegister rd,VRegister rn,VRegister rm)10543   void Vdiv(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10544     VIXL_ASSERT(rd.IsS() || rd.IsD());
10545     VIXL_ASSERT(rd.GetType() == rn.GetType());
10546     VIXL_ASSERT(rd.GetType() == rm.GetType());
10547     if (rd.IsS()) {
10548       Vdiv(cond, F32, rd.S(), rn.S(), rm.S());
10549     } else {
10550       Vdiv(cond, F64, rd.D(), rn.D(), rm.D());
10551     }
10552   }
Vdiv(VRegister rd,VRegister rn,VRegister rm)10553   void Vdiv(VRegister rd, VRegister rn, VRegister rm) { Vdiv(al, rd, rn, rm); }
Vfma(Condition cond,VRegister rd,VRegister rn,VRegister rm)10554   void Vfma(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10555     VIXL_ASSERT(rd.IsS() || rd.IsD());
10556     VIXL_ASSERT(rd.GetType() == rn.GetType());
10557     VIXL_ASSERT(rd.GetType() == rm.GetType());
10558     if (rd.IsS()) {
10559       Vfma(cond, F32, rd.S(), rn.S(), rm.S());
10560     } else {
10561       Vfma(cond, F64, rd.D(), rn.D(), rm.D());
10562     }
10563   }
Vfma(VRegister rd,VRegister rn,VRegister rm)10564   void Vfma(VRegister rd, VRegister rn, VRegister rm) { Vfma(al, rd, rn, rm); }
Vfms(Condition cond,VRegister rd,VRegister rn,VRegister rm)10565   void Vfms(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10566     VIXL_ASSERT(rd.IsS() || rd.IsD());
10567     VIXL_ASSERT(rd.GetType() == rn.GetType());
10568     VIXL_ASSERT(rd.GetType() == rm.GetType());
10569     if (rd.IsS()) {
10570       Vfms(cond, F32, rd.S(), rn.S(), rm.S());
10571     } else {
10572       Vfms(cond, F64, rd.D(), rn.D(), rm.D());
10573     }
10574   }
Vfms(VRegister rd,VRegister rn,VRegister rm)10575   void Vfms(VRegister rd, VRegister rn, VRegister rm) { Vfms(al, rd, rn, rm); }
Vfnma(Condition cond,VRegister rd,VRegister rn,VRegister rm)10576   void Vfnma(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10577     VIXL_ASSERT(rd.IsS() || rd.IsD());
10578     VIXL_ASSERT(rd.GetType() == rn.GetType());
10579     VIXL_ASSERT(rd.GetType() == rm.GetType());
10580     if (rd.IsS()) {
10581       Vfnma(cond, F32, rd.S(), rn.S(), rm.S());
10582     } else {
10583       Vfnma(cond, F64, rd.D(), rn.D(), rm.D());
10584     }
10585   }
Vfnma(VRegister rd,VRegister rn,VRegister rm)10586   void Vfnma(VRegister rd, VRegister rn, VRegister rm) {
10587     Vfnma(al, rd, rn, rm);
10588   }
Vfnms(Condition cond,VRegister rd,VRegister rn,VRegister rm)10589   void Vfnms(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10590     VIXL_ASSERT(rd.IsS() || rd.IsD());
10591     VIXL_ASSERT(rd.GetType() == rn.GetType());
10592     VIXL_ASSERT(rd.GetType() == rm.GetType());
10593     if (rd.IsS()) {
10594       Vfnms(cond, F32, rd.S(), rn.S(), rm.S());
10595     } else {
10596       Vfnms(cond, F64, rd.D(), rn.D(), rm.D());
10597     }
10598   }
Vfnms(VRegister rd,VRegister rn,VRegister rm)10599   void Vfnms(VRegister rd, VRegister rn, VRegister rm) {
10600     Vfnms(al, rd, rn, rm);
10601   }
Vmaxnm(VRegister rd,VRegister rn,VRegister rm)10602   void Vmaxnm(VRegister rd, VRegister rn, VRegister rm) {
10603     VIXL_ASSERT(rd.IsS() || rd.IsD());
10604     VIXL_ASSERT(rd.GetType() == rn.GetType());
10605     VIXL_ASSERT(rd.GetType() == rm.GetType());
10606     if (rd.IsS()) {
10607       Vmaxnm(F32, rd.S(), rn.S(), rm.S());
10608     } else {
10609       Vmaxnm(F64, rd.D(), rn.D(), rm.D());
10610     }
10611   }
Vminnm(VRegister rd,VRegister rn,VRegister rm)10612   void Vminnm(VRegister rd, VRegister rn, VRegister rm) {
10613     VIXL_ASSERT(rd.IsS() || rd.IsD());
10614     VIXL_ASSERT(rd.GetType() == rn.GetType());
10615     VIXL_ASSERT(rd.GetType() == rm.GetType());
10616     if (rd.IsS()) {
10617       Vminnm(F32, rd.S(), rn.S(), rm.S());
10618     } else {
10619       Vminnm(F64, rd.D(), rn.D(), rm.D());
10620     }
10621   }
Vmla(Condition cond,VRegister rd,VRegister rn,VRegister rm)10622   void Vmla(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10623     VIXL_ASSERT(rd.IsS() || rd.IsD());
10624     VIXL_ASSERT(rd.GetType() == rn.GetType());
10625     VIXL_ASSERT(rd.GetType() == rm.GetType());
10626     if (rd.IsS()) {
10627       Vmla(cond, F32, rd.S(), rn.S(), rm.S());
10628     } else {
10629       Vmla(cond, F64, rd.D(), rn.D(), rm.D());
10630     }
10631   }
Vmla(VRegister rd,VRegister rn,VRegister rm)10632   void Vmla(VRegister rd, VRegister rn, VRegister rm) { Vmla(al, rd, rn, rm); }
Vmls(Condition cond,VRegister rd,VRegister rn,VRegister rm)10633   void Vmls(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10634     VIXL_ASSERT(rd.IsS() || rd.IsD());
10635     VIXL_ASSERT(rd.GetType() == rn.GetType());
10636     VIXL_ASSERT(rd.GetType() == rm.GetType());
10637     if (rd.IsS()) {
10638       Vmls(cond, F32, rd.S(), rn.S(), rm.S());
10639     } else {
10640       Vmls(cond, F64, rd.D(), rn.D(), rm.D());
10641     }
10642   }
Vmls(VRegister rd,VRegister rn,VRegister rm)10643   void Vmls(VRegister rd, VRegister rn, VRegister rm) { Vmls(al, rd, rn, rm); }
Vmov(Condition cond,VRegister rd,VRegister rm)10644   void Vmov(Condition cond, VRegister rd, VRegister rm) {
10645     VIXL_ASSERT(rd.IsS() || rd.IsD());
10646     VIXL_ASSERT(rd.GetType() == rm.GetType());
10647     if (rd.IsS()) {
10648       Vmov(cond, F32, rd.S(), rm.S());
10649     } else {
10650       Vmov(cond, F64, rd.D(), rm.D());
10651     }
10652   }
Vmov(VRegister rd,VRegister rm)10653   void Vmov(VRegister rd, VRegister rm) { Vmov(al, rd, rm); }
Vmul(Condition cond,VRegister rd,VRegister rn,VRegister rm)10654   void Vmul(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10655     VIXL_ASSERT(rd.IsS() || rd.IsD());
10656     VIXL_ASSERT(rd.GetType() == rn.GetType());
10657     VIXL_ASSERT(rd.GetType() == rm.GetType());
10658     if (rd.IsS()) {
10659       Vmul(cond, F32, rd.S(), rn.S(), rm.S());
10660     } else {
10661       Vmul(cond, F64, rd.D(), rn.D(), rm.D());
10662     }
10663   }
Vmul(VRegister rd,VRegister rn,VRegister rm)10664   void Vmul(VRegister rd, VRegister rn, VRegister rm) { Vmul(al, rd, rn, rm); }
Vneg(Condition cond,VRegister rd,VRegister rm)10665   void Vneg(Condition cond, VRegister rd, VRegister rm) {
10666     VIXL_ASSERT(rd.IsS() || rd.IsD());
10667     VIXL_ASSERT(rd.GetType() == rm.GetType());
10668     if (rd.IsS()) {
10669       Vneg(cond, F32, rd.S(), rm.S());
10670     } else {
10671       Vneg(cond, F64, rd.D(), rm.D());
10672     }
10673   }
Vneg(VRegister rd,VRegister rm)10674   void Vneg(VRegister rd, VRegister rm) { Vneg(al, rd, rm); }
Vnmla(Condition cond,VRegister rd,VRegister rn,VRegister rm)10675   void Vnmla(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10676     VIXL_ASSERT(rd.IsS() || rd.IsD());
10677     VIXL_ASSERT(rd.GetType() == rn.GetType());
10678     VIXL_ASSERT(rd.GetType() == rm.GetType());
10679     if (rd.IsS()) {
10680       Vnmla(cond, F32, rd.S(), rn.S(), rm.S());
10681     } else {
10682       Vnmla(cond, F64, rd.D(), rn.D(), rm.D());
10683     }
10684   }
Vnmla(VRegister rd,VRegister rn,VRegister rm)10685   void Vnmla(VRegister rd, VRegister rn, VRegister rm) {
10686     Vnmla(al, rd, rn, rm);
10687   }
Vnmls(Condition cond,VRegister rd,VRegister rn,VRegister rm)10688   void Vnmls(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10689     VIXL_ASSERT(rd.IsS() || rd.IsD());
10690     VIXL_ASSERT(rd.GetType() == rn.GetType());
10691     VIXL_ASSERT(rd.GetType() == rm.GetType());
10692     if (rd.IsS()) {
10693       Vnmls(cond, F32, rd.S(), rn.S(), rm.S());
10694     } else {
10695       Vnmls(cond, F64, rd.D(), rn.D(), rm.D());
10696     }
10697   }
Vnmls(VRegister rd,VRegister rn,VRegister rm)10698   void Vnmls(VRegister rd, VRegister rn, VRegister rm) {
10699     Vnmls(al, rd, rn, rm);
10700   }
Vnmul(Condition cond,VRegister rd,VRegister rn,VRegister rm)10701   void Vnmul(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10702     VIXL_ASSERT(rd.IsS() || rd.IsD());
10703     VIXL_ASSERT(rd.GetType() == rn.GetType());
10704     VIXL_ASSERT(rd.GetType() == rm.GetType());
10705     if (rd.IsS()) {
10706       Vnmul(cond, F32, rd.S(), rn.S(), rm.S());
10707     } else {
10708       Vnmul(cond, F64, rd.D(), rn.D(), rm.D());
10709     }
10710   }
Vnmul(VRegister rd,VRegister rn,VRegister rm)10711   void Vnmul(VRegister rd, VRegister rn, VRegister rm) {
10712     Vnmul(al, rd, rn, rm);
10713   }
Vrinta(VRegister rd,VRegister rm)10714   void Vrinta(VRegister rd, VRegister rm) {
10715     VIXL_ASSERT(rd.IsS() || rd.IsD());
10716     VIXL_ASSERT(rd.GetType() == rm.GetType());
10717     if (rd.IsS()) {
10718       Vrinta(F32, rd.S(), rm.S());
10719     } else {
10720       Vrinta(F64, rd.D(), rm.D());
10721     }
10722   }
Vrintm(VRegister rd,VRegister rm)10723   void Vrintm(VRegister rd, VRegister rm) {
10724     VIXL_ASSERT(rd.IsS() || rd.IsD());
10725     VIXL_ASSERT(rd.GetType() == rm.GetType());
10726     if (rd.IsS()) {
10727       Vrintm(F32, rd.S(), rm.S());
10728     } else {
10729       Vrintm(F64, rd.D(), rm.D());
10730     }
10731   }
Vrintn(VRegister rd,VRegister rm)10732   void Vrintn(VRegister rd, VRegister rm) {
10733     VIXL_ASSERT(rd.IsS() || rd.IsD());
10734     VIXL_ASSERT(rd.GetType() == rm.GetType());
10735     if (rd.IsS()) {
10736       Vrintn(F32, rd.S(), rm.S());
10737     } else {
10738       Vrintn(F64, rd.D(), rm.D());
10739     }
10740   }
Vrintp(VRegister rd,VRegister rm)10741   void Vrintp(VRegister rd, VRegister rm) {
10742     VIXL_ASSERT(rd.IsS() || rd.IsD());
10743     VIXL_ASSERT(rd.GetType() == rm.GetType());
10744     if (rd.IsS()) {
10745       Vrintp(F32, rd.S(), rm.S());
10746     } else {
10747       Vrintp(F64, rd.D(), rm.D());
10748     }
10749   }
Vrintr(Condition cond,VRegister rd,VRegister rm)10750   void Vrintr(Condition cond, VRegister rd, VRegister rm) {
10751     VIXL_ASSERT(rd.IsS() || rd.IsD());
10752     VIXL_ASSERT(rd.GetType() == rm.GetType());
10753     if (rd.IsS()) {
10754       Vrintr(cond, F32, rd.S(), rm.S());
10755     } else {
10756       Vrintr(cond, F64, rd.D(), rm.D());
10757     }
10758   }
Vrintr(VRegister rd,VRegister rm)10759   void Vrintr(VRegister rd, VRegister rm) { Vrintr(al, rd, rm); }
Vrintx(Condition cond,VRegister rd,VRegister rm)10760   void Vrintx(Condition cond, VRegister rd, VRegister rm) {
10761     VIXL_ASSERT(rd.IsS() || rd.IsD());
10762     VIXL_ASSERT(rd.GetType() == rm.GetType());
10763     if (rd.IsS()) {
10764       Vrintx(cond, F32, rd.S(), rm.S());
10765     } else {
10766       Vrintx(cond, F64, rd.D(), rm.D());
10767     }
10768   }
Vrintx(VRegister rd,VRegister rm)10769   void Vrintx(VRegister rd, VRegister rm) { Vrintx(al, rd, rm); }
Vrintz(Condition cond,VRegister rd,VRegister rm)10770   void Vrintz(Condition cond, VRegister rd, VRegister rm) {
10771     VIXL_ASSERT(rd.IsS() || rd.IsD());
10772     VIXL_ASSERT(rd.GetType() == rm.GetType());
10773     if (rd.IsS()) {
10774       Vrintz(cond, F32, rd.S(), rm.S());
10775     } else {
10776       Vrintz(cond, F64, rd.D(), rm.D());
10777     }
10778   }
Vrintz(VRegister rd,VRegister rm)10779   void Vrintz(VRegister rd, VRegister rm) { Vrintz(al, rd, rm); }
Vseleq(VRegister rd,VRegister rn,VRegister rm)10780   void Vseleq(VRegister rd, VRegister rn, VRegister rm) {
10781     VIXL_ASSERT(rd.IsS() || rd.IsD());
10782     VIXL_ASSERT(rd.GetType() == rn.GetType());
10783     VIXL_ASSERT(rd.GetType() == rm.GetType());
10784     if (rd.IsS()) {
10785       Vseleq(F32, rd.S(), rn.S(), rm.S());
10786     } else {
10787       Vseleq(F64, rd.D(), rn.D(), rm.D());
10788     }
10789   }
Vselge(VRegister rd,VRegister rn,VRegister rm)10790   void Vselge(VRegister rd, VRegister rn, VRegister rm) {
10791     VIXL_ASSERT(rd.IsS() || rd.IsD());
10792     VIXL_ASSERT(rd.GetType() == rn.GetType());
10793     VIXL_ASSERT(rd.GetType() == rm.GetType());
10794     if (rd.IsS()) {
10795       Vselge(F32, rd.S(), rn.S(), rm.S());
10796     } else {
10797       Vselge(F64, rd.D(), rn.D(), rm.D());
10798     }
10799   }
Vselgt(VRegister rd,VRegister rn,VRegister rm)10800   void Vselgt(VRegister rd, VRegister rn, VRegister rm) {
10801     VIXL_ASSERT(rd.IsS() || rd.IsD());
10802     VIXL_ASSERT(rd.GetType() == rn.GetType());
10803     VIXL_ASSERT(rd.GetType() == rm.GetType());
10804     if (rd.IsS()) {
10805       Vselgt(F32, rd.S(), rn.S(), rm.S());
10806     } else {
10807       Vselgt(F64, rd.D(), rn.D(), rm.D());
10808     }
10809   }
Vselvs(VRegister rd,VRegister rn,VRegister rm)10810   void Vselvs(VRegister rd, VRegister rn, VRegister rm) {
10811     VIXL_ASSERT(rd.IsS() || rd.IsD());
10812     VIXL_ASSERT(rd.GetType() == rn.GetType());
10813     VIXL_ASSERT(rd.GetType() == rm.GetType());
10814     if (rd.IsS()) {
10815       Vselvs(F32, rd.S(), rn.S(), rm.S());
10816     } else {
10817       Vselvs(F64, rd.D(), rn.D(), rm.D());
10818     }
10819   }
Vsqrt(Condition cond,VRegister rd,VRegister rm)10820   void Vsqrt(Condition cond, VRegister rd, VRegister rm) {
10821     VIXL_ASSERT(rd.IsS() || rd.IsD());
10822     VIXL_ASSERT(rd.GetType() == rm.GetType());
10823     if (rd.IsS()) {
10824       Vsqrt(cond, F32, rd.S(), rm.S());
10825     } else {
10826       Vsqrt(cond, F64, rd.D(), rm.D());
10827     }
10828   }
Vsqrt(VRegister rd,VRegister rm)10829   void Vsqrt(VRegister rd, VRegister rm) { Vsqrt(al, rd, rm); }
Vsub(Condition cond,VRegister rd,VRegister rn,VRegister rm)10830   void Vsub(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10831     VIXL_ASSERT(rd.IsS() || rd.IsD());
10832     VIXL_ASSERT(rd.GetType() == rn.GetType());
10833     VIXL_ASSERT(rd.GetType() == rm.GetType());
10834     if (rd.IsS()) {
10835       Vsub(cond, F32, rd.S(), rn.S(), rm.S());
10836     } else {
10837       Vsub(cond, F64, rd.D(), rn.D(), rm.D());
10838     }
10839   }
Vsub(VRegister rd,VRegister rn,VRegister rm)10840   void Vsub(VRegister rd, VRegister rn, VRegister rm) { Vsub(al, rd, rn, rm); }
10841   // End of generated code.
10842 
AllowUnpredictable()10843   virtual bool AllowUnpredictable() VIXL_OVERRIDE {
10844     VIXL_ABORT_WITH_MSG("Unpredictable instruction.\n");
10845     return false;
10846   }
AllowStronglyDiscouraged()10847   virtual bool AllowStronglyDiscouraged() VIXL_OVERRIDE {
10848     VIXL_ABORT_WITH_MSG(
10849         "ARM strongly recommends to not use this instruction.\n");
10850     return false;
10851   }
10852   // Old syntax of vrint instructions.
10853   VIXL_DEPRECATED(
10854       "void Vrinta(DataType dt, DRegister rd, DRegister rm)",
Vrinta(DataType dt1,DataType dt2,DRegister rd,DRegister rm)10855       void Vrinta(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
10856     USE(dt2);
10857     VIXL_ASSERT(dt1.Is(dt2));
10858     return Vrinta(dt1, rd, rm);
10859   }
10860   VIXL_DEPRECATED(
10861       "void Vrinta(DataType dt, QRegister rd, QRegister rm)",
Vrinta(DataType dt1,DataType dt2,QRegister rd,QRegister rm)10862       void Vrinta(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
10863     USE(dt2);
10864     VIXL_ASSERT(dt1.Is(dt2));
10865     return Vrinta(dt1, rd, rm);
10866   }
10867   VIXL_DEPRECATED(
10868       "void Vrinta(DataType dt, SRegister rd, SRegister rm)",
Vrinta(DataType dt1,DataType dt2,SRegister rd,SRegister rm)10869       void Vrinta(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
10870     USE(dt2);
10871     VIXL_ASSERT(dt1.Is(dt2));
10872     return Vrinta(dt1, rd, rm);
10873   }
10874 
10875   VIXL_DEPRECATED(
10876       "void Vrintm(DataType dt, DRegister rd, DRegister rm)",
Vrintm(DataType dt1,DataType dt2,DRegister rd,DRegister rm)10877       void Vrintm(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
10878     USE(dt2);
10879     VIXL_ASSERT(dt1.Is(dt2));
10880     return Vrintm(dt1, rd, rm);
10881   }
10882   VIXL_DEPRECATED(
10883       "void Vrintm(DataType dt, QRegister rd, QRegister rm)",
Vrintm(DataType dt1,DataType dt2,QRegister rd,QRegister rm)10884       void Vrintm(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
10885     USE(dt2);
10886     VIXL_ASSERT(dt1.Is(dt2));
10887     return Vrintm(dt1, rd, rm);
10888   }
10889   VIXL_DEPRECATED(
10890       "void Vrintm(DataType dt, SRegister rd, SRegister rm)",
Vrintm(DataType dt1,DataType dt2,SRegister rd,SRegister rm)10891       void Vrintm(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
10892     USE(dt2);
10893     VIXL_ASSERT(dt1.Is(dt2));
10894     return Vrintm(dt1, rd, rm);
10895   }
10896 
10897   VIXL_DEPRECATED(
10898       "void Vrintn(DataType dt, DRegister rd, DRegister rm)",
Vrintn(DataType dt1,DataType dt2,DRegister rd,DRegister rm)10899       void Vrintn(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
10900     USE(dt2);
10901     VIXL_ASSERT(dt1.Is(dt2));
10902     return Vrintn(dt1, rd, rm);
10903   }
10904   VIXL_DEPRECATED(
10905       "void Vrintn(DataType dt, QRegister rd, QRegister rm)",
Vrintn(DataType dt1,DataType dt2,QRegister rd,QRegister rm)10906       void Vrintn(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
10907     USE(dt2);
10908     VIXL_ASSERT(dt1.Is(dt2));
10909     return Vrintn(dt1, rd, rm);
10910   }
10911   VIXL_DEPRECATED(
10912       "void Vrintn(DataType dt, SRegister rd, SRegister rm)",
Vrintn(DataType dt1,DataType dt2,SRegister rd,SRegister rm)10913       void Vrintn(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
10914     USE(dt2);
10915     VIXL_ASSERT(dt1.Is(dt2));
10916     return Vrintn(dt1, rd, rm);
10917   }
10918 
10919   VIXL_DEPRECATED(
10920       "void Vrintp(DataType dt, DRegister rd, DRegister rm)",
Vrintp(DataType dt1,DataType dt2,DRegister rd,DRegister rm)10921       void Vrintp(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
10922     USE(dt2);
10923     VIXL_ASSERT(dt1.Is(dt2));
10924     return Vrintp(dt1, rd, rm);
10925   }
10926   VIXL_DEPRECATED(
10927       "void Vrintp(DataType dt, QRegister rd, QRegister rm)",
Vrintp(DataType dt1,DataType dt2,QRegister rd,QRegister rm)10928       void Vrintp(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
10929     USE(dt2);
10930     VIXL_ASSERT(dt1.Is(dt2));
10931     return Vrintp(dt1, rd, rm);
10932   }
10933   VIXL_DEPRECATED(
10934       "void Vrintp(DataType dt, SRegister rd, SRegister rm)",
Vrintp(DataType dt1,DataType dt2,SRegister rd,SRegister rm)10935       void Vrintp(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
10936     USE(dt2);
10937     VIXL_ASSERT(dt1.Is(dt2));
10938     return Vrintp(dt1, rd, rm);
10939   }
10940 
10941   VIXL_DEPRECATED(
10942       "void Vrintr(Condition cond, DataType dt, SRegister rd, SRegister rm)",
Vrintr(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)10943       void Vrintr(Condition cond,
10944                   DataType dt1,
10945                   DataType dt2,
10946                   SRegister rd,
10947                   SRegister rm)) {
10948     USE(dt2);
10949     VIXL_ASSERT(dt1.Is(dt2));
10950     return Vrintr(cond, dt1, rd, rm);
10951   }
10952   VIXL_DEPRECATED(
10953       "void Vrintr(DataType dt, SRegister rd, SRegister rm)",
Vrintr(DataType dt1,DataType dt2,SRegister rd,SRegister rm)10954       void Vrintr(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
10955     USE(dt2);
10956     VIXL_ASSERT(dt1.Is(dt2));
10957     return Vrintr(dt1, rd, rm);
10958   }
10959 
10960   VIXL_DEPRECATED(
10961       "void Vrintr(Condition cond, DataType dt, DRegister rd, DRegister rm)",
Vrintr(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)10962       void Vrintr(Condition cond,
10963                   DataType dt1,
10964                   DataType dt2,
10965                   DRegister rd,
10966                   DRegister rm)) {
10967     USE(dt2);
10968     VIXL_ASSERT(dt1.Is(dt2));
10969     return Vrintr(cond, dt1, rd, rm);
10970   }
10971   VIXL_DEPRECATED(
10972       "void Vrintr(DataType dt, DRegister rd, DRegister rm)",
Vrintr(DataType dt1,DataType dt2,DRegister rd,DRegister rm)10973       void Vrintr(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
10974     USE(dt2);
10975     VIXL_ASSERT(dt1.Is(dt2));
10976     return Vrintr(dt1, rd, rm);
10977   }
10978 
10979   VIXL_DEPRECATED(
10980       "void Vrintx(Condition cond, DataType dt, DRegister rd, DRegister rm)",
Vrintx(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)10981       void Vrintx(Condition cond,
10982                   DataType dt1,
10983                   DataType dt2,
10984                   DRegister rd,
10985                   DRegister rm)) {
10986     USE(dt2);
10987     VIXL_ASSERT(dt1.Is(dt2));
10988     return Vrintx(cond, dt1, rd, rm);
10989   }
10990   VIXL_DEPRECATED(
10991       "void Vrintx(DataType dt, DRegister rd, DRegister rm)",
Vrintx(DataType dt1,DataType dt2,DRegister rd,DRegister rm)10992       void Vrintx(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
10993     USE(dt2);
10994     VIXL_ASSERT(dt1.Is(dt2));
10995     return Vrintx(dt1, rd, rm);
10996   }
10997 
10998   VIXL_DEPRECATED(
10999       "void Vrintx(DataType dt, QRegister rd, QRegister rm)",
Vrintx(DataType dt1,DataType dt2,QRegister rd,QRegister rm)11000       void Vrintx(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
11001     USE(dt2);
11002     VIXL_ASSERT(dt1.Is(dt2));
11003     return Vrintx(dt1, rd, rm);
11004   }
11005 
11006   VIXL_DEPRECATED(
11007       "void Vrintx(Condition cond, DataType dt, SRegister rd, SRegister rm)",
Vrintx(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)11008       void Vrintx(Condition cond,
11009                   DataType dt1,
11010                   DataType dt2,
11011                   SRegister rd,
11012                   SRegister rm)) {
11013     USE(dt2);
11014     VIXL_ASSERT(dt1.Is(dt2));
11015     return Vrintx(cond, dt1, rd, rm);
11016   }
11017   VIXL_DEPRECATED(
11018       "void Vrintx(DataType dt, SRegister rd, SRegister rm)",
Vrintx(DataType dt1,DataType dt2,SRegister rd,SRegister rm)11019       void Vrintx(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
11020     USE(dt2);
11021     VIXL_ASSERT(dt1.Is(dt2));
11022     return Vrintx(dt1, rd, rm);
11023   }
11024 
11025   VIXL_DEPRECATED(
11026       "void Vrintz(Condition cond, DataType dt, DRegister rd, DRegister rm)",
Vrintz(Condition cond,DataType dt1,DataType dt2,DRegister rd,DRegister rm)11027       void Vrintz(Condition cond,
11028                   DataType dt1,
11029                   DataType dt2,
11030                   DRegister rd,
11031                   DRegister rm)) {
11032     USE(dt2);
11033     VIXL_ASSERT(dt1.Is(dt2));
11034     return Vrintz(cond, dt1, rd, rm);
11035   }
11036   VIXL_DEPRECATED(
11037       "void Vrintz(DataType dt, DRegister rd, DRegister rm)",
Vrintz(DataType dt1,DataType dt2,DRegister rd,DRegister rm)11038       void Vrintz(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
11039     USE(dt2);
11040     VIXL_ASSERT(dt1.Is(dt2));
11041     return Vrintz(dt1, rd, rm);
11042   }
11043 
11044   VIXL_DEPRECATED(
11045       "void Vrintz(DataType dt, QRegister rd, QRegister rm)",
Vrintz(DataType dt1,DataType dt2,QRegister rd,QRegister rm)11046       void Vrintz(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
11047     USE(dt2);
11048     VIXL_ASSERT(dt1.Is(dt2));
11049     return Vrintz(dt1, rd, rm);
11050   }
11051 
11052   VIXL_DEPRECATED(
11053       "void Vrintz(Condition cond, DataType dt, SRegister rd, SRegister rm)",
Vrintz(Condition cond,DataType dt1,DataType dt2,SRegister rd,SRegister rm)11054       void Vrintz(Condition cond,
11055                   DataType dt1,
11056                   DataType dt2,
11057                   SRegister rd,
11058                   SRegister rm)) {
11059     USE(dt2);
11060     VIXL_ASSERT(dt1.Is(dt2));
11061     return Vrintz(cond, dt1, rd, rm);
11062   }
11063   VIXL_DEPRECATED(
11064       "void Vrintz(DataType dt, SRegister rd, SRegister rm)",
Vrintz(DataType dt1,DataType dt2,SRegister rd,SRegister rm)11065       void Vrintz(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
11066     USE(dt2);
11067     VIXL_ASSERT(dt1.Is(dt2));
11068     return Vrintz(dt1, rd, rm);
11069   }
11070 
11071  private:
NeedBranch(Condition * cond)11072   bool NeedBranch(Condition* cond) { return !cond->Is(al) && IsUsingT32(); }
11073   static const int kBranchSize = kMaxInstructionSizeInBytes;
11074 
11075   RegisterList available_;
11076   VRegisterList available_vfp_;
11077   UseScratchRegisterScope* current_scratch_scope_;
11078   MacroAssemblerContext context_;
11079   PoolManager<int32_t> pool_manager_;
11080   bool generate_simulator_code_;
11081   bool allow_macro_instructions_;
11082   Label* pool_end_;
11083 
11084   friend class TestMacroAssembler;
11085 };
11086 
11087 // This scope utility allows scratch registers to be managed safely. The
11088 // MacroAssembler's GetScratchRegisterList() is used as a pool of scratch
11089 // registers. These registers can be allocated on demand, and will be returned
11090 // at the end of the scope.
11091 //
11092 // When the scope ends, the MacroAssembler's lists will be restored to their
11093 // original state, even if the lists were modified by some other means.
11094 //
11095 // Scopes must nest perfectly. That is, they must be destructed in reverse
11096 // construction order. Otherwise, it is not clear how to handle cases where one
11097 // scope acquires a register that was included in a now-closing scope. With
11098 // perfect nesting, this cannot occur.
11099 class UseScratchRegisterScope {
11100  public:
11101   // This constructor implicitly calls the `Open` function to initialise the
11102   // scope, so it is ready to use immediately after it has been constructed.
UseScratchRegisterScope(MacroAssembler * masm)11103   explicit UseScratchRegisterScope(MacroAssembler* masm)
11104       : masm_(NULL), parent_(NULL), old_available_(0), old_available_vfp_(0) {
11105     Open(masm);
11106   }
11107   // This constructor allows deferred and optional initialisation of the scope.
11108   // The user is required to explicitly call the `Open` function before using
11109   // the scope.
UseScratchRegisterScope()11110   UseScratchRegisterScope()
11111       : masm_(NULL), parent_(NULL), old_available_(0), old_available_vfp_(0) {}
11112 
11113   // This function performs the actual initialisation work.
11114   void Open(MacroAssembler* masm);
11115 
11116   // The destructor always implicitly calls the `Close` function.
~UseScratchRegisterScope()11117   ~UseScratchRegisterScope() { Close(); }
11118 
11119   // This function performs the cleaning-up work. It must succeed even if the
11120   // scope has not been opened. It is safe to call multiple times.
11121   void Close();
11122 
11123   bool IsAvailable(const Register& reg) const;
11124   bool IsAvailable(const VRegister& reg) const;
11125 
11126   // Take a register from the temp list. It will be returned automatically when
11127   // the scope ends.
11128   Register Acquire();
11129   VRegister AcquireV(unsigned size_in_bits);
11130   QRegister AcquireQ();
11131   DRegister AcquireD();
11132   SRegister AcquireS();
11133 
11134   // Explicitly release an acquired (or excluded) register, putting it back in
11135   // the temp list.
11136   void Release(const Register& reg);
11137   void Release(const VRegister& reg);
11138 
11139   // Make the specified registers available as scratch registers for the
11140   // duration of this scope.
11141   void Include(const RegisterList& list);
11142   void Include(const Register& reg1,
11143                const Register& reg2 = NoReg,
11144                const Register& reg3 = NoReg,
11145                const Register& reg4 = NoReg) {
11146     Include(RegisterList(reg1, reg2, reg3, reg4));
11147   }
11148   void Include(const VRegisterList& list);
11149   void Include(const VRegister& reg1,
11150                const VRegister& reg2 = NoVReg,
11151                const VRegister& reg3 = NoVReg,
11152                const VRegister& reg4 = NoVReg) {
11153     Include(VRegisterList(reg1, reg2, reg3, reg4));
11154   }
11155 
11156   // Make sure that the specified registers are not available in this scope.
11157   // This can be used to prevent helper functions from using sensitive
11158   // registers, for example.
11159   void Exclude(const RegisterList& list);
11160   void Exclude(const Register& reg1,
11161                const Register& reg2 = NoReg,
11162                const Register& reg3 = NoReg,
11163                const Register& reg4 = NoReg) {
11164     Exclude(RegisterList(reg1, reg2, reg3, reg4));
11165   }
11166   void Exclude(const VRegisterList& list);
11167   void Exclude(const VRegister& reg1,
11168                const VRegister& reg2 = NoVReg,
11169                const VRegister& reg3 = NoVReg,
11170                const VRegister& reg4 = NoVReg) {
11171     Exclude(VRegisterList(reg1, reg2, reg3, reg4));
11172   }
11173 
11174   // A convenience helper to exclude any registers used by the operand.
11175   void Exclude(const Operand& operand);
11176 
11177   // Prevent any scratch registers from being used in this scope.
11178   void ExcludeAll();
11179 
11180  private:
11181   // The MacroAssembler maintains a list of available scratch registers, and
11182   // also keeps track of the most recently-opened scope so that on destruction
11183   // we can check that scopes do not outlive their parents.
11184   MacroAssembler* masm_;
11185   UseScratchRegisterScope* parent_;
11186 
11187   // The state of the available lists at the start of this scope.
11188   uint32_t old_available_;      // kRRegister
11189   uint64_t old_available_vfp_;  // kVRegister
11190 
UseScratchRegisterScope(const UseScratchRegisterScope &)11191   VIXL_NO_RETURN_IN_DEBUG_MODE UseScratchRegisterScope(
11192       const UseScratchRegisterScope&) {
11193     VIXL_UNREACHABLE();
11194   }
11195   VIXL_NO_RETURN_IN_DEBUG_MODE void operator=(const UseScratchRegisterScope&) {
11196     VIXL_UNREACHABLE();
11197   }
11198 };
11199 
11200 
11201 }  // namespace aarch32
11202 }  // namespace vixl
11203 
11204 #endif  // VIXL_AARCH32_MACRO_ASSEMBLER_AARCH32_H_
11205